blob: c8af05a36f7877ced530b56d76f02f274612a7d6 [file] [log] [blame]
[email protected]e41982a72012-11-20 07:16:511// Copyright 2012 The Chromium Authors. All rights reserved.
[email protected]fd2b9ce2010-08-11 04:03:572// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]03bb7102013-03-17 22:44:475#include "chrome/browser/ui/search/instant_controller.h"
[email protected]fd2b9ce2010-08-11 04:03:576
avi655876a2015-12-25 07:18:157#include <stddef.h>
8
Marc Treib5cacd242017-09-06 07:48:259#include "base/bind.h"
10#include "base/callback.h"
[email protected]d58688c62013-07-03 23:09:1211#include "chrome/browser/profiles/profile.h"
[email protected]a7b8e43d2013-03-18 18:52:4312#include "chrome/browser/search/instant_service.h"
13#include "chrome/browser/search/instant_service_factory.h"
Marc Treibbfe01712017-09-26 11:49:4514#include "chrome/browser/search/search.h"
Marc Treibf4e8daff2017-09-27 08:40:3415#include "chrome/browser/ui/tabs/tab_strip_model.h"
Marc Treibbfe01712017-09-26 11:49:4516#include "chrome/common/url_constants.h"
17#include "content/public/browser/navigation_details.h"
Marc Treib5cacd242017-09-06 07:48:2518#include "content/public/browser/navigation_handle.h"
[email protected]3d6a8952012-12-14 03:18:0719#include "content/public/browser/web_contents.h"
Marc Treib5cacd242017-09-06 07:48:2520#include "content/public/browser/web_contents_observer.h"
21
22class InstantController::TabObserver : public content::WebContentsObserver {
23 public:
24 TabObserver(content::WebContents* web_contents, const base::Closure& callback)
25 : content::WebContentsObserver(web_contents), callback_(callback) {}
26 ~TabObserver() override = default;
27
28 private:
29 // Overridden from content::WebContentsObserver:
Marc Treibbfe01712017-09-26 11:49:4530 void NavigationEntryCommitted(
31 const content::LoadCommittedDetails& load_details) override {
32 if (load_details.is_main_frame && search::IsInstantNTP(web_contents())) {
33 callback_.Run();
34 }
35 }
36
Marc Treib5cacd242017-09-06 07:48:2537 void DidFinishNavigation(
38 content::NavigationHandle* navigation_handle) override {
Marc Treibbfe01712017-09-26 11:49:4539 // TODO(treib): Verify if this is necessary - NavigationEntryCommitted
40 // should already cover all cases.
Marc Treib5cacd242017-09-06 07:48:2541 if (navigation_handle->HasCommitted() &&
Marc Treibbfe01712017-09-26 11:49:4542 navigation_handle->IsInMainFrame() &&
43 search::IsInstantNTP(web_contents())) {
Marc Treib5cacd242017-09-06 07:48:2544 callback_.Run();
45 }
46 }
47
48 base::Closure callback_;
49
50 DISALLOW_COPY_AND_ASSIGN(TabObserver);
51};
[email protected]fd2b9ce2010-08-11 04:03:5752
Marc Treibf4e8daff2017-09-27 08:40:3453InstantController::InstantController(Profile* profile,
54 TabStripModel* tab_strip_model)
55 : profile_(profile), tab_strip_observer_(this) {
56 tab_strip_observer_.Add(tab_strip_model);
57}
Marc Treibbfe01712017-09-26 11:49:4558
59InstantController::~InstantController() = default;
60
Marc Treibf4e8daff2017-09-27 08:40:3461void InstantController::TabDetachedAt(content::WebContents* contents,
62 int index) {
63 StopWatchingTab(contents);
64}
65
66void InstantController::TabDeactivated(content::WebContents* contents) {
67 StopWatchingTab(contents);
68}
69
70void InstantController::ActiveTabChanged(content::WebContents* old_contents,
71 content::WebContents* new_contents,
72 int index,
73 int reason) {
74 StartWatchingTab(new_contents);
75}
76
77void InstantController::TabReplacedAt(TabStripModel* tab_strip_model,
78 content::WebContents* old_contents,
79 content::WebContents* new_contents,
80 int index) {
81 StopWatchingTab(old_contents);
82}
83
84void InstantController::StartWatchingTab(content::WebContents* web_contents) {
Marc Treibbfe01712017-09-26 11:49:4585 if (!tab_observer_ || tab_observer_->web_contents() != web_contents) {
86 tab_observer_ = std::make_unique<TabObserver>(
87 web_contents, base::Bind(&InstantController::UpdateInfoForInstantTab,
88 base::Unretained(this)));
89 // If this tab is an NTP, immediately send it the required info.
90 if (search::IsInstantNTP(web_contents)) {
91 UpdateInfoForInstantTab();
92 }
93 }
Marc Treib7376bd82017-09-26 08:03:2094}
[email protected]e41982a72012-11-20 07:16:5195
Marc Treibf4e8daff2017-09-27 08:40:3496void InstantController::StopWatchingTab(content::WebContents* web_contents) {
Marc Treibbfe01712017-09-26 11:49:4597 if (tab_observer_ && tab_observer_->web_contents() == web_contents) {
98 tab_observer_ = nullptr;
99 }
Marc Treib7376bd82017-09-26 08:03:20100}
[email protected]0c9406632013-02-08 01:13:33101
[email protected]8cc9e532013-05-06 21:01:47102void InstantController::UpdateInfoForInstantTab() {
Marc Treibf4e8daff2017-09-27 08:40:34103 InstantService* instant_service =
104 InstantServiceFactory::GetForProfile(profile_);
treib93f4a872017-04-28 13:29:52105 if (instant_service) {
106 instant_service->UpdateThemeInfo();
107 instant_service->UpdateMostVisitedItemsInfo();
[email protected]8cc9e532013-05-06 21:01:47108 }
109}