Componentize AccountReconcilor.
[chromium-blink-merge.git] / chrome / browser / three_d_api_observer.cc
blob94d3b38a44e4c5db3fb5ac2731221ca0b2c5381c
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/three_d_api_observer.h"
7 #include "base/metrics/histogram.h"
8 #include "chrome/browser/infobars/confirm_infobar_delegate.h"
9 #include "chrome/browser/infobars/infobar.h"
10 #include "chrome/browser/infobars/infobar_service.h"
11 #include "chrome/browser/tab_contents/tab_util.h"
12 #include "content/public/browser/gpu_data_manager.h"
13 #include "grit/generated_resources.h"
14 #include "grit/theme_resources.h"
15 #include "ui/base/l10n/l10n_util.h"
18 // ThreeDAPIInfoBarDelegate ---------------------------------------------------
20 class ThreeDAPIInfoBarDelegate : public ConfirmInfoBarDelegate {
21 public:
22 // Creates a 3D API infobar and delegate and adds the infobar to
23 // |infobar_service|.
24 static void Create(InfoBarService* infobar_service,
25 const GURL& url,
26 content::ThreeDAPIType requester);
28 private:
29 enum DismissalHistogram {
30 IGNORED,
31 RELOADED,
32 CLOSED_WITHOUT_ACTION,
33 DISMISSAL_MAX
36 ThreeDAPIInfoBarDelegate(const GURL& url, content::ThreeDAPIType requester);
37 virtual ~ThreeDAPIInfoBarDelegate();
39 // ConfirmInfoBarDelegate:
40 virtual bool EqualsDelegate(InfoBarDelegate* delegate) const OVERRIDE;
41 virtual int GetIconID() const OVERRIDE;
42 virtual base::string16 GetMessageText() const OVERRIDE;
43 virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
44 virtual bool Accept() OVERRIDE;
45 virtual bool Cancel() OVERRIDE;
46 virtual base::string16 GetLinkText() const OVERRIDE;
47 virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE;
49 GURL url_;
50 content::ThreeDAPIType requester_;
51 // Basically indicates whether the infobar was displayed at all, or
52 // was a temporary instance thrown away by the InfobarService.
53 mutable bool message_text_queried_;
54 bool action_taken_;
56 DISALLOW_COPY_AND_ASSIGN(ThreeDAPIInfoBarDelegate);
59 // static
60 void ThreeDAPIInfoBarDelegate::Create(InfoBarService* infobar_service,
61 const GURL& url,
62 content::ThreeDAPIType requester) {
63 if (!infobar_service)
64 return; // NULL for apps.
65 infobar_service->AddInfoBar(ConfirmInfoBarDelegate::CreateInfoBar(
66 scoped_ptr<ConfirmInfoBarDelegate>(
67 new ThreeDAPIInfoBarDelegate(url, requester))));
70 ThreeDAPIInfoBarDelegate::ThreeDAPIInfoBarDelegate(
71 const GURL& url,
72 content::ThreeDAPIType requester)
73 : ConfirmInfoBarDelegate(),
74 url_(url),
75 requester_(requester),
76 message_text_queried_(false),
77 action_taken_(false) {
80 ThreeDAPIInfoBarDelegate::~ThreeDAPIInfoBarDelegate() {
81 if (message_text_queried_ && !action_taken_) {
82 UMA_HISTOGRAM_ENUMERATION("GPU.ThreeDAPIInfoBarDismissal",
83 CLOSED_WITHOUT_ACTION, DISMISSAL_MAX);
87 bool ThreeDAPIInfoBarDelegate::EqualsDelegate(InfoBarDelegate* delegate) const {
88 // For the time being, if a given web page is actually using both
89 // WebGL and Pepper 3D and both APIs are blocked, just leave the
90 // first infobar up. If the user selects "try again", both APIs will
91 // be unblocked and the web page reload will succeed.
92 return delegate->GetIconID() == GetIconID();
95 int ThreeDAPIInfoBarDelegate::GetIconID() const {
96 return IDR_INFOBAR_3D_BLOCKED;
99 base::string16 ThreeDAPIInfoBarDelegate::GetMessageText() const {
100 message_text_queried_ = true;
102 base::string16 api_name;
103 switch (requester_) {
104 case content::THREE_D_API_TYPE_WEBGL:
105 api_name = l10n_util::GetStringUTF16(IDS_3D_APIS_WEBGL_NAME);
106 break;
107 case content::THREE_D_API_TYPE_PEPPER_3D:
108 api_name = l10n_util::GetStringUTF16(IDS_3D_APIS_PEPPER_3D_NAME);
109 break;
112 return l10n_util::GetStringFUTF16(IDS_3D_APIS_BLOCKED_TEXT,
113 api_name);
116 base::string16 ThreeDAPIInfoBarDelegate::GetButtonLabel(
117 InfoBarButton button) const {
118 return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
119 IDS_3D_APIS_BLOCKED_OK_BUTTON_LABEL :
120 IDS_3D_APIS_BLOCKED_TRY_AGAIN_BUTTON_LABEL);
123 bool ThreeDAPIInfoBarDelegate::Accept() {
124 action_taken_ = true;
125 UMA_HISTOGRAM_ENUMERATION("GPU.ThreeDAPIInfoBarDismissal", IGNORED,
126 DISMISSAL_MAX);
127 return true;
130 bool ThreeDAPIInfoBarDelegate::Cancel() {
131 action_taken_ = true;
132 UMA_HISTOGRAM_ENUMERATION("GPU.ThreeDAPIInfoBarDismissal", RELOADED,
133 DISMISSAL_MAX);
134 content::GpuDataManager::GetInstance()->UnblockDomainFrom3DAPIs(url_);
135 web_contents()->GetController().Reload(true);
136 return true;
139 base::string16 ThreeDAPIInfoBarDelegate::GetLinkText() const {
140 return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
143 bool ThreeDAPIInfoBarDelegate::LinkClicked(WindowOpenDisposition disposition) {
144 web_contents()->OpenURL(content::OpenURLParams(
145 GURL("https://support.google.com/chrome/?p=ib_webgl"),
146 content::Referrer(),
147 (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition,
148 content::PAGE_TRANSITION_LINK,
149 false));
150 return false;
154 // ThreeDAPIObserver ----------------------------------------------------------
156 ThreeDAPIObserver::ThreeDAPIObserver() {
157 content::GpuDataManager::GetInstance()->AddObserver(this);
160 ThreeDAPIObserver::~ThreeDAPIObserver() {
161 content::GpuDataManager::GetInstance()->RemoveObserver(this);
164 void ThreeDAPIObserver::DidBlock3DAPIs(const GURL& url,
165 int render_process_id,
166 int render_view_id,
167 content::ThreeDAPIType requester) {
168 content::WebContents* web_contents = tab_util::GetWebContentsByID(
169 render_process_id, render_view_id);
170 if (!web_contents)
171 return;
172 ThreeDAPIInfoBarDelegate::Create(
173 InfoBarService::FromWebContents(web_contents), url, requester);