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