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