12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/search/instant_page.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/profiles/profile.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/search/search.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/search/search_model.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/search/search_tab_helper.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/render_messages.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/url_constants.h" 13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/public/browser/navigation_controller.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_details.h" 15b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/public/browser/navigation_entry.h" 16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/notification_service.h" 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/notification_source.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_frame_host.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/frame_navigate_params.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InstantPage::Delegate::~Delegate() { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InstantPage::~InstantPage() { 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (web_contents()) { 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SearchTabHelper::FromWebContents(web_contents())->model()->RemoveObserver( 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool InstantPage::supports_instant() const { 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return web_contents() && 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SearchTabHelper::FromWebContents(web_contents())->SupportsInstant(); 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const std::string& InstantPage::instant_url() const { 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return instant_url_; 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool InstantPage::IsLocal() const { 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return web_contents() && 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_contents()->GetURL() == GURL(chrome::kChromeSearchLocalNtpUrl); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochInstantPage::InstantPage(Delegate* delegate, const std::string& instant_url, 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch Profile* profile, bool is_incognito) 48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : profile_(profile), 49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch delegate_(delegate), 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) instant_url_(instant_url), 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_incognito_(is_incognito) { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid InstantPage::SetContents(content::WebContents* new_web_contents) { 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ClearContents(); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!new_web_contents) 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Observe(new_web_contents); 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SearchModel* model = 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SearchTabHelper::FromWebContents(web_contents())->model(); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch model->AddObserver(this); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Already know whether the page supports instant. 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (model->instant_support() != INSTANT_SUPPORT_UNKNOWN) 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InstantSupportDetermined(model->instant_support() == INSTANT_SUPPORT_YES); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool InstantPage::ShouldProcessAboutToNavigateMainFrame() { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstantPage::DidCommitProvisionalLoadForFrame( 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransition /* transition_type */) { 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!render_frame_host->GetParent() && 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ShouldProcessAboutToNavigateMainFrame()) 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate_->InstantPageAboutToNavigateMainFrame(web_contents(), url); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantPage::ModelChanged(const SearchModel::State& old_state, 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SearchModel::State& new_state) { 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (old_state.instant_support != new_state.instant_support) 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InstantSupportDetermined(new_state.instant_support == INSTANT_SUPPORT_YES); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantPage::InstantSupportDetermined(bool supports_instant) { 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate_->InstantSupportDetermined(web_contents(), supports_instant); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the page doesn't support Instant, stop listening to it. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!supports_instant) 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ClearContents(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantPage::ClearContents() { 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (web_contents()) { 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SearchTabHelper::FromWebContents(web_contents())->model()->RemoveObserver( 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this); 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Observe(NULL); 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 105