Commit dc838412 authored by Chris Lu's avatar Chris Lu Committed by Chromium LUCI CQ

[ios] Add SadTabCoordinator as BrowserObserver

FullscreenController is tied to the Browser, so when the Browser is
destroyed, any reference to FullscreenController is garbage. Thus,
SadTabCoordinator needs to call [self stop] to break itself down
(and therefore reset its FullscreenDisabler) before the Browser is
completely destroyed in case [self stop] is called by its owning class
after the fact.

Bug: 1154298
Change-Id: Id9ffc055d338972fe360899a14cf596fc7c41a3d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2572692Reviewed-by: default avatarSylvain Defresne <sdefresne@chromium.org>
Reviewed-by: default avatarRohit Rao <rohitrao@chromium.org>
Commit-Queue: Chris Lu <thegreenfrog@chromium.org>
Cr-Commit-Position: refs/heads/master@{#835718}
parent e32054c9
...@@ -10,6 +10,8 @@ source_set("public") { ...@@ -10,6 +10,8 @@ source_set("public") {
"browser_list_factory.h", "browser_list_factory.h",
"browser_list_observer.h", "browser_list_observer.h",
"browser_observer.h", "browser_observer.h",
"browser_observer_bridge.h",
"browser_observer_bridge.mm",
"browser_user_data.h", "browser_user_data.h",
] ]
deps = [ deps = [
......
// 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_MAIN_BROWSER_OBSERVER_BRIDGE_H_
#define IOS_CHROME_BROWSER_MAIN_BROWSER_OBSERVER_BRIDGE_H_
#import "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/main/browser_observer.h"
// Protocol that corresponds to the BrowserObserver API. Allows registering
// Objective-C objects to listen to Browser events.
@protocol BrowserObserving <NSObject>
- (void)browserDestroyed:(Browser*)browser;
@end
// Observer that bridges Browser events to an Objective-C observer that
// implements the BrowserObserver protocol (the observer is *not* owned).
class BrowserObserverBridge final : public BrowserObserver {
public:
// It is the responsibility of calling code to add/remove the instance
// from the WebStates observer lists.
explicit BrowserObserverBridge(id<BrowserObserving> observer);
~BrowserObserverBridge() final;
private:
void BrowserDestroyed(Browser* browser) override;
__weak id<BrowserObserving> observer_ = nil;
DISALLOW_COPY_AND_ASSIGN(BrowserObserverBridge);
};
#endif // IOS_CHROME_BROWSER_MAIN_BROWSER_OBSERVER_BRIDGE_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/main/browser_observer_bridge.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
BrowserObserverBridge::BrowserObserverBridge(id<BrowserObserving> observer)
: observer_(observer) {}
BrowserObserverBridge::~BrowserObserverBridge() {}
void BrowserObserverBridge::BrowserDestroyed(Browser* browser) {
[observer_ browserDestroyed:browser];
}
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "components/ui_metrics/sadtab_metrics_types.h" #include "components/ui_metrics/sadtab_metrics_types.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/main/browser.h" #import "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/main/browser_observer_bridge.h"
#import "ios/chrome/browser/ui/commands/application_commands.h" #import "ios/chrome/browser/ui/commands/application_commands.h"
#import "ios/chrome/browser/ui/commands/browser_commands.h" #import "ios/chrome/browser/ui/commands/browser_commands.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
...@@ -26,8 +27,12 @@ ...@@ -26,8 +27,12 @@
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
@interface SadTabCoordinator ()<SadTabViewControllerDelegate> { @interface SadTabCoordinator () <SadTabViewControllerDelegate,
BrowserObserving> {
SadTabViewController* _viewController; SadTabViewController* _viewController;
// Observe BrowserObserver to stop fullscreen disabling before the
// FullscreenController tied to the Browser is destroyed.
std::unique_ptr<BrowserObserverBridge> _browserObserver;
} }
@end @end
...@@ -46,7 +51,8 @@ ...@@ -46,7 +51,8 @@
ui_metrics::SadTabEvent::DISPLAYED, ui_metrics::SadTabEvent::DISPLAYED,
ui_metrics::SadTabEvent::MAX_SAD_TAB_EVENT); ui_metrics::SadTabEvent::MAX_SAD_TAB_EVENT);
} }
_browserObserver = std::make_unique<BrowserObserverBridge>(self);
self.browser->AddObserver(_browserObserver.get());
// Creates a fullscreen disabler. // Creates a fullscreen disabler.
[self didStartFullscreenDisablingUI]; [self didStartFullscreenDisablingUI];
...@@ -71,6 +77,8 @@ ...@@ -71,6 +77,8 @@
if (!_viewController) if (!_viewController)
return; return;
self.browser->RemoveObserver(_browserObserver.get());
_browserObserver.reset();
[self didStopFullscreenDisablingUI]; [self didStopFullscreenDisablingUI];
[_viewController willMoveToParentViewController:nil]; [_viewController willMoveToParentViewController:nil];
...@@ -85,6 +93,12 @@ ...@@ -85,6 +93,12 @@
_overscrollDelegate = delegate; _overscrollDelegate = delegate;
} }
#pragma mark - BrowserObserving
- (void)browserDestroyed:(Browser*)browser {
[self stop];
}
#pragma mark - SadTabViewDelegate #pragma mark - SadTabViewDelegate
- (void)sadTabViewControllerShowReportAnIssue: - (void)sadTabViewControllerShowReportAnIssue:
......
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