Home | History | Annotate | Download | only in google
      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.
      4 
      5 #include "chrome/browser/google/google_url_tracker_navigation_helper_impl.h"
      6 
      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"
     14 
     15 GoogleURLTrackerNavigationHelperImpl::GoogleURLTrackerNavigationHelperImpl(
     16     content::WebContents* web_contents,
     17     GoogleURLTracker* tracker)
     18     : GoogleURLTrackerNavigationHelper(tracker),
     19       web_contents_(web_contents) {
     20 }
     21 
     22 GoogleURLTrackerNavigationHelperImpl::~GoogleURLTrackerNavigationHelperImpl() {
     23   web_contents_ = NULL;
     24 }
     25 
     26 void GoogleURLTrackerNavigationHelperImpl::SetListeningForNavigationCommit(
     27     bool listen) {
     28   content::NotificationSource navigation_controller_source =
     29       content::Source<content::NavigationController>(
     30           &web_contents_->GetController());
     31   if (listen) {
     32     registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
     33                     navigation_controller_source);
     34   } else {
     35     registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
     36                       navigation_controller_source);
     37   }
     38 }
     39 
     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);
     47 }
     48 
     49 void GoogleURLTrackerNavigationHelperImpl::SetListeningForTabDestruction(
     50     bool listen) {
     51   content::NotificationSource web_contents_source =
     52       content::Source<content::WebContents>(web_contents_);
     53   if (listen) {
     54     registrar_.Add(this,
     55                    content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
     56                    web_contents_source);
     57   } else {
     58     registrar_.Remove(this,
     59                       content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
     60                       web_contents_source);
     61   }
     62 }
     63 
     64 bool GoogleURLTrackerNavigationHelperImpl::IsListeningForTabDestruction() {
     65   return registrar_.IsRegistered(
     66       this,
     67       content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
     68       content::Source<content::WebContents>(web_contents_));
     69 }
     70 
     71 void GoogleURLTrackerNavigationHelperImpl::OpenURL(
     72     GURL url,
     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));
     79 }
     80 
     81 void GoogleURLTrackerNavigationHelperImpl::Observe(
     82     int type,
     83     const content::NotificationSource& source,
     84     const content::NotificationDetails& details) {
     85   switch (type) {
     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());
     90 
     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);
    100       break;
    101     }
    102 
    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);
    107       break;
    108     }
    109 
    110     default:
    111       NOTREACHED() << "Unknown notification received:" << type;
    112   }
    113 }
    114