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

Side by Side Diff: mojo/shell/application_manager.cc

Issue 1342503003: Move fetching logic out of ApplicationManager, eliminate url mappings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 5 years, 3 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
« no previous file with comments | « mojo/shell/application_manager.h ('k') | mojo/shell/application_manager_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "mojo/shell/application_manager.h" 5 #include "mojo/shell/application_manager.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
11 #include "base/stl_util.h" 11 #include "base/stl_util.h"
12 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
13 #include "base/trace_event/trace_event.h" 13 #include "base/trace_event/trace_event.h"
14 #include "mojo/application/public/interfaces/content_handler.mojom.h" 14 #include "mojo/application/public/interfaces/content_handler.mojom.h"
15 #include "mojo/public/cpp/bindings/binding.h" 15 #include "mojo/public/cpp/bindings/binding.h"
16 #include "mojo/shell/application_fetcher.h"
16 #include "mojo/shell/application_instance.h" 17 #include "mojo/shell/application_instance.h"
17 #include "mojo/shell/content_handler_connection.h" 18 #include "mojo/shell/content_handler_connection.h"
18 #include "mojo/shell/fetcher.h" 19 #include "mojo/shell/fetcher.h"
19 #include "mojo/shell/local_fetcher.h"
20 #include "mojo/shell/network_fetcher.h"
21 #include "mojo/shell/query_util.h" 20 #include "mojo/shell/query_util.h"
22 #include "mojo/shell/switches.h" 21 #include "mojo/shell/switches.h"
23 #include "mojo/shell/update_fetcher.h"
24 22
25 namespace mojo { 23 namespace mojo {
26 namespace shell { 24 namespace shell {
27 25
28 namespace { 26 namespace {
29 27
30 // Used by TestAPI. 28 // Used by TestAPI.
31 bool has_created_instance = false; 29 bool has_created_instance = false;
32 30
33 void OnEmptyOnConnectCallback(uint32_t content_handler_id) {} 31 void OnEmptyOnConnectCallback(uint32_t content_handler_id) {}
(...skipping 11 matching lines...) Expand all
45 bool ApplicationManager::TestAPI::HasCreatedInstance() { 43 bool ApplicationManager::TestAPI::HasCreatedInstance() {
46 return has_created_instance; 44 return has_created_instance;
47 } 45 }
48 46
49 bool ApplicationManager::TestAPI::HasRunningInstanceForURL( 47 bool ApplicationManager::TestAPI::HasRunningInstanceForURL(
50 const GURL& url) const { 48 const GURL& url) const {
51 return manager_->identity_to_instance_.find(Identity(url)) != 49 return manager_->identity_to_instance_.find(Identity(url)) !=
52 manager_->identity_to_instance_.end(); 50 manager_->identity_to_instance_.end();
53 } 51 }
54 52
55 ApplicationManager::ApplicationManager(Delegate* delegate) 53 ApplicationManager::ApplicationManager(scoped_ptr<ApplicationFetcher> fetcher)
56 : delegate_(delegate), 54 : fetcher_(fetcher.Pass()),
57 disable_cache_(false),
58 content_handler_id_counter_(0u), 55 content_handler_id_counter_(0u),
59 weak_ptr_factory_(this) {} 56 weak_ptr_factory_(this) {
57 fetcher_->SetApplicationManager(this);
58 }
60 59
61 ApplicationManager::~ApplicationManager() { 60 ApplicationManager::~ApplicationManager() {
62 URLToContentHandlerMap url_to_content_handler(url_to_content_handler_); 61 URLToContentHandlerMap url_to_content_handler(url_to_content_handler_);
63 for (auto& pair : url_to_content_handler) 62 for (auto& pair : url_to_content_handler)
64 pair.second->CloseConnection(); 63 pair.second->CloseConnection();
65 TerminateShellConnections(); 64 TerminateShellConnections();
66 STLDeleteValues(&url_to_loader_); 65 STLDeleteValues(&url_to_loader_);
67 STLDeleteValues(&scheme_to_loader_); 66 STLDeleteValues(&scheme_to_loader_);
68 } 67 }
69 68
(...skipping 27 matching lines...) Expand all
97 scoped_ptr<ConnectToApplicationParams> params) { 96 scoped_ptr<ConnectToApplicationParams> params) {
98 GURL original_url = params->app_url(); 97 GURL original_url = params->app_url();
99 URLRequestPtr original_url_request = params->TakeAppURLRequest(); 98 URLRequestPtr original_url_request = params->TakeAppURLRequest();
100 99
101 TRACE_EVENT_INSTANT1("mojo_shell", "ApplicationManager::ConnectToApplication", 100 TRACE_EVENT_INSTANT1("mojo_shell", "ApplicationManager::ConnectToApplication",
102 TRACE_EVENT_SCOPE_THREAD, "original_url", 101 TRACE_EVENT_SCOPE_THREAD, "original_url",
103 original_url.spec()); 102 original_url.spec());
104 DCHECK(original_url.is_valid()); 103 DCHECK(original_url.is_valid());
105 DCHECK(original_url_request); 104 DCHECK(original_url_request);
106 105
107 // We check both the mapped and resolved urls for existing instances because 106 GURL resolved_url = fetcher_->ResolveURL(original_url);
yzshen1 2015/09/14 19:06:15 One thing that seems like an issue: Currently for
Ben Goodger (Google) 2015/09/14 23:27:16 Good catch! WDYT about uniquifying instances based
108 // external applications can be registered for the unresolved mojo:foo urls.
109
110 GURL mapped_url = delegate_->ResolveMappings(original_url);
111 params->SetURLInfo(mapped_url);
112 if (ConnectToRunningApplication(&params))
113 return;
114
115 GURL resolved_url = delegate_->ResolveMojoURL(mapped_url);
116 params->SetURLInfo(resolved_url); 107 params->SetURLInfo(resolved_url);
117 if (ConnectToRunningApplication(&params)) 108 if (ConnectToRunningApplication(&params))
118 return; 109 return;
119 110
120 // The application is not running, let's compute the parameters. 111 // The application is not running, let's compute the parameters.
121 // NOTE: Set URL info using |original_url_request| instead of |original_url| 112 // NOTE: Set URL info using |original_url_request| instead of |original_url|
122 // because it may contain more information (e.g., it is a POST request). 113 // because it may contain more information (e.g., it is a POST request).
123 params->SetURLInfo(original_url_request.Pass()); 114 params->SetURLInfo(original_url_request.Pass());
124 if (ConnectToApplicationWithLoader(&params, mapped_url, 115 ApplicationLoader* loader = GetLoaderForURL(resolved_url);
125 GetLoaderForURL(mapped_url))) { 116 if (loader) {
117 ConnectToApplicationWithLoader(&params, resolved_url, loader);
126 return; 118 return;
127 } 119 }
128 120
129 if (ConnectToApplicationWithLoader(&params, resolved_url,
130 GetLoaderForURL(resolved_url))) {
131 return;
132 }
133
134 if (ConnectToApplicationWithLoader(&params, resolved_url,
135 default_loader_.get())) {
136 return;
137 }
138
139 original_url_request = params->TakeAppURLRequest(); 121 original_url_request = params->TakeAppURLRequest();
140 auto callback = 122 auto callback =
141 base::Bind(&ApplicationManager::HandleFetchCallback, 123 base::Bind(&ApplicationManager::HandleFetchCallback,
142 weak_ptr_factory_.GetWeakPtr(), base::Passed(&params)); 124 weak_ptr_factory_.GetWeakPtr(), base::Passed(&params));
143 125 fetcher_->FetchRequest(original_url_request.Pass(), callback);
144 if (delegate_->CreateFetcher(
145 resolved_url,
146 base::Bind(callback, NativeApplicationCleanup::DONT_DELETE))) {
147 return;
148 }
149
150 if (resolved_url.SchemeIsFile()) {
151 // LocalFetcher uses the network service to infer MIME types from URLs.
152 // Skip this for mojo URLs to avoid recursively loading the network service.
153 if (!network_service_ && !original_url.SchemeIs("mojo"))
154 ConnectToService(GURL("mojo:network_service"), &network_service_);
155 new LocalFetcher(
156 network_service_.get(), resolved_url,
157 GetBaseURLAndQuery(resolved_url, nullptr),
158 base::Bind(callback, NativeApplicationCleanup::DONT_DELETE));
159 return;
160 }
161
162 if (mapped_url.SchemeIs("mojo") &&
163 base::CommandLine::ForCurrentProcess()->HasSwitch(
164 switches::kUseUpdater)) {
165 ConnectToService(GURL("mojo:updater"), &updater_);
166 new UpdateFetcher(
167 mapped_url, updater_.get(),
168 base::Bind(callback, NativeApplicationCleanup::DONT_DELETE));
169 return;
170 }
171
172 if (!url_loader_factory_)
173 ConnectToService(GURL("mojo:network_service"), &url_loader_factory_);
174
175 const NativeApplicationCleanup cleanup =
176 base::CommandLine::ForCurrentProcess()->HasSwitch(
177 switches::kDontDeleteOnDownload)
178 ? NativeApplicationCleanup::DONT_DELETE
179 : NativeApplicationCleanup::DELETE;
180
181 if (original_url.SchemeIs("mojo")) {
182 // Use the resolved mojo URL in the request to support origin mapping, etc.
183 URLRequestPtr resolved_url_request(URLRequest::New());
184 resolved_url_request->url = resolved_url.spec();
185 new NetworkFetcher(disable_cache_, resolved_url_request.Pass(),
186 url_loader_factory_.get(),
187 base::Bind(callback, cleanup));
188 return;
189 }
190
191 new NetworkFetcher(disable_cache_, original_url_request.Pass(),
192 url_loader_factory_.get(), base::Bind(callback, cleanup));
193 } 126 }
194 127
195 bool ApplicationManager::ConnectToRunningApplication( 128 bool ApplicationManager::ConnectToRunningApplication(
196 scoped_ptr<ConnectToApplicationParams>* params) { 129 scoped_ptr<ConnectToApplicationParams>* params) {
197 ApplicationInstance* instance = GetApplicationInstance( 130 ApplicationInstance* instance = GetApplicationInstance(
198 Identity((*params)->app_url(), (*params)->qualifier())); 131 Identity((*params)->app_url(), (*params)->qualifier()));
199 if (!instance) 132 if (!instance)
200 return false; 133 return false;
201 134
202 instance->ConnectToClient(params->Pass()); 135 instance->ConnectToClient(params->Pass());
203 return true; 136 return true;
204 } 137 }
205 138
206 bool ApplicationManager::ConnectToApplicationWithLoader( 139 void ApplicationManager::ConnectToApplicationWithLoader(
207 scoped_ptr<ConnectToApplicationParams>* params, 140 scoped_ptr<ConnectToApplicationParams>* params,
208 const GURL& resolved_url, 141 const GURL& resolved_url,
209 ApplicationLoader* loader) { 142 ApplicationLoader* loader) {
210 if (!loader)
211 return false;
212
213 if (!(*params)->app_url().SchemeIs("mojo")) 143 if (!(*params)->app_url().SchemeIs("mojo"))
214 (*params)->SetURLInfo(resolved_url); 144 (*params)->SetURLInfo(resolved_url);
215 145
216 loader->Load(resolved_url, RegisterInstance(params->Pass(), nullptr)); 146 loader->Load(resolved_url, RegisterInstance(params->Pass(), nullptr));
217 return true;
218 } 147 }
219 148
220 InterfaceRequest<Application> ApplicationManager::RegisterInstance( 149 InterfaceRequest<Application> ApplicationManager::RegisterInstance(
221 scoped_ptr<ConnectToApplicationParams> params, 150 scoped_ptr<ConnectToApplicationParams> params,
222 ApplicationInstance** resulting_instance) { 151 ApplicationInstance** resulting_instance) {
223 Identity app_identity(params->app_url(), params->qualifier()); 152 Identity app_identity(params->app_url(), params->qualifier());
224 153
225 ApplicationPtr application; 154 ApplicationPtr application;
226 InterfaceRequest<Application> application_request = GetProxy(&application); 155 InterfaceRequest<Application> application_request = GetProxy(&application);
227 ApplicationInstance* instance = new ApplicationInstance( 156 ApplicationInstance* instance = new ApplicationInstance(
(...skipping 13 matching lines...) Expand all
241 ApplicationInstance* ApplicationManager::GetApplicationInstance( 170 ApplicationInstance* ApplicationManager::GetApplicationInstance(
242 const Identity& identity) const { 171 const Identity& identity) const {
243 const auto& instance_it = identity_to_instance_.find(identity); 172 const auto& instance_it = identity_to_instance_.find(identity);
244 if (instance_it != identity_to_instance_.end()) 173 if (instance_it != identity_to_instance_.end())
245 return instance_it->second; 174 return instance_it->second;
246 return nullptr; 175 return nullptr;
247 } 176 }
248 177
249 void ApplicationManager::HandleFetchCallback( 178 void ApplicationManager::HandleFetchCallback(
250 scoped_ptr<ConnectToApplicationParams> params, 179 scoped_ptr<ConnectToApplicationParams> params,
251 NativeApplicationCleanup cleanup,
252 scoped_ptr<Fetcher> fetcher) { 180 scoped_ptr<Fetcher> fetcher) {
253 if (!fetcher) { 181 if (!fetcher) {
254 // Network error. Drop |params| to tell the requestor. 182 // Network error. Drop |params| to tell the requestor.
255 params->connect_callback().Run(Shell::kInvalidContentHandlerID); 183 params->connect_callback().Run(Shell::kInvalidContentHandlerID);
256 return; 184 return;
257 } 185 }
258 186
259 GURL redirect_url = fetcher->GetRedirectURL(); 187 GURL redirect_url = fetcher->GetRedirectURL();
260 if (!redirect_url.is_empty()) { 188 if (!redirect_url.is_empty()) {
261 // And around we go again... Whee! 189 // And around we go again... Whee!
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 params->set_connect_callback(EmptyConnectCallback()); 221 params->set_connect_callback(EmptyConnectCallback());
294 ApplicationInstance* app = nullptr; 222 ApplicationInstance* app = nullptr;
295 InterfaceRequest<Application> request(RegisterInstance(params.Pass(), &app)); 223 InterfaceRequest<Application> request(RegisterInstance(params.Pass(), &app));
296 224
297 // For resources that are loaded with content handlers, we group app instances 225 // For resources that are loaded with content handlers, we group app instances
298 // by site. 226 // by site.
299 227
300 // If the response begins with a #!mojo <content-handler-url>, use it. 228 // If the response begins with a #!mojo <content-handler-url>, use it.
301 GURL content_handler_url; 229 GURL content_handler_url;
302 std::string shebang; 230 std::string shebang;
231 // TODO(beng): it seems like some delegate should/would want to have a say in
232 // configuring the qualifier also.
303 bool enable_multi_process = base::CommandLine::ForCurrentProcess()->HasSwitch( 233 bool enable_multi_process = base::CommandLine::ForCurrentProcess()->HasSwitch(
304 switches::kEnableMultiprocess); 234 switches::kEnableMultiprocess);
305 235
306 if (fetcher->PeekContentHandler(&shebang, &content_handler_url)) { 236 if (fetcher->PeekContentHandler(&shebang, &content_handler_url)) {
307 URLResponsePtr response(fetcher->AsURLResponse( 237 URLResponsePtr response(fetcher->AsURLResponse(
308 blocking_pool_, static_cast<int>(shebang.size()))); 238 blocking_pool_, static_cast<int>(shebang.size())));
309 std::string site = 239 std::string site =
310 enable_multi_process ? response->site.To<std::string>() : std::string(); 240 enable_multi_process ? response->site.To<std::string>() : std::string();
311 LoadWithContentHandler(originator_identity, originator_filter, 241 LoadWithContentHandler(originator_identity, originator_filter,
312 content_handler_url, site, filter, connect_callback, 242 content_handler_url, site, filter, connect_callback,
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 else if (app_url == GURL("mojo://html_viewer/")) 308 else if (app_url == GURL("mojo://html_viewer/"))
379 start_sandboxed = true; 309 start_sandboxed = true;
380 } 310 }
381 311
382 connect_callback.Run(Shell::kInvalidContentHandlerID); 312 connect_callback.Run(Shell::kInvalidContentHandlerID);
383 313
384 fetcher->AsPath(blocking_pool_, 314 fetcher->AsPath(blocking_pool_,
385 base::Bind(&ApplicationManager::RunNativeApplication, 315 base::Bind(&ApplicationManager::RunNativeApplication,
386 weak_ptr_factory_.GetWeakPtr(), 316 weak_ptr_factory_.GetWeakPtr(),
387 base::Passed(request.Pass()), start_sandboxed, 317 base::Passed(request.Pass()), start_sandboxed,
388 options, cleanup, base::Passed(fetcher.Pass()))); 318 options, base::Passed(fetcher.Pass())));
389 } 319 }
390 320
391 void ApplicationManager::RunNativeApplication( 321 void ApplicationManager::RunNativeApplication(
392 InterfaceRequest<Application> application_request, 322 InterfaceRequest<Application> application_request,
393 bool start_sandboxed, 323 bool start_sandboxed,
394 const NativeRunnerFactory::Options& options, 324 const NativeRunnerFactory::Options& options,
395 NativeApplicationCleanup cleanup,
396 scoped_ptr<Fetcher> fetcher, 325 scoped_ptr<Fetcher> fetcher,
397 const base::FilePath& path, 326 const base::FilePath& path,
398 bool path_exists) { 327 bool path_exists) {
399 // We only passed fetcher to keep it alive. Done with it now. 328 // We only passed fetcher to keep it alive. Done with it now.
400 fetcher.reset(); 329 fetcher.reset();
401 330
402 DCHECK(application_request.is_pending()); 331 DCHECK(application_request.is_pending());
403 332
404 if (!path_exists) { 333 if (!path_exists) {
405 LOG(ERROR) << "Library not started because library path '" << path.value() 334 LOG(ERROR) << "Library not started because library path '" << path.value()
406 << "' does not exist."; 335 << "' does not exist.";
407 return; 336 return;
408 } 337 }
409 338
410 TRACE_EVENT1("mojo_shell", "ApplicationManager::RunNativeApplication", "path", 339 TRACE_EVENT1("mojo_shell", "ApplicationManager::RunNativeApplication", "path",
411 path.AsUTF8Unsafe()); 340 path.AsUTF8Unsafe());
412 NativeRunner* runner = native_runner_factory_->Create(options).release(); 341 NativeRunner* runner = native_runner_factory_->Create(options).release();
413 native_runners_.push_back(runner); 342 native_runners_.push_back(runner);
414 runner->Start(path, start_sandboxed, cleanup, application_request.Pass(), 343 runner->Start(path, start_sandboxed, NativeApplicationCleanup::DONT_DELETE,
344 application_request.Pass(),
415 base::Bind(&ApplicationManager::CleanupRunner, 345 base::Bind(&ApplicationManager::CleanupRunner,
416 weak_ptr_factory_.GetWeakPtr(), runner)); 346 weak_ptr_factory_.GetWeakPtr(), runner));
417 } 347 }
418 348
419 void ApplicationManager::RegisterContentHandler( 349 void ApplicationManager::RegisterContentHandler(
420 const std::string& mime_type, 350 const std::string& mime_type,
421 const GURL& content_handler_url) { 351 const GURL& content_handler_url) {
422 DCHECK(content_handler_url.is_valid()) 352 DCHECK(content_handler_url.is_valid())
423 << "Content handler URL is invalid for mime type " << mime_type; 353 << "Content handler URL is invalid for mime type " << mime_type;
424 mime_type_to_url_[mime_type] = content_handler_url; 354 mime_type_to_url_[mime_type] = content_handler_url;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 if (it != scheme_to_loader_.end()) 407 if (it != scheme_to_loader_.end())
478 delete it->second; 408 delete it->second;
479 scheme_to_loader_[scheme] = loader.release(); 409 scheme_to_loader_[scheme] = loader.release();
480 } 410 }
481 411
482 void ApplicationManager::SetNativeOptionsForURL( 412 void ApplicationManager::SetNativeOptionsForURL(
483 const NativeRunnerFactory::Options& options, 413 const NativeRunnerFactory::Options& options,
484 const GURL& url) { 414 const GURL& url) {
485 DCHECK(!url.has_query()); // Precondition. 415 DCHECK(!url.has_query()); // Precondition.
486 // Apply mappings and resolution to get the resolved URL. 416 // Apply mappings and resolution to get the resolved URL.
487 GURL resolved_url = 417 GURL resolved_url = fetcher_->ResolveURL(url);
488 delegate_->ResolveMojoURL(delegate_->ResolveMappings(url));
489 DCHECK(!resolved_url.has_query()); // Still shouldn't have query. 418 DCHECK(!resolved_url.has_query()); // Still shouldn't have query.
490 // TODO(vtl): We should probably also remove/disregard the query string (and 419 // TODO(vtl): We should probably also remove/disregard the query string (and
491 // maybe canonicalize in other ways). 420 // maybe canonicalize in other ways).
492 DVLOG(2) << "Storing native options for resolved URL " << resolved_url 421 DVLOG(2) << "Storing native options for resolved URL " << resolved_url
493 << " (original URL " << url << ")"; 422 << " (original URL " << url << ")";
494 url_to_native_options_[resolved_url] = options; 423 url_to_native_options_[resolved_url] = options;
495 } 424 }
496 425
497 ApplicationLoader* ApplicationManager::GetLoaderForURL(const GURL& url) { 426 ApplicationLoader* ApplicationManager::GetLoaderForURL(const GURL& url) {
498 auto url_it = url_to_loader_.find(GetBaseURLAndQuery(url, nullptr)); 427 auto url_it = url_to_loader_.find(GetBaseURLAndQuery(url, nullptr));
499 if (url_it != url_to_loader_.end()) 428 if (url_it != url_to_loader_.end())
500 return url_it->second; 429 return url_it->second;
501 auto scheme_it = scheme_to_loader_.find(url.scheme()); 430 auto scheme_it = scheme_to_loader_.find(url.scheme());
502 if (scheme_it != scheme_to_loader_.end()) 431 if (scheme_it != scheme_to_loader_.end())
503 return scheme_it->second; 432 return scheme_it->second;
504 return nullptr; 433 return default_loader_.get();
505 } 434 }
506 435
507 void ApplicationManager::OnApplicationInstanceError( 436 void ApplicationManager::OnApplicationInstanceError(
508 ApplicationInstance* instance) { 437 ApplicationInstance* instance) {
509 // Called from ~ApplicationInstance, so we do not need to call Destroy here. 438 // Called from ~ApplicationInstance, so we do not need to call Destroy here.
510 const Identity identity = instance->identity(); 439 const Identity identity = instance->identity();
511 base::Closure on_application_end = instance->on_application_end(); 440 base::Closure on_application_end = instance->on_application_end();
512 // Remove the shell. 441 // Remove the shell.
513 auto it = identity_to_instance_.find(identity); 442 auto it = identity_to_instance_.find(identity);
514 DCHECK(it != identity_to_instance_.end()); 443 DCHECK(it != identity_to_instance_.end());
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 services->ConnectToService(interface_name, pipe.handle1.Pass()); 475 services->ConnectToService(interface_name, pipe.handle1.Pass());
547 return pipe.handle0.Pass(); 476 return pipe.handle0.Pass();
548 } 477 }
549 478
550 Shell::ConnectToApplicationCallback EmptyConnectCallback() { 479 Shell::ConnectToApplicationCallback EmptyConnectCallback() {
551 return base::Bind(&OnEmptyOnConnectCallback); 480 return base::Bind(&OnEmptyOnConnectCallback);
552 } 481 }
553 482
554 } // namespace shell 483 } // namespace shell
555 } // namespace mojo 484 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/shell/application_manager.h ('k') | mojo/shell/application_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698