Chromium Code Reviews| Index: chrome/browser/prerender/prerender_contents.cc |
| diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc |
| index 3b38659345fdfc8e320449538b995bee547bbf0f..41b9587c955d5bdc456e8434c312a0946e24008d 100644 |
| --- a/chrome/browser/prerender/prerender_contents.cc |
| +++ b/chrome/browser/prerender/prerender_contents.cc |
| @@ -73,10 +73,10 @@ void InformRenderProcessAboutPrerender(const GURL& url, |
| class PrerenderContentsFactoryImpl : public PrerenderContents::Factory { |
| public: |
| virtual PrerenderContents* CreatePrerenderContents( |
| - PrerenderManager* prerender_manager, PrerenderTracker* prerender_tracker, |
| - Profile* profile, const GURL& url, const content::Referrer& referrer, |
| + PrerenderManager* prerender_manager, Profile* profile, |
| + const GURL& url, const content::Referrer& referrer, |
| Origin origin, uint8 experiment_id) OVERRIDE { |
| - return new PrerenderContents(prerender_manager, prerender_tracker, profile, |
| + return new PrerenderContents(prerender_manager, profile, |
| url, referrer, origin, experiment_id); |
| } |
| }; |
| @@ -167,6 +167,12 @@ class PrerenderContents::TabContentsDelegateImpl |
| PrerenderContents* prerender_contents_; |
| }; |
| +PrerenderContents::Observer::Observer() { |
| +} |
| + |
| +PrerenderContents::Observer::~Observer() { |
| +} |
| + |
| PrerenderContents::PendingPrerenderInfo::PendingPrerenderInfo( |
| base::WeakPtr<PrerenderHandle> weak_prerender_handle, |
| Origin origin, |
| @@ -202,7 +208,6 @@ void PrerenderContents::StartPendingPrerenders() { |
| PrerenderContents::PrerenderContents( |
| PrerenderManager* prerender_manager, |
| - PrerenderTracker* prerender_tracker, |
| Profile* profile, |
| const GURL& url, |
| const content::Referrer& referrer, |
| @@ -210,7 +215,6 @@ PrerenderContents::PrerenderContents( |
| uint8 experiment_id) |
| : prerendering_has_started_(false), |
| prerender_manager_(prerender_manager), |
| - prerender_tracker_(prerender_tracker), |
| prerender_url_(url), |
| referrer_(referrer), |
| profile_(profile), |
| @@ -310,10 +314,7 @@ void PrerenderContents::StartPrerendering( |
| // RenderViewHost. This must be done before the Navigate message to catch all |
| // resource requests, but as it is on the same thread as the Navigate message |
| // (IO) there is no race condition. |
| - prerender_tracker_->OnPrerenderingStarted( |
| - child_id_, |
| - route_id_, |
| - prerender_manager_); |
| + NotifyPrerenderStart(); |
|
mmenke
2012/12/03 20:02:47
IMPORTANT: We do want to call this for the contro
gavinp
2012/12/04 18:04:48
It's the other way, I think. We don't want to tell
|
| // Close ourselves when the application is shutting down. |
| notification_registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING, |
| @@ -371,22 +372,20 @@ void PrerenderContents::set_final_status(FinalStatus final_status) { |
| DCHECK(final_status_ == FINAL_STATUS_MAX); |
| final_status_ = final_status; |
| + |
| + NotifyPrerenderStop(); |
| } |
| PrerenderContents::~PrerenderContents() { |
| - DCHECK(final_status_ != FINAL_STATUS_MAX); |
| - DCHECK(prerendering_has_been_cancelled_ || |
| - final_status_ == FINAL_STATUS_USED); |
| - DCHECK(origin_ != ORIGIN_MAX); |
| + DCHECK_NE(FINAL_STATUS_MAX, final_status_); |
| + DCHECK( |
| + prerendering_has_been_cancelled_ || final_status_ == FINAL_STATUS_USED); |
| + DCHECK_NE(ORIGIN_MAX, origin_); |
| prerender_manager_->RecordFinalStatusWithMatchCompleteStatus( |
| - origin_, |
| - experiment_id_, |
| - match_complete_status_, |
| - final_status_); |
| + origin_, experiment_id_, match_complete_status_, final_status_); |
| if (child_id_ != -1 && route_id_ != -1) { |
| - prerender_tracker_->OnPrerenderingFinished(child_id_, route_id_); |
| for (std::vector<GURL>::const_iterator it = alias_urls_.begin(); |
| it != alias_urls_.end(); |
| ++it) { |
| @@ -400,6 +399,14 @@ PrerenderContents::~PrerenderContents() { |
| delete ReleasePrerenderContents(); |
| } |
| +void PrerenderContents::AddObserver(Observer* observer) { |
| + observer_list_.AddObserver(observer); |
| +} |
| + |
| +void PrerenderContents::RemoveObserver(Observer* observer) { |
| + observer_list_.RemoveObserver(observer); |
| +} |
| + |
| void PrerenderContents::Observe(int type, |
| const content::NotificationSource& source, |
| const content::NotificationDetails& details) { |
| @@ -484,6 +491,14 @@ WebContents* PrerenderContents::CreateWebContents( |
| profile_, NULL, MSG_ROUTING_NONE, NULL, session_storage_namespace_map); |
| } |
| +void PrerenderContents::NotifyPrerenderStart() { |
| + FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderStart(this)); |
| +} |
| + |
| +void PrerenderContents::NotifyPrerenderStop() { |
| + FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderStop(this)); |
| +} |
| + |
| void PrerenderContents::OnUpdateFaviconURL( |
| int32 page_id, |
| const std::vector<FaviconURL>& urls) { |
| @@ -580,14 +595,14 @@ void PrerenderContents::Destroy(FinalStatus final_status) { |
| // because destroy may be called directly from the UI thread without calling |
| // TryCancel(). This is difficult to completely avoid, since prerendering |
| // can be cancelled before a RenderView is created. |
| - bool is_cancelled = prerender_tracker_->TryCancel( |
| + bool is_cancelled = prerender_manager()->prerender_tracker()->TryCancel( |
| child_id_, route_id_, final_status); |
| CHECK(is_cancelled); |
| // A different final status may have been set already from another thread. |
| // If so, use it instead. |
| - if (!prerender_tracker_->GetFinalStatus(child_id_, route_id_, |
| - &final_status)) { |
| + if (!prerender_manager()->prerender_tracker()-> |
| + GetFinalStatus(child_id_, route_id_, &final_status)) { |
| NOTREACHED(); |
| } |
| } |