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