1 // Copyright 2013 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/ui/android/content_settings/popup_blocked_infobar_delegate.h" 6 7 #include "base/prefs/pref_service.h" 8 #include "chrome/browser/content_settings/host_content_settings_map.h" 9 #include "chrome/browser/infobars/infobar_service.h" 10 #include "chrome/browser/profiles/profile.h" 11 #include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h" 12 #include "chrome/grit/generated_resources.h" 13 #include "components/content_settings/core/common/content_settings.h" 14 #include "components/content_settings/core/common/content_settings_types.h" 15 #include "components/infobars/core/infobar.h" 16 #include "grit/theme_resources.h" 17 #include "ui/base/l10n/l10n_util.h" 18 19 20 // static 21 void PopupBlockedInfoBarDelegate::Create(content::WebContents* web_contents, 22 int num_popups) { 23 const GURL& url = web_contents->GetURL(); 24 Profile* profile = 25 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 26 scoped_ptr<infobars::InfoBar> infobar(ConfirmInfoBarDelegate::CreateInfoBar( 27 scoped_ptr<ConfirmInfoBarDelegate>(new PopupBlockedInfoBarDelegate( 28 num_popups, url, profile->GetHostContentSettingsMap())))); 29 30 InfoBarService* infobar_service = 31 InfoBarService::FromWebContents(web_contents); 32 // See if there is an existing popup infobar already. 33 // TODO(dfalcantara) When triggering more than one popup the infobar 34 // will be shown once, then hide then be shown again. 35 // This will be fixed once we have an in place replace infobar mechanism. 36 for (size_t i = 0; i < infobar_service->infobar_count(); ++i) { 37 infobars::InfoBar* existing_infobar = infobar_service->infobar_at(i); 38 if (existing_infobar->delegate()->AsPopupBlockedInfoBarDelegate()) { 39 infobar_service->ReplaceInfoBar(existing_infobar, infobar.Pass()); 40 return; 41 } 42 } 43 44 infobar_service->AddInfoBar(infobar.Pass()); 45 } 46 47 PopupBlockedInfoBarDelegate::~PopupBlockedInfoBarDelegate() { 48 } 49 50 int PopupBlockedInfoBarDelegate::GetIconID() const { 51 return IDR_BLOCKED_POPUPS; 52 } 53 54 PopupBlockedInfoBarDelegate* 55 PopupBlockedInfoBarDelegate::AsPopupBlockedInfoBarDelegate() { 56 return this; 57 } 58 59 PopupBlockedInfoBarDelegate::PopupBlockedInfoBarDelegate( 60 int num_popups, 61 const GURL& url, 62 HostContentSettingsMap* map) 63 : ConfirmInfoBarDelegate(), num_popups_(num_popups), url_(url), map_(map) { 64 content_settings::SettingInfo setting_info; 65 scoped_ptr<base::Value> setting = map->GetWebsiteSetting( 66 url, url, CONTENT_SETTINGS_TYPE_POPUPS, std::string(), &setting_info); 67 can_show_popups_ = 68 setting_info.source != content_settings::SETTING_SOURCE_POLICY; 69 } 70 71 base::string16 PopupBlockedInfoBarDelegate::GetMessageText() const { 72 return l10n_util::GetStringFUTF16Int(IDS_POPUPS_BLOCKED_INFOBAR_TEXT, 73 num_popups_); 74 } 75 76 int PopupBlockedInfoBarDelegate::GetButtons() const { 77 if (!can_show_popups_) 78 return 0; 79 80 return BUTTON_OK; 81 } 82 83 base::string16 PopupBlockedInfoBarDelegate::GetButtonLabel( 84 InfoBarButton button) const { 85 return l10n_util::GetStringUTF16(IDS_POPUPS_BLOCKED_INFOBAR_BUTTON_SHOW); 86 } 87 88 bool PopupBlockedInfoBarDelegate::Accept() { 89 DCHECK(can_show_popups_); 90 91 // Create exceptions. 92 map_->AddExceptionForURL( 93 url_, url_, CONTENT_SETTINGS_TYPE_POPUPS, CONTENT_SETTING_ALLOW); 94 95 // Launch popups. 96 content::WebContents* web_contents = 97 InfoBarService::WebContentsFromInfoBar(infobar()); 98 PopupBlockerTabHelper* popup_blocker_helper = 99 PopupBlockerTabHelper::FromWebContents(web_contents); 100 DCHECK(popup_blocker_helper); 101 PopupBlockerTabHelper::PopupIdMap blocked_popups = 102 popup_blocker_helper->GetBlockedPopupRequests(); 103 for (PopupBlockerTabHelper::PopupIdMap::iterator it = blocked_popups.begin(); 104 it != blocked_popups.end(); ++it) 105 popup_blocker_helper->ShowBlockedPopup(it->first); 106 107 return true; 108 } 109