Home | History | Annotate | Download | only in geolocation
      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/geolocation/geolocation_infobar_delegate.h"
      6 
      7 #include "chrome/browser/content_settings/permission_queue_controller.h"
      8 #include "chrome/browser/google/google_util.h"
      9 #include "chrome/browser/infobars/infobar_service.h"
     10 #include "content/public/browser/navigation_details.h"
     11 #include "content/public/browser/navigation_entry.h"
     12 #include "content/public/browser/web_contents.h"
     13 #include "grit/generated_resources.h"
     14 #include "grit/locale_settings.h"
     15 #include "grit/theme_resources.h"
     16 #include "net/base/net_util.h"
     17 #include "ui/base/l10n/l10n_util.h"
     18 
     19 #if defined(OS_ANDROID)
     20 #include "chrome/browser/geolocation/geolocation_infobar_delegate_android.h"
     21 typedef GeolocationInfoBarDelegateAndroid DelegateType;
     22 #else
     23 typedef GeolocationInfoBarDelegate DelegateType;
     24 #endif
     25 
     26 
     27 // static
     28 InfoBarDelegate* GeolocationInfoBarDelegate::Create(
     29     InfoBarService* infobar_service,
     30     PermissionQueueController* controller,
     31     const PermissionRequestID& id,
     32     const GURL& requesting_frame,
     33     const std::string& display_languages) {
     34   const content::NavigationEntry* committed_entry =
     35       infobar_service->web_contents()->GetController().GetLastCommittedEntry();
     36   return infobar_service->AddInfoBar(scoped_ptr<InfoBarDelegate>(
     37       new DelegateType(infobar_service, controller, id, requesting_frame,
     38                        committed_entry ? committed_entry->GetUniqueID() : 0,
     39                        display_languages)));
     40 }
     41 
     42 GeolocationInfoBarDelegate::GeolocationInfoBarDelegate(
     43     InfoBarService* infobar_service,
     44     PermissionQueueController* controller,
     45     const PermissionRequestID& id,
     46     const GURL& requesting_frame,
     47     int contents_unique_id,
     48     const std::string& display_languages)
     49     : ConfirmInfoBarDelegate(infobar_service),
     50       controller_(controller),
     51       id_(id),
     52       requesting_frame_(requesting_frame),
     53       contents_unique_id_(contents_unique_id),
     54       display_languages_(display_languages) {
     55 }
     56 
     57 GeolocationInfoBarDelegate::~GeolocationInfoBarDelegate() {
     58 }
     59 
     60 bool GeolocationInfoBarDelegate::Accept() {
     61   SetPermission(true, true);
     62   return true;
     63 }
     64 
     65 void GeolocationInfoBarDelegate::SetPermission(bool update_content_setting,
     66                                                bool allowed) {
     67   if (web_contents()) {
     68     controller_->OnPermissionSet(id_, requesting_frame_,
     69                                  web_contents()->GetURL(),
     70                                  update_content_setting, allowed);
     71   }
     72 }
     73 
     74 int GeolocationInfoBarDelegate::GetIconID() const {
     75   return IDR_GEOLOCATION_INFOBAR_ICON;
     76 }
     77 
     78 InfoBarDelegate::Type GeolocationInfoBarDelegate::GetInfoBarType() const {
     79   return PAGE_ACTION_TYPE;
     80 }
     81 
     82 bool GeolocationInfoBarDelegate::ShouldExpireInternal(
     83     const content::LoadCommittedDetails& details) const {
     84   // This implementation matches InfoBarDelegate::ShouldExpireInternal(), but
     85   // uses the unique ID we set in the constructor instead of that stored in the
     86   // base class.
     87   return (contents_unique_id_ != details.entry->GetUniqueID()) ||
     88       (content::PageTransitionStripQualifier(
     89           details.entry->GetTransitionType()) ==
     90               content::PAGE_TRANSITION_RELOAD);
     91 }
     92 
     93 string16 GeolocationInfoBarDelegate::GetMessageText() const {
     94   return l10n_util::GetStringFUTF16(IDS_GEOLOCATION_INFOBAR_QUESTION,
     95       net::FormatUrl(requesting_frame_.GetOrigin(), display_languages_));
     96 }
     97 
     98 string16 GeolocationInfoBarDelegate::GetButtonLabel(
     99     InfoBarButton button) const {
    100   return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
    101       IDS_GEOLOCATION_ALLOW_BUTTON : IDS_GEOLOCATION_DENY_BUTTON);
    102 }
    103 
    104 bool GeolocationInfoBarDelegate::Cancel() {
    105   SetPermission(true, false);
    106   return true;
    107 }
    108 
    109 string16 GeolocationInfoBarDelegate::GetLinkText() const {
    110   return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
    111 }
    112 
    113 bool GeolocationInfoBarDelegate::LinkClicked(
    114     WindowOpenDisposition disposition) {
    115   const char kGeolocationLearnMoreUrl[] =
    116 #if defined(OS_CHROMEOS)
    117       "https://www.google.com/support/chromeos/bin/answer.py?answer=142065";
    118 #else
    119       "https://www.google.com/support/chrome/bin/answer.py?answer=142065";
    120 #endif
    121 
    122   web_contents()->OpenURL(content::OpenURLParams(
    123       google_util::AppendGoogleLocaleParam(GURL(kGeolocationLearnMoreUrl)),
    124       content::Referrer(),
    125       (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition,
    126       content::PAGE_TRANSITION_LINK, false));
    127   return false;  // Do not dismiss the info bar.
    128 }
    129