Chromium Code Reviews| Index: chrome/browser/extensions/extension_message_bubble_controller.cc |
| diff --git a/chrome/browser/extensions/extension_message_bubble_controller.cc b/chrome/browser/extensions/extension_message_bubble_controller.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..32b0258fdea679de8ee08cf9d9ba842fcce01293 |
| --- /dev/null |
| +++ b/chrome/browser/extensions/extension_message_bubble_controller.cc |
| @@ -0,0 +1,141 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/extensions/extension_message_bubble_controller.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/metrics/histogram.h" |
| +#include "base/strings/utf_string_conversions.h" |
| +#include "chrome/browser/extensions/extension_message_bubble.h" |
| +#include "chrome/browser/extensions/extension_prefs.h" |
| +#include "chrome/browser/extensions/extension_service.h" |
| +#include "chrome/browser/ui/browser.h" |
| +#include "chrome/browser/ui/browser_finder.h" |
| +#include "chrome/common/url_constants.h" |
| +#include "content/public/browser/user_metrics.h" |
| +#include "grit/chromium_strings.h" |
| +#include "grit/generated_resources.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| + |
| +namespace extensions { |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// ExtensionMessageBubbleController |
| + |
| +ExtensionMessageBubbleController::ExtensionMessageBubbleController( |
| + Delegate* delegate, Profile* profile) |
| + : service_(extensions::ExtensionSystem::Get(profile)->extension_service()), |
| + profile_(profile), |
| + user_action_(ACTION_BOUNDARY), |
| + delegate_(delegate), |
| + has_notified_(false), |
| + showing_bubble_(false) { |
| +} |
| + |
| +ExtensionMessageBubbleController::~ExtensionMessageBubbleController() { |
| +} |
| + |
| +bool ExtensionMessageBubbleController::HasExtensionList() { |
|
not at google - send to devlin
2013/12/10 01:21:39
HasExtensionList is confusing given it's actually
Finnur
2013/12/11 23:12:18
Done.
|
| + if (has_notified_) |
| + return false; |
| + |
| + scoped_ptr<const ExtensionSet> extension_set( |
| + service_->GenerateInstalledExtensionsSet()); |
| + for (ExtensionSet::const_iterator it = extension_set->begin(); |
| + it != extension_set->end(); ++it) { |
| + std::string id = (*it)->id(); |
| + if (!delegate_->ShouldIncludeExtension(id)) |
| + continue; |
| + extension_list_.push_back(id); |
| + } |
| + |
| + delegate_->LogExtensionCount(extension_list_.size()); |
| + |
| + has_notified_ = true; |
| + return !extension_list_.empty(); |
|
not at google - send to devlin
2013/12/10 01:21:39
A lot of the behaviour in this class seems to rely
Finnur
2013/12/11 23:12:18
The class already has a GetExtensionList method, b
|
| +} |
| + |
| +std::vector<string16> |
| +ExtensionMessageBubbleController::GetExtensionList() const { |
| + if (extension_list_.empty()) |
| + return std::vector<string16>(); |
| + |
| + std::vector<string16> return_value; |
| + for (ExtensionIdList::const_iterator it = extension_list_.begin(); |
| + it != extension_list_.end(); ++it) { |
| + const Extension* extension = service_->GetInstalledExtension(*it); |
| + if (extension) { |
| + return_value.push_back(UTF8ToUTF16(extension->name())); |
| + } else { |
| + return_value.push_back( |
| + ASCIIToUTF16(std::string("(unknown name) ") + *it)); |
| + // TODO(finnur): Add this as a string to the grd, for next milestone. |
| + } |
| + } |
| + return return_value; |
| +} |
| + |
| +void ExtensionMessageBubbleController::Show(ExtensionMessageBubble* bubble) { |
| + // Wire up all the callbacks, to get notified what actions the user took. |
| + base::Closure dismiss_button_callback = |
| + base::Bind(&ExtensionMessageBubbleController::OnBubbleDismiss, |
| + base::Unretained(this)); |
| + base::Closure action_button_callback = |
| + base::Bind(&ExtensionMessageBubbleController::OnBubbleAction, |
| + base::Unretained(this)); |
| + base::Closure link_callback = |
| + base::Bind(&ExtensionMessageBubbleController::OnLinkClicked, |
| + base::Unretained(this)); |
| + bubble->OnActionButtonClicked(action_button_callback); |
| + bubble->OnDismissButtonClicked(dismiss_button_callback); |
| + bubble->OnLinkClicked(link_callback); |
| + |
| + showing_bubble_ = true; |
| + bubble->Show(); |
| +} |
| + |
| +void ExtensionMessageBubbleController::OnBubbleAction() { |
| + DCHECK_EQ(ACTION_BOUNDARY, user_action_); |
| + user_action_ = ACTION_EXECUTE; |
| + |
| + delegate_->LogAction(ACTION_EXECUTE); |
| + delegate_->PerformAction(extension_list_); |
| + AcknowledgeExtensions(); |
| +} |
| + |
| +void ExtensionMessageBubbleController::OnBubbleDismiss() { |
| + DCHECK_EQ(ACTION_BOUNDARY, user_action_); |
| + user_action_ = ACTION_DISMISS; |
| + |
| + delegate_->LogAction(ACTION_DISMISS); |
| + AcknowledgeExtensions(); |
| +} |
| + |
| +void ExtensionMessageBubbleController::OnLinkClicked() { |
| + DCHECK_EQ(ACTION_BOUNDARY, user_action_); |
| + user_action_ = ACTION_LEARN_MORE; |
| + |
| + delegate_->LogAction(ACTION_LEARN_MORE); |
| + Browser* browser = |
| + chrome::FindBrowserWithProfile(profile_, chrome::GetActiveDesktop()); |
| + if (browser) { |
| + browser->OpenURL( |
| + content::OpenURLParams(delegate_->GetLearnMoreUrl(), |
| + content::Referrer(), |
| + NEW_FOREGROUND_TAB, |
| + content::PAGE_TRANSITION_LINK, |
| + false)); |
| + } |
| + AcknowledgeExtensions(); |
| +} |
| + |
| +void ExtensionMessageBubbleController::AcknowledgeExtensions() { |
| + for (ExtensionIdList::const_iterator it = extension_list_.begin(); |
| + it != extension_list_.end(); ++it) |
| + delegate_->AcknowledgeExtension(*it, user_action_); |
| + |
| + showing_bubble_ = false; |
| +} |
| + |
| +} // namespace extensions |