Home | History | Annotate | Download | only in infobars
      1 // Copyright (c) 2011 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/infobars/insecure_content_infobar_delegate.h"
      6 
      7 #include "base/metrics/histogram.h"
      8 #include "chrome/browser/infobars/infobar_service.h"
      9 #include "chrome/common/render_messages.h"
     10 #include "components/google/core/browser/google_util.h"
     11 #include "components/infobars/core/infobar.h"
     12 #include "content/public/browser/render_frame_host.h"
     13 #include "content/public/browser/render_view_host.h"
     14 #include "content/public/browser/web_contents.h"
     15 #include "content/public/common/page_transition_types.h"
     16 #include "grit/generated_resources.h"
     17 #include "ui/base/l10n/l10n_util.h"
     18 
     19 
     20 // static
     21 void InsecureContentInfoBarDelegate::Create(InfoBarService* infobar_service,
     22                                             InfoBarType type) {
     23   scoped_ptr<infobars::InfoBar> new_infobar(
     24       ConfirmInfoBarDelegate::CreateInfoBar(scoped_ptr<ConfirmInfoBarDelegate>(
     25           new InsecureContentInfoBarDelegate(type))));
     26 
     27   // Only supsersede an existing insecure content infobar if we are upgrading
     28   // from DISPLAY to RUN.
     29   for (size_t i = 0; i < infobar_service->infobar_count(); ++i) {
     30     infobars::InfoBar* old_infobar = infobar_service->infobar_at(i);
     31     InsecureContentInfoBarDelegate* delegate =
     32         old_infobar->delegate()->AsInsecureContentInfoBarDelegate();
     33     if (delegate != NULL) {
     34       if ((type == RUN) && (delegate->type_ == DISPLAY))
     35         return;
     36       infobar_service->ReplaceInfoBar(old_infobar, new_infobar.Pass());
     37       break;
     38     }
     39   }
     40   if (new_infobar.get())
     41     infobar_service->AddInfoBar(new_infobar.Pass());
     42 
     43   UMA_HISTOGRAM_ENUMERATION("InsecureContentInfoBarDelegateV2",
     44       (type == DISPLAY) ? DISPLAY_INFOBAR_SHOWN : RUN_INFOBAR_SHOWN,
     45       NUM_EVENTS);
     46 }
     47 
     48 InsecureContentInfoBarDelegate::InsecureContentInfoBarDelegate(InfoBarType type)
     49     : ConfirmInfoBarDelegate(),
     50       type_(type) {
     51 }
     52 
     53 InsecureContentInfoBarDelegate::~InsecureContentInfoBarDelegate() {
     54 }
     55 
     56 void InsecureContentInfoBarDelegate::InfoBarDismissed() {
     57   UMA_HISTOGRAM_ENUMERATION("InsecureContentInfoBarDelegateV2",
     58       (type_ == DISPLAY) ? DISPLAY_INFOBAR_DISMISSED : RUN_INFOBAR_DISMISSED,
     59       NUM_EVENTS);
     60   ConfirmInfoBarDelegate::InfoBarDismissed();
     61 }
     62 
     63 InsecureContentInfoBarDelegate*
     64     InsecureContentInfoBarDelegate::AsInsecureContentInfoBarDelegate() {
     65   return this;
     66 }
     67 
     68 base::string16 InsecureContentInfoBarDelegate::GetMessageText() const {
     69   return l10n_util::GetStringUTF16(IDS_BLOCKED_DISPLAYING_INSECURE_CONTENT);
     70 }
     71 
     72 base::string16 InsecureContentInfoBarDelegate::GetButtonLabel(
     73     InfoBarButton button) const {
     74   return l10n_util::GetStringUTF16(button == BUTTON_OK ?
     75       IDS_BLOCK_INSECURE_CONTENT_BUTTON : IDS_ALLOW_INSECURE_CONTENT_BUTTON);
     76 }
     77 
     78 // OK button is labelled "don't load".  It triggers Accept(), but really
     79 // means stay secure, so do nothing but count the event and dismiss.
     80 bool InsecureContentInfoBarDelegate::Accept() {
     81   UMA_HISTOGRAM_ENUMERATION("InsecureContentInfoBarDelegateV2",
     82       (type_ == DISPLAY) ? DISPLAY_USER_DID_NOT_LOAD : RUN_USER_DID_NOT_LOAD,
     83       NUM_EVENTS);
     84   return true;
     85 }
     86 
     87 // Cancel button is labelled "load anyways".  It triggers Cancel(), but really
     88 // means become insecure, so do the work of reloading the page.
     89 bool InsecureContentInfoBarDelegate::Cancel() {
     90   UMA_HISTOGRAM_ENUMERATION("InsecureContentInfoBarDelegateV2",
     91       (type_ == DISPLAY) ? DISPLAY_USER_OVERRIDE : RUN_USER_OVERRIDE,
     92       NUM_EVENTS);
     93 
     94   content::WebContents* web_contents =
     95       InfoBarService::WebContentsFromInfoBar(infobar());
     96   web_contents->SendToAllFrames((type_ == DISPLAY) ?
     97       static_cast<IPC::Message*>(
     98           new ChromeViewMsg_SetAllowDisplayingInsecureContent(MSG_ROUTING_NONE,
     99                                                               true)) :
    100       new ChromeViewMsg_SetAllowRunningInsecureContent(MSG_ROUTING_NONE, true));
    101   web_contents->GetMainFrame()->Send(new ChromeViewMsg_ReloadFrame(
    102       web_contents->GetMainFrame()->GetRoutingID()));
    103   return true;
    104 }
    105 
    106 base::string16 InsecureContentInfoBarDelegate::GetLinkText() const {
    107   return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
    108 }
    109 
    110 bool InsecureContentInfoBarDelegate::LinkClicked(
    111     WindowOpenDisposition disposition) {
    112   InfoBarService::WebContentsFromInfoBar(infobar())->OpenURL(
    113       content::OpenURLParams(
    114           GURL("https://www.google.com/"
    115                "support/chrome/bin/answer.py?answer=1342714"),
    116           content::Referrer(),
    117           (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition,
    118           content::PAGE_TRANSITION_LINK, false));
    119   return false;
    120 }
    121