Commit 8a487489 authored by Cheick Cisse's avatar Cheick Cisse Committed by Chromium LUCI CQ

[iOS] Add support to native context menu

This change only handles links but we will add support for images and images link later.

Bug: 1140387
Change-Id: I83289a9deefbe346343bc3649ffa2c015bd20ec5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2584604
Commit-Queue: Cheick Cisse <cheickcisse@google.com>
Reviewed-by: default avatarSebastien Lalancette <seblalancette@chromium.org>
Reviewed-by: default avatarGauthier Ambard <gambard@chromium.org>
Cr-Commit-Position: refs/heads/master@{#837742}
parent 5c13e8c9
...@@ -113,6 +113,7 @@ source_set("browser_view") { ...@@ -113,6 +113,7 @@ source_set("browser_view") {
"//ios/chrome/browser/ui/main:scene_state_header", "//ios/chrome/browser/ui/main:scene_state_header",
"//ios/chrome/browser/ui/main_content:main_content_ui", "//ios/chrome/browser/ui/main_content:main_content_ui",
"//ios/chrome/browser/ui/main_content:main_content_ui_broadcasting_util", "//ios/chrome/browser/ui/main_content:main_content_ui_broadcasting_util",
"//ios/chrome/browser/ui/menu",
"//ios/chrome/browser/ui/ntp", "//ios/chrome/browser/ui/ntp",
"//ios/chrome/browser/ui/ntp:coordinator", "//ios/chrome/browser/ui/ntp:coordinator",
"//ios/chrome/browser/ui/ntp:util", "//ios/chrome/browser/ui/ntp:util",
......
...@@ -106,6 +106,8 @@ ...@@ -106,6 +106,8 @@
#import "ios/chrome/browser/ui/main_content/main_content_ui_broadcasting_util.h" #import "ios/chrome/browser/ui/main_content/main_content_ui_broadcasting_util.h"
#import "ios/chrome/browser/ui/main_content/main_content_ui_state.h" #import "ios/chrome/browser/ui/main_content/main_content_ui_state.h"
#import "ios/chrome/browser/ui/main_content/web_scroll_view_main_content_ui_forwarder.h" #import "ios/chrome/browser/ui/main_content/web_scroll_view_main_content_ui_forwarder.h"
#import "ios/chrome/browser/ui/menu/action_factory.h"
#import "ios/chrome/browser/ui/menu/menu_histograms.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h"
#import "ios/chrome/browser/ui/ntp/ntp_util.h" #import "ios/chrome/browser/ui/ntp/ntp_util.h"
#import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_presenter.h" #import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_presenter.h"
...@@ -3608,9 +3610,86 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -3608,9 +3610,86 @@ NSString* const kBrowserViewControllerSnackbarCategory =
if (!params.link_url.is_valid()) if (!params.link_url.is_valid())
return; return;
base::RecordAction(
base::UserMetricsAction("MobileWebContextMenuLinkImpression"));
DCHECK(self.browserState); DCHECK(self.browserState);
// TODO(crbug.com/1140387): Add support for the context menu images.
// TODO(crbug.com/1140387): Add support for the context menu. __weak BrowserViewController* weakSelf = self;
GURL link = params.link_url;
const GURL& lastCommittedURL = webState->GetLastCommittedURL();
NSMutableArray<UIMenuElement*>* menuElements = [[NSMutableArray alloc] init];
NSString* title;
ActionFactory* actionFactory =
[[ActionFactory alloc] initWithBrowser:self.browser
scenario:MenuScenario::kContextMenuLink];
if (link.SchemeIs(url::kJavaScriptScheme)) {
// Open.
title = l10n_util::GetNSStringWithFixup(IDS_IOS_CONTENT_CONTEXT_OPEN);
UIAction* open = [actionFactory actionToOpenJavascriptWithBlock:^{
[weakSelf openJavascript:base::SysUTF8ToNSString(link.GetContent())];
}];
[menuElements addObject:open];
}
if (web::UrlHasWebScheme(link)) {
web::Referrer referrer(lastCommittedURL, web::ReferrerPolicyDefault);
// Open in New Tab.
UIAction* openNewTab = [actionFactory actionToOpenInNewTabWithBlock:^{
BrowserViewController* strongSelf = weakSelf;
if (!strongSelf)
return;
UrlLoadParams params = UrlLoadParams::InNewTab(link);
params.SetInBackground(YES);
params.in_incognito = strongSelf.isOffTheRecord;
params.append_to = kCurrentTab;
UrlLoadingBrowserAgent::FromBrowser(strongSelf.browser)->Load(params);
}];
[menuElements addObject:openNewTab];
if (!_isOffTheRecord) {
// Open in Incognito Tab.
UIAction* openIncognitoTab =
[actionFactory actionToOpenInNewIncognitoTabWithURL:link
completion:nil];
[menuElements addObject:openIncognitoTab];
}
if (IsMultipleScenesSupported()) {
// Open in New Window.
UIAction* openNewWindow = [actionFactory
actionToOpenInNewWindowWithURL:link
activityOrigin:WindowActivityContextMenuOrigin];
[menuElements addObject:openNewWindow];
}
// TODO(crbug.com/1140387): Add to reading list action.
// Copy Link.
UIAction* copyLink = [actionFactory actionToCopyURL:link];
[menuElements addObject:copyLink];
// TODO(crbug.com/1140387): Share action.
}
UIContextMenuActionProvider actionProvider =
^(NSArray<UIMenuElement*>* suggestedActions) {
RecordMenuShown(MenuScenario::kContextMenuLink);
return [UIMenu menuWithTitle:@"" children:menuElements];
};
UIContextMenuConfiguration* configuration =
[UIContextMenuConfiguration configurationWithIdentifier:nil
previewProvider:nil
actionProvider:actionProvider];
completionHandler(configuration);
} }
#pragma mark - CRWWebStateDelegate helpers #pragma mark - CRWWebStateDelegate helpers
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment