<!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>[208191] trunk/Source</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/208191">208191</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2016-10-31 16:19:19 -0700 (Mon, 31 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WK1] Candidate visibility should not update as a result of selection during a dictionary lookup
https://bugs.webkit.org/show_bug.cgi?id=164236
&lt;rdar://problem/28747712&gt;

Reviewed by Beth Dakin.

Source/WebCore:

Moves state that keeps track of whether or not a dictionary lookup is active from the WebPage to the Editor, so
that when clicking a text field or contenteditable in WK1 or WK2, we are able to avoid notifying the
WebEditorClient of the selection change.

Changes to WK2 are covered by existing unit tests in WKWebViewCandidateTests which verify that clicking does not
thrash candidate list visibility. A similar test will be added in the future for the WK1 case in CandidateTests.

* editing/Editor.h:
(WebCore::Editor::setIsGettingDictionaryPopupInfo):
(WebCore::Editor::isGettingDictionaryPopupInfo):

Source/WebKit/mac:

See WebCore ChangeLog for more detail. Sets the Editor's isGettingDictionaryPopupInfo state to true during a
dictionary lookup.

* WebCoreSupport/WebEditorClient.mm:
(WebEditorClient::respondToChangedSelection):
* WebView/WebImmediateActionController.mm:
(+[WebImmediateActionController _dictionaryPopupInfoForRange:inFrame:withLookupOptions:indicatorOptions:transition:]):

Source/WebKit2:

