1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/google/google_url_tracker_navigation_helper_impl.h"
7 #include "chrome/browser/chrome_notification_types.h"
8 #include "chrome/browser/infobars/infobar_service.h"
9 #include "components/google/core/browser/google_url_tracker.h"
10 #include "content/public/browser/navigation_controller.h"
11 #include "content/public/browser/navigation_entry.h"
12 #include "content/public/browser/notification_service.h"
13 #include "content/public/browser/web_contents.h"
15 GoogleURLTrackerNavigationHelperImpl::GoogleURLTrackerNavigationHelperImpl(
16 content::WebContents
* web_contents
,
17 GoogleURLTracker
* tracker
)
18 : GoogleURLTrackerNavigationHelper(tracker
),
19 web_contents_(web_contents
) {
22 GoogleURLTrackerNavigationHelperImpl::~GoogleURLTrackerNavigationHelperImpl() {
26 void GoogleURLTrackerNavigationHelperImpl::SetListeningForNavigationCommit(
28 content::NotificationSource navigation_controller_source
=
29 content::Source
<content::NavigationController
>(
30 &web_contents_
->GetController());
32 registrar_
.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED
,
33 navigation_controller_source
);
35 registrar_
.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED
,
36 navigation_controller_source
);
40 bool GoogleURLTrackerNavigationHelperImpl::IsListeningForNavigationCommit() {
41 content::NotificationSource navigation_controller_source
=
42 content::Source
<content::NavigationController
>(
43 &web_contents_
->GetController());
44 return registrar_
.IsRegistered(
45 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED
,
46 navigation_controller_source
);
49 void GoogleURLTrackerNavigationHelperImpl::SetListeningForTabDestruction(
51 content::NotificationSource web_contents_source
=
52 content::Source
<content::WebContents
>(web_contents_
);
55 content::NOTIFICATION_WEB_CONTENTS_DESTROYED
,
58 registrar_
.Remove(this,
59 content::NOTIFICATION_WEB_CONTENTS_DESTROYED
,
64 bool GoogleURLTrackerNavigationHelperImpl::IsListeningForTabDestruction() {
65 return registrar_
.IsRegistered(
67 content::NOTIFICATION_WEB_CONTENTS_DESTROYED
,
68 content::Source
<content::WebContents
>(web_contents_
));
71 void GoogleURLTrackerNavigationHelperImpl::OpenURL(
73 WindowOpenDisposition disposition
,
74 bool user_clicked_on_link
) {
75 content::PageTransition transition_type
= user_clicked_on_link
?
76 content::PAGE_TRANSITION_LINK
: content::PAGE_TRANSITION_GENERATED
;
77 web_contents_
->OpenURL(content::OpenURLParams(
78 url
, content::Referrer(), disposition
, transition_type
, false));
81 void GoogleURLTrackerNavigationHelperImpl::Observe(
83 const content::NotificationSource
& source
,
84 const content::NotificationDetails
& details
) {
86 case content::NOTIFICATION_NAV_ENTRY_COMMITTED
: {
87 content::NavigationController
* controller
=
88 content::Source
<content::NavigationController
>(source
).ptr();
89 DCHECK_EQ(web_contents_
, controller
->GetWebContents());
91 // Here we're only listening to notifications where we already know
92 // there's an associated InfoBarService.
93 InfoBarService
* infobar_service
=
94 InfoBarService::FromWebContents(web_contents_
);
95 DCHECK(infobar_service
);
96 const GURL
& search_url
= controller
->GetActiveEntry()->GetURL();
97 if (!search_url
.is_valid()) // Not clear if this can happen.
98 google_url_tracker()->OnTabClosed(this);
99 google_url_tracker()->OnNavigationCommitted(infobar_service
, search_url
);
103 case content::NOTIFICATION_WEB_CONTENTS_DESTROYED
: {
104 DCHECK_EQ(web_contents_
,
105 content::Source
<content::WebContents
>(source
).ptr());
106 google_url_tracker()->OnTabClosed(this);
111 NOTREACHED() << "Unknown notification received:" << type
;