| OLD | NEW |
| 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/application_manager/application_manager.h" | 5 #include "mojo/application_manager/application_manager.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 ApplicationManager* manager, | 64 ApplicationManager* manager, |
| 65 const GURL& requested_url, | 65 const GURL& requested_url, |
| 66 const GURL& url) | 66 const GURL& url) |
| 67 : ShellImpl(manager, requested_url, url) { | 67 : ShellImpl(manager, requested_url, url) { |
| 68 binding_.Bind(ptr); | 68 binding_.Bind(ptr); |
| 69 } | 69 } |
| 70 | 70 |
| 71 ~ShellImpl() override {} | 71 ~ShellImpl() override {} |
| 72 | 72 |
| 73 void ConnectToClient(const GURL& requestor_url, | 73 void ConnectToClient(const GURL& requestor_url, |
| 74 ServiceProviderPtr service_provider) { | 74 InterfaceRequest<ServiceProvider> services, |
| 75 client()->AcceptConnection(String::From(requestor_url), | 75 ServiceProviderPtr exported_services) { |
| 76 service_provider.Pass()); | 76 client()->AcceptConnection(String::From(requestor_url), services.Pass(), |
| 77 exported_services.Pass()); |
| 77 } | 78 } |
| 78 | 79 |
| 79 Application* client() { return binding_.client(); } | 80 Application* client() { return binding_.client(); } |
| 80 const GURL& url() const { return url_; } | 81 const GURL& url() const { return url_; } |
| 81 const GURL& requested_url() const { return requested_url_; } | 82 const GURL& requested_url() const { return requested_url_; } |
| 82 | 83 |
| 83 private: | 84 private: |
| 84 ShellImpl(ApplicationManager* manager, | 85 ShellImpl(ApplicationManager* manager, |
| 85 const GURL& requested_url, | 86 const GURL& requested_url, |
| 86 const GURL& url) | 87 const GURL& url) |
| 87 : manager_(manager), | 88 : manager_(manager), |
| 88 requested_url_(requested_url), | 89 requested_url_(requested_url), |
| 89 url_(url), | 90 url_(url), |
| 90 binding_(this) { | 91 binding_(this) { |
| 91 binding_.set_error_handler(this); | 92 binding_.set_error_handler(this); |
| 92 } | 93 } |
| 93 | 94 |
| 94 // Shell implementation: | 95 // Shell implementation: |
| 95 void ConnectToApplication( | 96 void ConnectToApplication(const String& app_url, |
| 96 const String& app_url, | 97 InterfaceRequest<ServiceProvider> services, |
| 97 InterfaceRequest<ServiceProvider> in_service_provider) override { | 98 ServiceProviderPtr exported_services) override { |
| 98 ServiceProviderPtr out_service_provider; | |
| 99 out_service_provider.Bind(in_service_provider.PassMessagePipe()); | |
| 100 GURL app_gurl(app_url); | 99 GURL app_gurl(app_url); |
| 101 if (!app_gurl.is_valid()) { | 100 if (!app_gurl.is_valid()) { |
| 102 LOG(ERROR) << "Error: invalid URL: " << app_url; | 101 LOG(ERROR) << "Error: invalid URL: " << app_url; |
| 103 return; | 102 return; |
| 104 } | 103 } |
| 105 manager_->ConnectToApplication(app_gurl, url_, out_service_provider.Pass()); | 104 manager_->ConnectToApplication(app_gurl, url_, services.Pass(), |
| 105 exported_services.Pass()); |
| 106 } | 106 } |
| 107 | 107 |
| 108 // ErrorHandler implementation: | 108 // ErrorHandler implementation: |
| 109 void OnConnectionError() override { manager_->OnShellImplError(this); } | 109 void OnConnectionError() override { manager_->OnShellImplError(this); } |
| 110 | 110 |
| 111 ApplicationManager* const manager_; | 111 ApplicationManager* const manager_; |
| 112 const GURL requested_url_; | 112 const GURL requested_url_; |
| 113 const GURL url_; | 113 const GURL url_; |
| 114 Binding<Shell> binding_; | 114 Binding<Shell> binding_; |
| 115 | 115 |
| 116 DISALLOW_COPY_AND_ASSIGN(ShellImpl); | 116 DISALLOW_COPY_AND_ASSIGN(ShellImpl); |
| 117 }; | 117 }; |
| 118 | 118 |
| 119 class ApplicationManager::ContentHandlerConnection : public ErrorHandler { | 119 class ApplicationManager::ContentHandlerConnection : public ErrorHandler { |
| 120 public: | 120 public: |
| 121 ContentHandlerConnection(ApplicationManager* manager, | 121 ContentHandlerConnection(ApplicationManager* manager, |
| 122 const GURL& content_handler_url) | 122 const GURL& content_handler_url) |
| 123 : manager_(manager), content_handler_url_(content_handler_url) { | 123 : manager_(manager), content_handler_url_(content_handler_url) { |
| 124 ServiceProviderPtr service_provider; | 124 ServiceProviderPtr services; |
| 125 StubServiceProvider* service_provider_impl = | 125 manager->ConnectToApplication(content_handler_url, GURL(), |
| 126 BindToProxy(new StubServiceProvider, &service_provider); | 126 GetProxy(&services), ServiceProviderPtr()); |
| 127 manager->ConnectToApplication( | 127 mojo::ConnectToService(services.get(), &content_handler_); |
| 128 content_handler_url, GURL(), service_provider.Pass()); | |
| 129 mojo::ConnectToService(service_provider_impl->client(), &content_handler_); | |
| 130 content_handler_.set_error_handler(this); | 128 content_handler_.set_error_handler(this); |
| 131 } | 129 } |
| 132 | 130 |
| 133 ContentHandler* content_handler() { return content_handler_.get(); } | 131 ContentHandler* content_handler() { return content_handler_.get(); } |
| 134 | 132 |
| 135 GURL content_handler_url() { return content_handler_url_; } | 133 GURL content_handler_url() { return content_handler_url_; } |
| 136 | 134 |
| 137 private: | 135 private: |
| 138 // ErrorHandler implementation: | 136 // ErrorHandler implementation: |
| 139 void OnConnectionError() override { manager_->OnContentHandlerError(this); } | 137 void OnConnectionError() override { manager_->OnContentHandlerError(this); } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 STLDeleteValues(&scheme_to_loader_); | 172 STLDeleteValues(&scheme_to_loader_); |
| 175 } | 173 } |
| 176 | 174 |
| 177 void ApplicationManager::TerminateShellConnections() { | 175 void ApplicationManager::TerminateShellConnections() { |
| 178 STLDeleteValues(&url_to_shell_impl_); | 176 STLDeleteValues(&url_to_shell_impl_); |
| 179 } | 177 } |
| 180 | 178 |
| 181 void ApplicationManager::ConnectToApplication( | 179 void ApplicationManager::ConnectToApplication( |
| 182 const GURL& requested_url, | 180 const GURL& requested_url, |
| 183 const GURL& requestor_url, | 181 const GURL& requestor_url, |
| 184 ServiceProviderPtr service_provider) { | 182 InterfaceRequest<ServiceProvider> services, |
| 183 ServiceProviderPtr exported_services) { |
| 185 DCHECK(requested_url.is_valid()); | 184 DCHECK(requested_url.is_valid()); |
| 186 ApplicationLoader* loader = GetLoaderForURL(requested_url, | 185 ApplicationLoader* loader = GetLoaderForURL(requested_url, |
| 187 DONT_INCLUDE_DEFAULT_LOADER); | 186 DONT_INCLUDE_DEFAULT_LOADER); |
| 188 if (loader) { | 187 if (loader) { |
| 189 ConnectToApplicationImpl(requested_url, requested_url, requestor_url, | 188 ConnectToApplicationImpl(requested_url, requested_url, requestor_url, |
| 190 service_provider.Pass(), loader); | 189 services.Pass(), exported_services.Pass(), loader); |
| 191 return; | 190 return; |
| 192 } | 191 } |
| 193 | 192 |
| 194 GURL resolved_url = delegate_->ResolveURL(requested_url); | 193 GURL resolved_url = delegate_->ResolveURL(requested_url); |
| 195 loader = GetLoaderForURL(resolved_url, INCLUDE_DEFAULT_LOADER); | 194 loader = GetLoaderForURL(resolved_url, INCLUDE_DEFAULT_LOADER); |
| 196 if (loader) { | 195 if (loader) { |
| 197 ConnectToApplicationImpl(requested_url, resolved_url, requestor_url, | 196 ConnectToApplicationImpl(requested_url, resolved_url, requestor_url, |
| 198 service_provider.Pass(), loader); | 197 services.Pass(), exported_services.Pass(), loader); |
| 199 return; | 198 return; |
| 200 } | 199 } |
| 201 | 200 |
| 202 LOG(WARNING) << "Could not find loader to load application: " | 201 LOG(WARNING) << "Could not find loader to load application: " |
| 203 << requested_url.spec(); | 202 << requested_url.spec(); |
| 204 } | 203 } |
| 205 | 204 |
| 206 void ApplicationManager::ConnectToApplicationImpl( | 205 void ApplicationManager::ConnectToApplicationImpl( |
| 207 const GURL& requested_url, | 206 const GURL& requested_url, |
| 208 const GURL& resolved_url, | 207 const GURL& resolved_url, |
| 209 const GURL& requestor_url, | 208 const GURL& requestor_url, |
| 210 ServiceProviderPtr service_provider, | 209 InterfaceRequest<ServiceProvider> services, |
| 210 ServiceProviderPtr exported_services, |
| 211 ApplicationLoader* loader) { | 211 ApplicationLoader* loader) { |
| 212 ShellImpl* shell = nullptr; | 212 ShellImpl* shell = nullptr; |
| 213 URLToShellImplMap::const_iterator shell_it = | 213 URLToShellImplMap::const_iterator shell_it = |
| 214 url_to_shell_impl_.find(resolved_url); | 214 url_to_shell_impl_.find(resolved_url); |
| 215 if (shell_it != url_to_shell_impl_.end()) { | 215 if (shell_it != url_to_shell_impl_.end()) { |
| 216 shell = shell_it->second; | 216 shell = shell_it->second; |
| 217 } else { | 217 } else { |
| 218 MessagePipe pipe; | 218 MessagePipe pipe; |
| 219 shell = | 219 shell = |
| 220 new ShellImpl(pipe.handle0.Pass(), this, requested_url, resolved_url); | 220 new ShellImpl(pipe.handle0.Pass(), this, requested_url, resolved_url); |
| 221 url_to_shell_impl_[resolved_url] = shell; | 221 url_to_shell_impl_[resolved_url] = shell; |
| 222 shell->client()->Initialize(GetArgsForURL(requested_url)); | 222 shell->client()->Initialize(GetArgsForURL(requested_url)); |
| 223 | 223 |
| 224 loader->Load(this, resolved_url, pipe.handle1.Pass(), | 224 loader->Load(this, resolved_url, pipe.handle1.Pass(), |
| 225 base::Bind(&ApplicationManager::LoadWithContentHandler, | 225 base::Bind(&ApplicationManager::LoadWithContentHandler, |
| 226 weak_ptr_factory_.GetWeakPtr())); | 226 weak_ptr_factory_.GetWeakPtr())); |
| 227 } | 227 } |
| 228 ConnectToClient(shell, resolved_url, requestor_url, service_provider.Pass()); | 228 ConnectToClient(shell, resolved_url, requestor_url, services.Pass(), |
| 229 exported_services.Pass()); |
| 229 } | 230 } |
| 230 | 231 |
| 231 void ApplicationManager::ConnectToClient(ShellImpl* shell_impl, | 232 void ApplicationManager::ConnectToClient( |
| 232 const GURL& url, | 233 ShellImpl* shell_impl, |
| 233 const GURL& requestor_url, | 234 const GURL& url, |
| 234 ServiceProviderPtr service_provider) { | 235 const GURL& requestor_url, |
| 235 shell_impl->ConnectToClient(requestor_url, service_provider.Pass()); | 236 InterfaceRequest<ServiceProvider> services, |
| 237 ServiceProviderPtr exported_services) { |
| 238 shell_impl->ConnectToClient(requestor_url, services.Pass(), |
| 239 exported_services.Pass()); |
| 236 } | 240 } |
| 237 | 241 |
| 238 void ApplicationManager::RegisterExternalApplication( | 242 void ApplicationManager::RegisterExternalApplication( |
| 239 const GURL& url, | 243 const GURL& url, |
| 240 ScopedMessagePipeHandle shell_handle) { | 244 ScopedMessagePipeHandle shell_handle) { |
| 241 ShellImpl* shell_impl = new ShellImpl(shell_handle.Pass(), this, url, url); | 245 ShellImpl* shell_impl = new ShellImpl(shell_handle.Pass(), this, url, url); |
| 242 url_to_shell_impl_[url] = shell_impl; | 246 url_to_shell_impl_[url] = shell_impl; |
| 243 shell_impl->client()->Initialize(GetArgsForURL(url)); | 247 shell_impl->client()->Initialize(GetArgsForURL(url)); |
| 244 } | 248 } |
| 245 | 249 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 auto it = | 322 auto it = |
| 319 url_to_content_handler_.find(content_handler->content_handler_url()); | 323 url_to_content_handler_.find(content_handler->content_handler_url()); |
| 320 DCHECK(it != url_to_content_handler_.end()); | 324 DCHECK(it != url_to_content_handler_.end()); |
| 321 delete it->second; | 325 delete it->second; |
| 322 url_to_content_handler_.erase(it); | 326 url_to_content_handler_.erase(it); |
| 323 } | 327 } |
| 324 | 328 |
| 325 ScopedMessagePipeHandle ApplicationManager::ConnectToServiceByName( | 329 ScopedMessagePipeHandle ApplicationManager::ConnectToServiceByName( |
| 326 const GURL& application_url, | 330 const GURL& application_url, |
| 327 const std::string& interface_name) { | 331 const std::string& interface_name) { |
| 328 StubServiceProvider* stub_sp = new StubServiceProvider; | 332 ServiceProviderPtr services; |
| 329 ServiceProviderPtr spp; | 333 ConnectToApplication(application_url, GURL(), GetProxy(&services), |
| 330 BindToProxy(stub_sp, &spp); | 334 ServiceProviderPtr()); |
| 331 ConnectToApplication(application_url, GURL(), spp.Pass()); | |
| 332 MessagePipe pipe; | 335 MessagePipe pipe; |
| 333 stub_sp->GetRemoteServiceProvider()->ConnectToService(interface_name, | 336 services->ConnectToService(interface_name, pipe.handle1.Pass()); |
| 334 pipe.handle1.Pass()); | |
| 335 return pipe.handle0.Pass(); | 337 return pipe.handle0.Pass(); |
| 336 } | 338 } |
| 337 | 339 |
| 338 Array<String> ApplicationManager::GetArgsForURL(const GURL& url) { | 340 Array<String> ApplicationManager::GetArgsForURL(const GURL& url) { |
| 339 URLToArgsMap::const_iterator args_it = url_to_args_.find(url); | 341 URLToArgsMap::const_iterator args_it = url_to_args_.find(url); |
| 340 if (args_it != url_to_args_.end()) | 342 if (args_it != url_to_args_.end()) |
| 341 return Array<String>::From(args_it->second); | 343 return Array<String>::From(args_it->second); |
| 342 return Array<String>(); | 344 return Array<String>(); |
| 343 } | 345 } |
| 344 } // namespace mojo | 346 } // namespace mojo |
| OLD | NEW |