Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1876)

Unified Diff: chrome/browser/instant/instant_loader.cc

Issue 10829284: Remove observer when removing delegate, in Instant. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Proper fix, hopefully Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/instant/instant_loader.cc
diff --git a/chrome/browser/instant/instant_loader.cc b/chrome/browser/instant/instant_loader.cc
index 1f088885ff6f6e188e9f563851934cb0fb8c2210..5ca8877677c08f072d31e8113f0f8e135a7008be 100644
--- a/chrome/browser/instant/instant_loader.cc
+++ b/chrome/browser/instant/instant_loader.cc
@@ -38,6 +38,10 @@ class InstantLoader::WebContentsDelegateImpl
return is_pointer_down_from_activate_;
}
+ // Start observing the given |web_contents| instead of whatever is currently
+ // being observed. If |web_contents| is NULL, effectively stops observing.
+ void ObserveContents(content::WebContents* web_contents);
+
// ConstrainedWindowTabHelperDelegate:
virtual bool ShouldFocusConstrainedWindow() OVERRIDE;
@@ -93,11 +97,15 @@ class InstantLoader::WebContentsDelegateImpl
InstantLoader::WebContentsDelegateImpl::WebContentsDelegateImpl(
InstantLoader* loader)
- : content::WebContentsObserver(loader->preview_contents_->web_contents()),
- loader_(loader),
+ : loader_(loader),
is_pointer_down_from_activate_(false) {
}
+void InstantLoader::WebContentsDelegateImpl::ObserveContents(
+ content::WebContents* web_contents) {
+ Observe(web_contents);
+}
+
bool InstantLoader::WebContentsDelegateImpl::ShouldFocusConstrainedWindow() {
// Return false so that constrained windows are not initially focused. If we
// did otherwise the preview would prematurely get committed when focus goes
@@ -200,6 +208,13 @@ void InstantLoader::WebContentsDelegateImpl::OnSetSuggestions(
int page_id,
const std::vector<string16>& suggestions,
InstantCompleteBehavior behavior) {
+ DCHECK(loader_->preview_contents() &&
+ loader_->preview_contents_->web_contents());
+ // TODO(sreeram): Remove this 'if' bandaid once bug 141875 is confirmed fixed.
+ if (!loader_->preview_contents() ||
+ !loader_->preview_contents_->web_contents()) {
+ return;
+ }
content::NavigationEntry* entry = loader_->preview_contents_->web_contents()->
GetController().GetActiveEntry();
if (entry && page_id == entry->GetPageID()) {
@@ -211,6 +226,13 @@ void InstantLoader::WebContentsDelegateImpl::OnSetSuggestions(
void InstantLoader::WebContentsDelegateImpl::OnInstantSupportDetermined(
int page_id,
bool result) {
+ DCHECK(loader_->preview_contents() &&
+ loader_->preview_contents_->web_contents());
+ // TODO(sreeram): Remove this 'if' bandaid once bug 141875 is confirmed fixed.
+ if (!loader_->preview_contents() ||
Shishir 2012/08/10 22:11:15 How will you know what is fixing the issue: this i
sreeram 2012/08/10 22:13:54 I'll know when debug builds don't crash (the DCHEC
+ !loader_->preview_contents_->web_contents()) {
+ return;
+ }
content::NavigationEntry* entry = loader_->preview_contents_->web_contents()->
GetController().GetActiveEntry();
if (entry && page_id == entry->GetPageID())
@@ -239,8 +261,10 @@ void InstantLoader::WebContentsDelegateImpl
// If the page doesn't support the Instant API, InstantController schedules
// the loader for destruction. Stop sending the controller any more messages,
// by severing the connection from the WebContents to us (its delegate).
- if (!supports_instant)
+ if (!supports_instant) {
loader_->preview_contents_->web_contents()->SetDelegate(NULL);
+ ObserveContents(NULL);
+ }
}
// InstantLoader ---------------------------------------------------------------
@@ -261,8 +285,10 @@ InstantLoader::InstantLoader(InstantLoaderDelegate* delegate,
}
InstantLoader::~InstantLoader() {
- if (preview_contents())
+ if (preview_contents()) {
preview_contents_->web_contents()->SetDelegate(NULL);
+ preview_delegate_->ObserveContents(NULL);
+ }
}
void InstantLoader::Init() {
@@ -325,6 +351,7 @@ void InstantLoader::SetupPreviewContents() {
content::WebContents* new_contents = preview_contents_->web_contents();
WebContentsDelegateImpl* new_delegate = preview_delegate_.get();
new_contents->SetDelegate(new_delegate);
+ new_delegate->ObserveContents(new_contents);
// Disable popups and such (mainly to avoid losing focus and reverting the
// preview prematurely).
@@ -353,6 +380,7 @@ void InstantLoader::SetupPreviewContents() {
void InstantLoader::CleanupPreviewContents() {
content::WebContents* old_contents = preview_contents_->web_contents();
old_contents->SetDelegate(NULL);
+ preview_delegate_->ObserveContents(NULL);
preview_contents_->blocked_content_tab_helper()->SetAllContentsBlocked(false);
preview_contents_->constrained_window_tab_helper()->set_delegate(NULL);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698