1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright (c) 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/extensions/settings_api_bubble_controller.h" 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/metrics/histogram.h" 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/extensions/extension_service.h" 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/extensions/extension_toolbar_model.h" 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/extensions/settings_api_helpers.h" 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/profiles/profile.h" 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/startup/startup_browser_creator.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.h" 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/url_constants.h" 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/chromium_strings.h" 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_prefs.h" 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/browser/extension_registry.h" 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/browser/extension_system.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_strings.h" 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/base/l10n/l10n_util.h" 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace extensions { 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace { 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//////////////////////////////////////////////////////////////////////////////// 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// SettingsApiBubbleDelegate 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass SettingsApiBubbleDelegate 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : public ExtensionMessageBubbleController::Delegate { 32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch explicit SettingsApiBubbleDelegate(ExtensionService* service, 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Profile* profile, 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SettingsApiOverrideType type); 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual ~SettingsApiBubbleDelegate(); 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // ExtensionMessageBubbleController::Delegate methods. 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool ShouldIncludeExtension(const std::string& extension_id) OVERRIDE; 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void AcknowledgeExtension( 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& extension_id, 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionMessageBubbleController::BubbleAction user_action) OVERRIDE; 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void PerformAction(const ExtensionIdList& list) OVERRIDE; 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnClose() OVERRIDE; 45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual base::string16 GetTitle() const OVERRIDE; 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual base::string16 GetMessageBody( 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool anchored_to_browser_action) const OVERRIDE; 48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual base::string16 GetOverflowText( 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::string16& overflow_count) const OVERRIDE; 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual base::string16 GetLearnMoreLabel() const OVERRIDE; 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual GURL GetLearnMoreUrl() const OVERRIDE; 52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual base::string16 GetActionButtonLabel() const OVERRIDE; 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual base::string16 GetDismissButtonLabel() const OVERRIDE; 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool ShouldShowExtensionList() const OVERRIDE; 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void LogExtensionCount(size_t count) OVERRIDE; 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void LogAction( 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionMessageBubbleController::BubbleAction action) OVERRIDE; 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Our extension service. Weak, not owned by us. 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExtensionService* service_; 62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // A weak pointer to the profile we are associated with. Not owned by us. 64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Profile* profile_; 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The type of settings override this bubble will report on. This can be, for 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // example, a bubble to notify the user that the search engine has been 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // changed by an extension (or homepage/startup pages/etc). 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SettingsApiOverrideType type_; 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The ID of the extension we are showing the bubble for. 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string extension_id_; 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DISALLOW_COPY_AND_ASSIGN(SettingsApiBubbleDelegate); 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 77effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochSettingsApiBubbleDelegate::SettingsApiBubbleDelegate( 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExtensionService* service, 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Profile* profile, 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SettingsApiOverrideType type) 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : service_(service), profile_(profile), type_(type) {} 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 83effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochSettingsApiBubbleDelegate::~SettingsApiBubbleDelegate() {} 84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool SettingsApiBubbleDelegate::ShouldIncludeExtension( 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& extension_id) { 87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExtensionRegistry* registry = ExtensionRegistry::Get(profile_); 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const Extension* extension = 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch registry->GetExtensionById(extension_id, ExtensionRegistry::ENABLED); 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!extension) 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; // The extension provided is no longer enabled. 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (prefs->HasSettingsApiBubbleBeenAcknowledged(extension_id)) 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const Extension* override = NULL; 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch switch (type_) { 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case extensions::BUBBLE_TYPE_HOME_PAGE: 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) override = extensions::GetExtensionOverridingHomepage(profile_); 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case extensions::BUBBLE_TYPE_STARTUP_PAGES: 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) override = extensions::GetExtensionOverridingStartupPages(profile_); 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case extensions::BUBBLE_TYPE_SEARCH_ENGINE: 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) override = extensions::GetExtensionOverridingSearchEngine(profile_); 107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!override || override->id() != extension->id()) 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension_id_ = extension_id; 114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid SettingsApiBubbleDelegate::AcknowledgeExtension( 118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& extension_id, 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExtensionMessageBubbleController::BubbleAction user_action) { 120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (user_action != ExtensionMessageBubbleController::ACTION_EXECUTE) { 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch prefs->SetSettingsApiBubbleBeenAcknowledged(extension_id, true); 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void SettingsApiBubbleDelegate::PerformAction(const ExtensionIdList& list) { 127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch for (size_t i = 0; i < list.size(); ++i) { 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) service_->DisableExtension(list[i], Extension::DISABLE_USER_ACTION); 129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void SettingsApiBubbleDelegate::OnClose() { 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionToolbarModel* toolbar_model = ExtensionToolbarModel::Get(profile_); 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (toolbar_model) 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) toolbar_model->StopHighlighting(); 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::string16 SettingsApiBubbleDelegate::GetTitle() const { 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch switch (type_) { 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case BUBBLE_TYPE_HOME_PAGE: 141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return l10n_util::GetStringUTF16( 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_TITLE_HOME_PAGE_BUBBLE); 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case BUBBLE_TYPE_STARTUP_PAGES: 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return l10n_util::GetStringUTF16( 145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_TITLE_STARTUP_PAGES_BUBBLE); 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case BUBBLE_TYPE_SEARCH_ENGINE: 147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return l10n_util::GetStringUTF16( 148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_TITLE_SEARCH_ENGINE_BUBBLE); 149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NOTREACHED(); 151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return base::string16(); 152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 SettingsApiBubbleDelegate::GetMessageBody( 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool anchored_to_browser_action) const { 156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExtensionRegistry* registry = ExtensionRegistry::Get(profile_); 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const Extension* extension = 158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch registry->GetExtensionById(extension_id_, ExtensionRegistry::ENABLED); 159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const SettingsOverrides* settings = 160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extension ? SettingsOverrides::Get(extension) : NULL; 161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!extension || !settings) { 162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NOTREACHED(); 163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return base::string16(); 164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool home_change = settings->homepage != NULL; 167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool startup_change = !settings->startup_pages.empty(); 168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool search_change = settings->search_engine != NULL; 169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::string16 body; 171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch switch (type_) { 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case BUBBLE_TYPE_HOME_PAGE: 173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body = l10n_util::GetStringUTF16( 174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_FIRST_LINE_HOME_PAGE); 175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (startup_change && search_change) { 176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body += l10n_util::GetStringUTF16( 177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_SECOND_LINE_START_AND_SEARCH); 178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (startup_change) { 179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body += l10n_util::GetStringUTF16( 180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_SECOND_LINE_START_PAGES); 181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (search_change) { 182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body += l10n_util::GetStringUTF16( 183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_SECOND_LINE_SEARCH_ENGINE); 184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case BUBBLE_TYPE_STARTUP_PAGES: 187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body = l10n_util::GetStringUTF16( 188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_FIRST_LINE_START_PAGES); 189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (home_change && search_change) { 190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body += l10n_util::GetStringUTF16( 191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_SECOND_LINE_HOME_AND_SEARCH); 192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (home_change) { 193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body += l10n_util::GetStringUTF16( 194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_SECOND_LINE_HOME_PAGE); 195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (search_change) { 196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body += l10n_util::GetStringUTF16( 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_SECOND_LINE_SEARCH_ENGINE); 198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case BUBBLE_TYPE_SEARCH_ENGINE: 201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body = l10n_util::GetStringUTF16( 202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_FIRST_LINE_SEARCH_ENGINE); 203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (startup_change && home_change) { 204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body += l10n_util::GetStringUTF16( 205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_SECOND_LINE_START_AND_HOME); 206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (startup_change) { 207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body += l10n_util::GetStringUTF16( 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_SECOND_LINE_START_PAGES); 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (home_change) { 210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body += l10n_util::GetStringUTF16( 211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_SECOND_LINE_HOME_PAGE); 212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!body.empty()) 216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch body += l10n_util::GetStringUTF16( 217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_EXTENSIONS_SETTINGS_API_THIRD_LINE_CONFIRMATION); 218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return body; 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::string16 SettingsApiBubbleDelegate::GetOverflowText( 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::string16& overflow_count) const { 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Does not have more than one extension in the list at a time. 224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NOTREACHED(); 225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return base::string16(); 226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::string16 SettingsApiBubbleDelegate::GetLearnMoreLabel() const { 229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return l10n_util::GetStringUTF16(IDS_LEARN_MORE); 230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 232effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochGURL SettingsApiBubbleDelegate::GetLearnMoreUrl() const { 233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return GURL(chrome::kExtensionControlledSettingLearnMoreURL); 234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::string16 SettingsApiBubbleDelegate::GetActionButtonLabel() const { 237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_EXTENSION_CONTROLLED_RESTORE_SETTINGS); 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::string16 SettingsApiBubbleDelegate::GetDismissButtonLabel() const { 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_EXTENSION_CONTROLLED_KEEP_CHANGES); 242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool SettingsApiBubbleDelegate::ShouldShowExtensionList() const { 245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid SettingsApiBubbleDelegate::LogExtensionCount(size_t count) { 249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid SettingsApiBubbleDelegate::LogAction( 252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExtensionMessageBubbleController::BubbleAction action) { 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (type_) { 25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case BUBBLE_TYPE_HOME_PAGE: 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "ExtensionOverrideBubble.SettingsApiUserSelectionHomePage", 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) action, 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExtensionMessageBubbleController::ACTION_BOUNDARY); 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case BUBBLE_TYPE_STARTUP_PAGES: 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "ExtensionOverrideBubble.SettingsApiUserSelectionStartupPage", 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) action, 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExtensionMessageBubbleController::ACTION_BOUNDARY); 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case BUBBLE_TYPE_SEARCH_ENGINE: 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "ExtensionOverrideBubble.SettingsApiUserSelectionSearchEngine", 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) action, 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExtensionMessageBubbleController::ACTION_BOUNDARY); 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace 276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//////////////////////////////////////////////////////////////////////////////// 278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// SettingsApiBubbleController 279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 280effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochSettingsApiBubbleController::SettingsApiBubbleController( 281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Profile* profile, 282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SettingsApiOverrideType type) 283effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : ExtensionMessageBubbleController( 284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new SettingsApiBubbleDelegate( 285effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExtensionSystem::Get(profile)->extension_service(), 286effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile, 287effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch type), 288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile), 289effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile_(profile), 290effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch type_(type) {} 291effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 292effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochSettingsApiBubbleController::~SettingsApiBubbleController() {} 293effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool SettingsApiBubbleController::ShouldShow(const std::string& extension_id) { 29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); 296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (prefs->HasSettingsApiBubbleBeenAcknowledged(extension_id)) 297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!delegate()->ShouldIncludeExtension(extension_id)) 300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // If the browser is showing the 'Chrome crashed' infobar, it won't be showing 303effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // the startup pages, so there's no point in showing the bubble now. 304effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (type_ == BUBBLE_TYPE_STARTUP_PAGES) 305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return profile_->GetLastSessionExitType() != Profile::EXIT_CRASHED; 306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return true; 308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 310effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool SettingsApiBubbleController::CloseOnDeactivate() { 311effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Startup bubbles tend to get lost in the focus storm that happens on 312effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // startup. Other types should dismiss on focus loss. 313effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return type_ != BUBBLE_TYPE_STARTUP_PAGES; 314effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 316effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace extensions 317