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