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

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

Issue 1130353005: Makes content handlers see requestor url (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: merge to trunk Created 5 years, 7 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"
(...skipping 17 matching lines...) Expand all
28 28
29 // Used by TestAPI. 29 // Used by TestAPI.
30 bool has_created_instance = false; 30 bool has_created_instance = false;
31 31
32 } // namespace 32 } // namespace
33 33
34 class ApplicationManager::ContentHandlerConnection : public ErrorHandler { 34 class ApplicationManager::ContentHandlerConnection : public ErrorHandler {
35 public: 35 public:
36 ContentHandlerConnection(ApplicationManager* manager, 36 ContentHandlerConnection(ApplicationManager* manager,
37 const GURL& content_handler_url, 37 const GURL& content_handler_url,
38 const GURL& requestor_url,
38 const std::string& qualifier) 39 const std::string& qualifier)
39 : manager_(manager), 40 : manager_(manager),
40 content_handler_url_(content_handler_url), 41 content_handler_url_(content_handler_url),
41 content_handler_qualifier_(qualifier) { 42 content_handler_qualifier_(qualifier) {
42 ServiceProviderPtr services; 43 ServiceProviderPtr services;
43 manager->ConnectToApplicationWithParameters( 44 manager->ConnectToApplicationWithParameters(
44 content_handler_url, qualifier, GURL(), GetProxy(&services), nullptr, 45 content_handler_url, qualifier, requestor_url, GetProxy(&services),
45 base::Closure(), std::vector<std::string>()); 46 nullptr, base::Closure(), std::vector<std::string>());
46 MessagePipe pipe; 47 MessagePipe pipe;
47 content_handler_.Bind(pipe.handle0.Pass()); 48 content_handler_.Bind(pipe.handle0.Pass());
48 services->ConnectToService(ContentHandler::Name_, pipe.handle1.Pass()); 49 services->ConnectToService(ContentHandler::Name_, pipe.handle1.Pass());
49 content_handler_.set_error_handler(this); 50 content_handler_.set_error_handler(this);
50 } 51 }
51 52
52 ContentHandler* content_handler() { return content_handler_.get(); } 53 ContentHandler* content_handler() { return content_handler_.get(); }
53 54
54 GURL content_handler_url() { return content_handler_url_; } 55 GURL content_handler_url() { return content_handler_url_; }
55 std::string content_handler_qualifier() { return content_handler_qualifier_; } 56 std::string content_handler_qualifier() { return content_handler_qualifier_; }
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 default_loader_.get())) { 159 default_loader_.get())) {
159 return; 160 return;
160 } 161 }
161 162
162 auto callback = base::Bind( 163 auto callback = base::Bind(
163 &ApplicationManager::HandleFetchCallback, weak_ptr_factory_.GetWeakPtr(), 164 &ApplicationManager::HandleFetchCallback, weak_ptr_factory_.GetWeakPtr(),
164 requested_url, qualifier, requestor_url, base::Passed(services.Pass()), 165 requested_url, qualifier, requestor_url, base::Passed(services.Pass()),
165 base::Passed(exposed_services.Pass()), on_application_end, 166 base::Passed(exposed_services.Pass()), on_application_end,
166 pre_redirect_parameters); 167 pre_redirect_parameters);
167 168
169 if (delegate_->CreateFetcher(
170 resolved_url,
171 base::Bind(callback, NativeApplicationCleanup::DONT_DELETE))) {
172 return;
173 }
174
168 if (resolved_url.SchemeIsFile()) { 175 if (resolved_url.SchemeIsFile()) {
169 new LocalFetcher( 176 new LocalFetcher(
170 resolved_url, GetBaseURLAndQuery(resolved_url, nullptr), 177 resolved_url, GetBaseURLAndQuery(resolved_url, nullptr),
171 base::Bind(callback, NativeApplicationCleanup::DONT_DELETE)); 178 base::Bind(callback, NativeApplicationCleanup::DONT_DELETE));
172 return; 179 return;
173 } 180 }
174 181
175 if (!network_service_) 182 if (!network_service_)
176 ConnectToService(GURL("mojo:network_service"), &network_service_); 183 ConnectToService(GURL("mojo:network_service"), &network_service_);
177 184
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 311
305 InterfaceRequest<Application> request( 312 InterfaceRequest<Application> request(
306 RegisterShell(app_url, qualifier, requestor_url, services.Pass(), 313 RegisterShell(app_url, qualifier, requestor_url, services.Pass(),
307 exposed_services.Pass(), on_application_end, parameters)); 314 exposed_services.Pass(), on_application_end, parameters));
308 315
309 // If the response begins with a #!mojo <content-handler-url>, use it. 316 // If the response begins with a #!mojo <content-handler-url>, use it.
310 GURL content_handler_url; 317 GURL content_handler_url;
311 std::string shebang; 318 std::string shebang;
312 if (fetcher->PeekContentHandler(&shebang, &content_handler_url)) { 319 if (fetcher->PeekContentHandler(&shebang, &content_handler_url)) {
313 LoadWithContentHandler( 320 LoadWithContentHandler(
314 content_handler_url, qualifier, request.Pass(), 321 content_handler_url, requestor_url, qualifier, request.Pass(),
315 fetcher->AsURLResponse(blocking_pool_, 322 fetcher->AsURLResponse(blocking_pool_,
316 static_cast<int>(shebang.size()))); 323 static_cast<int>(shebang.size())));
317 return; 324 return;
318 } 325 }
319 326
320 MimeTypeToURLMap::iterator iter = mime_type_to_url_.find(fetcher->MimeType()); 327 MimeTypeToURLMap::iterator iter = mime_type_to_url_.find(fetcher->MimeType());
321 if (iter != mime_type_to_url_.end()) { 328 if (iter != mime_type_to_url_.end()) {
322 LoadWithContentHandler(iter->second, qualifier, request.Pass(), 329 LoadWithContentHandler(iter->second, requestor_url, qualifier,
330 request.Pass(),
323 fetcher->AsURLResponse(blocking_pool_, 0)); 331 fetcher->AsURLResponse(blocking_pool_, 0));
324 return; 332 return;
325 } 333 }
326 334
327 auto alias_iter = application_package_alias_.find(app_url); 335 auto alias_iter = application_package_alias_.find(app_url);
328 if (alias_iter != application_package_alias_.end()) { 336 if (alias_iter != application_package_alias_.end()) {
329 // We replace the qualifier with the one our package alias requested. 337 // We replace the qualifier with the one our package alias requested.
330 URLResponsePtr response(URLResponse::New()); 338 URLResponsePtr response(URLResponse::New());
331 response->url = String::From(app_url.spec()); 339 response->url = String::From(app_url.spec());
332 340
333 std::string qualifier; 341 std::string qualifier;
334 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 342 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
335 switches::kEnableMultiprocess)) { 343 switches::kEnableMultiprocess)) {
336 // Why can't we use this in single process mode? Because of 344 // Why can't we use this in single process mode? Because of
337 // base::AtExitManager. If you link in ApplicationRunnerChromium into 345 // base::AtExitManager. If you link in ApplicationRunnerChromium into
338 // your code, and then we make initialize multiple copies of the 346 // your code, and then we make initialize multiple copies of the
339 // application, we end up with multiple AtExitManagers and will check on 347 // application, we end up with multiple AtExitManagers and will check on
340 // the second one being created. 348 // the second one being created.
341 // 349 //
342 // Why doesn't that happen when running different apps? Because 350 // Why doesn't that happen when running different apps? Because
343 // your_thing.mojo!base::AtExitManager and 351 // your_thing.mojo!base::AtExitManager and
344 // my_thing.mojo!base::AtExitManager are different symbols. 352 // my_thing.mojo!base::AtExitManager are different symbols.
345 qualifier = alias_iter->second.second; 353 qualifier = alias_iter->second.second;
346 } 354 }
347 355
348 LoadWithContentHandler(alias_iter->second.first, qualifier, request.Pass(), 356 LoadWithContentHandler(alias_iter->second.first, requestor_url, qualifier,
349 response.Pass()); 357 request.Pass(), response.Pass());
350 return; 358 return;
351 } 359 }
352 360
353 // TODO(aa): Sanity check that the thing we got looks vaguely like a mojo 361 // TODO(aa): Sanity check that the thing we got looks vaguely like a mojo
354 // application. That could either mean looking for the platform-specific dll 362 // application. That could either mean looking for the platform-specific dll
355 // header, or looking for some specific mojo signature prepended to the 363 // header, or looking for some specific mojo signature prepended to the
356 // library. 364 // library.
357 // TODO(vtl): (Maybe this should be done by the factory/runner?) 365 // TODO(vtl): (Maybe this should be done by the factory/runner?)
358 366
359 GURL base_resolved_url = GetBaseURLAndQuery(fetcher->GetURL(), nullptr); 367 GURL base_resolved_url = GetBaseURLAndQuery(fetcher->GetURL(), nullptr);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 void ApplicationManager::RegisterApplicationPackageAlias( 418 void ApplicationManager::RegisterApplicationPackageAlias(
411 const GURL& alias, 419 const GURL& alias,
412 const GURL& content_handler_package, 420 const GURL& content_handler_package,
413 const std::string& qualifier) { 421 const std::string& qualifier) {
414 application_package_alias_[alias] = 422 application_package_alias_[alias] =
415 std::make_pair(content_handler_package, qualifier); 423 std::make_pair(content_handler_package, qualifier);
416 } 424 }
417 425
418 void ApplicationManager::LoadWithContentHandler( 426 void ApplicationManager::LoadWithContentHandler(
419 const GURL& content_handler_url, 427 const GURL& content_handler_url,
428 const GURL& requestor_url,
420 const std::string& qualifier, 429 const std::string& qualifier,
421 InterfaceRequest<Application> application_request, 430 InterfaceRequest<Application> application_request,
422 URLResponsePtr url_response) { 431 URLResponsePtr url_response) {
423 ContentHandlerConnection* connection = nullptr; 432 ContentHandlerConnection* connection = nullptr;
424 std::pair<GURL, std::string> key(content_handler_url, qualifier); 433 std::pair<GURL, std::string> key(content_handler_url, qualifier);
425 URLToContentHandlerMap::iterator iter = url_to_content_handler_.find(key); 434 URLToContentHandlerMap::iterator iter = url_to_content_handler_.find(key);
426 if (iter != url_to_content_handler_.end()) { 435 if (iter != url_to_content_handler_.end()) {
427 connection = iter->second; 436 connection = iter->second;
428 } else { 437 } else {
429 connection = 438 connection = new ContentHandlerConnection(this, content_handler_url,
430 new ContentHandlerConnection(this, content_handler_url, qualifier); 439 requestor_url, qualifier);
431 url_to_content_handler_[key] = connection; 440 url_to_content_handler_[key] = connection;
432 } 441 }
433 442
434 connection->content_handler()->StartApplication(application_request.Pass(), 443 connection->content_handler()->StartApplication(application_request.Pass(),
435 url_response.Pass()); 444 url_response.Pass());
436 } 445 }
437 446
438 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader, 447 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader,
439 const GURL& url) { 448 const GURL& url) {
440 URLToLoaderMap::iterator it = url_to_loader_.find(url); 449 URLToLoaderMap::iterator it = url_to_loader_.find(url);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 return pipe.handle0.Pass(); 521 return pipe.handle0.Pass();
513 } 522 }
514 523
515 void ApplicationManager::CleanupRunner(NativeRunner* runner) { 524 void ApplicationManager::CleanupRunner(NativeRunner* runner) {
516 native_runners_.erase( 525 native_runners_.erase(
517 std::find(native_runners_.begin(), native_runners_.end(), runner)); 526 std::find(native_runners_.begin(), native_runners_.end(), runner));
518 } 527 }
519 528
520 } // namespace shell 529 } // namespace shell
521 } // namespace mojo 530 } // 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