Commit 0c1e6658 authored by Gauthier Ambard's avatar Gauthier Ambard Committed by Commit Bot

[iOS] Disable share menu when overlays are presented.

The share menu requires JavaScript execution to capture the page's
canonical URL, but script execution is halted when JavaScript dialogs
are running.  This CL adds ToolbarMediator as an
OverlayPresenterObserver and disables the button when a overlays are
displayed in OverlayModality::kWebContentArea.

Fixed: 987247
Change-Id: Ia09b9eb5e9e734e4d25252aee236acf46a6d81c3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2256230
Commit-Queue: Gauthier Ambard <gambard@chromium.org>
Commit-Queue: Chris Lu <thegreenfrog@chromium.org>
Auto-Submit: Gauthier Ambard <gambard@chromium.org>
Reviewed-by: default avatarChris Lu <thegreenfrog@chromium.org>
Cr-Commit-Position: refs/heads/master@{#780800}
parent ee0c101e
......@@ -35,6 +35,7 @@ source_set("toolbar") {
"//ios/chrome/browser/bookmarks",
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/main",
"//ios/chrome/browser/overlays",
"//ios/chrome/browser/policy:feature_flags",
"//ios/chrome/browser/reading_list",
"//ios/chrome/browser/search_engines",
......
......@@ -7,6 +7,7 @@
#include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/overlays/public/overlay_presenter.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
#import "ios/chrome/browser/ui/ntp/ntp_util.h"
#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator+subclassing.h"
......@@ -65,6 +66,8 @@
self.mediator.bookmarkModel = ios::BookmarkModelFactory::GetForBrowserState(
self.browser->GetBrowserState());
self.mediator.prefService = self.browser->GetBrowserState()->GetPrefs();
self.mediator.webContentAreaOverlayPresenter = OverlayPresenter::FromBrowser(
self.browser, OverlayModality::kWebContentArea);
}
- (void)stop {
......
......@@ -13,6 +13,7 @@ class BookmarkModel;
namespace web {
class WebState;
}
class OverlayPresenter;
class PrefService;
@protocol ToolbarConsumer;
class WebStateList;
......@@ -38,6 +39,11 @@ class WebStateList;
// object and may be nil.
@property(nonatomic, strong) id<ToolbarConsumer> consumer;
// The overlay presenter for OverlayModality::kWebContentArea. This mediator
// listens for overlay presentation events to determine whether the share button
// should be enabled.
@property(nonatomic, assign) OverlayPresenter* webContentAreaOverlayPresenter;
// Updates the consumer to conforms to |webState|.
- (void)updateConsumerForWebState:(web::WebState*)webState;
......
......@@ -13,6 +13,8 @@
#include "components/prefs/pref_change_registrar.h"
#include "components/prefs/pref_service.h"
#include "ios/chrome/browser/chrome_url_constants.h"
#import "ios/chrome/browser/overlays/public/overlay_presenter.h"
#import "ios/chrome/browser/overlays/public/overlay_presenter_observer_bridge.h"
#include "ios/chrome/browser/policy/policy_features.h"
#include "ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.h"
#import "ios/chrome/browser/ui/ntp/ntp_util.h"
......@@ -33,6 +35,7 @@
@interface ToolbarMediator () <BookmarkModelBridgeObserver,
CRWWebStateObserver,
OverlayPresenterObserving,
PrefObserverDelegate,
WebStateListObserving>
......@@ -42,6 +45,10 @@
// Whether the associated toolbar is in dark mode.
@property(nonatomic, assign) BOOL toolbarDarkMode;
// Whether an overlay is currently presented over the web content area.
@property(nonatomic, assign, getter=isWebContentAreaShowingOverlay)
BOOL webContentAreaShowingOverlay;
@end
@implementation ToolbarMediator {
......@@ -53,6 +60,7 @@
std::unique_ptr<PrefObserverBridge> _prefObserverBridge;
// Registrar for pref changes notifications.
std::unique_ptr<PrefChangeRegistrar> _prefChangeRegistrar;
std::unique_ptr<OverlayPresenterObserverBridge> _overlayObserver;
}
- (instancetype)init {
......@@ -60,6 +68,7 @@
if (self) {
_webStateObserver = std::make_unique<web::WebStateObserverBridge>(self);
_webStateListObserver = std::make_unique<WebStateListObserverBridge>(self);
_overlayObserver = std::make_unique<OverlayPresenterObserverBridge>(self);
}
return self;
}
......@@ -77,6 +86,8 @@
}
- (void)disconnect {
self.webContentAreaOverlayPresenter = nullptr;
if (_webStateList) {
_webStateList->RemoveObserver(_webStateListObserver.get());
_webStateListObserver.reset();
......@@ -251,6 +262,24 @@
[self.consumer setBookmarkEnabled:[self isEditBookmarksEnabled]];
}
- (void)setWebContentAreaOverlayPresenter:
(OverlayPresenter*)webContentAreaOverlayPresenter {
if (_webContentAreaOverlayPresenter)
_webContentAreaOverlayPresenter->RemoveObserver(_overlayObserver.get());
_webContentAreaOverlayPresenter = webContentAreaOverlayPresenter;
if (_webContentAreaOverlayPresenter)
_webContentAreaOverlayPresenter->AddObserver(_overlayObserver.get());
}
- (void)setWebContentAreaShowingOverlay:(BOOL)webContentAreaShowingOverlay {
if (_webContentAreaShowingOverlay == webContentAreaShowingOverlay)
return;
_webContentAreaShowingOverlay = webContentAreaShowingOverlay;
[self updateShareMenuForWebState:self.webState];
}
#pragma mark - Update helper methods
// Updates the consumer to match the current WebState.
......@@ -295,7 +324,10 @@
const GURL& URL = webState->GetLastCommittedURL();
BOOL shareMenuEnabled =
URL.is_valid() && !web::GetWebClient()->IsAppSpecificURL(URL);
[self.consumer setShareMenuEnabled:shareMenuEnabled];
// Page sharing requires JavaScript execution, which is paused while overlays
// are displayed over the web content area.
[self.consumer setShareMenuEnabled:shareMenuEnabled &&
!self.webContentAreaShowingOverlay];
}
#pragma mark - Other private methods
......@@ -341,6 +373,19 @@
// No-op -- required by BookmarkModelBridgeObserver but not used.
}
#pragma mark - OverlayPresesenterObserving
- (void)overlayPresenter:(OverlayPresenter*)presenter
willShowOverlayForRequest:(OverlayRequest*)request
initialPresentation:(BOOL)initialPresentation {
self.webContentAreaShowingOverlay = YES;
}
- (void)overlayPresenter:(OverlayPresenter*)presenter
didHideOverlayForRequest:(OverlayRequest*)request {
self.webContentAreaShowingOverlay = NO;
}
#pragma mark - PrefObserverDelegate
- (void)onPreferenceChanged:(const std::string&)preferenceName {
......
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