See WebCore ChangeLog for more detail. Removes m_isGettingDictionaryPopupInfo from the WebPage in favor of
keeping track of the same state in Editor, so that both the WK1 and WK2 cases can share the same codepath.

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::didChangeSelection):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/mac/WebPageMac.mm:
(WebKit::WebPage::dictionaryPopupInfoForRange):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreeditingEditorh">trunk/Source/WebCore/editing/Editor.h</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebEditorClientmm">trunk/Source/WebKit/mac/WebCoreSupport/WebEditorClient.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebImmediateActionControllermm">trunk/Source/WebKit/mac/WebView/WebImmediateActionController.mm</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacWebPageMacmm">trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208190 => 208191)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-31 23:18:38 UTC (rev 208190)
+++ trunk/Source/WebCore/ChangeLog        2016-10-31 23:19:19 UTC (rev 208191)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2016-10-31  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        [WK1] Candidate visibility should not update as a result of selection during a dictionary lookup
+        https://bugs.webkit.org/show_bug.cgi?id=164236
+        &lt;rdar://problem/28747712&gt;
+
+        Reviewed by Beth Dakin.
+
+        Moves state that keeps track of whether or not a dictionary lookup is active from the WebPage to the Editor, so
+        that when clicking a text field or contenteditable in WK1 or WK2, we are able to avoid notifying the
+        WebEditorClient of the selection change.
+
+        Changes to WK2 are covered by existing unit tests in WKWebViewCandidateTests which verify that clicking does not
+        thrash candidate list visibility. A similar test will be added in the future for the WK1 case in CandidateTests.
+
+        * editing/Editor.h:
+        (WebCore::Editor::setIsGettingDictionaryPopupInfo):
+        (WebCore::Editor::isGettingDictionaryPopupInfo):
+
</ins><span class="cx"> 2016-10-31  Antoine Quint  &lt;graouts@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Modern Media Controls] Media Controller: Placard support
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingEditorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/Editor.h (208190 => 208191)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/Editor.h        2016-10-31 23:18:38 UTC (rev 208190)
+++ trunk/Source/WebCore/editing/Editor.h        2016-10-31 23:19:19 UTC (rev 208191)
</span><span class="lines">@@ -476,6 +476,9 @@
</span><span class="cx">     RefPtr&lt;Range&gt; rangeForTextCheckingResult(const TextCheckingResult&amp;) const;
</span><span class="cx">     bool isHandlingAcceptedCandidate() const { return m_isHandlingAcceptedCandidate; }
</span><span class="cx"> 
</span><ins>+    void setIsGettingDictionaryPopupInfo(bool b) { m_isGettingDictionaryPopupInfo = b; }
+    bool isGettingDictionaryPopupInfo() const { return m_isGettingDictionaryPopupInfo; }
+
</ins><span class="cx"> private:
</span><span class="cx">     class WebContentReader;
</span><span class="cx"> 
</span><span class="lines">@@ -551,6 +554,8 @@
</span><span class="cx">     Timer m_telephoneNumberDetectionUpdateTimer;
</span><span class="cx">     Vector&lt;RefPtr&lt;Range&gt;&gt; m_detectedTelephoneNumberRanges;
</span><span class="cx"> #endif
</span><ins>+
+    bool m_isGettingDictionaryPopupInfo { false };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> inline void Editor::setStartNewKillRingSequence(bool flag)
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (208190 => 208191)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2016-10-31 23:18:38 UTC (rev 208190)
+++ trunk/Source/WebKit/mac/ChangeLog        2016-10-31 23:19:19 UTC (rev 208191)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2016-10-31  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        [WK1] Candidate visibility should not update as a result of selection during a dictionary lookup
+        https://bugs.webkit.org/show_bug.cgi?id=164236
+        &lt;rdar://problem/28747712&gt;
+
+        Reviewed by Beth Dakin.
+
+        See WebCore ChangeLog for more detail. Sets the Editor's isGettingDictionaryPopupInfo state to true during a
+        dictionary lookup.
+
+        * WebCoreSupport/WebEditorClient.mm:
+        (WebEditorClient::respondToChangedSelection):
+        * WebView/WebImmediateActionController.mm:
+        (+[WebImmediateActionController _dictionaryPopupInfoForRange:inFrame:withLookupOptions:indicatorOptions:transition:]):
+
</ins><span class="cx"> 2016-10-31  Darin Adler  &lt;darin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Move ChildNode and ParentNode from ExceptionCode to Exception, add support for ExceptionOr&lt;T&amp;&gt;
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebEditorClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebEditorClient.mm (208190 => 208191)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebEditorClient.mm        2016-10-31 23:18:38 UTC (rev 208190)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebEditorClient.mm        2016-10-31 23:19:19 UTC (rev 208191)
</span><span class="lines">@@ -341,6 +341,9 @@
</span><span class="cx"> 
</span><span class="cx"> void WebEditorClient::respondToChangedSelection(Frame* frame)
</span><span class="cx"> {
</span><ins>+    if (frame-&gt;editor().isGettingDictionaryPopupInfo())
+        return;
+
</ins><span class="cx">     NSView&lt;WebDocumentView&gt; *documentView = [[kit(frame) frameView] documentView];
</span><span class="cx">     if ([documentView isKindOfClass:[WebHTMLView class]]) {
</span><span class="cx">         [(WebHTMLView *)documentView _selectionChanged];
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebImmediateActionControllermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebImmediateActionController.mm (208190 => 208191)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebImmediateActionController.mm        2016-10-31 23:18:38 UTC (rev 208190)
+++ trunk/Source/WebKit/mac/WebView/WebImmediateActionController.mm        2016-10-31 23:19:19 UTC (rev 208191)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> #import &lt;WebCore/DataDetection.h&gt;
</span><span class="cx"> #import &lt;WebCore/DataDetectorsSPI.h&gt;
</span><span class="cx"> #import &lt;WebCore/DictionaryLookup.h&gt;
</span><ins>+#import &lt;WebCore/Editor.h&gt;
</ins><span class="cx"> #import &lt;WebCore/EventHandler.h&gt;
</span><span class="cx"> #import &lt;WebCore/FocusController.h&gt;
</span><span class="cx"> #import &lt;WebCore/Frame.h&gt;
</span><span class="lines">@@ -501,11 +502,16 @@
</span><span class="cx"> 
</span><span class="cx"> + (DictionaryPopupInfo)_dictionaryPopupInfoForRange:(Range&amp;)range inFrame:(Frame*)frame withLookupOptions:(NSDictionary *)lookupOptions indicatorOptions:(TextIndicatorOptions)indicatorOptions transition:(TextIndicatorPresentationTransition)presentationTransition
</span><span class="cx"> {
</span><ins>+    Editor&amp; editor = frame-&gt;editor();
+    editor.setIsGettingDictionaryPopupInfo(true);
+
</ins><span class="cx">     // Dictionary API will accept a whitespace-only string and display UI as if it were real text,
</span><span class="cx">     // so bail out early to avoid that.
</span><span class="cx">     DictionaryPopupInfo popupInfo;
</span><del>-    if (range.text().stripWhiteSpace().isEmpty())
</del><ins>+    if (range.text().stripWhiteSpace().isEmpty()) {
+        editor.setIsGettingDictionaryPopupInfo(false);
</ins><span class="cx">         return popupInfo;
</span><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     RenderObject* renderer = range.startContainer().renderer();
</span><span class="cx">     const RenderStyle&amp; style = renderer-&gt;style();
</span><span class="lines">@@ -512,8 +518,10 @@
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;FloatQuad&gt; quads;
</span><span class="cx">     range.absoluteTextQuads(quads);
</span><del>-    if (quads.isEmpty())
</del><ins>+    if (quads.isEmpty()) {
+        editor.setIsGettingDictionaryPopupInfo(false);
</ins><span class="cx">         return popupInfo;
</span><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     IntRect rangeRect = frame-&gt;view()-&gt;contentsToWindow(quads[0].enclosingBoundingBox());
</span><span class="cx"> 
</span><span class="lines">@@ -540,6 +548,8 @@
</span><span class="cx"> 
</span><span class="cx">     if (auto textIndicator = TextIndicator::createWithRange(range, indicatorOptions, presentationTransition))
</span><span class="cx">         popupInfo.textIndicator = textIndicator-&gt;data();
</span><ins>+
+    editor.setIsGettingDictionaryPopupInfo(false);
</ins><span class="cx">     return popupInfo;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (208190 => 208191)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-10-31 23:18:38 UTC (rev 208190)
+++ trunk/Source/WebKit2/ChangeLog        2016-10-31 23:19:19 UTC (rev 208191)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2016-10-31  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        [WK1] Candidate visibility should not update as a result of selection during a dictionary lookup
+        https://bugs.webkit.org/show_bug.cgi?id=164236
+        &lt;rdar://problem/28747712&gt;
+
+        Reviewed by Beth Dakin.
+
+        See WebCore ChangeLog for more detail. Removes m_isGettingDictionaryPopupInfo from the WebPage in favor of
+        keeping track of the same state in Editor, so that both the WK1 and WK2 cases can share the same codepath.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::didChangeSelection):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/mac/WebPageMac.mm:
+        (WebKit::WebPage::dictionaryPopupInfoForRange):
+
</ins><span class="cx"> 2016-10-31  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Implement IntersectionObserver
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (208190 => 208191)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-10-31 23:18:38 UTC (rev 208190)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-10-31 23:19:19 UTC (rev 208191)
</span><span class="lines">@@ -4855,10 +4855,11 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPage::didChangeSelection()
</span><span class="cx"> {
</span><ins>+    Frame&amp; frame = m_page-&gt;focusController().focusedOrMainFrame();
</ins><span class="cx">     // The act of getting Dictionary Popup info can make selection changes that we should not propagate to the UIProcess.
</span><span class="cx">     // Specifically, if there is a caret selection, it will change to a range selection of the word around the caret. And
</span><span class="cx">     // then it will change back.
</span><del>-    if (m_isGettingDictionaryPopupInfo)
</del><ins>+    if (frame.editor().isGettingDictionaryPopupInfo())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     // Similarly, we don't want to propagate changes to the web process when inserting text asynchronously, since we will
</span><span class="lines">@@ -4866,7 +4867,6 @@
</span><span class="cx">     if (m_isSelectingTextWhileInsertingAsynchronously)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    Frame&amp; frame = m_page-&gt;focusController().focusedOrMainFrame();
</del><span class="cx">     FrameView* view = frame.view();
</span><span class="cx"> 
</span><span class="cx">     // If there is a layout pending, we should avoid populating EditorState that require layout to be done or it will
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (208190 => 208191)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-10-31 23:18:38 UTC (rev 208190)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-10-31 23:19:19 UTC (rev 208191)
</span><span class="lines">@@ -1499,7 +1499,6 @@
</span><span class="cx">     bool m_mainFrameProgressCompleted;
</span><span class="cx">     bool m_shouldDispatchFakeMouseMoveEvents;
</span><span class="cx">     bool m_isEditorStateMissingPostLayoutData { false };
</span><del>-    bool m_isGettingDictionaryPopupInfo { false };
</del><span class="cx">     bool m_isSelectingTextWhileInsertingAsynchronously { false };
</span><span class="cx"> 
</span><span class="cx">     enum class EditorStateIsContentEditable { No, Yes, Unset };
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacWebPageMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm (208190 => 208191)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm        2016-10-31 23:18:38 UTC (rev 208190)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm        2016-10-31 23:19:19 UTC (rev 208191)
</span><span class="lines">@@ -59,6 +59,7 @@
</span><span class="cx"> #import &lt;WebCore/BackForwardController.h&gt;
</span><span class="cx"> #import &lt;WebCore/DataDetection.h&gt;
</span><span class="cx"> #import &lt;WebCore/DictionaryLookup.h&gt;
</span><ins>+#import &lt;WebCore/Editor.h&gt;
</ins><span class="cx"> #import &lt;WebCore/EventHandler.h&gt;
</span><span class="cx"> #import &lt;WebCore/FocusController.h&gt;
</span><span class="cx"> #import &lt;WebCore/FrameLoader.h&gt;
</span><span class="lines">@@ -437,11 +438,14 @@
</span><span class="cx"> 
</span><span class="cx"> DictionaryPopupInfo WebPage::dictionaryPopupInfoForRange(Frame* frame, Range&amp; range, NSDictionary **options, TextIndicatorPresentationTransition presentationTransition)
</span><span class="cx"> {
</span><del>-    TemporaryChange&lt;bool&gt; isGettingDictionaryPopupInfoChange { m_isGettingDictionaryPopupInfo, true };
</del><ins>+    Editor&amp; editor = frame-&gt;editor();
+    editor.setIsGettingDictionaryPopupInfo(true);
</ins><span class="cx"> 
</span><span class="cx">     DictionaryPopupInfo dictionaryPopupInfo;
</span><del>-    if (range.text().stripWhiteSpace().isEmpty())
</del><ins>+    if (range.text().stripWhiteSpace().isEmpty()) {
+        editor.setIsGettingDictionaryPopupInfo(false);
</ins><span class="cx">         return dictionaryPopupInfo;
</span><ins>+    }
</ins><span class="cx">     
</span><span class="cx">     RenderObject* renderer = range.startContainer().renderer();
</span><span class="cx">     const RenderStyle&amp; style = renderer-&gt;style();
</span><span class="lines">@@ -448,8 +452,10 @@
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;FloatQuad&gt; quads;
</span><span class="cx">     range.absoluteTextQuads(quads);
</span><del>-    if (quads.isEmpty())
</del><ins>+    if (quads.isEmpty()) {
+        editor.setIsGettingDictionaryPopupInfo(false);
</ins><span class="cx">         return dictionaryPopupInfo;
</span><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     IntRect rangeRect = frame-&gt;view()-&gt;contentsToWindow(quads[0].enclosingBoundingBox());
</span><span class="cx"> 
</span><span class="lines">@@ -479,12 +485,15 @@
</span><span class="cx">         indicatorOptions |= TextIndicatorOptionIncludeSnapshotWithSelectionHighlight;
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;TextIndicator&gt; textIndicator = TextIndicator::createWithRange(range, indicatorOptions, presentationTransition);
</span><del>-    if (!textIndicator)
</del><ins>+    if (!textIndicator) {
+        editor.setIsGettingDictionaryPopupInfo(false);
</ins><span class="cx">         return dictionaryPopupInfo;
</span><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     dictionaryPopupInfo.textIndicator = textIndicator-&gt;data();
</span><span class="cx">     dictionaryPopupInfo.attributedString = scaledNSAttributedString;
</span><span class="cx"> 
</span><ins>+    editor.setIsGettingDictionaryPopupInfo(false);
</ins><span class="cx">     return dictionaryPopupInfo;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>