<!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>[175973] 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/175973">175973</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2014-11-11 13:39:46 -0800 (Tue, 11 Nov 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Occasional assertion failure under recommendedScrollbarStyleDidChange()
https://bugs.webkit.org/show_bug.cgi?id=138604
&lt;rdar://problem/18855914&gt;

Reviewed by Beth Dakin.

It is possible for AppKit to install tracking areas into our view
behind our back, but we have code that depends on knowing exactly
the set of tracking areas installed on WKView.

Make this more robust by keeping a reference to the tracking area we
use for many things and manipulating that instead of making assumptions
about the total set of tracking areas on WKView.

* UIProcess/API/mac/WKView.mm:
(-[WKView _primaryTrackingArea]):
(-[WKView _replacePrimaryTrackingArea:]):
Provide a 'primary' tracking area setter/getter.

(-[WKView initWithFrame:context:configuration:webView:]):
Keep a reference to the original tracking area installed at initialization time.

* UIProcess/API/mac/WKViewInternal.h:
* UIProcess/mac/PageClientImpl.mm:
(WebKit::PageClientImpl::recommendedScrollbarStyleDidChange):
Instead of walking the set of tracking areas, make use of the fact that
we know exactly which tracking area we installed, and uninstall just that
one, and replace it with our newly-built one.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</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>
<li><a href="#trunkSourceWebKit2UIProcessmacPageClientImplmm">trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (175972 => 175973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-11-11 21:37:03 UTC (rev 175972)
+++ trunk/Source/WebKit2/ChangeLog        2014-11-11 21:39:46 UTC (rev 175973)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2014-11-11  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        Occasional assertion failure under recommendedScrollbarStyleDidChange()
+        https://bugs.webkit.org/show_bug.cgi?id=138604
+        &lt;rdar://problem/18855914&gt;
+
+        Reviewed by Beth Dakin.
+
+        It is possible for AppKit to install tracking areas into our view
+        behind our back, but we have code that depends on knowing exactly
+        the set of tracking areas installed on WKView.
+
+        Make this more robust by keeping a reference to the tracking area we
+        use for many things and manipulating that instead of making assumptions
+        about the total set of tracking areas on WKView.
+
+        * UIProcess/API/mac/WKView.mm:
+        (-[WKView _primaryTrackingArea]):
+        (-[WKView _replacePrimaryTrackingArea:]):
+        Provide a 'primary' tracking area setter/getter.
+
+        (-[WKView initWithFrame:context:configuration:webView:]):
+        Keep a reference to the original tracking area installed at initialization time.
+
+        * UIProcess/API/mac/WKViewInternal.h:
+        * UIProcess/mac/PageClientImpl.mm:
+        (WebKit::PageClientImpl::recommendedScrollbarStyleDidChange):
+        Instead of walking the set of tracking areas, make use of the fact that
+        we know exactly which tracking area we installed, and uninstall just that
+        one, and replace it with our newly-built one.
+
</ins><span class="cx"> 2014-11-11  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Finish moving CTFontGetVerticalGlyphsForCharacters and CTLineCreateWithUniCharProvider out from WKSI
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPImacWKViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm (175972 => 175973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm        2014-11-11 21:37:03 UTC (rev 175972)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm        2014-11-11 21:39:46 UTC (rev 175973)
</span><span class="lines">@@ -170,6 +170,8 @@
</span><span class="cx">     RetainPtr&lt;WKBrowsingContextController&gt; _browsingContextController;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    RetainPtr&lt;NSTrackingArea&gt; _primaryTrackingArea;
+
</ins><span class="cx">     // For ToolTips.
</span><span class="cx">     NSToolTipTag _lastToolTipTag;
</span><span class="cx">     id _trackingRectOwner;
</span><span class="lines">@@ -3493,6 +3495,18 @@
</span><span class="cx">     return _data-&gt;_page-&gt;suppressVisibilityUpdates();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (NSTrackingArea *)_primaryTrackingArea
+{
+    return _data-&gt;_primaryTrackingArea.get();
+}
+
+- (void)_setPrimaryTrackingArea:(NSTrackingArea *)trackingArea
+{
+    [self removeTrackingArea:_data-&gt;_primaryTrackingArea.get()];
+    _data-&gt;_primaryTrackingArea = trackingArea;
+    [self addTrackingArea:trackingArea];
+}
+
</ins><span class="cx"> - (instancetype)initWithFrame:(NSRect)frame context:(WebContext&amp;)context configuration:(WebPageConfiguration)webPageConfiguration webView:(WKWebView *)webView
</span><span class="cx"> {
</span><span class="cx">     self = [super initWithFrame:frame];
</span><span class="lines">@@ -3510,14 +3524,10 @@
</span><span class="cx">     else
</span><span class="cx">         options |= NSTrackingActiveInKeyWindow;
</span><span class="cx"> 
</span><del>-    NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:frame
-                                                                options:options
-                                                                  owner:self
-                                                               userInfo:nil];
-    [self addTrackingArea:trackingArea];
-    [trackingArea release];
</del><ins>+    _data = [[WKViewData alloc] init];
+    _data-&gt;_primaryTrackingArea = adoptNS([[NSTrackingArea alloc] initWithRect:frame options:options owner:self userInfo:nil]);
+    [self addTrackingArea:_data-&gt;_primaryTrackingArea.get()];
</ins><span class="cx"> 
</span><del>-    _data = [[WKViewData alloc] init];
</del><span class="cx">     _data-&gt;_pageClient = std::make_unique&lt;PageClientImpl&gt;(self, webView);
</span><span class="cx">     _data-&gt;_page = context.createWebPage(*_data-&gt;_pageClient, WTF::move(webPageConfiguration));
</span><span class="cx">     _data-&gt;_page-&gt;setAddsVisitedLinks(context.historyClient().addsVisitedLinks());
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPImacWKViewInternalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h (175972 => 175973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h        2014-11-11 21:37:03 UTC (rev 175972)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h        2014-11-11 21:39:46 UTC (rev 175973)
</span><span class="lines">@@ -133,4 +133,6 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)_dismissActionMenuPopovers;
</span><span class="cx"> 
</span><ins>+@property (nonatomic, retain, setter=_setPrimaryTrackingArea:) NSTrackingArea *_primaryTrackingArea;
+
</ins><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacPageClientImplmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.mm (175972 => 175973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.mm        2014-11-11 21:37:03 UTC (rev 175972)
+++ trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.mm        2014-11-11 21:39:46 UTC (rev 175973)
</span><span class="lines">@@ -585,13 +585,6 @@
</span><span class="cx"> 
</span><span class="cx"> void PageClientImpl::recommendedScrollbarStyleDidChange(int32_t newStyle)
</span><span class="cx"> {
</span><del>-    NSArray *trackingAreas = [m_wkView trackingAreas];
-    NSUInteger count = [trackingAreas count];
-    ASSERT(count == 1);
-    
-    for (NSUInteger i = 0; i &lt; count; ++i)
-        [m_wkView removeTrackingArea:[trackingAreas objectAtIndex:i]];
-
</del><span class="cx">     // Now re-create a tracking area with the appropriate options given the new scrollbar style
</span><span class="cx">     NSTrackingAreaOptions options = NSTrackingMouseMoved | NSTrackingMouseEnteredAndExited | NSTrackingInVisibleRect;
</span><span class="cx">     if (newStyle == NSScrollerStyleLegacy)
</span><span class="lines">@@ -599,12 +592,8 @@
</span><span class="cx">     else
</span><span class="cx">         options |= NSTrackingActiveInKeyWindow;
</span><span class="cx"> 
</span><del>-    NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:[m_wkView frame]
-                                                                options:options
-                                                                  owner:m_wkView
-                                                               userInfo:nil];
-    [m_wkView addTrackingArea:trackingArea];
-    [trackingArea release];
</del><ins>+    RetainPtr&lt;NSTrackingArea&gt; trackingArea = adoptNS([[NSTrackingArea alloc] initWithRect:[m_wkView frame] options:options owner:m_wkView userInfo:nil]);
+    [m_wkView _setPrimaryTrackingArea:trackingArea.get()];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageClientImpl::intrinsicContentSizeDidChange(const IntSize&amp; intrinsicContentSize)
</span></span></pre>
</div>
</div>

</body>
</html>