// Copyright 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_notification_observer.h" #include <vector> #include "base/logging.h" #include "base/strings/stringprintf.h" #include "extensions/common/extension.h" namespace extensions { namespace { std::string Str(const std::vector<chrome::NotificationType>& types) { std::string str = "["; bool needs_comma = false; for (std::vector<chrome::NotificationType>::const_iterator it = types.begin(); it != types.end(); ++it) { if (needs_comma) str += ","; needs_comma = true; str += base::StringPrintf("%d", *it); } str += "]"; return str; } } // namespace ExtensionNotificationObserver::ExtensionNotificationObserver( content::NotificationSource source, const std::set<std::string>& extension_ids) : extension_ids_(extension_ids) { registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, source); registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, source); registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, source); } ExtensionNotificationObserver::~ExtensionNotificationObserver() {} testing::AssertionResult ExtensionNotificationObserver::CheckNotifications() { return CheckNotifications(std::vector<chrome::NotificationType>()); } testing::AssertionResult ExtensionNotificationObserver::CheckNotifications( chrome::NotificationType type) { return CheckNotifications(std::vector<chrome::NotificationType>(1, type)); } testing::AssertionResult ExtensionNotificationObserver::CheckNotifications( chrome::NotificationType t1, chrome::NotificationType t2) { std::vector<chrome::NotificationType> types; types.push_back(t1); types.push_back(t2); return CheckNotifications(types); } testing::AssertionResult ExtensionNotificationObserver::CheckNotifications( chrome::NotificationType t1, chrome::NotificationType t2, chrome::NotificationType t3) { std::vector<chrome::NotificationType> types; types.push_back(t1); types.push_back(t2); types.push_back(t3); return CheckNotifications(types); } testing::AssertionResult ExtensionNotificationObserver::CheckNotifications( chrome::NotificationType t1, chrome::NotificationType t2, chrome::NotificationType t3, chrome::NotificationType t4, chrome::NotificationType t5, chrome::NotificationType t6) { std::vector<chrome::NotificationType> types; types.push_back(t1); types.push_back(t2); types.push_back(t3); types.push_back(t4); types.push_back(t5); types.push_back(t6); return CheckNotifications(types); } // content::NotificationObserver implementation. void ExtensionNotificationObserver::Observe( int type, const content::NotificationSource& source, const content::NotificationDetails& details) { switch (type) { case chrome::NOTIFICATION_EXTENSION_INSTALLED: { const Extension* extension = content::Details<const InstalledExtensionInfo>(details)->extension; if (extension_ids_.count(extension->id())) notifications_.push_back(static_cast<chrome::NotificationType>(type)); break; } case chrome::NOTIFICATION_EXTENSION_LOADED: { const Extension* extension = content::Details<const Extension>(details).ptr(); if (extension_ids_.count(extension->id())) notifications_.push_back(static_cast<chrome::NotificationType>(type)); break; } case chrome::NOTIFICATION_EXTENSION_UNLOADED: { UnloadedExtensionInfo* reason = content::Details<UnloadedExtensionInfo>(details).ptr(); if (extension_ids_.count(reason->extension->id())) { notifications_.push_back(static_cast<chrome::NotificationType>(type)); // The only way that extensions are unloaded in these tests is // by blacklisting. EXPECT_EQ(UnloadedExtensionInfo::REASON_BLACKLIST, reason->reason); } break; } default: NOTREACHED(); break; } } testing::AssertionResult ExtensionNotificationObserver::CheckNotifications( const std::vector<chrome::NotificationType>& types) { testing::AssertionResult result = (notifications_ == types) ? testing::AssertionSuccess() : testing::AssertionFailure() << "Expected " << Str(types) << ", " << "Got " << Str(notifications_); notifications_.clear(); return result; } } // namespace extensions