OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/event_router_forwarder.h" | 5 #include "chrome/browser/extensions/event_router_forwarder.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/system_monitor/system_monitor.h" | 9 #include "base/system_monitor/system_monitor.h" |
10 #include "base/test/thread_test_helper.h" | 10 #include "base/test/thread_test_helper.h" |
11 #include "chrome/browser/profiles/profile_manager.h" | 11 #include "chrome/browser/profiles/profile_manager.h" |
12 #include "chrome/test/base/testing_browser_process.h" | 12 #include "chrome/test/base/testing_browser_process.h" |
13 #include "chrome/test/base/testing_profile.h" | 13 #include "chrome/test/base/testing_profile.h" |
14 #include "chrome/test/base/testing_profile_manager.h" | 14 #include "chrome/test/base/testing_profile_manager.h" |
15 #include "content/public/test/test_browser_thread.h" | 15 #include "content/public/test/test_browser_thread.h" |
16 #include "googleurl/src/gurl.h" | 16 #include "googleurl/src/gurl.h" |
17 #include "testing/gmock/include/gmock/gmock.h" | 17 #include "testing/gmock/include/gmock/gmock.h" |
18 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
19 | 19 |
20 using content::BrowserThread; | 20 using content::BrowserThread; |
21 | 21 |
22 namespace extensions { | 22 namespace extensions { |
23 | 23 |
24 namespace { | 24 namespace { |
25 | 25 |
26 const char kEventName[] = "event_name"; | 26 const char kEventName[] = "event_name"; |
27 const char kEventArgs[] = "event_args"; | |
28 const char kExt[] = "extension"; | 27 const char kExt[] = "extension"; |
29 | 28 |
30 class MockEventRouterForwarder : public EventRouterForwarder { | 29 class MockEventRouterForwarder : public EventRouterForwarder { |
31 public: | 30 public: |
32 MOCK_METHOD6(CallEventRouter, | 31 MOCK_METHOD5(CallEventRouter, |
33 void(Profile*, const std::string&, const std::string&, const std::string&, | 32 void(Profile*, const std::string&, const std::string&, Profile*, |
34 Profile*, const GURL&)); | 33 const GURL&)); |
| 34 |
| 35 virtual void CallEventRouter( |
| 36 Profile* profile, const std::string& extension_id, |
| 37 const std::string& event_name, scoped_ptr<base::ListValue> event_args, |
| 38 Profile* restrict_to_profile, const GURL& event_url) { |
| 39 CallEventRouter(profile, extension_id, event_name, |
| 40 restrict_to_profile, event_url); |
| 41 } |
35 | 42 |
36 protected: | 43 protected: |
37 virtual ~MockEventRouterForwarder() {} | 44 virtual ~MockEventRouterForwarder() {} |
38 }; | 45 }; |
39 | 46 |
| 47 static void BroadcastEventToRenderers(EventRouterForwarder* event_router, |
| 48 const std::string& event_name, |
| 49 const GURL& url) { |
| 50 scoped_ptr<ListValue> args(new ListValue()); |
| 51 event_router->BroadcastEventToRenderers(event_name, args.Pass(), url); |
| 52 } |
| 53 |
| 54 static void DispatchEventToRenderers(EventRouterForwarder* event_router, |
| 55 const std::string& event_name, |
| 56 void* profile, |
| 57 bool use_profile_to_restrict_events, |
| 58 const GURL& url) { |
| 59 scoped_ptr<ListValue> args(new ListValue()); |
| 60 event_router->DispatchEventToRenderers(event_name, args.Pass(), profile, |
| 61 use_profile_to_restrict_events, url); |
| 62 } |
| 63 |
| 64 static void BroadcastEventToExtension(EventRouterForwarder* event_router, |
| 65 const std::string& extension, |
| 66 const std::string& event_name, |
| 67 const GURL& url) { |
| 68 scoped_ptr<ListValue> args(new ListValue()); |
| 69 event_router->BroadcastEventToExtension(extension, event_name, args.Pass(), |
| 70 url); |
| 71 } |
| 72 |
| 73 static void DispatchEventToExtension(EventRouterForwarder* event_router, |
| 74 const std::string& extension, |
| 75 const std::string& event_name, |
| 76 void* profile, |
| 77 bool use_profile_to_restrict_events, |
| 78 const GURL& url) { |
| 79 scoped_ptr<ListValue> args(new ListValue()); |
| 80 event_router->DispatchEventToExtension( |
| 81 extension, event_name, args.Pass(), profile, |
| 82 use_profile_to_restrict_events, url); |
| 83 } |
| 84 |
40 } // namespace | 85 } // namespace |
41 | 86 |
42 class EventRouterForwarderTest : public testing::Test { | 87 class EventRouterForwarderTest : public testing::Test { |
43 protected: | 88 protected: |
44 EventRouterForwarderTest() | 89 EventRouterForwarderTest() |
45 : ui_thread_(BrowserThread::UI, &message_loop_), | 90 : ui_thread_(BrowserThread::UI, &message_loop_), |
46 io_thread_(BrowserThread::IO), | 91 io_thread_(BrowserThread::IO), |
47 profile_manager_( | 92 profile_manager_( |
48 static_cast<TestingBrowserProcess*>(g_browser_process)) { | 93 static_cast<TestingBrowserProcess*>(g_browser_process)) { |
49 #if defined(OS_MACOSX) | 94 #if defined(OS_MACOSX) |
(...skipping 27 matching lines...) Expand all Loading... |
77 // Profiles are weak pointers, owned by ProfileManager in |browser_process_|. | 122 // Profiles are weak pointers, owned by ProfileManager in |browser_process_|. |
78 TestingProfile* profile1_; | 123 TestingProfile* profile1_; |
79 TestingProfile* profile2_; | 124 TestingProfile* profile2_; |
80 }; | 125 }; |
81 | 126 |
82 TEST_F(EventRouterForwarderTest, BroadcastRendererUI) { | 127 TEST_F(EventRouterForwarderTest, BroadcastRendererUI) { |
83 scoped_refptr<MockEventRouterForwarder> event_router( | 128 scoped_refptr<MockEventRouterForwarder> event_router( |
84 new MockEventRouterForwarder); | 129 new MockEventRouterForwarder); |
85 GURL url; | 130 GURL url; |
86 EXPECT_CALL(*event_router, | 131 EXPECT_CALL(*event_router, |
87 CallEventRouter( | 132 CallEventRouter(profile1_, "", kEventName, profile1_, url)); |
88 profile1_, "", kEventName, kEventArgs, profile1_, url)); | |
89 EXPECT_CALL(*event_router, | 133 EXPECT_CALL(*event_router, |
90 CallEventRouter( | 134 CallEventRouter(profile2_, "", kEventName, profile2_, url)); |
91 profile2_, "", kEventName, kEventArgs, profile2_, url)); | 135 BroadcastEventToRenderers(event_router.get(), kEventName, url); |
92 event_router->BroadcastEventToRenderers(kEventName, kEventArgs, url); | |
93 } | 136 } |
94 | 137 |
95 TEST_F(EventRouterForwarderTest, BroadcastRendererUIIncognito) { | 138 TEST_F(EventRouterForwarderTest, BroadcastRendererUIIncognito) { |
96 scoped_refptr<MockEventRouterForwarder> event_router( | 139 scoped_refptr<MockEventRouterForwarder> event_router( |
97 new MockEventRouterForwarder); | 140 new MockEventRouterForwarder); |
98 using ::testing::_; | 141 using ::testing::_; |
99 GURL url; | 142 GURL url; |
100 Profile* incognito = CreateIncognitoProfile(profile1_); | 143 Profile* incognito = CreateIncognitoProfile(profile1_); |
101 EXPECT_CALL(*event_router, | 144 EXPECT_CALL(*event_router, |
102 CallEventRouter( | 145 CallEventRouter(profile1_, "", kEventName, profile1_, url)); |
103 profile1_, "", kEventName, kEventArgs, profile1_, url)); | |
104 EXPECT_CALL(*event_router, | 146 EXPECT_CALL(*event_router, |
105 CallEventRouter(incognito, _, _, _, _, _)).Times(0); | 147 CallEventRouter(incognito, _, _, _, _)).Times(0); |
106 EXPECT_CALL(*event_router, | 148 EXPECT_CALL(*event_router, |
107 CallEventRouter( | 149 CallEventRouter(profile2_, "", kEventName, profile2_, url)); |
108 profile2_, "", kEventName, kEventArgs, profile2_, url)); | 150 BroadcastEventToRenderers(event_router.get(), kEventName, url); |
109 event_router->BroadcastEventToRenderers(kEventName, kEventArgs, url); | |
110 } | 151 } |
111 | 152 |
112 // This is the canonical test for passing control flow from the IO thread | 153 // This is the canonical test for passing control flow from the IO thread |
113 // to the UI thread. Repeating this for all public functions of | 154 // to the UI thread. Repeating this for all public functions of |
114 // EventRouterForwarder would not increase coverage. | 155 // EventRouterForwarder would not increase coverage. |
115 TEST_F(EventRouterForwarderTest, BroadcastRendererIO) { | 156 TEST_F(EventRouterForwarderTest, BroadcastRendererIO) { |
116 scoped_refptr<MockEventRouterForwarder> event_router( | 157 scoped_refptr<MockEventRouterForwarder> event_router( |
117 new MockEventRouterForwarder); | 158 new MockEventRouterForwarder); |
118 GURL url; | 159 GURL url; |
119 EXPECT_CALL(*event_router, | 160 EXPECT_CALL(*event_router, |
120 CallEventRouter( | 161 CallEventRouter(profile1_, "", kEventName, profile1_, url)); |
121 profile1_, "", kEventName, kEventArgs, profile1_, url)); | |
122 EXPECT_CALL(*event_router, | 162 EXPECT_CALL(*event_router, |
123 CallEventRouter( | 163 CallEventRouter(profile2_, "", kEventName, profile2_, url)); |
124 profile2_, "", kEventName, kEventArgs, profile2_, url)); | |
125 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 164 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
126 base::Bind( | 165 base::Bind( |
127 &MockEventRouterForwarder::BroadcastEventToRenderers, | 166 &BroadcastEventToRenderers, base::Unretained(event_router.get()), |
128 event_router.get(), | 167 kEventName, url)); |
129 std::string(kEventName), std::string(kEventArgs), url)); | |
130 | 168 |
131 // Wait for IO thread's message loop to be processed | 169 // Wait for IO thread's message loop to be processed |
132 scoped_refptr<base::ThreadTestHelper> helper( | 170 scoped_refptr<base::ThreadTestHelper> helper( |
133 new base::ThreadTestHelper( | 171 new base::ThreadTestHelper( |
134 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))); | 172 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))); |
135 ASSERT_TRUE(helper->Run()); | 173 ASSERT_TRUE(helper->Run()); |
136 | 174 |
137 MessageLoop::current()->RunAllPending(); | 175 MessageLoop::current()->RunAllPending(); |
138 } | 176 } |
139 | 177 |
140 TEST_F(EventRouterForwarderTest, UnicastRendererUIRestricted) { | 178 TEST_F(EventRouterForwarderTest, UnicastRendererUIRestricted) { |
141 scoped_refptr<MockEventRouterForwarder> event_router( | 179 scoped_refptr<MockEventRouterForwarder> event_router( |
142 new MockEventRouterForwarder); | 180 new MockEventRouterForwarder); |
143 using ::testing::_; | 181 using ::testing::_; |
144 GURL url; | 182 GURL url; |
145 EXPECT_CALL(*event_router, | 183 EXPECT_CALL(*event_router, |
146 CallEventRouter( | 184 CallEventRouter(profile1_, "", kEventName, profile1_, url)); |
147 profile1_, "", kEventName, kEventArgs, profile1_, url)); | |
148 EXPECT_CALL(*event_router, | 185 EXPECT_CALL(*event_router, |
149 CallEventRouter(profile2_, _, _, _, _, _)).Times(0); | 186 CallEventRouter(profile2_, _, _, _, _)).Times(0); |
150 event_router->DispatchEventToRenderers(kEventName, kEventArgs, | 187 DispatchEventToRenderers(event_router.get(), kEventName, profile1_, true, |
151 profile1_, true, url); | 188 url); |
152 } | 189 } |
153 | 190 |
154 TEST_F(EventRouterForwarderTest, UnicastRendererUIRestrictedIncognito1) { | 191 TEST_F(EventRouterForwarderTest, UnicastRendererUIRestrictedIncognito1) { |
155 scoped_refptr<MockEventRouterForwarder> event_router( | 192 scoped_refptr<MockEventRouterForwarder> event_router( |
156 new MockEventRouterForwarder); | 193 new MockEventRouterForwarder); |
157 Profile* incognito = CreateIncognitoProfile(profile1_); | 194 Profile* incognito = CreateIncognitoProfile(profile1_); |
158 using ::testing::_; | 195 using ::testing::_; |
159 GURL url; | 196 GURL url; |
160 EXPECT_CALL(*event_router, | 197 EXPECT_CALL(*event_router, |
161 CallEventRouter( | 198 CallEventRouter(profile1_, "", kEventName, profile1_, url)); |
162 profile1_, "", kEventName, kEventArgs, profile1_, url)); | |
163 EXPECT_CALL(*event_router, | 199 EXPECT_CALL(*event_router, |
164 CallEventRouter(incognito, _, _, _, _, _)).Times(0); | 200 CallEventRouter(incognito, _, _, _, _)).Times(0); |
165 EXPECT_CALL(*event_router, | 201 EXPECT_CALL(*event_router, |
166 CallEventRouter(profile2_, _, _, _, _, _)).Times(0); | 202 CallEventRouter(profile2_, _, _, _, _)).Times(0); |
167 event_router->DispatchEventToRenderers(kEventName, kEventArgs, | 203 DispatchEventToRenderers(event_router.get(), kEventName, profile1_, true, |
168 profile1_, true, url); | 204 url); |
169 } | 205 } |
170 | 206 |
171 TEST_F(EventRouterForwarderTest, UnicastRendererUIRestrictedIncognito2) { | 207 TEST_F(EventRouterForwarderTest, UnicastRendererUIRestrictedIncognito2) { |
172 scoped_refptr<MockEventRouterForwarder> event_router( | 208 scoped_refptr<MockEventRouterForwarder> event_router( |
173 new MockEventRouterForwarder); | 209 new MockEventRouterForwarder); |
174 Profile* incognito = CreateIncognitoProfile(profile1_); | 210 Profile* incognito = CreateIncognitoProfile(profile1_); |
175 using ::testing::_; | 211 using ::testing::_; |
176 GURL url; | 212 GURL url; |
177 EXPECT_CALL(*event_router, | 213 EXPECT_CALL(*event_router, |
178 CallEventRouter(profile1_, _, _, _, _, _)).Times(0); | 214 CallEventRouter(profile1_, _, _, _, _)).Times(0); |
179 EXPECT_CALL(*event_router, | 215 EXPECT_CALL(*event_router, |
180 CallEventRouter( | 216 CallEventRouter(incognito, "", kEventName, incognito, url)); |
181 incognito, "", kEventName, kEventArgs, incognito, url)); | |
182 EXPECT_CALL(*event_router, | 217 EXPECT_CALL(*event_router, |
183 CallEventRouter(profile2_, _, _, _, _, _)).Times(0); | 218 CallEventRouter(profile2_, _, _, _, _)).Times(0); |
184 event_router->DispatchEventToRenderers(kEventName, kEventArgs, | 219 DispatchEventToRenderers(event_router.get(), kEventName, incognito, true, |
185 incognito, true, url); | 220 url); |
186 } | 221 } |
187 | 222 |
188 TEST_F(EventRouterForwarderTest, UnicastRendererUIUnrestricted) { | 223 TEST_F(EventRouterForwarderTest, UnicastRendererUIUnrestricted) { |
189 scoped_refptr<MockEventRouterForwarder> event_router( | 224 scoped_refptr<MockEventRouterForwarder> event_router( |
190 new MockEventRouterForwarder); | 225 new MockEventRouterForwarder); |
191 using ::testing::_; | 226 using ::testing::_; |
192 GURL url; | 227 GURL url; |
193 EXPECT_CALL(*event_router, | 228 EXPECT_CALL(*event_router, |
194 CallEventRouter( | 229 CallEventRouter(profile1_, "", kEventName, NULL, url)); |
195 profile1_, "", kEventName, kEventArgs, NULL, url)); | |
196 EXPECT_CALL(*event_router, | 230 EXPECT_CALL(*event_router, |
197 CallEventRouter(profile2_, _, _, _, _, _)).Times(0); | 231 CallEventRouter(profile2_, _, _, _, _)).Times(0); |
198 event_router->DispatchEventToRenderers(kEventName, kEventArgs, | 232 DispatchEventToRenderers(event_router.get(), kEventName, profile1_, false, |
199 profile1_, false, url); | 233 url); |
200 } | 234 } |
201 | 235 |
202 TEST_F(EventRouterForwarderTest, UnicastRendererUIUnrestrictedIncognito) { | 236 TEST_F(EventRouterForwarderTest, UnicastRendererUIUnrestrictedIncognito) { |
203 scoped_refptr<MockEventRouterForwarder> event_router( | 237 scoped_refptr<MockEventRouterForwarder> event_router( |
204 new MockEventRouterForwarder); | 238 new MockEventRouterForwarder); |
205 Profile* incognito = CreateIncognitoProfile(profile1_); | 239 Profile* incognito = CreateIncognitoProfile(profile1_); |
206 using ::testing::_; | 240 using ::testing::_; |
207 GURL url; | 241 GURL url; |
208 EXPECT_CALL(*event_router, | 242 EXPECT_CALL(*event_router, |
209 CallEventRouter( | 243 CallEventRouter(profile1_, "", kEventName, NULL, url)); |
210 profile1_, "", kEventName, kEventArgs, NULL, url)); | |
211 EXPECT_CALL(*event_router, | 244 EXPECT_CALL(*event_router, |
212 CallEventRouter(incognito, _, _, _, _, _)).Times(0); | 245 CallEventRouter(incognito, _, _, _, _)).Times(0); |
213 EXPECT_CALL(*event_router, | 246 EXPECT_CALL(*event_router, |
214 CallEventRouter(profile2_, _, _, _, _, _)).Times(0); | 247 CallEventRouter(profile2_, _, _, _, _)).Times(0); |
215 event_router->DispatchEventToRenderers(kEventName, kEventArgs, | 248 DispatchEventToRenderers(event_router.get(), kEventName, profile1_, false, |
216 profile1_, false, url); | 249 url); |
217 } | 250 } |
218 | 251 |
219 TEST_F(EventRouterForwarderTest, BroadcastExtensionUI) { | 252 TEST_F(EventRouterForwarderTest, BroadcastExtensionUI) { |
220 scoped_refptr<MockEventRouterForwarder> event_router( | 253 scoped_refptr<MockEventRouterForwarder> event_router( |
221 new MockEventRouterForwarder); | 254 new MockEventRouterForwarder); |
222 GURL url; | 255 GURL url; |
223 EXPECT_CALL(*event_router, | 256 EXPECT_CALL(*event_router, |
224 CallEventRouter( | 257 CallEventRouter(profile1_, kExt, kEventName, profile1_, url)); |
225 profile1_, kExt, kEventName, kEventArgs, profile1_, url)); | |
226 EXPECT_CALL(*event_router, | 258 EXPECT_CALL(*event_router, |
227 CallEventRouter( | 259 CallEventRouter(profile2_, kExt, kEventName, profile2_, url)); |
228 profile2_, kExt, kEventName, kEventArgs, profile2_, url)); | 260 BroadcastEventToExtension(event_router.get(), kExt, kEventName, url); |
229 event_router->BroadcastEventToExtension(kExt, kEventName, kEventArgs, url); | |
230 } | 261 } |
231 | 262 |
232 TEST_F(EventRouterForwarderTest, UnicastExtensionUIRestricted) { | 263 TEST_F(EventRouterForwarderTest, UnicastExtensionUIRestricted) { |
233 scoped_refptr<MockEventRouterForwarder> event_router( | 264 scoped_refptr<MockEventRouterForwarder> event_router( |
234 new MockEventRouterForwarder); | 265 new MockEventRouterForwarder); |
235 using ::testing::_; | 266 using ::testing::_; |
236 GURL url; | 267 GURL url; |
237 EXPECT_CALL(*event_router, | 268 EXPECT_CALL(*event_router, |
238 CallEventRouter( | 269 CallEventRouter(profile1_, kExt, kEventName, profile1_, url)); |
239 profile1_, kExt, kEventName, kEventArgs, profile1_, url)); | |
240 EXPECT_CALL(*event_router, | 270 EXPECT_CALL(*event_router, |
241 CallEventRouter(profile2_, _, _, _, _, _)).Times(0); | 271 CallEventRouter(profile2_, _, _, _, _)).Times(0); |
242 event_router->DispatchEventToExtension(kExt, kEventName, kEventArgs, | 272 DispatchEventToExtension(event_router.get(), kExt, kEventName, profile1_, |
243 profile1_, true, url); | 273 true, url); |
244 } | 274 } |
245 | 275 |
246 TEST_F(EventRouterForwarderTest, UnicastExtensionUIUnrestricted) { | 276 TEST_F(EventRouterForwarderTest, UnicastExtensionUIUnrestricted) { |
247 scoped_refptr<MockEventRouterForwarder> event_router( | 277 scoped_refptr<MockEventRouterForwarder> event_router( |
248 new MockEventRouterForwarder); | 278 new MockEventRouterForwarder); |
249 using ::testing::_; | 279 using ::testing::_; |
250 GURL url; | 280 GURL url; |
251 EXPECT_CALL(*event_router, | 281 EXPECT_CALL(*event_router, |
252 CallEventRouter( | 282 CallEventRouter(profile1_, kExt, kEventName, NULL, url)); |
253 profile1_, kExt, kEventName, kEventArgs, NULL, url)); | |
254 EXPECT_CALL(*event_router, | 283 EXPECT_CALL(*event_router, |
255 CallEventRouter(profile2_, _, _, _, _, _)).Times(0); | 284 CallEventRouter(profile2_, _, _, _, _)).Times(0); |
256 event_router->DispatchEventToExtension(kExt, kEventName, kEventArgs, | 285 DispatchEventToExtension(event_router.get(), kExt, kEventName, profile1_, |
257 profile1_, false, url); | 286 false, url); |
258 } | 287 } |
259 | 288 |
260 } // namespace extensions | 289 } // namespace extensions |
OLD | NEW |