Commit 5ae5fd76 authored by Mark Cogan's avatar Mark Cogan Committed by Commit Bot

[iOS] Trigger blocking UI while clearing browsing data.

The Clear Browsing Data flow uses the ChromeActivityOverlayCoordinator to
block user interactions in the window in which it was triggered. To
extend this to multiple windows, this CL adds an option to the activity
coordinator to block all windows, implemented by triggering the blocking
UI.

that the blocking UI is shown in the other window.

TEST: Opened two windows, opened History, chose Clear Browsing Data, saw
Bug: 1045580
Change-Id: I8466cd8e67ddedce13c6db6580cd0d57b76b120d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2339963Reviewed-by: default avatarStepan Khapugin <stkhapugin@chromium.org>
Commit-Queue: Mark Cogan <marq@chromium.org>
Cr-Commit-Position: refs/heads/master@{#795468}
parent f51e2865
......@@ -93,7 +93,9 @@ source_set("elements_internal") {
"//base",
"//ios/chrome/browser",
"//ios/chrome/browser/ui/coordinators:chrome_coordinators",
"//ios/chrome/browser/ui/main:scene_state_header",
"//ios/chrome/browser/ui/material_components",
"//ios/chrome/browser/ui/scoped_ui_blocker:scoped_ui_blocker",
"//ios/chrome/browser/ui/util",
"//ios/chrome/common/ui/colors",
"//ios/chrome/common/ui/util",
......
......@@ -18,6 +18,10 @@
// is currently being displayed.
@property(nonatomic, assign) BOOL started;
// YES if the coordinator should trgger blocking UI in all other windows as
// long as it is active.
@property(nonatomic, assign) BOOL blockAllWindows;
@end
#endif // IOS_CHROME_BROWSER_UI_ELEMENTS_CHROME_ACTIVITY_OVERLAY_COORDINATOR_H_
......@@ -5,6 +5,9 @@
#import "ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h"
#import "ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.h"
#import "ios/chrome/browser/ui/main/scene_state.h"
#import "ios/chrome/browser/ui/main/scene_state_browser_agent.h"
#import "ios/chrome/browser/ui/scoped_ui_blocker/scoped_ui_blocker.h"
#import "ios/chrome/common/ui/util/constraints_ui_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
......@@ -17,7 +20,9 @@
ChromeActivityOverlayViewController* chromeActivityOverlayViewController;
@end
@implementation ChromeActivityOverlayCoordinator
@implementation ChromeActivityOverlayCoordinator {
std::unique_ptr<ScopedUIBlocker> _windowUIBlocker;
}
- (void)start {
if (self.chromeActivityOverlayViewController || self.started)
......@@ -40,12 +45,20 @@
addSubview:self.chromeActivityOverlayViewController.view];
[self.chromeActivityOverlayViewController
didMoveToParentViewController:self.baseViewController];
if (self.blockAllWindows) {
SceneState* sceneState =
SceneStateBrowserAgent::FromBrowser(self.browser)->GetSceneState();
_windowUIBlocker = std::make_unique<ScopedUIBlocker>(sceneState);
}
self.started = YES;
}
- (void)stop {
if (!self.chromeActivityOverlayViewController || !self.started)
return;
_windowUIBlocker.reset();
[self.chromeActivityOverlayViewController willMoveToParentViewController:nil];
[self.chromeActivityOverlayViewController.view removeFromSuperview];
[self.chromeActivityOverlayViewController removeFromParentViewController];
......
......@@ -60,7 +60,7 @@
// Coordinator for displaying a modal overlay with native activity indicator to
// prevent the user from interacting with the page.
@property(nonatomic, strong)
ChromeActivityOverlayCoordinator* chromeActivityOverlayCoordinator;
ChromeActivityOverlayCoordinator* overlayCoordinator;
@property(nonatomic, readonly, strong)
UIBarButtonItem* clearBrowsingDataBarButton;
......@@ -312,14 +312,16 @@
base::UserMetricsAction("MobileClearBrowsingDataTriggeredFromUIRefresh"));
// Show activity indicator modal while removal is happening.
self.chromeActivityOverlayCoordinator =
[[ChromeActivityOverlayCoordinator alloc]
initWithBaseViewController:self.navigationController
browser:_browser];
self.chromeActivityOverlayCoordinator.messageText =
l10n_util::GetNSStringWithFixup(
IDS_IOS_CLEAR_BROWSING_DATA_ACTIVITY_MODAL);
[self.chromeActivityOverlayCoordinator start];
self.overlayCoordinator = [[ChromeActivityOverlayCoordinator alloc]
initWithBaseViewController:self.navigationController
browser:_browser];
self.overlayCoordinator.messageText = l10n_util::GetNSStringWithFixup(
IDS_IOS_CLEAR_BROWSING_DATA_ACTIVITY_MODAL);
self.overlayCoordinator.blockAllWindows = YES;
[self.overlayCoordinator start];
__weak ClearBrowsingDataTableViewController* weakSelf = self;
dispatch_time_t timeOneSecondLater =
......@@ -333,7 +335,7 @@
// (<1sec), so ensure that overlay displays for at
// least 1 second instead of looking like a glitch.
dispatch_after(timeOneSecondLater, dispatch_get_main_queue(), ^{
[self.chromeActivityOverlayCoordinator stop];
[self.overlayCoordinator stop];
if (completionBlock)
completionBlock();
});
......@@ -389,7 +391,7 @@
- (BOOL)presentationControllerShouldDismiss:
(UIPresentationController*)presentationController {
return !self.chromeActivityOverlayCoordinator.started;
return !self.overlayCoordinator.started;
}
#pragma mark - Private 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