1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/gpu/three_d_api_observer.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h" 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/infobars/core/confirm_infobar_delegate.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/gpu_data_manager.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_strings.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "grit/theme_resources.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// ThreeDAPIInfoBarDelegate --------------------------------------------------- 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreeDAPIInfoBarDelegate : public ConfirmInfoBarDelegate { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Creates a 3D API infobar and delegate and adds the infobar to 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |infobar_service|. 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void Create(InfoBarService* infobar_service, 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ThreeDAPIType requester); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enum DismissalHistogram { 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IGNORED, 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RELOADED, 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CLOSED_WITHOUT_ACTION, 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISMISSAL_MAX 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ThreeDAPIInfoBarDelegate(const GURL& url, content::ThreeDAPIType requester); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreeDAPIInfoBarDelegate(); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ConfirmInfoBarDelegate: 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool EqualsDelegate( 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBarDelegate* delegate) const OVERRIDE; 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual int GetIconID() const OVERRIDE; 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetMessageText() const OVERRIDE; 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool Accept() OVERRIDE; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool Cancel() OVERRIDE; 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetLinkText() const OVERRIDE; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url_; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ThreeDAPIType requester_; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Basically indicates whether the infobar was displayed at all, or 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // was a temporary instance thrown away by the InfobarService. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mutable bool message_text_queried_; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool action_taken_; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreeDAPIInfoBarDelegate); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ThreeDAPIInfoBarDelegate::Create(InfoBarService* infobar_service, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ThreeDAPIType requester) { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!infobar_service) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; // NULL for apps. 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_service->AddInfoBar(ConfirmInfoBarDelegate::CreateInfoBar( 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ConfirmInfoBarDelegate>( 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new ThreeDAPIInfoBarDelegate(url, requester)))); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ThreeDAPIInfoBarDelegate::ThreeDAPIInfoBarDelegate( 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ThreeDAPIType requester) 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : ConfirmInfoBarDelegate(), 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_(url), 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) requester_(requester), 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_text_queried_(false), 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) action_taken_(false) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ThreeDAPIInfoBarDelegate::~ThreeDAPIInfoBarDelegate() { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (message_text_queried_ && !action_taken_) { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("GPU.ThreeDAPIInfoBarDismissal", 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CLOSED_WITHOUT_ACTION, DISMISSAL_MAX); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool ThreeDAPIInfoBarDelegate::EqualsDelegate( 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBarDelegate* delegate) const { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For the time being, if a given web page is actually using both 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebGL and Pepper 3D and both APIs are blocked, just leave the 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // first infobar up. If the user selects "try again", both APIs will 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be unblocked and the web page reload will succeed. 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return delegate->GetIconID() == GetIconID(); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochint ThreeDAPIInfoBarDelegate::GetIconID() const { 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return IDR_INFOBAR_3D_BLOCKED; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ThreeDAPIInfoBarDelegate::GetMessageText() const { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_text_queried_ = true; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 api_name; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (requester_) { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case content::THREE_D_API_TYPE_WEBGL: 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) api_name = l10n_util::GetStringUTF16(IDS_3D_APIS_WEBGL_NAME); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case content::THREE_D_API_TYPE_PEPPER_3D: 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) api_name = l10n_util::GetStringUTF16(IDS_3D_APIS_PEPPER_3D_NAME); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_3D_APIS_BLOCKED_TEXT, 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) api_name); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ThreeDAPIInfoBarDelegate::GetButtonLabel( 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarButton button) const { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16((button == BUTTON_OK) ? 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_3D_APIS_BLOCKED_OK_BUTTON_LABEL : 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_3D_APIS_BLOCKED_TRY_AGAIN_BUTTON_LABEL); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ThreeDAPIInfoBarDelegate::Accept() { 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) action_taken_ = true; 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UMA_HISTOGRAM_ENUMERATION("GPU.ThreeDAPIInfoBarDismissal", IGNORED, 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISMISSAL_MAX); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ThreeDAPIInfoBarDelegate::Cancel() { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) action_taken_ = true; 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UMA_HISTOGRAM_ENUMERATION("GPU.ThreeDAPIInfoBarDismissal", RELOADED, 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISMISSAL_MAX); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::GpuDataManager::GetInstance()->UnblockDomainFrom3DAPIs(url_); 138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoBarService::WebContentsFromInfoBar(infobar())->GetController().Reload( 139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch true); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ThreeDAPIInfoBarDelegate::GetLinkText() const { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_LEARN_MORE); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ThreeDAPIInfoBarDelegate::LinkClicked(WindowOpenDisposition disposition) { 148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoBarService::WebContentsFromInfoBar(infobar())->OpenURL( 149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content::OpenURLParams( 150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GURL("https://support.google.com/chrome/?p=ib_webgl"), 151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content::Referrer(), 152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition, 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK, false)); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 158bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// ThreeDAPIObserver ---------------------------------------------------------- 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ThreeDAPIObserver::ThreeDAPIObserver() { 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::GpuDataManager::GetInstance()->AddObserver(this); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ThreeDAPIObserver::~ThreeDAPIObserver() { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::GpuDataManager::GetInstance()->RemoveObserver(this); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ThreeDAPIObserver::DidBlock3DAPIs(const GURL& url, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int render_process_id, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int render_view_id, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ThreeDAPIType requester) { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_contents = tab_util::GetWebContentsByID( 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_process_id, render_view_id); 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!web_contents) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreeDAPIInfoBarDelegate::Create( 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService::FromWebContents(web_contents), url, requester); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 179