15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright (c) 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/extensions/ntp_overridden_bubble_controller.h"
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/metrics/histogram.h"
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/extensions/extension_service.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/profiles/profile.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/common/url_constants.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_prefs.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/browser/extension_registry.h"
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/browser/extension_system.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_strings.h"
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/base/l10n/l10n_util.h"
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing extensions::ExtensionMessageBubbleController;
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing extensions::NtpOverriddenBubbleController;
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace {
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu////////////////////////////////////////////////////////////////////////////////
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// NtpOverriddenBubbleDelegate
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass NtpOverriddenBubbleDelegate
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : public extensions::ExtensionMessageBubbleController::Delegate {
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  NtpOverriddenBubbleDelegate(ExtensionService* service, Profile* profile);
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual ~NtpOverriddenBubbleDelegate();
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // ExtensionMessageBubbleController::Delegate methods.
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual bool ShouldIncludeExtension(const std::string& extension_id) OVERRIDE;
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void AcknowledgeExtension(
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& extension_id,
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      extensions::ExtensionMessageBubbleController::BubbleAction
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          user_action) OVERRIDE;
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void PerformAction(const extensions::ExtensionIdList& list) OVERRIDE;
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual base::string16 GetTitle() const OVERRIDE;
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual base::string16 GetMessageBody(
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      bool anchored_to_browser_action) const OVERRIDE;
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual base::string16 GetOverflowText(
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const base::string16& overflow_count) const OVERRIDE;
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual base::string16 GetLearnMoreLabel() const OVERRIDE;
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual GURL GetLearnMoreUrl() const OVERRIDE;
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual base::string16 GetActionButtonLabel() const OVERRIDE;
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual base::string16 GetDismissButtonLabel() const OVERRIDE;
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual bool ShouldShowExtensionList() const OVERRIDE;
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void RestrictToSingleExtension(
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& extension_id) OVERRIDE;
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void LogExtensionCount(size_t count) OVERRIDE;
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void LogAction(
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      extensions::ExtensionMessageBubbleController::BubbleAction
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          action) OVERRIDE;
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Our extension service. Weak, not owned by us.
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExtensionService* service_;
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // A weak pointer to the profile we are associated with. Not owned by us.
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  Profile* profile_;
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The ID of the extension we are showing the bubble for.
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string extension_id_;
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(NtpOverriddenBubbleDelegate);
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuNtpOverriddenBubbleDelegate::NtpOverriddenBubbleDelegate(
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ExtensionService* service,
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    Profile* profile)
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : service_(service), profile_(profile) {}
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuNtpOverriddenBubbleDelegate::~NtpOverriddenBubbleDelegate() {}
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool NtpOverriddenBubbleDelegate::ShouldIncludeExtension(
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& extension_id) {
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!extension_id_.empty() && extension_id_ != extension_id)
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return false;
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  using extensions::ExtensionRegistry;
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExtensionRegistry* registry = ExtensionRegistry::Get(profile_);
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const extensions::Extension* extension =
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      registry->GetExtensionById(extension_id, ExtensionRegistry::ENABLED);
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!extension)
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return false;  // The extension provided is no longer enabled.
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  extensions::ExtensionPrefs* prefs = extensions::ExtensionPrefs::Get(profile_);
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (prefs->HasNtpOverriddenBubbleBeenAcknowledged(extension_id))
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return false;
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return true;
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid NtpOverriddenBubbleDelegate::AcknowledgeExtension(
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& extension_id,
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ExtensionMessageBubbleController::BubbleAction user_action) {
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (user_action != ExtensionMessageBubbleController::ACTION_EXECUTE) {
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    extensions::ExtensionPrefs* prefs =
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        extensions::ExtensionPrefs::Get(profile_);
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    prefs->SetNtpOverriddenBubbleBeenAcknowledged(extension_id, true);
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid NtpOverriddenBubbleDelegate::PerformAction(
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const extensions::ExtensionIdList& list) {
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (size_t i = 0; i < list.size(); ++i) {
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    service_->DisableExtension(list[i],
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                               extensions::Extension::DISABLE_USER_ACTION);
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::string16 NtpOverriddenBubbleDelegate::GetTitle() const {
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return l10n_util::GetStringUTF16(
1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      IDS_EXTENSIONS_NTP_CONTROLLED_TITLE_HOME_PAGE_BUBBLE);
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 NtpOverriddenBubbleDelegate::GetMessageBody(
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool anchored_to_browser_action) const {
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::string16 body =
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      l10n_util::GetStringUTF16(IDS_EXTENSIONS_NTP_CONTROLLED_FIRST_LINE);
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  body += l10n_util::GetStringUTF16(
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      IDS_EXTENSIONS_SETTINGS_API_THIRD_LINE_CONFIRMATION);
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return body;
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::string16 NtpOverriddenBubbleDelegate::GetOverflowText(
1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::string16& overflow_count) const {
1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Does not have more than one extension in the list at a time.
1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  NOTREACHED();
1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return base::string16();
1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::string16 NtpOverriddenBubbleDelegate::GetLearnMoreLabel() const {
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuGURL NtpOverriddenBubbleDelegate::GetLearnMoreUrl() const {
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return GURL(chrome::kExtensionControlledSettingLearnMoreURL);
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::string16 NtpOverriddenBubbleDelegate::GetActionButtonLabel() const {
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_EXTENSION_CONTROLLED_RESTORE_SETTINGS);
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::string16 NtpOverriddenBubbleDelegate::GetDismissButtonLabel() const {
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_EXTENSION_CONTROLLED_KEEP_CHANGES);
1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool NtpOverriddenBubbleDelegate::ShouldShowExtensionList() const {
1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return false;
1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid NtpOverriddenBubbleDelegate::RestrictToSingleExtension(
1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& extension_id) {
1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  extension_id_ = extension_id;
1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid NtpOverriddenBubbleDelegate::LogExtensionCount(size_t count) {
1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid NtpOverriddenBubbleDelegate::LogAction(
1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ExtensionMessageBubbleController::BubbleAction action) {
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION(
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "ExtensionOverrideBubble.NtpOverriddenUserSelection",
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      action,
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ExtensionMessageBubbleController::ACTION_BOUNDARY);
1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace
1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace extensions {
1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu////////////////////////////////////////////////////////////////////////////////
1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// NtpOverriddenBubbleController
1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuNtpOverriddenBubbleController::NtpOverriddenBubbleController(Profile* profile)
1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : ExtensionMessageBubbleController(
1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          new NtpOverriddenBubbleDelegate(
1805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              ExtensionSystem::Get(profile)->extension_service(),
1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              profile),
1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          profile),
1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      profile_(profile) {}
1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuNtpOverriddenBubbleController::~NtpOverriddenBubbleController() {}
1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool NtpOverriddenBubbleController::ShouldShow(
1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& extension_id) {
1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!delegate()->ShouldIncludeExtension(extension_id))
1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return false;
1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  delegate()->RestrictToSingleExtension(extension_id);
1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return true;
1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool NtpOverriddenBubbleController::CloseOnDeactivate() {
1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return true;
1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace extensions
201