Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(229)

Side by Side Diff: chrome/browser/media/router/media_router_mojo_impl_unittest.cc

Issue 1259073004: [Presentation API] Change ListenForSessionMessages API to client-style. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Compile fix Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 <string> 5 #include <string>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
11 #include "base/synchronization/waitable_event.h" 11 #include "base/synchronization/waitable_event.h"
12 #include "chrome/browser/media/router/media_route.h" 12 #include "chrome/browser/media/router/media_route.h"
13 #include "chrome/browser/media/router/media_router_mojo_test.h" 13 #include "chrome/browser/media/router/media_router_mojo_test.h"
14 #include "chrome/browser/media/router/mock_media_router.h" 14 #include "chrome/browser/media/router/mock_media_router.h"
15 #include "chrome/browser/media/router/presentation_session_messages_observer.h"
15 #include "chrome/browser/media/router/test_helper.h" 16 #include "chrome/browser/media/router/test_helper.h"
16 #include "chrome/test/base/chrome_render_view_host_test_harness.h" 17 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
17 #include "chrome/test/base/testing_profile.h" 18 #include "chrome/test/base/testing_profile.h"
18 #include "extensions/browser/extension_registry.h" 19 #include "extensions/browser/extension_registry.h"
19 #include "extensions/browser/process_manager.h" 20 #include "extensions/browser/process_manager.h"
20 #include "extensions/browser/process_manager_factory.h" 21 #include "extensions/browser/process_manager_factory.h"
21 #include "media/base/gmock_callback_support.h" 22 #include "media/base/gmock_callback_support.h"
22 #include "testing/gmock/include/gmock/gmock.h" 23 #include "testing/gmock/include/gmock/gmock.h"
23 #include "testing/gtest/include/gtest/gtest.h" 24 #include "testing/gtest/include/gtest/gtest.h"
24 25
25 using testing::_; 26 using testing::_;
26 using testing::Eq; 27 using testing::Eq;
27 using testing::Invoke; 28 using testing::Invoke;
29 using testing::Not;
28 using testing::Pointee; 30 using testing::Pointee;
29 using testing::Return; 31 using testing::Return;
30 using testing::ReturnRef; 32 using testing::ReturnRef;
31 using testing::SaveArg; 33 using testing::SaveArg;
32 34
33 namespace media_router { 35 namespace media_router {
34 36
35 namespace { 37 namespace {
36 38
37 const char kDescription[] = "description"; 39 const char kDescription[] = "description";
38 const char kError[] = "error"; 40 const char kError[] = "error";
39 const char kExtensionId[] = "extension1234"; 41 const char kExtensionId[] = "extension1234";
40 const char kMessage[] = "message"; 42 const char kMessage[] = "message";
41 const char kSource[] = "source1"; 43 const char kSource[] = "source1";
42 const char kSource2[] = "source2"; 44 const char kSource2[] = "source2";
43 const char kRouteId[] = "routeId"; 45 const char kRouteId[] = "routeId";
44 const char kRouteId2[] = "routeId2"; 46 const char kRouteId2[] = "routeId2";
45 const char kSink[] = "sink"; 47 const char kSink[] = "sink";
46 const char kSink2[] = "sink2"; 48 const char kSink2[] = "sink2";
47 const char kSinkName[] = "sinkName"; 49 const char kSinkName[] = "sinkName";
48 const char kPresentationId[] = "presentationId"; 50 const char kPresentationId[] = "presentationId";
49 const char kOrigin[] = "http://origin/"; 51 const char kOrigin[] = "http://origin/";
50 const int kTabId = 123; 52 const int kTabId = 123;
51 53
52 bool ArePresentationSessionMessagesEqual( 54 bool ArePresentationSessionMessagesEqual(
53 const content::PresentationSessionMessage* expected, 55 const content::PresentationSessionMessage* expected,
54 const content::PresentationSessionMessage* actual) { 56 const content::PresentationSessionMessage* actual) {
55 if (expected->presentation_url != actual->presentation_url || 57 if (expected->type != actual->type)
56 expected->presentation_id != actual->presentation_id ||
57 expected->type != actual->type) {
58 return false; 58 return false;
59 } 59
60 return expected->is_binary() ? *(expected->data) == *(actual->data) 60 return expected->is_binary() ? expected->data == actual->data
61 : *(expected->message) == *(actual->message); 61 : expected->message == actual->message;
62 } 62 }
63 63
64 } // namespace 64 } // namespace
65 65
66 class RouteResponseCallbackHandler { 66 class RouteResponseCallbackHandler {
67 public: 67 public:
68 MOCK_METHOD2(Invoke, 68 MOCK_METHOD3(Invoke,
69 void(const MediaRoute* route, const std::string& error_text)); 69 void(const MediaRoute* route,
70 const std::string& presentation_id,
71 const std::string& error_text));
70 }; 72 };
71 73
72 class SendMessageCallbackHandler { 74 class SendMessageCallbackHandler {
73 public: 75 public:
74 MOCK_METHOD1(Invoke, void(bool)); 76 MOCK_METHOD1(Invoke, void(bool));
75 }; 77 };
76 78
77 class ListenForMessagesCallbackHandler { 79 class ListenForMessagesCallbackHandler {
78 public: 80 public:
79 ListenForMessagesCallbackHandler(scoped_ptr< 81 ListenForMessagesCallbackHandler(
80 ScopedVector<content::PresentationSessionMessage>> expected_messages) 82 ScopedVector<content::PresentationSessionMessage> expected_messages)
81 : expected_messages_(expected_messages.Pass()) {} 83 : expected_messages_(expected_messages.Pass()) {}
82 void Invoke( 84 void Invoke(
83 scoped_ptr<ScopedVector<content::PresentationSessionMessage>> messages) { 85 const ScopedVector<content::PresentationSessionMessage>& messages) {
84 InvokeObserver(); 86 InvokeObserver();
85 EXPECT_EQ(messages->size(), expected_messages_->size()); 87 EXPECT_EQ(messages.size(), expected_messages_.size());
86 const auto& expected = expected_messages_->get(); 88 for (size_t i = 0; i < expected_messages_.size(); ++i) {
87 const auto& actual = messages->get(); 89 EXPECT_TRUE(ArePresentationSessionMessagesEqual(expected_messages_[i],
88 for (size_t i = 0; i < expected_messages_->size(); ++i) { 90 messages[i]));
89 EXPECT_TRUE(ArePresentationSessionMessagesEqual(expected[i], actual[i]));
90 } 91 }
91 } 92 }
92 93
93 MOCK_METHOD0(InvokeObserver, void()); 94 MOCK_METHOD0(InvokeObserver, void());
94 95
95 private: 96 private:
96 scoped_ptr<ScopedVector<content::PresentationSessionMessage>> 97 ScopedVector<content::PresentationSessionMessage> expected_messages_;
97 expected_messages_;
98 }; 98 };
99 99
100 template <typename T> 100 template <typename T>
101 void StoreAndRun(T* result, const base::Closure& closure, const T& result_val) { 101 void StoreAndRun(T* result, const base::Closure& closure, const T& result_val) {
102 *result = result_val; 102 *result = result_val;
103 closure.Run(); 103 closure.Run();
104 } 104 }
105 105
106 class MediaRouterMojoImplTest : public MediaRouterMojoTest { 106 class MediaRouterMojoImplTest : public MediaRouterMojoTest {
107 public: 107 public:
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 mojo::String(kOrigin), kTabId, _)) 159 mojo::String(kOrigin), kTabId, _))
160 .WillOnce(Invoke([&route]( 160 .WillOnce(Invoke([&route](
161 const mojo::String& source, const mojo::String& sink, 161 const mojo::String& source, const mojo::String& sink,
162 const mojo::String& presentation_id, const mojo::String& origin, 162 const mojo::String& presentation_id, const mojo::String& origin,
163 int tab_id, 163 int tab_id,
164 const interfaces::MediaRouteProvider::CreateRouteCallback& cb) { 164 const interfaces::MediaRouteProvider::CreateRouteCallback& cb) {
165 cb.Run(route.Pass(), mojo::String()); 165 cb.Run(route.Pass(), mojo::String());
166 })); 166 }));
167 167
168 RouteResponseCallbackHandler handler; 168 RouteResponseCallbackHandler handler;
169 EXPECT_CALL(handler, Invoke(Pointee(Equals(expected_route)), "")); 169 EXPECT_CALL(handler, Invoke(Pointee(Equals(expected_route)), Not(""), ""));
170 std::vector<MediaRouteResponseCallback> route_response_callbacks; 170 std::vector<MediaRouteResponseCallback> route_response_callbacks;
171 route_response_callbacks.push_back(base::Bind( 171 route_response_callbacks.push_back(base::Bind(
172 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 172 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
173 router()->CreateRoute(kSource, kSink, GURL(kOrigin), kTabId, 173 router()->CreateRoute(kSource, kSink, GURL(kOrigin), kTabId,
174 route_response_callbacks); 174 route_response_callbacks);
175 ProcessEventLoop(); 175 ProcessEventLoop();
176 } 176 }
177 177
178 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) { 178 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) {
179 EXPECT_CALL(mock_media_route_provider_, 179 EXPECT_CALL(mock_media_route_provider_,
180 CreateRoute(mojo::String(kSource), mojo::String(kSink), _, 180 CreateRoute(mojo::String(kSource), mojo::String(kSink), _,
181 mojo::String(kOrigin), kTabId, _)) 181 mojo::String(kOrigin), kTabId, _))
182 .WillOnce(Invoke( 182 .WillOnce(Invoke(
183 [](const mojo::String& source, const mojo::String& sink, 183 [](const mojo::String& source, const mojo::String& sink,
184 const mojo::String& presentation_id, const mojo::String& origin, 184 const mojo::String& presentation_id, const mojo::String& origin,
185 int tab_id, 185 int tab_id,
186 const interfaces::MediaRouteProvider::CreateRouteCallback& cb) { 186 const interfaces::MediaRouteProvider::CreateRouteCallback& cb) {
187 cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError)); 187 cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError));
188 })); 188 }));
189 189
190 RouteResponseCallbackHandler handler; 190 RouteResponseCallbackHandler handler;
191 EXPECT_CALL(handler, Invoke(nullptr, kError)); 191 EXPECT_CALL(handler, Invoke(nullptr, "", kError));
192 std::vector<MediaRouteResponseCallback> route_response_callbacks; 192 std::vector<MediaRouteResponseCallback> route_response_callbacks;
193 route_response_callbacks.push_back(base::Bind( 193 route_response_callbacks.push_back(base::Bind(
194 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 194 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
195 router()->CreateRoute(kSource, kSink, GURL(kOrigin), kTabId, 195 router()->CreateRoute(kSource, kSink, GURL(kOrigin), kTabId,
196 route_response_callbacks); 196 route_response_callbacks);
197 ProcessEventLoop(); 197 ProcessEventLoop();
198 } 198 }
199 199
200 TEST_F(MediaRouterMojoImplTest, JoinRoute) { 200 TEST_F(MediaRouterMojoImplTest, JoinRoute) {
201 MediaRoute expected_route(kRouteId, MediaSource(std::string(kSource)), 201 MediaRoute expected_route(kRouteId, MediaSource(std::string(kSource)),
(...skipping 13 matching lines...) Expand all
215 JoinRoute(mojo::String(kSource), mojo::String(kPresentationId), 215 JoinRoute(mojo::String(kSource), mojo::String(kPresentationId),
216 mojo::String(kOrigin), kTabId, _)) 216 mojo::String(kOrigin), kTabId, _))
217 .WillOnce(Invoke([&route]( 217 .WillOnce(Invoke([&route](
218 const mojo::String& source, const mojo::String& presentation_id, 218 const mojo::String& source, const mojo::String& presentation_id,
219 const mojo::String& origin, int tab_id, 219 const mojo::String& origin, int tab_id,
220 const interfaces::MediaRouteProvider::JoinRouteCallback& cb) { 220 const interfaces::MediaRouteProvider::JoinRouteCallback& cb) {
221 cb.Run(route.Pass(), mojo::String()); 221 cb.Run(route.Pass(), mojo::String());
222 })); 222 }));
223 223
224 RouteResponseCallbackHandler handler; 224 RouteResponseCallbackHandler handler;
225 EXPECT_CALL(handler, Invoke(Pointee(Equals(expected_route)), "")); 225 EXPECT_CALL(handler, Invoke(Pointee(Equals(expected_route)), Not(""), ""));
226 std::vector<MediaRouteResponseCallback> route_response_callbacks; 226 std::vector<MediaRouteResponseCallback> route_response_callbacks;
227 route_response_callbacks.push_back(base::Bind( 227 route_response_callbacks.push_back(base::Bind(
228 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 228 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
229 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), kTabId, 229 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), kTabId,
230 route_response_callbacks); 230 route_response_callbacks);
231 ProcessEventLoop(); 231 ProcessEventLoop();
232 } 232 }
233 233
234 TEST_F(MediaRouterMojoImplTest, JoinRouteFails) { 234 TEST_F(MediaRouterMojoImplTest, JoinRouteFails) {
235 EXPECT_CALL(mock_media_route_provider_, 235 EXPECT_CALL(mock_media_route_provider_,
236 JoinRoute(mojo::String(kSource), mojo::String(kPresentationId), 236 JoinRoute(mojo::String(kSource), mojo::String(kPresentationId),
237 mojo::String(kOrigin), kTabId, _)) 237 mojo::String(kOrigin), kTabId, _))
238 .WillOnce(Invoke( 238 .WillOnce(Invoke(
239 [](const mojo::String& source, const mojo::String& presentation_id, 239 [](const mojo::String& source, const mojo::String& presentation_id,
240 const mojo::String& origin, int tab_id, 240 const mojo::String& origin, int tab_id,
241 const interfaces::MediaRouteProvider::JoinRouteCallback& cb) { 241 const interfaces::MediaRouteProvider::JoinRouteCallback& cb) {
242 cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError)); 242 cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError));
243 })); 243 }));
244 244
245 RouteResponseCallbackHandler handler; 245 RouteResponseCallbackHandler handler;
246 EXPECT_CALL(handler, Invoke(nullptr, kError)); 246 EXPECT_CALL(handler, Invoke(nullptr, "", kError));
247 std::vector<MediaRouteResponseCallback> route_response_callbacks; 247 std::vector<MediaRouteResponseCallback> route_response_callbacks;
248 route_response_callbacks.push_back(base::Bind( 248 route_response_callbacks.push_back(base::Bind(
249 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 249 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
250 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), kTabId, 250 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), kTabId,
251 route_response_callbacks); 251 route_response_callbacks);
252 ProcessEventLoop(); 252 ProcessEventLoop();
253 } 253 }
254 254
255 TEST_F(MediaRouterMojoImplTest, CloseRoute) { 255 TEST_F(MediaRouterMojoImplTest, CloseRoute) {
256 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId))); 256 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId)));
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 })); 383 }));
384 384
385 SendMessageCallbackHandler handler; 385 SendMessageCallbackHandler handler;
386 EXPECT_CALL(handler, Invoke(true)); 386 EXPECT_CALL(handler, Invoke(true));
387 router()->SendRouteMessage(kRouteId, kMessage, 387 router()->SendRouteMessage(kRouteId, kMessage,
388 base::Bind(&SendMessageCallbackHandler::Invoke, 388 base::Bind(&SendMessageCallbackHandler::Invoke,
389 base::Unretained(&handler))); 389 base::Unretained(&handler)));
390 ProcessEventLoop(); 390 ProcessEventLoop();
391 } 391 }
392 392
393 TEST_F(MediaRouterMojoImplTest, ListenForRouteMessages) { 393 TEST_F(MediaRouterMojoImplTest, PresentationSessionMessagesObserver) {
394 mojo::Array<interfaces::RouteMessagePtr> mojo_messages(2); 394 mojo::Array<interfaces::RouteMessagePtr> mojo_messages(2);
395 mojo_messages[0] = interfaces::RouteMessage::New(); 395 mojo_messages[0] = interfaces::RouteMessage::New();
396 mojo_messages[0]->route_id = "r1";
397 mojo_messages[0]->type = interfaces::RouteMessage::Type::TYPE_TEXT; 396 mojo_messages[0]->type = interfaces::RouteMessage::Type::TYPE_TEXT;
398 mojo_messages[0]->message = "text"; 397 mojo_messages[0]->message = "text";
399 mojo_messages[1] = interfaces::RouteMessage::New(); 398 mojo_messages[1] = interfaces::RouteMessage::New();
400 mojo_messages[1]->route_id = "r2";
401 mojo_messages[1]->type = interfaces::RouteMessage::Type::TYPE_BINARY; 399 mojo_messages[1]->type = interfaces::RouteMessage::Type::TYPE_BINARY;
402 mojo_messages[1]->data.push_back(1); 400 mojo_messages[1]->data.push_back(1);
403 401
404 scoped_ptr<ScopedVector<content::PresentationSessionMessage>> 402 ScopedVector<content::PresentationSessionMessage> expected_messages;
405 expected_messages( 403 scoped_ptr<content::PresentationSessionMessage> message;
406 new ScopedVector<content::PresentationSessionMessage>()); 404 message.reset(new content::PresentationSessionMessage(
407 expected_messages->push_back( 405 content::PresentationMessageType::TEXT));
408 content::PresentationSessionMessage::CreateStringMessage( 406 message->message = "text";
409 "", "", make_scoped_ptr(new std::string("text")))); 407 expected_messages.push_back(message.Pass());
410 scoped_ptr<std::vector<uint8_t>> expected_binary_data(
411 new std::vector<uint8_t>(1, 1));
412 expected_messages->push_back(
413 content::PresentationSessionMessage::CreateArrayBufferMessage(
414 "", "", expected_binary_data.Pass()));
415 408
416 EXPECT_CALL(mock_media_route_provider_, ListenForRouteMessagesInteral(_, _)) 409 message.reset(new content::PresentationSessionMessage(
417 .WillOnce(Invoke([&mojo_messages]( 410 content::PresentationMessageType::ARRAY_BUFFER));
418 const std::vector<mojo::String>& route_ids, 411 message->data = std::vector<uint8_t>(1, 1);
419 const interfaces::MediaRouteProvider::ListenForRouteMessagesCallback& 412 expected_messages.push_back(message.Pass());
420 cb) { cb.Run(mojo_messages.Pass()); })); 413
414 MediaRoute::Id expected_route_id("foo");
415 interfaces::MediaRouteProvider::ListenForRouteMessagesCallback mojo_callback;
416 EXPECT_CALL(mock_media_route_provider_,
417 ListenForRouteMessages(Eq(expected_route_id), _))
418 .WillOnce(SaveArg<1>(&mojo_callback));
421 419
422 ListenForMessagesCallbackHandler handler(expected_messages.Pass()); 420 ListenForMessagesCallbackHandler handler(expected_messages.Pass());
423 EXPECT_CALL(handler, InvokeObserver()); 421 EXPECT_CALL(handler, InvokeObserver());
424 std::vector<MediaRoute::Id> route_ids; 422 // Creating PresentationSessionMessagesObserver will register itself to the
425 router()->ListenForRouteMessages( 423 // MediaRouter, which in turn will start listening for route messages.
426 route_ids, base::Bind(&ListenForMessagesCallbackHandler::Invoke, 424 scoped_ptr<PresentationSessionMessagesObserver> observer(
427 base::Unretained(&handler))); 425 new PresentationSessionMessagesObserver(
426 base::Bind(&ListenForMessagesCallbackHandler::Invoke,
427 base::Unretained(&handler)),
428 expected_route_id, router()));
429 ProcessEventLoop();
430
431 // Simulate messages by invoking the saved mojo callback.
432 // We expect one more ListenForRouteMessages call since |observer| was
433 // still registered when the first set of messages arrived.
434 mojo_callback.Run(mojo_messages.Pass());
435 interfaces::MediaRouteProvider::ListenForRouteMessagesCallback
436 mojo_callback_2;
437 EXPECT_CALL(mock_media_route_provider_, ListenForRouteMessages(_, _))
438 .WillOnce(SaveArg<1>(&mojo_callback_2));
439 ProcessEventLoop();
440
441 // Stop listening for messages. In particular, MediaRouterMojoImpl will not
442 // call ListenForRouteMessages again when it sees there are no more observers.
443 mojo::Array<interfaces::RouteMessagePtr> mojo_messages_2(1);
444 mojo_messages_2[0] = interfaces::RouteMessage::New();
445 mojo_messages_2[0]->type = interfaces::RouteMessage::Type::TYPE_TEXT;
446 mojo_messages_2[0]->message = "foo";
447 observer.reset();
448 mojo_callback_2.Run(mojo_messages_2.Pass());
428 ProcessEventLoop(); 449 ProcessEventLoop();
429 } 450 }
430 451
431 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) { 452 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) {
432 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) 453 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id()))
433 .Times(2) 454 .Times(2)
434 .WillRepeatedly(Return(true)); 455 .WillRepeatedly(Return(true));
435 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _)) 456 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _))
436 .Times(2) 457 .Times(2)
437 .WillRepeatedly(Return(true)); 458 .WillRepeatedly(Return(true));
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 binding.reset(new mojo::Binding<interfaces::MediaRouteProvider>( 538 binding.reset(new mojo::Binding<interfaces::MediaRouteProvider>(
518 &mock_media_route_provider, mojo::GetProxy(&media_route_provider_proxy))); 539 &mock_media_route_provider, mojo::GetProxy(&media_route_provider_proxy)));
519 media_router_proxy->RegisterMediaRouteProvider( 540 media_router_proxy->RegisterMediaRouteProvider(
520 media_route_provider_proxy.Pass(), 541 media_route_provider_proxy.Pass(),
521 base::Bind(&RegisterMediaRouteProviderHandler::Invoke, 542 base::Bind(&RegisterMediaRouteProviderHandler::Invoke,
522 base::Unretained(&provide_handler))); 543 base::Unretained(&provide_handler)));
523 message_loop.RunUntilIdle(); 544 message_loop.RunUntilIdle();
524 } 545 }
525 546
526 } // namespace media_router 547 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698