Commit 354f7f85 authored by Kurt Horimoto's avatar Kurt Horimoto Committed by Commit Bot

[iOS] Fix fullscreen for prerendered pages.

This CL contains several fixes related to prerendered pages:
- Updates the scroll view padding for replaced Tabs.
- Updates FullscreenWebStateListObserver, WebScrollViewMainContentUIForwarder,
  and LegacyToolbarUIUpdater to account for replaced active WebStates.
- Updates FullscreenWebStateObserver to stop observing destroyed WebStates.
- Updates FullscreenWebStateObserver to use ScopedFullscreenDisablers to
  prevent unbalanced increment/decrement disabled counter calls.
- Updates DCHECKs in MainContentUIState that failed for side-swipes.
- Creates TestFullscreenController for internal disabling tests.


Bug: 793891, 793966, 793989
Cq-Include-Trybots: master.tryserver.chromium.mac:ios-simulator-cronet;master.tryserver.chromium.mac:ios-simulator-full-configs
Change-Id: I7ed1cd0607e23f34f0991b06386d7d66bf8d86ed
Reviewed-on: https://chromium-review.googlesource.com/826266
Commit-Queue: Kurt Horimoto <kkhorimoto@chromium.org>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Reviewed-by: default avatarKurt Horimoto <kkhorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#524564}
parent fe6b1c49
...@@ -5083,9 +5083,21 @@ bubblePresenterForFeature:(const base::Feature&)feature ...@@ -5083,9 +5083,21 @@ bubblePresenterForFeature:(const base::Feature&)feature
_infoBarContainer->ChangeInfoBarManager(infoBarManager); _infoBarContainer->ChangeInfoBarManager(infoBarManager);
} }
// Add |newTab|'s view to the hierarchy if it's the current Tab. if (self.active && model.currentTab == newTab) {
if (self.active && model.currentTab == newTab) // Add |newTab|'s view to the hierarchy if it's the current Tab.
[self displayTab:newTab isNewSelection:NO]; [self displayTab:newTab isNewSelection:NO];
// Reset the temporary native controller since the current tab is replaced.
_temporaryNativeController = nil;
// If this is occurring for an inserted prerender tab, update its content
// offset so that it's below the toolbar.
if (_insertedTabWasPrerenderedTab) {
CRWWebViewProxyType webViewProxy = newTab.webState->GetWebViewProxy();
CRWWebViewScrollViewProxy* scrollProxy = webViewProxy.scrollViewProxy;
CGFloat toolbarHeight = [self toolbarHeight];
scrollProxy.contentOffset = CGPointMake(0, -toolbarHeight);
webViewProxy.topContentPadding = toolbarHeight;
}
}
if (newTab) if (newTab)
[_paymentRequestManager setActiveWebState:newTab.webState]; [_paymentRequestManager setActiveWebState:newTab.webState];
......
...@@ -41,8 +41,9 @@ source_set("new_fullscreen") { ...@@ -41,8 +41,9 @@ source_set("new_fullscreen") {
source_set("new_fullscreen_internal") { source_set("new_fullscreen_internal") {
sources = [ sources = [
"fullscreen_controller.mm",
"fullscreen_controller_factory.mm", "fullscreen_controller_factory.mm",
"fullscreen_controller_impl.h",
"fullscreen_controller_impl.mm",
"fullscreen_mediator.h", "fullscreen_mediator.h",
"fullscreen_mediator.mm", "fullscreen_mediator.mm",
"fullscreen_model.h", "fullscreen_model.h",
......
...@@ -2,22 +2,16 @@ ...@@ -2,22 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef IOS_CLEAN_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_CONTROLLER_H_ #ifndef IOS_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_CONTROLLER_H_
#define IOS_CLEAN_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_CONTROLLER_H_ #define IOS_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_CONTROLLER_H_
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#include <memory>
#include "base/macros.h" #include "base/macros.h"
#include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/core/keyed_service.h"
@class ChromeBroadcaster; @class ChromeBroadcaster;
@class ChromeBroadcastOberverBridge;
class FullscreenControllerObserver; class FullscreenControllerObserver;
class FullscreenMediator;
class FullscreenModel;
class FullscreenWebStateListObserver;
@class SystemNotificationFullscreenDisabler;
class WebStateList; class WebStateList;
// An object that observes scrolling events in the main content area and // An object that observes scrolling events in the main content area and
...@@ -26,26 +20,25 @@ class WebStateList; ...@@ -26,26 +20,25 @@ class WebStateList;
// the page's content to be visible. // the page's content to be visible.
class FullscreenController : public KeyedService { class FullscreenController : public KeyedService {
public: public:
explicit FullscreenController(); explicit FullscreenController() = default;
~FullscreenController() override;
// The ChromeBroadcaster through the FullscreenController receives UI // The ChromeBroadcaster through the FullscreenController receives UI
// information necessary to calculate fullscreen progress. // information necessary to calculate fullscreen progress.
// TODO(crbug.com/790886): Once FullscreenController is a BrowserUserData, // TODO(crbug.com/790886): Once FullscreenController is a BrowserUserData,
// remove this ad-hoc broadcaster and drive the animations via the Browser's // remove this ad-hoc broadcaster and drive the animations via the Browser's
// ChromeBroadcaster. // ChromeBroadcaster.
ChromeBroadcaster* broadcaster() { return broadcaster_; } virtual ChromeBroadcaster* broadcaster() = 0;
// The WebStateList for the Browser whose fullscreen state is managed by this // The WebStateList for the Browser whose fullscreen state is managed by this
// controller. // controller.
// TODO(crbug.com/790886): Once FullscreenController is a BrowserUserData, // TODO(crbug.com/790886): Once FullscreenController is a BrowserUserData,
// remove this, as the Browser's WebStateList can be used directly rather than // remove this, as the Browser's WebStateList can be used directly rather than
// being set. // being set.
void SetWebStateList(WebStateList* web_state_list); virtual void SetWebStateList(WebStateList* web_state_list) = 0;
// Adds and removes FullscreenControllerObservers. // Adds and removes FullscreenControllerObservers.
void AddObserver(FullscreenControllerObserver* observer); virtual void AddObserver(FullscreenControllerObserver* observer) = 0;
void RemoveObserver(FullscreenControllerObserver* observer); virtual void RemoveObserver(FullscreenControllerObserver* observer) = 0;
// FullscreenController can be disabled when a feature requires that the // FullscreenController can be disabled when a feature requires that the
// toolbar be fully visible. Since there are multiple reasons fullscreen // toolbar be fully visible. Since there are multiple reasons fullscreen
...@@ -55,31 +48,13 @@ class FullscreenController : public KeyedService { ...@@ -55,31 +48,13 @@ class FullscreenController : public KeyedService {
// the toolbar, it calls DecrementDisabledCounter(). IsEnabled() returns // the toolbar, it calls DecrementDisabledCounter(). IsEnabled() returns
// true when the counter is equal to zero. ScopedFullscreenDisabler can be // true when the counter is equal to zero. ScopedFullscreenDisabler can be
// used to tie a disabled counter to an object's lifetime. // used to tie a disabled counter to an object's lifetime.
bool IsEnabled() const; virtual bool IsEnabled() const = 0;
void IncrementDisabledCounter(); virtual void IncrementDisabledCounter() = 0;
void DecrementDisabledCounter(); virtual void DecrementDisabledCounter() = 0;
private: private:
// KeyedService:
void Shutdown() override;
// The broadcaster that drives the model.
__strong ChromeBroadcaster* broadcaster_ = nil;
// The WebStateList for the Browser whose fullscreen is managed by this
// object.
WebStateList* web_state_list_ = nullptr;
// The model used to calculate fullscreen state.
std::unique_ptr<FullscreenModel> model_;
// The bridge used to forward brodcasted UI to |model_|.
__strong ChromeBroadcastOberverBridge* bridge_ = nil;
// A helper object that disables fullscreen for system notifications.
__strong SystemNotificationFullscreenDisabler* disabler_ = nil;
// Object that manages sending signals to FullscreenControllerObservers.
std::unique_ptr<FullscreenMediator> mediator_;
// A WebStateListObserver that updates |model_| for WebStateList changes.
std::unique_ptr<FullscreenWebStateListObserver> web_state_list_observer_;
DISALLOW_COPY_AND_ASSIGN(FullscreenController); DISALLOW_COPY_AND_ASSIGN(FullscreenController);
}; };
#endif // IOS_CLEAN_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_CONTROLLER_H_ #endif // IOS_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_CONTROLLER_H_
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
#include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h"
#include "ios/chrome/browser/browser_state/browser_state_otr_helper.h" #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
...@@ -37,7 +37,7 @@ FullscreenControllerFactory::FullscreenControllerFactory() ...@@ -37,7 +37,7 @@ FullscreenControllerFactory::FullscreenControllerFactory()
std::unique_ptr<KeyedService> std::unique_ptr<KeyedService>
FullscreenControllerFactory::BuildServiceInstanceFor( FullscreenControllerFactory::BuildServiceInstanceFor(
web::BrowserState* context) const { web::BrowserState* context) const {
return base::MakeUnique<FullscreenController>(); return base::MakeUnique<FullscreenControllerImpl>();
} }
web::BrowserState* FullscreenControllerFactory::GetBrowserStateToUse( web::BrowserState* FullscreenControllerFactory::GetBrowserStateToUse(
......
// Copyright 2017 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_FULLSCREEN_FULLSCREEN_CONTROLLER_IMPL_H_
#define IOS_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_CONTROLLER_IMPL_H_
#include <memory>
#import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
@class ChromeBroadcastOberverBridge;
class FullscreenMediator;
class FullscreenModel;
class FullscreenWebStateListObserver;
@class SystemNotificationFullscreenDisabler;
// Implementation of FullscreenController.
class FullscreenControllerImpl : public FullscreenController {
public:
explicit FullscreenControllerImpl();
~FullscreenControllerImpl() override;
// FullscreenController:
ChromeBroadcaster* broadcaster() override;
void SetWebStateList(WebStateList* web_state_list) override;
void AddObserver(FullscreenControllerObserver* observer) override;
void RemoveObserver(FullscreenControllerObserver* observer) override;
bool IsEnabled() const override;
void IncrementDisabledCounter() override;
void DecrementDisabledCounter() override;
private:
// KeyedService:
void Shutdown() override;
// The broadcaster that drives the model.
__strong ChromeBroadcaster* broadcaster_ = nil;
// The WebStateList for the Browser whose fullscreen is managed by this
// object.
WebStateList* web_state_list_ = nullptr;
// The model used to calculate fullscreen state.
std::unique_ptr<FullscreenModel> model_;
// The bridge used to forward brodcasted UI to |model_|.
__strong ChromeBroadcastOberverBridge* bridge_ = nil;
// A helper object that disables fullscreen for system notifications.
__strong SystemNotificationFullscreenDisabler* disabler_ = nil;
// Object that manages sending signals to FullscreenControllerImplObservers.
std::unique_ptr<FullscreenMediator> mediator_;
// A WebStateListObserver that updates |model_| for WebStateList changes.
std::unique_ptr<FullscreenWebStateListObserver> web_state_list_observer_;
DISALLOW_COPY_AND_ASSIGN(FullscreenControllerImpl);
};
#endif // IOS_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_CONTROLLER_IMPL_H_
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#import "ios/chrome/browser/ui/broadcaster/chrome_broadcast_observer_bridge.h" #import "ios/chrome/browser/ui/broadcaster/chrome_broadcast_observer_bridge.h"
...@@ -16,8 +16,9 @@ ...@@ -16,8 +16,9 @@
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
FullscreenController::FullscreenController() FullscreenControllerImpl::FullscreenControllerImpl()
: broadcaster_([[ChromeBroadcaster alloc] init]), : FullscreenController(),
broadcaster_([[ChromeBroadcaster alloc] init]),
model_(base::MakeUnique<FullscreenModel>()), model_(base::MakeUnique<FullscreenModel>()),
bridge_( bridge_(
[[ChromeBroadcastOberverBridge alloc] initWithObserver:model_.get()]), [[ChromeBroadcastOberverBridge alloc] initWithObserver:model_.get()]),
...@@ -35,40 +36,45 @@ FullscreenController::FullscreenController() ...@@ -35,40 +36,45 @@ FullscreenController::FullscreenController()
forSelector:@selector(broadcastToolbarHeight:)]; forSelector:@selector(broadcastToolbarHeight:)];
} }
FullscreenController::~FullscreenController() = default; FullscreenControllerImpl::~FullscreenControllerImpl() = default;
void FullscreenController::SetWebStateList(WebStateList* web_state_list) { ChromeBroadcaster* FullscreenControllerImpl::broadcaster() {
return broadcaster_;
}
void FullscreenControllerImpl::SetWebStateList(WebStateList* web_state_list) {
if (web_state_list_observer_) if (web_state_list_observer_)
web_state_list_observer_->Disconnect(); web_state_list_observer_->Disconnect();
web_state_list_ = web_state_list; web_state_list_ = web_state_list;
web_state_list_observer_ = web_state_list_observer_ =
web_state_list_ ? base::MakeUnique<FullscreenWebStateListObserver>( web_state_list_ ? base::MakeUnique<FullscreenWebStateListObserver>(
model_.get(), web_state_list_) this, model_.get(), web_state_list_)
: nullptr; : nullptr;
} }
void FullscreenController::AddObserver(FullscreenControllerObserver* observer) { void FullscreenControllerImpl::AddObserver(
FullscreenControllerObserver* observer) {
mediator_->AddObserver(observer); mediator_->AddObserver(observer);
} }
void FullscreenController::RemoveObserver( void FullscreenControllerImpl::RemoveObserver(
FullscreenControllerObserver* observer) { FullscreenControllerObserver* observer) {
mediator_->RemoveObserver(observer); mediator_->RemoveObserver(observer);
} }
bool FullscreenController::IsEnabled() const { bool FullscreenControllerImpl::IsEnabled() const {
return model_->enabled(); return model_->enabled();
} }
void FullscreenController::IncrementDisabledCounter() { void FullscreenControllerImpl::IncrementDisabledCounter() {
model_->IncrementDisabledCounter(); model_->IncrementDisabledCounter();
} }
void FullscreenController::DecrementDisabledCounter() { void FullscreenControllerImpl::DecrementDisabledCounter() {
model_->DecrementDisabledCounter(); model_->DecrementDisabledCounter();
} }
void FullscreenController::Shutdown() { void FullscreenControllerImpl::Shutdown() {
mediator_->Disconnect(); mediator_->Disconnect();
[disabler_ disconnect]; [disabler_ disconnect];
if (web_state_list_observer_) if (web_state_list_observer_)
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#import "ios/chrome/browser/web_state_list/web_state_list_observer.h" #import "ios/chrome/browser/web_state_list/web_state_list_observer.h"
#include "ios/web/public/web_state/web_state_observer.h" #include "ios/web/public/web_state/web_state_observer.h"
class FullscreenController;
class FullscreenModel; class FullscreenModel;
// A WebStateListObserver that creates WebStateObservers that update a // A WebStateListObserver that creates WebStateObservers that update a
...@@ -16,7 +17,10 @@ class FullscreenModel; ...@@ -16,7 +17,10 @@ class FullscreenModel;
class FullscreenWebStateListObserver : public WebStateListObserver { class FullscreenWebStateListObserver : public WebStateListObserver {
public: public:
// Constructor for an observer for |web_state_list| that updates |model|. // Constructor for an observer for |web_state_list| that updates |model|.
FullscreenWebStateListObserver(FullscreenModel* model, // |controller| is used to create ScopedFullscreenDisablers for WebState
// navigation events that require the toolbar to be visible.
FullscreenWebStateListObserver(FullscreenController* controller,
FullscreenModel* model,
WebStateList* web_state_list); WebStateList* web_state_list);
~FullscreenWebStateListObserver() override; ~FullscreenWebStateListObserver() override;
...@@ -25,6 +29,10 @@ class FullscreenWebStateListObserver : public WebStateListObserver { ...@@ -25,6 +29,10 @@ class FullscreenWebStateListObserver : public WebStateListObserver {
private: private:
// WebStateListObserver: // WebStateListObserver:
void WebStateReplacedAt(WebStateList* web_state_list,
web::WebState* old_web_state,
web::WebState* new_web_state,
int index) override;
void WebStateActivatedAt(WebStateList* web_state_list, void WebStateActivatedAt(WebStateList* web_state_list,
web::WebState* old_web_state, web::WebState* old_web_state,
web::WebState* new_web_state, web::WebState* new_web_state,
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#import "ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer.h"
#include "base/logging.h" #include "base/logging.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_model.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/browser/web_state_list/web_state_list.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
...@@ -12,11 +13,12 @@ ...@@ -12,11 +13,12 @@
#endif #endif
FullscreenWebStateListObserver::FullscreenWebStateListObserver( FullscreenWebStateListObserver::FullscreenWebStateListObserver(
FullscreenController* controller,
FullscreenModel* model, FullscreenModel* model,
WebStateList* web_state_list) WebStateList* web_state_list)
: model_(model), : model_(model),
web_state_list_(web_state_list), web_state_list_(web_state_list),
web_state_observer_(model) { web_state_observer_(controller, model) {
DCHECK(model_); DCHECK(model_);
DCHECK(web_state_list_); DCHECK(web_state_list_);
web_state_list_->AddObserver(this); web_state_list_->AddObserver(this);
...@@ -34,6 +36,18 @@ void FullscreenWebStateListObserver::Disconnect() { ...@@ -34,6 +36,18 @@ void FullscreenWebStateListObserver::Disconnect() {
web_state_observer_.SetWebState(nullptr); web_state_observer_.SetWebState(nullptr);
} }
void FullscreenWebStateListObserver::WebStateReplacedAt(
WebStateList* web_state_list,
web::WebState* old_web_state,
web::WebState* new_web_state,
int index) {
if (new_web_state == web_state_list->GetActiveWebState()) {
// Reset the model if the active WebState is replaced.
web_state_observer_.SetWebState(new_web_state);
model_->ResetForNavigation();
}
}
void FullscreenWebStateListObserver::WebStateActivatedAt( void FullscreenWebStateListObserver::WebStateActivatedAt(
WebStateList* web_state_list, WebStateList* web_state_list,
web::WebState* old_web_state, web::WebState* old_web_state,
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_model.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_model.h"
#import "ios/chrome/browser/ui/fullscreen/test/fullscreen_model_test_util.h" #import "ios/chrome/browser/ui/fullscreen/test/fullscreen_model_test_util.h"
#import "ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.h"
#import "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h" #import "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
#import "ios/chrome/browser/web_state_list/web_state_list.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/chrome/browser/web_state_list/web_state_opener.h"
...@@ -25,8 +26,9 @@ class FullscreenWebStateListObserverTest : public PlatformTest { ...@@ -25,8 +26,9 @@ class FullscreenWebStateListObserverTest : public PlatformTest {
public: public:
FullscreenWebStateListObserverTest() FullscreenWebStateListObserverTest()
: PlatformTest(), : PlatformTest(),
controller_(&model_),
web_state_list_(&web_state_list_delegate_), web_state_list_(&web_state_list_delegate_),
observer_(&model_, &web_state_list_) { observer_(&controller_, &model_, &web_state_list_) {
SetUpFullscreenModelForTesting(&model_, 100.0); SetUpFullscreenModelForTesting(&model_, 100.0);
} }
...@@ -40,6 +42,7 @@ class FullscreenWebStateListObserverTest : public PlatformTest { ...@@ -40,6 +42,7 @@ class FullscreenWebStateListObserverTest : public PlatformTest {
private: private:
FullscreenModel model_; FullscreenModel model_;
TestFullscreenController controller_;
FakeWebStateListDelegate web_state_list_delegate_; FakeWebStateListDelegate web_state_list_delegate_;
WebStateList web_state_list_; WebStateList web_state_list_;
FullscreenWebStateListObserver observer_; FullscreenWebStateListObserver observer_;
......
...@@ -5,15 +5,21 @@ ...@@ -5,15 +5,21 @@
#ifndef IOS_CLEAN_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_WEB_STATE_OBSERVER_H_ #ifndef IOS_CLEAN_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_WEB_STATE_OBSERVER_H_
#define IOS_CLEAN_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_WEB_STATE_OBSERVER_H_ #define IOS_CLEAN_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_WEB_STATE_OBSERVER_H_
#include <memory>
#include "ios/web/public/web_state/web_state_observer.h" #include "ios/web/public/web_state/web_state_observer.h"
class FullscreenController;
class FullscreenModel; class FullscreenModel;
class ScopedFullscreenDisabler;
// A WebStateObserver that updates a FullscreenModel for navigation events. // A WebStateObserver that updates a FullscreenModel for navigation events.
class FullscreenWebStateObserver : public web::WebStateObserver { class FullscreenWebStateObserver : public web::WebStateObserver {
public: public:
// Constructor for an observer that updates |model|. // Constructor for an observer that updates |controller| and |model|.
FullscreenWebStateObserver(FullscreenModel* model); FullscreenWebStateObserver(FullscreenController* controller,
FullscreenModel* model);
~FullscreenWebStateObserver() override;
// Tells the observer to start observing |web_state|. // Tells the observer to start observing |web_state|.
void SetWebState(web::WebState* web_state); void SetWebState(web::WebState* web_state);
...@@ -25,6 +31,7 @@ class FullscreenWebStateObserver : public web::WebStateObserver { ...@@ -25,6 +31,7 @@ class FullscreenWebStateObserver : public web::WebStateObserver {
void DidStartLoading(web::WebState* web_state) override; void DidStartLoading(web::WebState* web_state) override;
void DidStopLoading(web::WebState* web_state) override; void DidStopLoading(web::WebState* web_state) override;
void DidChangeVisibleSecurityState(web::WebState* web_state) override; void DidChangeVisibleSecurityState(web::WebState* web_state) override;
void WebStateDestroyed(web::WebState* web_state) override;
// Setter for whether the current page's SSL is broken. // Setter for whether the current page's SSL is broken.
void SetIsSSLBroken(bool broken); void SetIsSSLBroken(bool broken);
// Setter for whether the WebState is currently loading. // Setter for whether the WebState is currently loading.
...@@ -32,12 +39,14 @@ class FullscreenWebStateObserver : public web::WebStateObserver { ...@@ -32,12 +39,14 @@ class FullscreenWebStateObserver : public web::WebStateObserver {
// The WebState being observed. // The WebState being observed.
web::WebState* web_state_ = nullptr; web::WebState* web_state_ = nullptr;
// The FullscreenController passed on construction.
FullscreenController* controller_;
// The model passed on construction. // The model passed on construction.
FullscreenModel* model_; FullscreenModel* model_;
// Whether the page's SSL is broken. // The disabler for broken SSL.
bool ssl_broken_ = false; std::unique_ptr<ScopedFullscreenDisabler> ssl_disabler_;
// Whether the WebState is loading. // The disabler for loading.
bool loading_ = false; std::unique_ptr<ScopedFullscreenDisabler> loading_disabler_;
}; };
#endif // IOS_CLEAN_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_WEB_STATE_OBSERVER_H_ #endif // IOS_CLEAN_CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_WEB_STATE_OBSERVER_H_
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
#import "ios/chrome/browser/ui/fullscreen/fullscreen_web_state_observer.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_web_state_observer.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/memory/ptr_util.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_model.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_model.h"
#import "ios/chrome/browser/ui/fullscreen/scoped_fullscreen_disabler.h"
#import "ios/web/public/navigation_item.h" #import "ios/web/public/navigation_item.h"
#import "ios/web/public/navigation_manager.h" #import "ios/web/public/navigation_manager.h"
#include "ios/web/public/ssl_status.h" #include "ios/web/public/ssl_status.h"
...@@ -31,11 +33,16 @@ bool IsWebStateSSLBroken(web::WebState* web_state) { ...@@ -31,11 +33,16 @@ bool IsWebStateSSLBroken(web::WebState* web_state) {
} }
} // namespace } // namespace
FullscreenWebStateObserver::FullscreenWebStateObserver(FullscreenModel* model) FullscreenWebStateObserver::FullscreenWebStateObserver(
: model_(model) { FullscreenController* controller,
FullscreenModel* model)
: controller_(controller), model_(model) {
DCHECK(controller_);
DCHECK(model_); DCHECK(model_);
} }
FullscreenWebStateObserver::~FullscreenWebStateObserver() = default;
void FullscreenWebStateObserver::SetWebState(web::WebState* web_state) { void FullscreenWebStateObserver::SetWebState(web::WebState* web_state) {
if (web_state_ == web_state) if (web_state_ == web_state)
return; return;
...@@ -68,24 +75,23 @@ void FullscreenWebStateObserver::DidChangeVisibleSecurityState( ...@@ -68,24 +75,23 @@ void FullscreenWebStateObserver::DidChangeVisibleSecurityState(
SetIsSSLBroken(IsWebStateSSLBroken(web_state)); SetIsSSLBroken(IsWebStateSSLBroken(web_state));
} }
void FullscreenWebStateObserver::WebStateDestroyed(web::WebState* web_state) {
DCHECK_EQ(web_state, web_state_);
SetWebState(nullptr);
}
void FullscreenWebStateObserver::SetIsSSLBroken(bool broken) { void FullscreenWebStateObserver::SetIsSSLBroken(bool broken) {
if (ssl_broken_ == broken) if (!!ssl_disabler_.get() == broken)
return; return;
ssl_broken_ = broken; ssl_disabler_ = broken
// Fullscreen should be disbaled for pages with broken SSL. ? base::MakeUnique<ScopedFullscreenDisabler>(controller_)
if (ssl_broken_) : nullptr;
model_->IncrementDisabledCounter();
else
model_->DecrementDisabledCounter();
} }
void FullscreenWebStateObserver::SetIsLoading(bool loading) { void FullscreenWebStateObserver::SetIsLoading(bool loading) {
if (loading_ == loading) if (!!loading_disabler_.get() == loading)
return; return;
loading_ = loading; loading_disabler_ =
// Fullscreen should be disabled while the web view is loading. loading ? base::MakeUnique<ScopedFullscreenDisabler>(controller_)
if (loading_) : nullptr;
model_->IncrementDisabledCounter();
else
model_->DecrementDisabledCounter();
} }
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_model.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_model.h"
#import "ios/chrome/browser/ui/fullscreen/test/fullscreen_model_test_util.h" #import "ios/chrome/browser/ui/fullscreen/test/fullscreen_model_test_util.h"
#import "ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.h"
#import "ios/web/public/navigation_item.h" #import "ios/web/public/navigation_item.h"
#include "ios/web/public/ssl_status.h" #include "ios/web/public/ssl_status.h"
#import "ios/web/public/test/fakes/fake_navigation_context.h" #import "ios/web/public/test/fakes/fake_navigation_context.h"
...@@ -20,7 +21,8 @@ ...@@ -20,7 +21,8 @@
class FullscreenWebStateObserverTest : public PlatformTest { class FullscreenWebStateObserverTest : public PlatformTest {
public: public:
FullscreenWebStateObserverTest() : PlatformTest(), observer_(&model_) { FullscreenWebStateObserverTest()
: PlatformTest(), controller_(&model_), observer_(&controller_, &model_) {
// Set up model. // Set up model.
SetUpFullscreenModelForTesting(&model_, 100.0); SetUpFullscreenModelForTesting(&model_, 100.0);
// Set up a TestNavigationManager. // Set up a TestNavigationManager.
...@@ -45,6 +47,7 @@ class FullscreenWebStateObserverTest : public PlatformTest { ...@@ -45,6 +47,7 @@ class FullscreenWebStateObserverTest : public PlatformTest {
private: private:
FullscreenModel model_; FullscreenModel model_;
TestFullscreenController controller_;
web::TestWebState web_state_; web::TestWebState web_state_;
web::TestNavigationManager* navigation_manager_; web::TestNavigationManager* navigation_manager_;
FullscreenWebStateObserver observer_; FullscreenWebStateObserver observer_;
......
...@@ -7,6 +7,8 @@ source_set("test") { ...@@ -7,6 +7,8 @@ source_set("test") {
sources = [ sources = [
"fullscreen_model_test_util.h", "fullscreen_model_test_util.h",
"fullscreen_model_test_util.mm", "fullscreen_model_test_util.mm",
"test_fullscreen_controller.h",
"test_fullscreen_controller.mm",
"test_fullscreen_controller_observer.h", "test_fullscreen_controller_observer.h",
"test_fullscreen_controller_observer.mm", "test_fullscreen_controller_observer.mm",
"test_fullscreen_model_observer.h", "test_fullscreen_model_observer.h",
......
// Copyright 2017 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_FULLSCREEN_TEST_TEST_FULLSCREEN_CONTROLLER_H_
#define IOS_CHROME_BROWSER_UI_FULLSCREEN_TEST_TEST_FULLSCREEN_CONTROLLER_H_
#import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
class FullscreenModel;
// Test version of FullscreenController that enables and disabled the
// FullscreenModel passed on initialization.
class TestFullscreenController : public FullscreenController {
public:
explicit TestFullscreenController(FullscreenModel* model);
~TestFullscreenController() override;
// FullscreenController:
ChromeBroadcaster* broadcaster() override;
void SetWebStateList(WebStateList* web_state_list) override;
void AddObserver(FullscreenControllerObserver* observer) override;
void RemoveObserver(FullscreenControllerObserver* observer) override;
bool IsEnabled() const override;
void IncrementDisabledCounter() override;
void DecrementDisabledCounter() override;
private:
// The model.
FullscreenModel* model_;
};
#endif // IOS_CHROME_BROWSER_UI_FULLSCREEN_TEST_TEST_FULLSCREEN_CONTROLLER_H_
// Copyright 2017 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/fullscreen/test/test_fullscreen_controller.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_model.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
TestFullscreenController::TestFullscreenController(FullscreenModel* model)
: FullscreenController(), model_(model) {}
TestFullscreenController::~TestFullscreenController() = default;
ChromeBroadcaster* TestFullscreenController::broadcaster() {
return nil;
}
void TestFullscreenController::SetWebStateList(WebStateList* web_state_list) {}
void TestFullscreenController::AddObserver(
FullscreenControllerObserver* observer) {}
void TestFullscreenController::RemoveObserver(
FullscreenControllerObserver* observer) {}
bool TestFullscreenController::IsEnabled() const {
return model_->enabled();
}
void TestFullscreenController::IncrementDisabledCounter() {
model_->IncrementDisabledCounter();
}
void TestFullscreenController::DecrementDisabledCounter() {
model_->DecrementDisabledCounter();
}
...@@ -91,6 +91,11 @@ ...@@ -91,6 +91,11 @@
- (void)scrollViewDidEndDraggingWithGesture:(UIPanGestureRecognizer*)panGesture - (void)scrollViewDidEndDraggingWithGesture:(UIPanGestureRecognizer*)panGesture
residualVelocity:(CGPoint)velocity { residualVelocity:(CGPoint)velocity {
// It's possible during the side-swipe gesture for a drag to end on the scroll
// view without a corresponding begin dragging call. Early return if there
// is no pan gesture from the begin call.
if (!self.panGesture)
return;
DCHECK_EQ(panGesture, self.panGesture); DCHECK_EQ(panGesture, self.panGesture);
if (!AreCGFloatsEqual(velocity.y, 0.0)) if (!AreCGFloatsEqual(velocity.y, 0.0))
self.state.decelerating = YES; self.state.decelerating = YES;
......
...@@ -108,6 +108,14 @@ ...@@ -108,6 +108,14 @@
#pragma mark - WebStateListObserving #pragma mark - WebStateListObserving
- (void)webStateList:(WebStateList*)webStateList
didReplaceWebState:(web::WebState*)oldWebState
withWebState:(web::WebState*)newWebState
atIndex:(int)atIndex {
if (newWebState == webStateList->GetActiveWebState())
self.proxy = newWebState->GetWebViewProxy().scrollViewProxy;
}
- (void)webStateList:(WebStateList*)webStateList - (void)webStateList:(WebStateList*)webStateList
didChangeActiveWebState:(web::WebState*)newWebState didChangeActiveWebState:(web::WebState*)newWebState
oldWebState:(web::WebState*)oldWebState oldWebState:(web::WebState*)oldWebState
......
...@@ -114,6 +114,15 @@ ...@@ -114,6 +114,15 @@
#pragma mark WebStateListObserving #pragma mark WebStateListObserving
- (void)webStateList:(WebStateList*)webStateList
didReplaceWebState:(web::WebState*)oldWebState
withWebState:(web::WebState*)newWebState
atIndex:(int)atIndex {
DCHECK_EQ(self.webStateList, webStateList);
if (newWebState == webStateList->GetActiveWebState())
self.webState = newWebState;
}
- (void)webStateList:(WebStateList*)webStateList - (void)webStateList:(WebStateList*)webStateList
didChangeActiveWebState:(web::WebState*)newWebState didChangeActiveWebState:(web::WebState*)newWebState
oldWebState:(web::WebState*)oldWebState oldWebState:(web::WebState*)oldWebState
......
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