<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[182037] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/182037">182037</a></dd>
<dt>Author</dt> <dd>enrica@apple.com</dd>
<dt>Date</dt> <dd>2015-03-26 16:24:02 -0700 (Thu, 26 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION(<a href="http://trac.webkit.org/projects/webkit/changeset/1807689">r1807689</a>): Slower startup time for WKWebView.
https://bugs.webkit.org/show_bug.cgi?id=143115
rdar://problem/20233711

Reviewed by Anders Carlsson.

In http://trac.webkit.org/changeset/180768 we added an observer to
track visibility of the NSFontPanel to ensure we could fetch the font
information for the current selection when the panel first becomes visible.
It turns out that adding the observer requires the shared font panel
object to be created.
That is apparently a very expensive operation that is regressing
the initialization time for the WKWebView.
We should initialize the NSFontPanel lazily, only when we make the entire
view editable.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _setEditable:]):
* UIProcess/API/mac/WKView.mm:
(-[WKView addWindowObserversForWindow:]):
(-[WKView _addFontPanelObserver]):
(-[WKView removeWindowObservers]):
(-[WKView observeValueForKeyPath:ofObject:change:context:]):
* UIProcess/API/mac/WKViewInternal.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPImacWKViewmm">trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPImacWKViewInternalh">trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (182036 => 182037)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-03-26 23:23:57 UTC (rev 182036)
+++ trunk/Source/WebKit2/ChangeLog        2015-03-26 23:24:02 UTC (rev 182037)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2015-03-26  Enrica Casucci  &lt;enrica@apple.com&gt;
+
+        REGRESSION(r1807689): Slower startup time for WKWebView.
+        https://bugs.webkit.org/show_bug.cgi?id=143115
+        rdar://problem/20233711
+
+        Reviewed by Anders Carlsson.
+
+        In http://trac.webkit.org/changeset/180768 we added an observer to
+        track visibility of the NSFontPanel to ensure we could fetch the font
+        information for the current selection when the panel first becomes visible.
+        It turns out that adding the observer requires the shared font panel
+        object to be created.
+        That is apparently a very expensive operation that is regressing
+        the initialization time for the WKWebView.
+        We should initialize the NSFontPanel lazily, only when we make the entire
+        view editable.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _setEditable:]):
+        * UIProcess/API/mac/WKView.mm:
+        (-[WKView addWindowObserversForWindow:]):
+        (-[WKView _addFontPanelObserver]):
+        (-[WKView removeWindowObservers]):
+        (-[WKView observeValueForKeyPath:ofObject:change:context:]):
+        * UIProcess/API/mac/WKViewInternal.h:
+
</ins><span class="cx"> 2015-03-26  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Progress towards CMake on Mac.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (182036 => 182037)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-03-26 23:23:57 UTC (rev 182036)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-03-26 23:24:02 UTC (rev 182037)
</span><span class="lines">@@ -1659,6 +1659,7 @@
</span><span class="cx"> - (void)_setEditable:(BOOL)editable
</span><span class="cx"> {
</span><span class="cx">     _page-&gt;setEditable(editable);
</span><ins>+    [_wkView _addFontPanelObserver];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (_WKRemoteObjectRegistry *)_remoteObjectRegistry
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPImacWKViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm (182036 => 182037)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm        2015-03-26 23:23:57 UTC (rev 182036)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm        2015-03-26 23:24:02 UTC (rev 182037)
</span><span class="lines">@@ -2609,10 +2609,6 @@
</span><span class="cx">                                                      name:@&quot;_NSWindowDidChangeContentsHostedInLayerSurfaceNotification&quot; object:window];
</span><span class="cx">         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidChangeOcclusionState:)
</span><span class="cx">                                                      name:NSWindowDidChangeOcclusionStateNotification object:window];
</span><del>-        [[NSFontPanel sharedFontPanel] addObserver:self
-                                        forKeyPath:@&quot;visible&quot;
-                                           options:NSKeyValueObservingOptionNew
-                                           context:nil];
</del><span class="cx"> #if __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101000
</span><span class="cx">         [window addObserver:self forKeyPath:@&quot;contentLayoutRect&quot; options:NSKeyValueObservingOptionInitial context:keyValueObservingContext];
</span><span class="cx">         [window addObserver:self forKeyPath:@&quot;titlebarAppearsTransparent&quot; options:NSKeyValueObservingOptionInitial context:keyValueObservingContext];
</span><span class="lines">@@ -2621,6 +2617,11 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_addFontPanelObserver
+{
+    [[NSFontPanel sharedFontPanel] addObserver:self forKeyPath:@&quot;visible&quot; options:0 context:keyValueObservingContext];
+}
+
</ins><span class="cx"> - (void)removeWindowObservers
</span><span class="cx"> {
</span><span class="cx">     NSWindow *window = _data-&gt;_targetWindowForMovePreparation ? _data-&gt;_targetWindowForMovePreparation : [self window];
</span><span class="lines">@@ -2637,7 +2638,8 @@
</span><span class="cx">     [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidChangeScreenNotification object:window];
</span><span class="cx">     [[NSNotificationCenter defaultCenter] removeObserver:self name:@&quot;_NSWindowDidChangeContentsHostedInLayerSurfaceNotification&quot; object:window];
</span><span class="cx">     [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidChangeOcclusionStateNotification object:window];
</span><del>-    [[NSFontPanel sharedFontPanel] removeObserver:self forKeyPath:@&quot;visible&quot; context:nil];
</del><ins>+    if (_data-&gt;_page-&gt;isEditable())
+        [[NSFontPanel sharedFontPanel] removeObserver:self forKeyPath:@&quot;visible&quot; context:keyValueObservingContext];
</ins><span class="cx"> #if __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101000
</span><span class="cx">     [window removeObserver:self forKeyPath:@&quot;contentLayoutRect&quot; context:keyValueObservingContext];
</span><span class="cx">     [window removeObserver:self forKeyPath:@&quot;titlebarAppearsTransparent&quot; context:keyValueObservingContext];
</span><span class="lines">@@ -3848,18 +3850,18 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
</span><span class="cx"> {
</span><del>-    if ([NSFontPanel sharedFontPanelExists] &amp;&amp; object == [NSFontPanel sharedFontPanel]) {
</del><ins>+    if (context != keyValueObservingContext) {
+        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
+        return;
+    }
+
+    if ([keyPath isEqualToString:@&quot;visible&quot;] &amp;&amp; [NSFontPanel sharedFontPanelExists] &amp;&amp; object == [NSFontPanel sharedFontPanel]) {
</ins><span class="cx">         [self updateFontPanelIfNeeded];
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> #if __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101000
</span><del>-    if (context == keyValueObservingContext) {
-        if ([keyPath isEqualToString:@&quot;contentLayoutRect&quot;] || [keyPath isEqualToString:@&quot;titlebarAppearsTransparent&quot;])
-            [self _updateContentInsetsIfAutomatic];
-        return;
-    }
-
-    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
</del><ins>+    if ([keyPath isEqualToString:@&quot;contentLayoutRect&quot;] || [keyPath isEqualToString:@&quot;titlebarAppearsTransparent&quot;])
+        [self _updateContentInsetsIfAutomatic];
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPImacWKViewInternalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h (182036 => 182037)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h        2015-03-26 23:23:57 UTC (rev 182036)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h        2015-03-26 23:24:02 UTC (rev 182037)
</span><span class="lines">@@ -132,6 +132,7 @@
</span><span class="cx"> - (void)_windowDidOrderOnScreen:(NSNotification *)notification;
</span><span class="cx"> - (void)_windowDidOrderOffScreen:(NSNotification *)notification;
</span><span class="cx"> 
</span><ins>+- (void)_addFontPanelObserver;
</ins><span class="cx"> // FullScreen
</span><span class="cx"> 
</span><span class="cx"> @property (readonly) BOOL _hasFullScreenWindowController;
</span></span></pre>
</div>
</div>

</body>
</html>