Commit 06b45622 authored by Avi Drissman's avatar Avi Drissman Committed by Commit Bot

Create Browser::FromWebContents.

This allows code to get the Browser from a WebContents
safely. Existing code doing blind casting from a
WebContentsDelegate is updated, and there are two
tab helpers on the way that will be using it.

BUG=none

Change-Id: Idea2fa9bd98d9a607bfc0a1ff9d2e88a0812a509
Reviewed-on: https://chromium-review.googlesource.com/612044Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Commit-Queue: Avi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#494092}
parent 404c74d7
...@@ -472,7 +472,7 @@ class NewTabNavigationOrSwapObserver { ...@@ -472,7 +472,7 @@ class NewTabNavigationOrSwapObserver {
WebContents* new_tab = content::Details<WebContents>(details).ptr(); WebContents* new_tab = content::Details<WebContents>(details).ptr();
// Get the TabStripModel. Assume this is attached to a Browser. // Get the TabStripModel. Assume this is attached to a Browser.
TabStripModel* tab_strip_model = TabStripModel* tab_strip_model =
static_cast<Browser*>(new_tab->GetDelegate())->tab_strip_model(); Browser::FromWebContents(new_tab)->tab_strip_model();
swap_observer_.reset(new NavigationOrSwapObserver(tab_strip_model, swap_observer_.reset(new NavigationOrSwapObserver(tab_strip_model,
new_tab)); new_tab));
swap_observer_->set_did_start_loading(); swap_observer_->set_did_start_loading();
......
...@@ -278,6 +278,19 @@ const extensions::Extension* GetExtensionForOrigin( ...@@ -278,6 +278,19 @@ const extensions::Extension* GetExtensionForOrigin(
#endif #endif
} }
// Stores a pointer to the Browser in the WebContents.
struct BrowserLink : public base::SupportsUserData::Data {
static const char kKey[];
explicit BrowserLink(Browser* browser) : browser(browser) {}
~BrowserLink() override = default;
Browser* browser;
};
// static
const char BrowserLink::kKey[] = "BrowserLink";
} // namespace } // namespace
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
...@@ -566,6 +579,13 @@ Browser::~Browser() { ...@@ -566,6 +579,13 @@ Browser::~Browser() {
select_file_dialog_->ListenerDestroyed(); select_file_dialog_->ListenerDestroyed();
} }
// static
Browser* Browser::FromWebContents(content::WebContents* web_contents) {
const BrowserLink* link =
static_cast<BrowserLink*>(web_contents->GetUserData(&BrowserLink::kKey));
return link ? link->browser : nullptr;
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Getters & Setters // Getters & Setters
...@@ -2357,7 +2377,8 @@ bool Browser::CanCloseWithInProgressDownloads() { ...@@ -2357,7 +2377,8 @@ bool Browser::CanCloseWithInProgressDownloads() {
// Browser, Assorted utility functions (private): // Browser, Assorted utility functions (private):
void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) { void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) {
Browser* delegate = set_delegate ? this : NULL; Browser* delegate = set_delegate ? this : nullptr;
// WebContents... // WebContents...
web_contents->SetDelegate(delegate); web_contents->SetDelegate(delegate);
...@@ -2375,6 +2396,14 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) { ...@@ -2375,6 +2396,14 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) {
zoom::ZoomController::FromWebContents(web_contents)->RemoveObserver(this); zoom::ZoomController::FromWebContents(web_contents)->RemoveObserver(this);
content_translate_driver.RemoveObserver(this); content_translate_driver.RemoveObserver(this);
} }
// Update the back-link from the WebContents to Browser.
if (set_delegate) {
web_contents->SetUserData(BrowserLink::kKey,
base::MakeUnique<BrowserLink>(this));
} else {
web_contents->RemoveUserData(BrowserLink::kKey);
}
} }
void Browser::CloseFrame() { void Browser::CloseFrame() {
......
...@@ -220,6 +220,10 @@ class Browser : public TabStripModelObserver, ...@@ -220,6 +220,10 @@ class Browser : public TabStripModelObserver,
explicit Browser(const CreateParams& params); explicit Browser(const CreateParams& params);
~Browser() override; ~Browser() override;
// Returns the Browser that contains the specified WebContents. May return
// null if no Browser has that WebContents as a tab.
static Browser* FromWebContents(content::WebContents* web_contents);
// Set overrides for the initial window bounds and maximized state. // Set overrides for the initial window bounds and maximized state.
void set_override_bounds(const gfx::Rect& bounds) { void set_override_bounds(const gfx::Rect& bounds) {
override_bounds_ = bounds; override_bounds_ = bounds;
......
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