diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-23 20:27:33 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-23 20:27:33 +0000 |
commit | fd0719894fe7432eec3155bd23cfab4bb22d4595 (patch) | |
tree | 656b6966cdcc64f66b92f4d6094179b1b4c05035 | |
parent | 15bb2f4987e01dbb765207d792edbfe48efe68d1 (diff) | |
download | chromium_src-fd0719894fe7432eec3155bd23cfab4bb22d4595.zip chromium_src-fd0719894fe7432eec3155bd23cfab4bb22d4595.tar.gz chromium_src-fd0719894fe7432eec3155bd23cfab4bb22d4595.tar.bz2 |
Two minor tweaks to prerender:
. Don't attempt to swap if the TabContentsWrapper has no delegate.
. Reset the delegate before returning the TabContents.
I'm doing this as we have crash reports of a TabContentsDelegate being
deleted before the TabContents.
BUG=85247
TEST=none
R=cbentzel@chromium.org
Review URL: http://codereview.chromium.org/7246012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90256 0039d316-1c4b-4281-b951-d872f2087c98
4 files changed, 13 insertions, 5 deletions
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc index 3247aae..ae72b91 100644 --- a/chrome/browser/prerender/prerender_contents.cc +++ b/chrome/browser/prerender/prerender_contents.cc @@ -537,6 +537,7 @@ void PrerenderContents::DestroyWhenUsingTooManyResources() { } TabContentsWrapper* PrerenderContents::ReleasePrerenderContents() { + prerender_contents_->tab_contents()->set_delegate(NULL); render_view_host_observer_.reset(); prerender_contents_->download_tab_helper()->set_delegate(NULL); TabContentsObserver::Observe(NULL); diff --git a/chrome/browser/prerender/prerender_observer.cc b/chrome/browser/prerender/prerender_observer.cc index 8f286aa..eb5e257 100644 --- a/chrome/browser/prerender/prerender_observer.cc +++ b/chrome/browser/prerender/prerender_observer.cc @@ -7,13 +7,15 @@ #include "base/time.h" #include "chrome/browser/prerender/prerender_manager.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" #include "content/browser/tab_contents/tab_contents.h" #include "content/common/view_messages.h" namespace prerender { -PrerenderObserver::PrerenderObserver(TabContents* tab_contents) - : TabContentsObserver(tab_contents), +PrerenderObserver::PrerenderObserver(TabContentsWrapper* tab) + : TabContentsObserver(tab->tab_contents()), + tab_(tab), pplt_load_start_() { } @@ -22,6 +24,8 @@ PrerenderObserver::~PrerenderObserver() { void PrerenderObserver::ProvisionalChangeToMainFrameUrl(const GURL& url, bool has_opener_set) { + if (!tab_->delegate()) + return; // PrerenderManager needs a delegate to handle the swap. PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); if (!prerender_manager) return; diff --git a/chrome/browser/prerender/prerender_observer.h b/chrome/browser/prerender/prerender_observer.h index 324644c..9f8526a 100644 --- a/chrome/browser/prerender/prerender_observer.h +++ b/chrome/browser/prerender/prerender_observer.h @@ -9,7 +9,7 @@ #include "base/time.h" -class TabContents; +class TabContentsWrapper; class GURL; namespace prerender { @@ -21,7 +21,7 @@ class PrerenderManager; // to compare PLT's with prerendering enabled and disabled. class PrerenderObserver : public TabContentsObserver { public: - explicit PrerenderObserver(TabContents* tab_contents); + explicit PrerenderObserver(TabContentsWrapper* tab); virtual ~PrerenderObserver(); // TabContentsObserver implementation. @@ -51,6 +51,9 @@ class PrerenderObserver : public TabContentsObserver { // Returns whether the TabContents being observed is currently prerendering. bool IsPrerendering(); + // TabContentsWrapper we're created for. + TabContentsWrapper* tab_; + // System time at which the current load was started for the purpose of // the perceived page load time (PPLT). base::TimeTicks pplt_load_start_; diff --git a/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc b/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc index 18fc132..4ee881b 100644 --- a/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc +++ b/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc @@ -137,7 +137,7 @@ TabContentsWrapper::TabContentsWrapper(TabContents* contents) external_protocol_observer_.reset(new ExternalProtocolObserver(contents)); file_select_observer_.reset(new FileSelectObserver(contents)); plugin_observer_.reset(new PluginObserver(this)); - prerender_observer_.reset(new prerender::PrerenderObserver(contents)); + prerender_observer_.reset(new prerender::PrerenderObserver(this)); print_preview_.reset(new printing::PrintPreviewMessageHandler(contents)); webnavigation_observer_.reset( new ExtensionWebNavigationTabObserver(contents)); |