Implement action menus for tel: URLs
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 4 Dec 2014 00:33:07 +0000 (00:33 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 4 Dec 2014 00:33:07 +0000 (00:33 +0000)
https://bugs.webkit.org/show_bug.cgi?id=139240
<rdar://problem/19115662>

Reviewed by Anders Carlsson.

* WebView/WebActionMenuController.mm:
(-[WebActionMenuController _defaultMenuItemsForDataDetectableLink]):
Rename this function as it will work for both mailto and tel URLs.
Adjust it to use contextForView:.

(-[WebActionMenuController webView:willHandleMouseDown:]):
(-[WebActionMenuController prepareForMenu:withEvent:]):
(-[WebActionMenuController didCloseMenu:withEvent:]):
(-[WebActionMenuController _defaultMenuItems]):
Don't check the menu type when going to interact with _currentActionContext.
We'll only have a _currentActionContext if we have a data detected item,
and there are multiple menu types that end up using DDActionContext.

* WebView/WebUIDelegatePrivate.h:
Add a new type.

* Shared/API/c/WKActionMenuTypes.h:
Add a new type.

* UIProcess/mac/WKActionMenuController.mm:
(-[WKActionMenuController _defaultMenuItemsForDataDetectableLink]):
Rename this function as it will work for both mailto and tel URLs.
Adjust it to use contextForView:.

(-[WKActionMenuController _clearActionMenuState]):
(-[WKActionMenuController menuNeedsUpdate:]):
(-[WKActionMenuController _defaultMenuItems]):
Don't check the menu type when going to interact with _currentActionContext.
We'll only have a _currentActionContext if we have a data detected item,
and there are multiple menu types that end up using DDActionContext.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@176763 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/mac/ChangeLog
Source/WebKit/mac/WebView/WebActionMenuController.mm
Source/WebKit/mac/WebView/WebUIDelegatePrivate.h
Source/WebKit2/ChangeLog
Source/WebKit2/Shared/API/c/WKActionMenuTypes.h
Source/WebKit2/UIProcess/mac/WKActionMenuController.mm

index c8d015f81291518f8fb9e2052dd2e5c9c6161466..235858c3484d56707ca9db600a2965690bafd28b 100644 (file)
@@ -1,3 +1,27 @@
+2014-12-03  Tim Horton  <timothy_horton@apple.com>
+
+        Implement action menus for tel: URLs
+        https://bugs.webkit.org/show_bug.cgi?id=139240
+        <rdar://problem/19115662>
+
+        Reviewed by Anders Carlsson.
+
+        * WebView/WebActionMenuController.mm:
+        (-[WebActionMenuController _defaultMenuItemsForDataDetectableLink]):
+        Rename this function as it will work for both mailto and tel URLs.
+        Adjust it to use contextForView:.
+
+        (-[WebActionMenuController webView:willHandleMouseDown:]):
+        (-[WebActionMenuController prepareForMenu:withEvent:]):
+        (-[WebActionMenuController didCloseMenu:withEvent:]):
+        (-[WebActionMenuController _defaultMenuItems]):
+        Don't check the menu type when going to interact with _currentActionContext.
+        We'll only have a _currentActionContext if we have a data detected item,
+        and there are multiple menu types that end up using DDActionContext.
+
+        * WebView/WebUIDelegatePrivate.h:
+        Add a new type.
+
 2014-12-03  Anders Carlsson  <andersca@apple.com>
 
         Set a visited link store when creating a simple WebView
index bbff7b27872247eecee3074443dfd9811a432a4a..f55e62f1013cb5f9b29860b34680ff83eb8f544d 100644 (file)
@@ -125,7 +125,7 @@ using namespace WebCore;
 
 - (void)webView:(WebView *)webView willHandleMouseDown:(NSEvent *)event
 {
-    if (_type == WebActionMenuDataDetectedItem && _currentActionContext && _hasActivatedActionContext) {
+    if (_currentActionContext && _hasActivatedActionContext) {
         [getDDActionsManagerClass() didUseActions];
         _hasActivatedActionContext = NO;
     }
@@ -158,7 +158,7 @@ using namespace WebCore;
     for (NSMenuItem *item in menuItems)
         [actionMenu addItem:item];
 
-    if (_type == WebActionMenuDataDetectedItem && _currentActionContext) {
+    if (_currentActionContext) {
         _hasActivatedActionContext = YES;
         if (![getDDActionsManagerClass() shouldUseActionsWithContext:_currentActionContext.get()]) {
             [menu cancelTracking];
@@ -229,7 +229,7 @@ using namespace WebCore;
     if (menu != _webView.actionMenu)
         return;
 
-    if (_type == WebActionMenuDataDetectedItem && _currentActionContext && _hasActivatedActionContext) {
+    if (_currentActionContext && _hasActivatedActionContext) {
         [getDDActionsManagerClass() didUseActions];
         _hasActivatedActionContext = NO;
     }
@@ -296,19 +296,24 @@ static IntRect elementBoundingBoxInWindowCoordinatesFromNode(Node* node)
     return @[ openLinkItem.get(), shouldUseStandardQuickLookPreview ? qlPreviewLinkItem.get() : previewLinkItem.get(), [NSMenuItem separatorItem], readingListItem.get() ];
 }
 
-#pragma mark Mailto Link actions
+#pragma mark mailto: and tel: Link actions
 
-- (NSArray *)_defaultMenuItemsForMailtoLink
+- (NSArray *)_defaultMenuItemsForDataDetectableLink
 {
     Node* node = _hitTestResult.innerNode();
     if (!node)
         return @[ ];
 
     RetainPtr<DDActionContext> actionContext = [[getDDActionContextClass() alloc] init];
-    [actionContext setAltMode:YES];
 
     // FIXME: Should this show a yellow highlight?
+    _currentActionContext = [actionContext contextForView:_webView altMode:YES interactionStartedHandler:^() {
+    } interactionChangedHandler:^() {
+    } interactionStoppedHandler:^() {
+    }];
+
     [actionContext setHighlightFrame:elementBoundingBoxInWindowCoordinatesFromNode(node)];
+
     return [[getDDActionsManagerClass() sharedManager] menuItemsForTargetURL:_hitTestResult.absoluteLinkURL() actionContext:actionContext.get()];
 }
 
@@ -846,14 +851,20 @@ static DictionaryPopupInfo performDictionaryLookupForRange(Frame* frame, Range&
 - (NSArray *)_defaultMenuItems
 {
     NSURL *url = _hitTestResult.absoluteLinkURL();
-    if (url && WebCore::protocolIsInHTTPFamily([url absoluteString])) {
+    NSString *absoluteURLString = [url absoluteString];
+    if (url && WebCore::protocolIsInHTTPFamily(absoluteURLString)) {
         _type = WebActionMenuLink;
         return [self _defaultMenuItemsForLink];
     }
 
-    if (url && WebCore::protocolIs([url absoluteString], "mailto")) {
+    if (url && WebCore::protocolIs(absoluteURLString, "mailto")) {
         _type = WebActionMenuMailtoLink;
-        return [self _defaultMenuItemsForMailtoLink];
+        return [self _defaultMenuItemsForDataDetectableLink];
+    }
+
+    if (url && WebCore::protocolIs(absoluteURLString, "tel")) {
+        _type = WebActionMenuTelLink;
+        return [self _defaultMenuItemsForDataDetectableLink];
     }
 
     if (!_hitTestResult.absoluteMediaURL().isEmpty()) {
index fb7b3e61d5004638772c2ab2a2a30cdcc0d70c35..1fb3a4b287e753fee4bd0799ba83654f80eb4789 100644 (file)
@@ -140,7 +140,8 @@ typedef enum {
     WebActionMenuImage,
     WebActionMenuVideo,
     WebActionMenuDataDetectedItem,
-    WebActionMenuMailtoLink
+    WebActionMenuMailtoLink,
+    WebActionMenuTelLink
 } WebActionMenuType;
 
 // Message Sources.
index 65adb28db508f87782fa285b4d9116d99f09b71c..3ff878a182c52332b903f8bfc9c62bdda3e1616d 100644 (file)
@@ -1,3 +1,26 @@
+2014-12-03  Tim Horton  <timothy_horton@apple.com>
+
+        Implement action menus for tel: URLs
+        https://bugs.webkit.org/show_bug.cgi?id=139240
+        <rdar://problem/19115662>
+
+        Reviewed by Anders Carlsson.
+
+        * Shared/API/c/WKActionMenuTypes.h:
+        Add a new type.
+
+        * UIProcess/mac/WKActionMenuController.mm:
+        (-[WKActionMenuController _defaultMenuItemsForDataDetectableLink]):
+        Rename this function as it will work for both mailto and tel URLs.
+        Adjust it to use contextForView:.
+
+        (-[WKActionMenuController _clearActionMenuState]):
+        (-[WKActionMenuController menuNeedsUpdate:]):
+        (-[WKActionMenuController _defaultMenuItems]):
+        Don't check the menu type when going to interact with _currentActionContext.
+        We'll only have a _currentActionContext if we have a data detected item,
+        and there are multiple menu types that end up using DDActionContext.
+
 2014-12-03  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, rolling out r176452 and r176559.
index 203047d44e11114e5e43f418905f164c1ea1f219..5b5eb7366a15aa5f9df4617164f62e719951c882 100644 (file)
@@ -42,7 +42,8 @@ enum {
     kWKActionMenuEditableTextWithSuggestions,
     kWKActionMenuWhitespaceInEditableArea,
     kWKActionMenuVideo,
-    kWKActionMenuMailtoLink
+    kWKActionMenuMailtoLink,
+    kWKActionMenuTelLink
 };
 typedef uint32_t _WKActionMenuType;
 
index b13b5be153aad52326095acd33e51ba51d7b72cb..46e6ac35989d837f87b02511df0444beb1f6ce39 100644 (file)
@@ -321,7 +321,7 @@ static const CGFloat previewViewTitleHeight = 34;
 
 - (void)_clearActionMenuState
 {
-    if (_type == kWKActionMenuDataDetectedItem && _currentActionContext && _hasActivatedActionContext) {
+    if (_currentActionContext && _hasActivatedActionContext) {
         [getDDActionsManagerClass() didUseActions];
         _hasActivatedActionContext = NO;
     }
@@ -859,17 +859,22 @@ static NSString *pathToPhotoOnDisk(NSString *suggestedFilename)
     return @[ [NSMenuItem separatorItem], [NSMenuItem separatorItem], pasteItem.get() ];
 }
 
-#pragma mark Mailto Link actions
+#pragma mark mailto: and tel: Link actions
 
-- (NSArray *)_defaultMenuItemsForMailtoLink
+- (NSArray *)_defaultMenuItemsForDataDetectableLink
 {
     RefPtr<WebHitTestResult> hitTestResult = [self _webHitTestResult];
+    RetainPtr<DDActionContext> actionContext = [[getDDActionContextClass() alloc] init];
 
     // FIXME: Should this show a yellow highlight?
-    RetainPtr<DDActionContext> actionContext = [[getDDActionContextClass() alloc] init];
-    [actionContext setAltMode:YES];
-    [actionContext setHighlightFrame:[_wkView.window convertRectToScreen:[_wkView convertRect:hitTestResult->elementBoundingBox() toView:nil]]];
-    return [[getDDActionsManagerClass() sharedManager] menuItemsForTargetURL:hitTestResult->absoluteLinkURL() actionContext:actionContext.get()];
+    _currentActionContext = [actionContext contextForView:_wkView altMode:YES interactionStartedHandler:^() {
+    } interactionChangedHandler:^() {
+    } interactionStoppedHandler:^() {
+    }];
+
+    [_currentActionContext setHighlightFrame:[_wkView.window convertRectToScreen:[_wkView convertRect:_hitTestResult.detectedDataBoundingBox toView:nil]]];
+
+    return [[getDDActionsManagerClass() sharedManager] menuItemsForTargetURL:hitTestResult->absoluteLinkURL() actionContext:_currentActionContext.get()];
 }
 
 #pragma mark NSMenuDelegate implementation
@@ -891,7 +896,7 @@ static NSString *pathToPhotoOnDisk(NSString *suggestedFilename)
     if (_state != ActionMenuState::Ready)
         [self _updateActionMenuItems];
 
-    if (_type == kWKActionMenuDataDetectedItem && _currentActionContext) {
+    if (_currentActionContext) {
         _hasActivatedActionContext = YES;
         if (![getDDActionsManagerClass() shouldUseActionsWithContext:_currentActionContext.get()]) {
             [menu cancelTracking];
@@ -1100,7 +1105,12 @@ static NSString *pathToPhotoOnDisk(NSString *suggestedFilename)
 
         if (protocolIs(absoluteLinkURL, "mailto")) {
             _type = kWKActionMenuMailtoLink;
-            return [self _defaultMenuItemsForMailtoLink];
+            return [self _defaultMenuItemsForDataDetectableLink];
+        }
+
+        if (protocolIs(absoluteLinkURL, "tel")) {
+            _type = kWKActionMenuTelLink;
+            return [self _defaultMenuItemsForDataDetectableLink];
         }
     }