1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/prerender/prerender_observer.h"
6
7 #include "base/time.h"
8 #include "chrome/browser/prerender/prerender_manager.h"
9 #include "chrome/browser/profiles/profile.h"
10 #include "content/browser/tab_contents/tab_contents.h"
11 #include "content/common/view_messages.h"
12
13 namespace prerender {
14
PrerenderObserver(TabContents * tab_contents)15 PrerenderObserver::PrerenderObserver(TabContents* tab_contents)
16 : TabContentsObserver(tab_contents),
17 pplt_load_start_() {
18 }
19
~PrerenderObserver()20 PrerenderObserver::~PrerenderObserver() {
21 }
22
ProvisionalChangeToMainFrameUrl(const GURL & url)23 void PrerenderObserver::ProvisionalChangeToMainFrameUrl(const GURL& url) {
24 PrerenderManager* pm = MaybeGetPrerenderManager();
25 if (pm)
26 pm->MarkTabContentsAsNotPrerendered(tab_contents());
27 MaybeUsePreloadedPage(url);
28 }
29
OnMessageReceived(const IPC::Message & message)30 bool PrerenderObserver::OnMessageReceived(const IPC::Message& message) {
31 IPC_BEGIN_MESSAGE_MAP(PrerenderObserver, message)
32 IPC_MESSAGE_HANDLER(ViewHostMsg_DidStartProvisionalLoadForFrame,
33 OnDidStartProvisionalLoadForFrame)
34 IPC_END_MESSAGE_MAP()
35 return false;
36 }
37
OnDidStartProvisionalLoadForFrame(int64 frame_id,bool is_main_frame,const GURL & url)38 void PrerenderObserver::OnDidStartProvisionalLoadForFrame(int64 frame_id,
39 bool is_main_frame,
40 const GURL& url) {
41 if (is_main_frame) {
42 // Record the beginning of a new PPLT navigation.
43 pplt_load_start_ = base::TimeTicks::Now();
44 }
45 }
46
DidStopLoading()47 void PrerenderObserver::DidStopLoading() {
48 // Compute the PPLT metric and report it in a histogram, if needed.
49 if (!pplt_load_start_.is_null()) {
50 PrerenderManager::RecordPerceivedPageLoadTime(
51 base::TimeTicks::Now() - pplt_load_start_, tab_contents());
52 }
53
54 // Reset the PPLT metric.
55 pplt_load_start_ = base::TimeTicks();
56 }
57
MaybeGetPrerenderManager()58 PrerenderManager* PrerenderObserver::MaybeGetPrerenderManager() {
59 return tab_contents()->profile()->GetPrerenderManager();
60 }
61
MaybeUsePreloadedPage(const GURL & url)62 bool PrerenderObserver::MaybeUsePreloadedPage(const GURL& url) {
63 PrerenderManager* pm = MaybeGetPrerenderManager();
64 if (pm && pm->MaybeUsePreloadedPage(tab_contents(), url))
65 return true;
66 return false;
67 }
68
69 } // namespace prerender
70