Diff
Modified: trunk/Source/WebKit2/ChangeLog (183591 => 183592)
--- trunk/Source/WebKit2/ChangeLog 2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/ChangeLog 2015-04-30 00:21:20 UTC (rev 183592)
@@ -1,3 +1,26 @@
+2015-04-29 Enrica Casucci <[email protected]>
+
+ Adding the ability to move selection by granularity on iOS.
+ https://bugs.webkit.org/show_bug.cgi?id=144410
+ rdar://problem/19213337
+
+ Reviewed by Benjamin Poulain.
+
+ This patch also correctly sets _usingGestureForSelection for all
+ the functions that change the selection with a gesture.
+ This way we make sure that the selection drawing is not delayed
+ until the next time we paint.
+
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/ios/WKContentViewInteraction.mm:
+ (-[WKContentView moveSelectionAtBoundary:inDirection:completionHandler:]):
+ * UIProcess/ios/WebPageProxyIOS.mm:
+ (WebKit::WebPageProxy::moveSelectionAtBoundaryWithDirection):
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/WebPage.messages.in:
+ * WebProcess/WebPage/ios/WebPageIOS.mm:
+ (WebKit::WebPage::moveSelectionAtBoundaryWithDirection):
+
2015-04-29 Tim Horton <[email protected]>
UI process sometimes crashes under _takeViewSnapshot when the window is off-screen
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (183591 => 183592)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2015-04-30 00:21:20 UTC (rev 183592)
@@ -470,6 +470,7 @@
void selectTextWithGranularityAtPoint(const WebCore::IntPoint, WebCore::TextGranularity, std::function<void (CallbackBase::Error)>);
void selectPositionAtPoint(const WebCore::IntPoint, std::function<void (CallbackBase::Error)>);
void selectPositionAtBoundaryWithDirection(const WebCore::IntPoint, WebCore::TextGranularity, WebCore::SelectionDirection, std::function<void (CallbackBase::Error)>);
+ void moveSelectionAtBoundaryWithDirection(WebCore::TextGranularity, WebCore::SelectionDirection, std::function<void(CallbackBase::Error)>);
void beginSelectionInDirection(WebCore::SelectionDirection, std::function<void (uint64_t, CallbackBase::Error)>);
void updateSelectionWithExtentPoint(const WebCore::IntPoint, std::function<void (uint64_t, CallbackBase::Error)>);
void requestAutocorrectionData(const String& textForAutocorrection, std::function<void (const Vector<WebCore::FloatRect>&, const String&, double, uint64_t, CallbackBase::Error)>);
Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm (183591 => 183592)
--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm 2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm 2015-04-30 00:21:20 UTC (rev 183592)
@@ -1974,30 +1974,52 @@
- (void)selectPositionAtPoint:(CGPoint)point completionHandler:(void (^)(void))completionHandler
{
+ _usingGestureForSelection = YES;
UIWKSelectionCompletionHandler selectionHandler = [completionHandler copy];
+ RetainPtr<WKContentView> view = self;
- _page->selectPositionAtPoint(WebCore::IntPoint(point), [selectionHandler](WebKit::CallbackBase::Error error) {
+ _page->selectPositionAtPoint(WebCore::IntPoint(point), [view, selectionHandler](WebKit::CallbackBase::Error error) {
selectionHandler();
+ view->_usingGestureForSelection = NO;
[selectionHandler release];
});
}
- (void)selectPositionAtBoundary:(UITextGranularity)granularity inDirection:(UITextDirection)direction fromPoint:(CGPoint)point completionHandler:(void (^)(void))completionHandler
{
+ _usingGestureForSelection = YES;
UIWKSelectionCompletionHandler selectionHandler = [completionHandler copy];
+ RetainPtr<WKContentView> view = self;
- _page->selectPositionAtBoundaryWithDirection(WebCore::IntPoint(point), toWKTextGranularity(granularity), toWKSelectionDirection(direction), [selectionHandler](WebKit::CallbackBase::Error error) {
+ _page->selectPositionAtBoundaryWithDirection(WebCore::IntPoint(point), toWKTextGranularity(granularity), toWKSelectionDirection(direction), [view, selectionHandler](WebKit::CallbackBase::Error error) {
selectionHandler();
+ view->_usingGestureForSelection = NO;
[selectionHandler release];
});
}
+- (void)moveSelectionAtBoundary:(UITextGranularity)granularity inDirection:(UITextDirection)direction completionHandler:(void (^)(void))completionHandler
+{
+ _usingGestureForSelection = YES;
+ UIWKSelectionCompletionHandler selectionHandler = [completionHandler copy];
+ RetainPtr<WKContentView> view = self;
+
+ _page->moveSelectionAtBoundaryWithDirection(toWKTextGranularity(granularity), toWKSelectionDirection(direction), [view, selectionHandler](WebKit::CallbackBase::Error error) {
+ selectionHandler();
+ view->_usingGestureForSelection = NO;
+ [selectionHandler release];
+ });
+}
+
- (void)selectTextWithGranularity:(UITextGranularity)granularity atPoint:(CGPoint)point completionHandler:(void (^)(void))completionHandler
{
+ _usingGestureForSelection = YES;
UIWKSelectionCompletionHandler selectionHandler = [completionHandler copy];
+ RetainPtr<WKContentView> view = self;
- _page->selectTextWithGranularityAtPoint(WebCore::IntPoint(point), toWKTextGranularity(granularity), [selectionHandler](WebKit::CallbackBase::Error error) {
+ _page->selectTextWithGranularityAtPoint(WebCore::IntPoint(point), toWKTextGranularity(granularity), [view, selectionHandler](WebKit::CallbackBase::Error error) {
selectionHandler();
+ view->_usingGestureForSelection = NO;
[selectionHandler release];
});
}
Modified: trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm (183591 => 183592)
--- trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm 2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm 2015-04-30 00:21:20 UTC (rev 183592)
@@ -452,6 +452,17 @@
m_process->send(Messages::WebPage::SelectPositionAtBoundaryWithDirection(point, static_cast<uint32_t>(granularity), static_cast<uint32_t>(direction), callbackID), m_pageID);
}
+void WebPageProxy::moveSelectionAtBoundaryWithDirection(WebCore::TextGranularity granularity, WebCore::SelectionDirection direction, std::function<void(CallbackBase::Error)> callbackFunction)
+{
+ if (!isValid()) {
+ callbackFunction(CallbackBase::Error::Unknown);
+ return;
+ }
+
+ uint64_t callbackID = m_callbacks.put(WTF::move(callbackFunction), m_process->throttler().backgroundActivityToken());
+ m_process->send(Messages::WebPage::MoveSelectionAtBoundaryWithDirection(static_cast<uint32_t>(granularity), static_cast<uint32_t>(direction), callbackID), m_pageID);
+}
+
void WebPageProxy::selectPositionAtPoint(const WebCore::IntPoint point, std::function<void (CallbackBase::Error)> callbackFunction)
{
if (!isValid()) {
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (183591 => 183592)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h 2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h 2015-04-30 00:21:20 UTC (rev 183592)
@@ -500,6 +500,7 @@
void moveSelectionByOffset(int32_t offset, uint64_t callbackID);
void selectTextWithGranularityAtPoint(const WebCore::IntPoint&, uint32_t granularity, uint64_t callbackID);
void selectPositionAtBoundaryWithDirection(const WebCore::IntPoint&, uint32_t granularity, uint32_t direction, uint64_t callbackID);
+ void moveSelectionAtBoundaryWithDirection(uint32_t granularity, uint32_t direction, uint64_t callbackID);
void selectPositionAtPoint(const WebCore::IntPoint&, uint64_t callbackID);
void beginSelectionInDirection(uint32_t direction, uint64_t callbackID);
void updateSelectionWithExtentPoint(const WebCore::IntPoint&, uint64_t callbackID);
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (183591 => 183592)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in 2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in 2015-04-30 00:21:20 UTC (rev 183592)
@@ -66,6 +66,7 @@
MoveSelectionByOffset(int32_t offset, uint64_t callbackID)
SelectTextWithGranularityAtPoint(WebCore::IntPoint point, uint32_t granularity, uint64_t callbackID)
SelectPositionAtBoundaryWithDirection(WebCore::IntPoint point, uint32_t granularity, uint32_t direction, uint64_t callbackID)
+ MoveSelectionAtBoundaryWithDirection(uint32_t granularity, uint32_t direction, uint64_t callbackID)
SelectPositionAtPoint(WebCore::IntPoint point, uint64_t callbackID)
BeginSelectionInDirection(uint32_t direction, uint64_t callbackID)
UpdateSelectionWithExtentPoint(WebCore::IntPoint point, uint64_t callbackID)
Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (183591 => 183592)
--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm 2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm 2015-04-30 00:21:20 UTC (rev 183592)
@@ -1695,6 +1695,20 @@
send(Messages::WebPageProxy::VoidCallback(callbackID));
}
+void WebPage::moveSelectionAtBoundaryWithDirection(uint32_t granularity, uint32_t direction, uint64_t callbackID)
+{
+ Frame& frame = m_page->focusController().focusedOrMainFrame();
+
+ if (!frame.selection().selection().isNone()) {
+ bool isForward = (direction == DirectionForward || direction == DirectionRight);
+ VisiblePosition position = (isForward) ? frame.selection().selection().visibleEnd() : frame.selection().selection().visibleStart();
+ position = positionOfNextBoundaryOfGranularity(position, static_cast<WebCore::TextGranularity>(granularity), static_cast<SelectionDirection>(direction));
+ if (position.isNotNull())
+ frame.selection().setSelectedRange(Range::create(*frame.document(), position, position).ptr(), isForward? UPSTREAM : DOWNSTREAM, true);
+ }
+ send(Messages::WebPageProxy::VoidCallback(callbackID));
+}
+
void WebPage::selectTextWithGranularityAtPoint(const WebCore::IntPoint& point, uint32_t granularity, uint64_t callbackID)
{
Frame& frame = m_page->focusController().focusedOrMainFrame();