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