1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/extension_notification_observer.h" 6 7 #include <vector> 8 9 #include "base/logging.h" 10 #include "base/strings/stringprintf.h" 11 #include "extensions/common/extension.h" 12 13 namespace extensions { 14 15 namespace { 16 17 std::string Str(const std::vector<chrome::NotificationType>& types) { 18 std::string str = "["; 19 bool needs_comma = false; 20 for (std::vector<chrome::NotificationType>::const_iterator it = 21 types.begin(); it != types.end(); ++it) { 22 if (needs_comma) 23 str += ","; 24 needs_comma = true; 25 str += base::StringPrintf("%d", *it); 26 } 27 str += "]"; 28 return str; 29 } 30 31 } // namespace 32 33 ExtensionNotificationObserver::ExtensionNotificationObserver( 34 content::NotificationSource source, 35 const std::set<std::string>& extension_ids) 36 : extension_ids_(extension_ids) { 37 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, source); 38 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, source); 39 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, source); 40 } 41 42 ExtensionNotificationObserver::~ExtensionNotificationObserver() {} 43 44 testing::AssertionResult ExtensionNotificationObserver::CheckNotifications() { 45 return CheckNotifications(std::vector<chrome::NotificationType>()); 46 } 47 48 testing::AssertionResult ExtensionNotificationObserver::CheckNotifications( 49 chrome::NotificationType type) { 50 return CheckNotifications(std::vector<chrome::NotificationType>(1, type)); 51 } 52 53 testing::AssertionResult ExtensionNotificationObserver::CheckNotifications( 54 chrome::NotificationType t1, 55 chrome::NotificationType t2) { 56 std::vector<chrome::NotificationType> types; 57 types.push_back(t1); 58 types.push_back(t2); 59 return CheckNotifications(types); 60 } 61 62 testing::AssertionResult ExtensionNotificationObserver::CheckNotifications( 63 chrome::NotificationType t1, 64 chrome::NotificationType t2, 65 chrome::NotificationType t3) { 66 std::vector<chrome::NotificationType> types; 67 types.push_back(t1); 68 types.push_back(t2); 69 types.push_back(t3); 70 return CheckNotifications(types); 71 } 72 73 testing::AssertionResult ExtensionNotificationObserver::CheckNotifications( 74 chrome::NotificationType t1, 75 chrome::NotificationType t2, 76 chrome::NotificationType t3, 77 chrome::NotificationType t4, 78 chrome::NotificationType t5, 79 chrome::NotificationType t6) { 80 std::vector<chrome::NotificationType> types; 81 types.push_back(t1); 82 types.push_back(t2); 83 types.push_back(t3); 84 types.push_back(t4); 85 types.push_back(t5); 86 types.push_back(t6); 87 return CheckNotifications(types); 88 } 89 90 // content::NotificationObserver implementation. 91 void ExtensionNotificationObserver::Observe( 92 int type, 93 const content::NotificationSource& source, 94 const content::NotificationDetails& details) { 95 switch (type) { 96 case chrome::NOTIFICATION_EXTENSION_INSTALLED: { 97 const Extension* extension = 98 content::Details<const InstalledExtensionInfo>(details)->extension; 99 if (extension_ids_.count(extension->id())) 100 notifications_.push_back(static_cast<chrome::NotificationType>(type)); 101 break; 102 } 103 104 case chrome::NOTIFICATION_EXTENSION_LOADED: { 105 const Extension* extension = 106 content::Details<const Extension>(details).ptr(); 107 if (extension_ids_.count(extension->id())) 108 notifications_.push_back(static_cast<chrome::NotificationType>(type)); 109 break; 110 } 111 112 case chrome::NOTIFICATION_EXTENSION_UNLOADED: { 113 UnloadedExtensionInfo* reason = 114 content::Details<UnloadedExtensionInfo>(details).ptr(); 115 if (extension_ids_.count(reason->extension->id())) { 116 notifications_.push_back(static_cast<chrome::NotificationType>(type)); 117 // The only way that extensions are unloaded in these tests is 118 // by blacklisting. 119 EXPECT_EQ(UnloadedExtensionInfo::REASON_BLACKLIST, 120 reason->reason); 121 } 122 break; 123 } 124 125 default: 126 NOTREACHED(); 127 break; 128 } 129 } 130 131 testing::AssertionResult ExtensionNotificationObserver::CheckNotifications( 132 const std::vector<chrome::NotificationType>& types) { 133 testing::AssertionResult result = (notifications_ == types) ? 134 testing::AssertionSuccess() : 135 testing::AssertionFailure() << "Expected " << Str(types) << ", " << 136 "Got " << Str(notifications_); 137 notifications_.clear(); 138 return result; 139 } 140 141 } // namespace extensions 142