Commit fc0b28c7 authored by Kurt Horimoto's avatar Kurt Horimoto Committed by Commit Bot

[iOS] Create OverlayPresentationContextFullscreenDisabler.

Rather than being owned by the OverlayContainerCoordinator, this CL
moves this functionality to a separate object owned by the
OverlayPresentationContext.  This will allow it to be used in a
follow-up CL when the overlay container functionality is split
between multiple coordinators.

Bug: 1030357
Change-Id: I38a6e7d179e119b180059df1e1a78b10029548b3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2056110
Commit-Queue: Kurt Horimoto <kkhorimoto@chromium.org>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#741527}
parent f8d430ce
...@@ -11,6 +11,8 @@ source_set("overlays") { ...@@ -11,6 +11,8 @@ source_set("overlays") {
"overlay_container_coordinator.mm", "overlay_container_coordinator.mm",
"overlay_coordinator_factory+initialization.h", "overlay_coordinator_factory+initialization.h",
"overlay_coordinator_factory.mm", "overlay_coordinator_factory.mm",
"overlay_presentation_context_fullscreen_disabler.h",
"overlay_presentation_context_fullscreen_disabler.mm",
"overlay_presentation_context_impl.h", "overlay_presentation_context_impl.h",
"overlay_presentation_context_impl.mm", "overlay_presentation_context_impl.mm",
"overlay_request_ui_state.h", "overlay_request_ui_state.h",
...@@ -89,6 +91,7 @@ source_set("unit_tests") { ...@@ -89,6 +91,7 @@ source_set("unit_tests") {
testonly = true testonly = true
sources = [ sources = [
"overlay_container_coordinator_unittest.mm", "overlay_container_coordinator_unittest.mm",
"overlay_presentation_context_fullscreen_disabler_unittest.mm",
"overlay_request_mediator_unittest.mm", "overlay_request_mediator_unittest.mm",
"overlay_request_mediator_util_unittest.mm", "overlay_request_mediator_util_unittest.mm",
"overlay_request_ui_state_unittest.mm", "overlay_request_ui_state_unittest.mm",
......
...@@ -10,10 +10,6 @@ ...@@ -10,10 +10,6 @@
#include "base/logging.h" #include "base/logging.h"
#include "base/scoped_observer.h" #include "base/scoped_observer.h"
#import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/overlays/public/overlay_presenter.h"
#import "ios/chrome/browser/overlays/public/overlay_presenter_observer.h"
#import "ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
#import "ios/chrome/browser/ui/overlays/overlay_container_view_controller.h" #import "ios/chrome/browser/ui/overlays/overlay_container_view_controller.h"
#import "ios/chrome/browser/ui/overlays/overlay_presentation_context_impl.h" #import "ios/chrome/browser/ui/overlays/overlay_presentation_context_impl.h"
#import "ios/chrome/common/ui_util/constraints_ui_util.h" #import "ios/chrome/common/ui_util/constraints_ui_util.h"
...@@ -22,67 +18,8 @@ ...@@ -22,67 +18,8 @@
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
namespace {
// Observer that disables fullscreen while overlays are presented.
class OverlayContainerFullscreenDisabler {
public:
OverlayContainerFullscreenDisabler(Browser* browser, OverlayModality modality)
: fullscreen_disabler_(
FullscreenController::FromBrowserState(browser->GetBrowserState()),
OverlayPresenter::FromBrowser(browser, modality)) {}
~OverlayContainerFullscreenDisabler() = default;
OverlayContainerFullscreenDisabler(
OverlayContainerFullscreenDisabler& disabler) = delete;
private:
// Helper object that disables fullscreen when overlays are presented.
class FullscreenDisabler : public OverlayPresenterObserver {
public:
FullscreenDisabler(FullscreenController* fullscreen_controller,
OverlayPresenter* overlay_presenter)
: fullscreen_controller_(fullscreen_controller),
scoped_observer_(this) {
DCHECK(fullscreen_controller_);
DCHECK(overlay_presenter);
scoped_observer_.Add(overlay_presenter);
}
~FullscreenDisabler() override = default;
private:
// OverlayPresenterObserver:
void WillShowOverlay(OverlayPresenter* presenter,
OverlayRequest* request) override {
disabler_ = std::make_unique<AnimatedScopedFullscreenDisabler>(
fullscreen_controller_);
disabler_->StartAnimation();
}
void DidHideOverlay(OverlayPresenter* presenter,
OverlayRequest* request) override {
disabler_ = nullptr;
}
void OverlayPresenterDestroyed(OverlayPresenter* presenter) override {
scoped_observer_.Remove(presenter);
disabler_ = nullptr;
}
// The FullscreenController being disabled.
FullscreenController* fullscreen_controller_ = nullptr;
// The animated disabler.
std::unique_ptr<AnimatedScopedFullscreenDisabler> disabler_;
ScopedObserver<OverlayPresenter, OverlayPresenterObserver> scoped_observer_;
};
FullscreenDisabler fullscreen_disabler_;
};
} // namespace
@interface OverlayContainerCoordinator () < @interface OverlayContainerCoordinator () <
OverlayContainerViewControllerDelegate> { OverlayContainerViewControllerDelegate>
// Helper object that disables fullscreen whenever an overlay is presented.
std::unique_ptr<OverlayContainerFullscreenDisabler> fullscreen_disabler_;
}
// Whether the coordinator is started. // Whether the coordinator is started.
@property(nonatomic, assign, getter=isStarted) BOOL started; @property(nonatomic, assign, getter=isStarted) BOOL started;
// The presentation context used by OverlayPresenter to drive presentation for // The presentation context used by OverlayPresenter to drive presentation for
...@@ -131,8 +68,6 @@ class OverlayContainerFullscreenDisabler { ...@@ -131,8 +68,6 @@ class OverlayContainerFullscreenDisabler {
AddSameConstraints(containerView, self.baseViewController.view); AddSameConstraints(containerView, self.baseViewController.view);
[_viewController didMoveToParentViewController:self.baseViewController]; [_viewController didMoveToParentViewController:self.baseViewController];
self.presentationContext->SetCoordinator(self); self.presentationContext->SetCoordinator(self);
fullscreen_disabler_ = std::make_unique<OverlayContainerFullscreenDisabler>(
self.browser, self.modality);
} }
- (void)stop { - (void)stop {
...@@ -145,7 +80,6 @@ class OverlayContainerFullscreenDisabler { ...@@ -145,7 +80,6 @@ class OverlayContainerFullscreenDisabler {
[_viewController.view removeFromSuperview]; [_viewController.view removeFromSuperview];
[_viewController removeFromParentViewController]; [_viewController removeFromParentViewController];
_viewController = nil; _viewController = nil;
fullscreen_disabler_ = nullptr;
} }
#pragma mark - OverlayContainerViewControllerDelegate #pragma mark - OverlayContainerViewControllerDelegate
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_OVERLAY_PRESENTATION_CONTEXT_FULLSCREEN_DISABLER_H_
#define IOS_CHROME_BROWSER_UI_OVERLAYS_OVERLAY_PRESENTATION_CONTEXT_FULLSCREEN_DISABLER_H_
#include <memory>
#include "base/scoped_observer.h"
#import "ios/chrome/browser/overlays/public/overlay_modality.h"
#import "ios/chrome/browser/overlays/public/overlay_presenter.h"
#import "ios/chrome/browser/overlays/public/overlay_presenter_observer.h"
class Browser;
class AnimatedScopedFullscreenDisabler;
class FullscreenController;
// A helper object that disables fullscreen while overlays are displayed.
class OverlayContainerFullscreenDisabler {
public:
// Constructs a OverlayContainerFullscreenDisabler that disables fullscreen
// for |browser| when overlays are displayed at |modality|.
OverlayContainerFullscreenDisabler(Browser* browser,
OverlayModality modality);
~OverlayContainerFullscreenDisabler();
OverlayContainerFullscreenDisabler(
OverlayContainerFullscreenDisabler& disabler) = delete;
private:
// Helper object that disables fullscreen when overlays are presented.
class FullscreenDisabler : public OverlayPresenterObserver {
public:
FullscreenDisabler(FullscreenController* fullscreen_controller,
OverlayPresenter* overlay_presenter);
~FullscreenDisabler() override;
private:
// OverlayPresenterObserver:
void WillShowOverlay(OverlayPresenter* presenter,
OverlayRequest* request) override;
void DidHideOverlay(OverlayPresenter* presenter,
OverlayRequest* request) override;
void OverlayPresenterDestroyed(OverlayPresenter* presenter) override;
// The FullscreenController being disabled.
FullscreenController* fullscreen_controller_ = nullptr;
// The animated disabler.
std::unique_ptr<AnimatedScopedFullscreenDisabler> disabler_;
ScopedObserver<OverlayPresenter, OverlayPresenterObserver> scoped_observer_;
};
FullscreenDisabler fullscreen_disabler_;
};
#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_OVERLAY_PRESENTATION_CONTEXT_FULLSCREEN_DISABLER_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/overlays/overlay_presentation_context_fullscreen_disabler.h"
#include "base/logging.h"
#import "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
#pragma mark - OverlayContainerFullscreenDisabler
OverlayContainerFullscreenDisabler::OverlayContainerFullscreenDisabler(
Browser* browser,
OverlayModality modality)
: fullscreen_disabler_(
FullscreenController::FromBrowserState(browser->GetBrowserState()),
OverlayPresenter::FromBrowser(browser, modality)) {}
OverlayContainerFullscreenDisabler::~OverlayContainerFullscreenDisabler() =
default;
#pragma mark - OverlayContainerFullscreenDisabler::FullscreenDisabler
OverlayContainerFullscreenDisabler::FullscreenDisabler::FullscreenDisabler(
FullscreenController* fullscreen_controller,
OverlayPresenter* overlay_presenter)
: fullscreen_controller_(fullscreen_controller), scoped_observer_(this) {
DCHECK(fullscreen_controller_);
DCHECK(overlay_presenter);
scoped_observer_.Add(overlay_presenter);
}
OverlayContainerFullscreenDisabler::FullscreenDisabler::~FullscreenDisabler() =
default;
void OverlayContainerFullscreenDisabler::FullscreenDisabler::WillShowOverlay(
OverlayPresenter* presenter,
OverlayRequest* request) {
disabler_ = std::make_unique<AnimatedScopedFullscreenDisabler>(
fullscreen_controller_);
disabler_->StartAnimation();
}
void OverlayContainerFullscreenDisabler::FullscreenDisabler::DidHideOverlay(
OverlayPresenter* presenter,
OverlayRequest* request) {
disabler_ = nullptr;
}
void OverlayContainerFullscreenDisabler::FullscreenDisabler::
OverlayPresenterDestroyed(OverlayPresenter* presenter) {
scoped_observer_.Remove(presenter);
disabler_ = nullptr;
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/overlays/overlay_presentation_context_fullscreen_disabler.h"
#import "ios/chrome/browser/main/test_browser.h"
#include "ios/chrome/browser/overlays/public/overlay_request.h"
#include "ios/chrome/browser/overlays/public/overlay_request_queue.h"
#include "ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h"
#include "ios/chrome/browser/overlays/test/overlay_test_macros.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/chrome/browser/web_state_list/web_state_opener.h"
#import "ios/web/public/test/fakes/test_web_state.h"
#include "ios/web/public/test/web_task_environment.h"
#include "testing/platform_test.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {
// The modality used in tests.
const OverlayModality kModality = OverlayModality::kWebContentArea;
// Request config used in tests.
DEFINE_TEST_OVERLAY_REQUEST_CONFIG(kConfig);
} // namespace
// Test fixture for OverlayPresentationContextFullscreenDisabler.
class OverlayPresentationContextFullscreenDisablerTest : public PlatformTest {
public:
OverlayPresentationContextFullscreenDisablerTest()
: disabler_(&browser_, kModality) {
// Set up the fake presentation context so OverlayPresenterObserver
// callbacks are sent.
overlay_presenter()->SetPresentationContext(&presentation_context_);
// Insert and activate a WebState.
browser_.GetWebStateList()->InsertWebState(
0, std::make_unique<web::TestWebState>(), WebStateList::INSERT_ACTIVATE,
WebStateOpener());
}
~OverlayPresentationContextFullscreenDisablerTest() override {
overlay_presenter()->SetPresentationContext(nullptr);
}
bool fullscreen_enabled() {
return FullscreenController::FromBrowserState(browser_.GetBrowserState())
->IsEnabled();
}
OverlayPresenter* overlay_presenter() {
return OverlayPresenter::FromBrowser(&browser_, kModality);
}
OverlayRequestQueue* queue() {
return OverlayRequestQueue::FromWebState(
browser_.GetWebStateList()->GetActiveWebState(), kModality);
}
protected:
web::WebTaskEnvironment task_environment_;
TestBrowser browser_;
OverlayContainerFullscreenDisabler disabler_;
FakeOverlayPresentationContext presentation_context_;
};
// Tests that OverlayPresentationContextFullscreenDisabler disables fullscreen
// when overlays are displayed.
TEST_F(OverlayPresentationContextFullscreenDisablerTest,
DisableForPresentedOverlays) {
ASSERT_TRUE(fullscreen_enabled());
// Add an OverlayRequest to the active WebState's queue and verify that
// fullscreen is disabled.
queue()->AddRequest(OverlayRequest::CreateWithConfig<kConfig>());
EXPECT_FALSE(fullscreen_enabled());
// Cancel the request and verify that fullscreen is re-enabled.
queue()->CancelAllRequests();
EXPECT_TRUE(fullscreen_enabled());
}
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "ios/chrome/browser/overlays/public/overlay_modality.h" #include "ios/chrome/browser/overlays/public/overlay_modality.h"
#import "ios/chrome/browser/overlays/public/overlay_presentation_context.h" #import "ios/chrome/browser/overlays/public/overlay_presentation_context.h"
#import "ios/chrome/browser/overlays/public/overlay_user_data.h" #import "ios/chrome/browser/overlays/public/overlay_user_data.h"
#import "ios/chrome/browser/ui/overlays/overlay_presentation_context_fullscreen_disabler.h"
#import "ios/chrome/browser/ui/overlays/overlay_request_coordinator.h" #import "ios/chrome/browser/ui/overlays/overlay_request_coordinator.h"
#import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h" #import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h"
#import "ios/chrome/browser/ui/overlays/overlay_request_ui_state.h" #import "ios/chrome/browser/ui/overlays/overlay_request_ui_state.h"
...@@ -139,6 +140,8 @@ class OverlayPresentationContextImpl : public OverlayPresentationContext { ...@@ -139,6 +140,8 @@ class OverlayPresentationContextImpl : public OverlayPresentationContext {
// The delegate used to intercept presentation/dismissal events from // The delegate used to intercept presentation/dismissal events from
// OverlayRequestCoordinators. // OverlayRequestCoordinators.
OverlayRequestCoordinatorDelegateImpl coordinator_delegate_; OverlayRequestCoordinatorDelegateImpl coordinator_delegate_;
// The fullscreen disabler helper.
OverlayContainerFullscreenDisabler fullscreen_disabler_;
// The coordinator factory that provides the UI for the overlays at this // The coordinator factory that provides the UI for the overlays at this
// modality. // modality.
OverlayRequestCoordinatorFactory* coordinator_factory_ = nil; OverlayRequestCoordinatorFactory* coordinator_factory_ = nil;
......
...@@ -48,6 +48,7 @@ OverlayPresentationContextImpl::OverlayPresentationContextImpl( ...@@ -48,6 +48,7 @@ OverlayPresentationContextImpl::OverlayPresentationContextImpl(
: presenter_(OverlayPresenter::FromBrowser(browser, modality)), : presenter_(OverlayPresenter::FromBrowser(browser, modality)),
shutdown_helper_(browser, presenter_), shutdown_helper_(browser, presenter_),
coordinator_delegate_(this), coordinator_delegate_(this),
fullscreen_disabler_(browser, modality),
coordinator_factory_([OverlayRequestCoordinatorFactory coordinator_factory_([OverlayRequestCoordinatorFactory
factoryForBrowser:browser factoryForBrowser:browser
modality:modality]), modality:modality]),
......
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