<!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>[199399] 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/199399">199399</a></dd>
<dt>Author</dt> <dd>enrica@apple.com</dd>
<dt>Date</dt> <dd>2016-04-12 18:07:26 -0700 (Tue, 12 Apr 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Should retrieve text surrounding the selection when performing lookup.
https://bugs.webkit.org/show_bug.cgi?id=156525
rdar://problem/25043678

Reviewed by Tim Horton.

The lookup functionality requires the surrounding text to improve
the quality of the results. This patch changes the implementation of
_lookup to retrieve the text before and the text after the selection.
It also renames DictationContextCallback to SelectionContextCallback so
that it can be used for both dictation and lookup, since they both need
the surrounding text.

* UIProcess/AutoCorrectionCallback.h:
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView _lookup:]):
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::autocorrectionDataCallback):
(WebKit::WebPageProxy::selectionContextCallback):
(WebKit::WebPageProxy::getAutocorrectionContext):
(WebKit::WebPageProxy::getSelectionContext):
(WebKit::WebPageProxy::handleTwoFingerTapAtPoint):
(WebKit::WebPageProxy::dictationContextCallback): Deleted.
(WebKit::WebPageProxy::getLookupContextAtPoint): Deleted.
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::performDefaultBehaviorForKeyEvent):
(WebKit::WebPage::getSelectionContext):
(WebKit::WebPage::accessibilityObjectForMainFramePlugin):
(WebKit::WebPage::requestDictationContext):
(WebKit::WebPage::replaceSelectedText):
(WebKit::WebPage::getLookupContextAtPoint): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAutoCorrectionCallbackh">trunk/Source/WebKit2/UIProcess/AutoCorrectionCallback.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxymessagesin">trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKContentViewInteractionmm">trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWebPageProxyIOSmm">trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagemessagesin">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm">trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (199398 => 199399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-04-13 00:48:50 UTC (rev 199398)
+++ trunk/Source/WebKit2/ChangeLog        2016-04-13 01:07:26 UTC (rev 199399)
</span><span class="lines">@@ -1,3 +1,41 @@
</span><ins>+2016-04-12  Enrica Casucci  &lt;enrica@apple.com&gt;
+
+        Should retrieve text surrounding the selection when performing lookup.
+        https://bugs.webkit.org/show_bug.cgi?id=156525
+        rdar://problem/25043678
+
+        Reviewed by Tim Horton.
+
+        The lookup functionality requires the surrounding text to improve
+        the quality of the results. This patch changes the implementation of
+        _lookup to retrieve the text before and the text after the selection.
+        It also renames DictationContextCallback to SelectionContextCallback so
+        that it can be used for both dictation and lookup, since they both need
+        the surrounding text.
+
+        * UIProcess/AutoCorrectionCallback.h:
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView _lookup:]):
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::autocorrectionDataCallback):
+        (WebKit::WebPageProxy::selectionContextCallback):
+        (WebKit::WebPageProxy::getAutocorrectionContext):
+        (WebKit::WebPageProxy::getSelectionContext):
+        (WebKit::WebPageProxy::handleTwoFingerTapAtPoint):
+        (WebKit::WebPageProxy::dictationContextCallback): Deleted.
+        (WebKit::WebPageProxy::getLookupContextAtPoint): Deleted.
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::performDefaultBehaviorForKeyEvent):
+        (WebKit::WebPage::getSelectionContext):
+        (WebKit::WebPage::accessibilityObjectForMainFramePlugin):
+        (WebKit::WebPage::requestDictationContext):
+        (WebKit::WebPage::replaceSelectedText):
+        (WebKit::WebPage::getLookupContextAtPoint): Deleted.
+
</ins><span class="cx"> 2016-04-12  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Dock controls are not available in toolbar if Web Inspector window leaves fullscreen
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAutoCorrectionCallbackh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/AutoCorrectionCallback.h (199398 => 199399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/AutoCorrectionCallback.h        2016-04-13 00:48:50 UTC (rev 199398)
+++ trunk/Source/WebKit2/UIProcess/AutoCorrectionCallback.h        2016-04-13 01:07:26 UTC (rev 199399)
</span><span class="lines">@@ -36,7 +36,7 @@
</span><span class="cx"> 
</span><span class="cx"> typedef GenericCallback&lt;const Vector&lt;WebCore::FloatRect&gt;&amp;, const String&amp;, double, uint64_t&gt; AutocorrectionDataCallback;
</span><span class="cx"> typedef GenericCallback&lt;const String&amp;, const String&amp;, const String&amp;, const String&amp;, uint64_t, uint64_t&gt; AutocorrectionContextCallback;
</span><del>-typedef GenericCallback&lt;const String&amp;, const String&amp;, const String&amp;&gt; DictationContextCallback;
</del><ins>+typedef GenericCallback&lt;const String&amp;, const String&amp;, const String&amp;&gt; SelectionContextCallback;
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (199398 => 199399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2016-04-13 00:48:50 UTC (rev 199398)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2016-04-13 01:07:26 UTC (rev 199399)
</span><span class="lines">@@ -515,7 +515,7 @@
</span><span class="cx">     void disableDoubleTapGesturesDuringTapIfNecessary(uint64_t requestID);
</span><span class="cx">     void didFinishDrawingPagesToPDF(const IPC::DataReference&amp;);
</span><span class="cx">     void contentSizeCategoryDidChange(const String&amp; contentSizeCategory);
</span><del>-    void getLookupContextAtPoint(const WebCore::IntPoint&amp;, std::function&lt;void(const String&amp;, CallbackBase::Error)&gt;);
</del><ins>+    void getSelectionContext(std::function&lt;void(const String&amp;, const String&amp;, const String&amp;, CallbackBase::Error)&gt;);
</ins><span class="cx">     void handleTwoFingerTapAtPoint(const WebCore::IntPoint&amp;, std::function&lt;void(const String&amp;, CallbackBase::Error)&gt;);
</span><span class="cx">     void updateForceAlwaysUserScalable();
</span><span class="cx"> #endif
</span><span class="lines">@@ -1365,7 +1365,7 @@
</span><span class="cx">     void touchesCallback(const WebCore::IntPoint&amp;, uint32_t, uint64_t);
</span><span class="cx">     void autocorrectionDataCallback(const Vector&lt;WebCore::FloatRect&gt;&amp;, const String&amp;, float, uint64_t, uint64_t);
</span><span class="cx">     void autocorrectionContextCallback(const String&amp;, const String&amp;, const String&amp;, const String&amp;, uint64_t, uint64_t, uint64_t);
</span><del>-    void dictationContextCallback(const String&amp;, const String&amp;, const String&amp;, uint64_t);
</del><ins>+    void selectionContextCallback(const String&amp;, const String&amp;, const String&amp;, uint64_t);
</ins><span class="cx">     void interpretKeyEvent(const EditorState&amp;, bool isCharEvent, bool&amp; handled);
</span><span class="cx">     void showPlaybackTargetPicker(bool hasVideo, const WebCore::IntRect&amp; elementRect);
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxymessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (199398 => 199399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2016-04-13 00:48:50 UTC (rev 199398)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2016-04-13 01:07:26 UTC (rev 199399)
</span><span class="lines">@@ -174,7 +174,7 @@
</span><span class="cx">     TouchesCallback(WebCore::IntPoint point, uint32_t touches, uint64_t callbackID)
</span><span class="cx">     AutocorrectionDataCallback(Vector&lt;WebCore::FloatRect&gt; textRects, String fontName, double fontSize, uint64_t traits, uint64_t callbackID)
</span><span class="cx">     AutocorrectionContextCallback(String beforeText, String markedText, String selectedText, String afterText, uint64_t location, uint64_t length, uint64_t callbackID)
</span><del>-    DictationContextCallback(String selectedText, String beforeText, String afterText, uint64_t callbackID)
</del><ins>+    SelectionContextCallback(String selectedText, String beforeText, String afterText, uint64_t callbackID)
</ins><span class="cx">     InterpretKeyEvent(struct WebKit::EditorState state, bool isCharEvent) -&gt; (bool handled)
</span><span class="cx">     DidReceivePositionInformation(struct WebKit::InteractionInformationAtPosition information)
</span><span class="cx">     SaveImageToLibrary(WebKit::SharedMemory::Handle handle, uint64_t size)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewInteractionmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm (199398 => 199399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm        2016-04-13 00:48:50 UTC (rev 199398)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm        2016-04-13 01:07:26 UTC (rev 199399)
</span><span class="lines">@@ -216,11 +216,13 @@
</span><span class="cx"> - (void)scheduleChineseTransliterationForText:(NSString *)text;
</span><span class="cx"> - (void)showShareSheetFor:(NSString *)selectedTerm fromRect:(CGRect)presentationRect;
</span><span class="cx"> - (void)lookup:(NSString *)textWithContext fromRect:(CGRect)presentationRect;
</span><ins>+- (void)lookup:(NSString *)textWithContext withRange:(NSRange)range fromRect:(CGRect)presentationRect;
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @interface UIWKSelectionAssistant (StagingToRemove)
</span><span class="cx"> - (void)showTextServiceFor:(NSString *)selectedTerm fromRect:(CGRect)presentationRect;
</span><span class="cx"> - (void)lookup:(NSString *)textWithContext fromRect:(CGRect)presentationRect;
</span><ins>+- (void)lookup:(NSString *)textWithContext withRange:(NSRange)range fromRect:(CGRect)presentationRect;
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @interface UIKeyboardImpl (StagingToRemove)
</span><span class="lines">@@ -1615,18 +1617,26 @@
</span><span class="cx"> - (void)_lookup:(id)sender
</span><span class="cx"> {
</span><span class="cx">     RetainPtr&lt;WKContentView&gt; view = self;
</span><del>-    _page-&gt;getSelectionOrContentsAsString([view](const String&amp; string, CallbackBase::Error error) {
</del><ins>+    _page-&gt;getSelectionContext([view](const String&amp; selectedText, const String&amp; textBefore, const String&amp; textAfter, CallbackBase::Error error) {
</ins><span class="cx">         if (error != CallbackBase::Error::None)
</span><span class="cx">             return;
</span><del>-        if (!string)
</del><ins>+        if (!selectedText)
</ins><span class="cx">             return;
</span><span class="cx">         
</span><span class="cx">         CGRect presentationRect = view-&gt;_page-&gt;editorState().selectionIsRange ? view-&gt;_page-&gt;editorState().postLayoutData().selectionRects[0].rect() : view-&gt;_page-&gt;editorState().postLayoutData().caretRectAtStart;
</span><span class="cx">         
</span><del>-        if (view-&gt;_textSelectionAssistant &amp;&amp; [view-&gt;_textSelectionAssistant respondsToSelector:@selector(lookup:fromRect:)])
-            [view-&gt;_textSelectionAssistant lookup:string fromRect:presentationRect];
-        else if (view-&gt;_webSelectionAssistant &amp;&amp; [view-&gt;_webSelectionAssistant respondsToSelector:@selector(lookup:fromRect:)])
-            [view-&gt;_webSelectionAssistant lookup:string fromRect:presentationRect];
</del><ins>+        String selectionContext = textBefore + selectedText + textAfter;
+        if (view-&gt;_textSelectionAssistant) {
+            if ([view-&gt;_textSelectionAssistant respondsToSelector:@selector(lookup:withRange:fromRect:)])
+                [view-&gt;_textSelectionAssistant lookup:selectionContext withRange:NSMakeRange(textBefore.length(), selectedText.length()) fromRect:presentationRect];
+            else
+                [view-&gt;_textSelectionAssistant lookup:selectedText fromRect:presentationRect];
+        } else {
+            if ([view-&gt;_webSelectionAssistant respondsToSelector:@selector(lookup:withRange:fromRect:)])
+                [view-&gt;_webSelectionAssistant lookup:selectionContext withRange:NSMakeRange(textBefore.length(), selectedText.length()) fromRect:presentationRect];
+            else
+                [view-&gt;_webSelectionAssistant lookup:selectedText fromRect:presentationRect];
+        }
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWebPageProxyIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm (199398 => 199399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm        2016-04-13 00:48:50 UTC (rev 199398)
+++ trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm        2016-04-13 01:07:26 UTC (rev 199399)
</span><span class="lines">@@ -160,9 +160,9 @@
</span><span class="cx">     callback-&gt;performCallbackWithReturnValue(rects, fontName, fontSize, fontTraits);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPageProxy::dictationContextCallback(const String&amp; selectedText, const String&amp; beforeText, const String&amp; afterText, uint64_t callbackID)
</del><ins>+void WebPageProxy::selectionContextCallback(const String&amp; selectedText, const String&amp; beforeText, const String&amp; afterText, uint64_t callbackID)
</ins><span class="cx"> {
</span><del>-    auto callback = m_callbacks.take&lt;DictationContextCallback&gt;(callbackID);
</del><ins>+    auto callback = m_callbacks.take&lt;SelectionContextCallback&gt;(callbackID);
</ins><span class="cx">     if (!callback) {
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="cx">         return;
</span><span class="lines">@@ -553,15 +553,15 @@
</span><span class="cx">     m_process-&gt;sendSync(Messages::WebPage::GetAutocorrectionContext(), Messages::WebPage::GetAutocorrectionContext::Reply(beforeContext, markedText, selectedText, afterContext, location, length), m_pageID);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPageProxy::getLookupContextAtPoint(const WebCore::IntPoint&amp; point, std::function&lt;void(const String&amp;, CallbackBase::Error)&gt; callbackFunction)
</del><ins>+void WebPageProxy::getSelectionContext(std::function&lt;void(const String&amp;, const String&amp;, const String&amp;, CallbackBase::Error)&gt; callbackFunction)
</ins><span class="cx"> {
</span><span class="cx">     if (!isValid()) {
</span><del>-        callbackFunction(String(), CallbackBase::Error::Unknown);
</del><ins>+        callbackFunction(String(), String(), String(), CallbackBase::Error::Unknown);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     uint64_t callbackID = m_callbacks.put(WTFMove(callbackFunction), m_process-&gt;throttler().backgroundActivityToken());
</span><del>-    m_process-&gt;send(Messages::WebPage::GetLookupContextAtPoint(point, callbackID), m_pageID);
</del><ins>+    m_process-&gt;send(Messages::WebPage::GetSelectionContext(callbackID), m_pageID);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::handleTwoFingerTapAtPoint(const WebCore::IntPoint&amp; point, std::function&lt;void(const String&amp;, CallbackBase::Error)&gt; callbackFunction)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (199398 => 199399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-04-13 00:48:50 UTC (rev 199398)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-04-13 01:07:26 UTC (rev 199399)
</span><span class="lines">@@ -556,7 +556,7 @@
</span><span class="cx">     void resetAssistedNodeForFrame(WebFrame*);
</span><span class="cx">     WebCore::IntRect rectForElementAtInteractionLocation();
</span><span class="cx">     void updateSelectionAppearance();
</span><del>-    void getLookupContextAtPoint(const WebCore::IntPoint, uint64_t callbackID);
</del><ins>+    void getSelectionContext(uint64_t callbackID);
</ins><span class="cx">     void handleTwoFingerTapAtPoint(const WebCore::IntPoint&amp;, uint64_t callbackID);
</span><span class="cx"> #if ENABLE(IOS_TOUCH_EVENTS)
</span><span class="cx">     void dispatchAsynchronousTouchEvents(const Vector&lt;WebTouchEvent, 1&gt;&amp; queue);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagemessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (199398 => 199399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2016-04-13 00:48:50 UTC (rev 199398)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2016-04-13 01:07:26 UTC (rev 199399)
</span><span class="lines">@@ -90,7 +90,7 @@
</span><span class="cx">     ApplicationDidBecomeActive()
</span><span class="cx">     ContentSizeCategoryDidChange(String contentSizeCategory)
</span><span class="cx">     ExecuteEditCommandWithCallback(String name, uint64_t callbackID)
</span><del>-    GetLookupContextAtPoint(WebCore::IntPoint point, uint64_t callbackID)
</del><ins>+    GetSelectionContext(uint64_t callbackID)
</ins><span class="cx">     SetAllowsMediaDocumentInlinePlayback(bool allows)
</span><span class="cx">     HandleTwoFingerTapAtPoint(WebCore::IntPoint point, uint64_t callbackID)
</span><span class="cx">     UpdateForceAlwaysUserScalable()
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (199398 => 199399)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2016-04-13 00:48:50 UTC (rev 199398)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2016-04-13 01:07:26 UTC (rev 199399)
</span><span class="lines">@@ -395,18 +395,20 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPage::getLookupContextAtPoint(const WebCore::IntPoint point, uint64_t callbackID)
</del><ins>+void WebPage::getSelectionContext(uint64_t callbackID)
</ins><span class="cx"> {
</span><span class="cx">     Frame&amp; frame = m_page-&gt;focusController().focusedOrMainFrame();
</span><del>-    VisiblePosition position = frame.visiblePositionForPoint(point);
-    String resultString;
-    if (!position.isNull()) {
-        // As context, we are going to use 250 characters of text before and after the point.
-        RefPtr&lt;Range&gt; fullCharacterRange = rangeExpandedAroundPositionByCharacters(position, 250);
-        if (fullCharacterRange)
-            resultString = plainText(fullCharacterRange.get());
</del><ins>+    if (!frame.selection().isRange()) {
+        send(Messages::WebPageProxy::SelectionContextCallback(String(), String(), String(), callbackID));
+        return;
</ins><span class="cx">     }
</span><del>-    send(Messages::WebPageProxy::StringCallback(resultString, callbackID));
</del><ins>+    const int selectionExtendedContextLength = 350;
+    
+    String selectedText = plainTextReplacingNoBreakSpace(frame.selection().selection().toNormalizedRange().get());
+    String textBefore = plainTextReplacingNoBreakSpace(rangeExpandedByCharactersInDirectionAtWordBoundary(frame.selection().selection().start(), selectionExtendedContextLength, DirectionBackward).get(), TextIteratorDefaultBehavior, true);
+    String textAfter = plainTextReplacingNoBreakSpace(rangeExpandedByCharactersInDirectionAtWordBoundary(frame.selection().selection().end(), selectionExtendedContextLength, DirectionForward).get(), TextIteratorDefaultBehavior, true);
+
+    send(Messages::WebPageProxy::SelectionContextCallback(selectedText, textBefore, textAfter, callbackID));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> NSObject *WebPage::accessibilityObjectForMainFramePlugin()
</span><span class="lines">@@ -1911,7 +1913,7 @@
</span><span class="cx">             contextAfter = plainTextReplacingNoBreakSpace(Range::create(*frame.document(), endPosition, lastPosition).ptr());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    send(Messages::WebPageProxy::DictationContextCallback(selectedText, contextBefore, contextAfter, callbackID));
</del><ins>+    send(Messages::WebPageProxy::SelectionContextCallback(selectedText, contextBefore, contextAfter, callbackID));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPage::replaceSelectedText(const String&amp; oldText, const String&amp; newText)
</span></span></pre>
</div>
</div>

</body>
</html>