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

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

Issue 696563002: Cache ShellImpl by resolved URL, not initial URL (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: rebase Created 6 years, 1 month 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 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 18 matching lines...) Expand all
29 public: 29 public:
30 ServiceProvider* GetRemoteServiceProvider() { return client(); } 30 ServiceProvider* GetRemoteServiceProvider() { return client(); }
31 31
32 private: 32 private:
33 void ConnectToService(const String& service_name, 33 void ConnectToService(const String& service_name,
34 ScopedMessagePipeHandle client_handle) override {} 34 ScopedMessagePipeHandle client_handle) override {}
35 }; 35 };
36 36
37 } // namespace 37 } // namespace
38 38
39 ApplicationManager::Delegate::~Delegate() {} 39
40 ApplicationManager::Delegate::~Delegate() {
41 }
42
43 void ApplicationManager::Delegate::OnApplicationError(const GURL& url) {
44 LOG(ERROR) << "Communication error with application: " << url.spec();
45 }
46
47 GURL ApplicationManager::Delegate::ResolveURL(const GURL& url) {
48 return url;
49 }
50
40 51
41 class ApplicationManager::LoadCallbacksImpl 52 class ApplicationManager::LoadCallbacksImpl
42 : public ApplicationLoader::LoadCallbacks { 53 : public ApplicationLoader::LoadCallbacks {
43 public: 54 public:
44 LoadCallbacksImpl(base::WeakPtr<ApplicationManager> manager, 55 LoadCallbacksImpl(base::WeakPtr<ApplicationManager> manager,
45 const GURL& requested_url, 56 const GURL& requested_url,
57 const GURL& resolved_url,
46 const GURL& requestor_url, 58 const GURL& requestor_url,
47 ServiceProviderPtr service_provider) 59 ServiceProviderPtr service_provider)
48 : manager_(manager), 60 : manager_(manager),
49 requested_url_(requested_url), 61 requested_url_(requested_url),
62 resolved_url_(resolved_url),
50 requestor_url_(requestor_url), 63 requestor_url_(requestor_url),
51 service_provider_(service_provider.Pass()) {} 64 service_provider_(service_provider.Pass()) {}
52 65
53 private: 66 private:
54 ~LoadCallbacksImpl() override {} 67 ~LoadCallbacksImpl() override {}
55 68
56 // LoadCallbacks implementation 69 // LoadCallbacks implementation
57 ScopedMessagePipeHandle RegisterApplication() override { 70 ScopedMessagePipeHandle RegisterApplication() override {
58 ScopedMessagePipeHandle shell_handle; 71 ScopedMessagePipeHandle shell_handle;
59 if (manager_) { 72 if (manager_) {
60 manager_->RegisterLoadedApplication(requested_url_, 73 manager_->RegisterLoadedApplication(requested_url_,
74 resolved_url_,
61 requestor_url_, 75 requestor_url_,
62 service_provider_.Pass(), 76 service_provider_.Pass(),
63 &shell_handle); 77 &shell_handle);
64 } 78 }
65 return shell_handle.Pass(); 79 return shell_handle.Pass();
66 } 80 }
67 81
68 void LoadWithContentHandler(const GURL& content_handler_url, 82 void LoadWithContentHandler(const GURL& content_handler_url,
69 URLResponsePtr url_response) override { 83 URLResponsePtr url_response) override {
70 if (manager_) { 84 if (manager_) {
71 manager_->LoadWithContentHandler(requested_url_, 85 manager_->LoadWithContentHandler(requested_url_,
86 resolved_url_,
72 requestor_url_, 87 requestor_url_,
73 content_handler_url, 88 content_handler_url,
74 url_response.Pass(), 89 url_response.Pass(),
75 service_provider_.Pass()); 90 service_provider_.Pass());
76 } 91 }
77 } 92 }
78 93
79 base::WeakPtr<ApplicationManager> manager_; 94 base::WeakPtr<ApplicationManager> manager_;
80 GURL requested_url_; 95 GURL requested_url_;
96 GURL resolved_url_;
81 GURL requestor_url_; 97 GURL requestor_url_;
82 ServiceProviderPtr service_provider_; 98 ServiceProviderPtr service_provider_;
83 }; 99 };
84 100
85 class ApplicationManager::ShellImpl : public InterfaceImpl<Shell> { 101 class ApplicationManager::ShellImpl : public InterfaceImpl<Shell> {
86 public: 102 public:
87 ShellImpl(ApplicationManager* manager, const GURL& url) 103 ShellImpl(ApplicationManager* manager,
88 : manager_(manager), url_(url) {} 104 const GURL& requested_url,
105 const GURL& url)
106 : manager_(manager), requested_url_(requested_url), url_(url) {}
89 107
90 ~ShellImpl() override {} 108 ~ShellImpl() override {}
91 109
92 void ConnectToClient(const GURL& requestor_url, 110 void ConnectToClient(const GURL& requestor_url,
93 ServiceProviderPtr service_provider) { 111 ServiceProviderPtr service_provider) {
94 client()->AcceptConnection(String::From(requestor_url), 112 client()->AcceptConnection(String::From(requestor_url),
95 service_provider.Pass()); 113 service_provider.Pass());
96 } 114 }
97 115
98 // ServiceProvider implementation: 116 // ServiceProvider implementation:
99 void ConnectToApplication( 117 void ConnectToApplication(
100 const String& app_url, 118 const String& app_url,
101 InterfaceRequest<ServiceProvider> in_service_provider) override { 119 InterfaceRequest<ServiceProvider> in_service_provider) override {
102 ServiceProviderPtr out_service_provider; 120 ServiceProviderPtr out_service_provider;
103 out_service_provider.Bind(in_service_provider.PassMessagePipe()); 121 out_service_provider.Bind(in_service_provider.PassMessagePipe());
104 manager_->ConnectToApplication( 122 manager_->ConnectToApplication(
105 app_url.To<GURL>(), url_, out_service_provider.Pass()); 123 app_url.To<GURL>(), url_, out_service_provider.Pass());
106 } 124 }
107 125
108 const GURL& url() const { return url_; } 126 const GURL& url() const { return url_; }
127 const GURL& requested_url() const { return requested_url_; }
109 128
110 private: 129 private:
111 void OnConnectionError() override { manager_->OnShellImplError(this); } 130 void OnConnectionError() override { manager_->OnShellImplError(this); }
112 131
113 ApplicationManager* const manager_; 132 ApplicationManager* const manager_;
133 const GURL requested_url_;
114 const GURL url_; 134 const GURL url_;
115 135
116 DISALLOW_COPY_AND_ASSIGN(ShellImpl); 136 DISALLOW_COPY_AND_ASSIGN(ShellImpl);
117 }; 137 };
118 138
119 class ApplicationManager::ContentHandlerConnection : public ErrorHandler { 139 class ApplicationManager::ContentHandlerConnection : public ErrorHandler {
120 public: 140 public:
121 ContentHandlerConnection(ApplicationManager* manager, 141 ContentHandlerConnection(ApplicationManager* manager,
122 const GURL& content_handler_url) 142 const GURL& content_handler_url)
123 : manager_(manager), content_handler_url_(content_handler_url) { 143 : manager_(manager), content_handler_url_(content_handler_url) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 175
156 bool ApplicationManager::TestAPI::HasCreatedInstance() { 176 bool ApplicationManager::TestAPI::HasCreatedInstance() {
157 return has_created_instance; 177 return has_created_instance;
158 } 178 }
159 179
160 bool ApplicationManager::TestAPI::HasFactoryForURL(const GURL& url) const { 180 bool ApplicationManager::TestAPI::HasFactoryForURL(const GURL& url) const {
161 return manager_->url_to_shell_impl_.find(url) != 181 return manager_->url_to_shell_impl_.find(url) !=
162 manager_->url_to_shell_impl_.end(); 182 manager_->url_to_shell_impl_.end();
163 } 183 }
164 184
165 ApplicationManager::ApplicationManager() 185 ApplicationManager::ApplicationManager(Delegate* delegate)
166 : delegate_(NULL), 186 : delegate_(delegate),
167 interceptor_(NULL), 187 interceptor_(NULL),
168 weak_ptr_factory_(this) { 188 weak_ptr_factory_(this) {
169 } 189 }
170 190
171 ApplicationManager::~ApplicationManager() { 191 ApplicationManager::~ApplicationManager() {
172 STLDeleteValues(&url_to_content_handler_); 192 STLDeleteValues(&url_to_content_handler_);
173 TerminateShellConnections(); 193 TerminateShellConnections();
174 STLDeleteValues(&url_to_loader_); 194 STLDeleteValues(&url_to_loader_);
175 STLDeleteValues(&scheme_to_loader_); 195 STLDeleteValues(&scheme_to_loader_);
176 } 196 }
177 197
178 void ApplicationManager::TerminateShellConnections() { 198 void ApplicationManager::TerminateShellConnections() {
179 STLDeleteValues(&url_to_shell_impl_); 199 STLDeleteValues(&url_to_shell_impl_);
180 STLDeleteElements(&content_shell_impls_); 200 STLDeleteElements(&content_shell_impls_);
181 } 201 }
182 202
183 // static 203 void ApplicationManager::ConnectToApplication(
184 ApplicationManager* ApplicationManager::GetInstance() { 204 const GURL& requested_url,
185 static base::LazyInstance<ApplicationManager> instance = 205 const GURL& requestor_url,
186 LAZY_INSTANCE_INITIALIZER; 206 ServiceProviderPtr service_provider) {
187 has_created_instance = true; 207 ApplicationLoader* loader = GetLoaderForURL(requested_url,
188 return &instance.Get(); 208 DONT_INCLUDE_DEFAULT_LOADER);
209 if (loader) {
210 ConnectToApplicationImpl(requested_url, requested_url, requestor_url,
211 service_provider.Pass(), loader);
212 return;
213 }
214
215 GURL resolved_url = delegate_->ResolveURL(requested_url);
216 loader = GetLoaderForURL(resolved_url, INCLUDE_DEFAULT_LOADER);
217 if (loader) {
218 ConnectToApplicationImpl(requested_url, resolved_url, requestor_url,
219 service_provider.Pass(), loader);
220 return;
221 }
222
223 LOG(WARNING) << "Could not find loader to load application: "
224 << requested_url.spec();
189 } 225 }
190 226
191 void ApplicationManager::ConnectToApplication( 227 void ApplicationManager::ConnectToApplicationImpl(
192 const GURL& url, 228 const GURL& requested_url, const GURL& resolved_url,
193 const GURL& requestor_url, 229 const GURL& requestor_url, ServiceProviderPtr service_provider,
194 ServiceProviderPtr service_provider) { 230 ApplicationLoader* loader) {
195 URLToShellImplMap::const_iterator shell_it = url_to_shell_impl_.find(url); 231 URLToShellImplMap::const_iterator shell_it =
232 url_to_shell_impl_.find(resolved_url);
196 if (shell_it != url_to_shell_impl_.end()) { 233 if (shell_it != url_to_shell_impl_.end()) {
197 ConnectToClient( 234 ConnectToClient(shell_it->second, resolved_url, requestor_url,
198 shell_it->second, url, requestor_url, service_provider.Pass()); 235 service_provider.Pass());
199 return; 236 return;
200 } 237 }
201 238
202 scoped_refptr<LoadCallbacksImpl> callbacks( 239 scoped_refptr<LoadCallbacksImpl> callbacks(
203 new LoadCallbacksImpl(weak_ptr_factory_.GetWeakPtr(), 240 new LoadCallbacksImpl(weak_ptr_factory_.GetWeakPtr(),
204 url, 241 requested_url,
242 resolved_url,
205 requestor_url, 243 requestor_url,
206 service_provider.Pass())); 244 service_provider.Pass()));
207 GetLoaderForURL(url)->Load(this, url, callbacks); 245 loader->Load(this, resolved_url, callbacks);
208 } 246 }
209 247
210 void ApplicationManager::ConnectToClient(ShellImpl* shell_impl, 248 void ApplicationManager::ConnectToClient(ShellImpl* shell_impl,
211 const GURL& url, 249 const GURL& url,
212 const GURL& requestor_url, 250 const GURL& requestor_url,
213 ServiceProviderPtr service_provider) { 251 ServiceProviderPtr service_provider) {
214 if (interceptor_) { 252 if (interceptor_) {
215 shell_impl->ConnectToClient( 253 shell_impl->ConnectToClient(
216 requestor_url, 254 requestor_url,
217 interceptor_->OnConnectToClient(url, service_provider.Pass())); 255 interceptor_->OnConnectToClient(url, service_provider.Pass()));
218 } else { 256 } else {
219 shell_impl->ConnectToClient(requestor_url, service_provider.Pass()); 257 shell_impl->ConnectToClient(requestor_url, service_provider.Pass());
220 } 258 }
221 } 259 }
222 260
223 void ApplicationManager::RegisterExternalApplication( 261 void ApplicationManager::RegisterExternalApplication(
224 const GURL& url, 262 const GURL& url,
225 ScopedMessagePipeHandle shell_handle) { 263 ScopedMessagePipeHandle shell_handle) {
226 ShellImpl* shell_impl = 264 url_to_shell_impl_[url] =
227 WeakBindToPipe(new ShellImpl(this, url), shell_handle.Pass()); 265 WeakBindToPipe(new ShellImpl(this, url, url), shell_handle.Pass());
228 url_to_shell_impl_[url] = shell_impl;
229 URLToArgsMap::const_iterator args_it = url_to_args_.find(url);
230 Array<String> args;
231 if (args_it != url_to_args_.end())
232 args = Array<String>::From(args_it->second);
233 shell_impl->client()->Initialize(args.Pass());
234 } 266 }
235 267
236 void ApplicationManager::RegisterLoadedApplication( 268 void ApplicationManager::RegisterLoadedApplication(
237 const GURL& url, 269 const GURL& requested_url,
270 const GURL& resolved_url,
238 const GURL& requestor_url, 271 const GURL& requestor_url,
239 ServiceProviderPtr service_provider, 272 ServiceProviderPtr service_provider,
240 ScopedMessagePipeHandle* shell_handle) { 273 ScopedMessagePipeHandle* shell_handle) {
241 ShellImpl* shell_impl = NULL; 274 ShellImpl* shell_impl = NULL;
242 URLToShellImplMap::iterator iter = url_to_shell_impl_.find(url); 275 URLToShellImplMap::iterator iter = url_to_shell_impl_.find(resolved_url);
243 if (iter != url_to_shell_impl_.end()) { 276 if (iter != url_to_shell_impl_.end()) {
244 // This can happen because services are loaded asynchronously. So if we get 277 // This can happen because services are loaded asynchronously. So if we get
245 // two requests for the same service close to each other, we might get here 278 // two requests for the same service close to each other, we might get here
246 // and find that we already have it. 279 // and find that we already have it.
247 shell_impl = iter->second; 280 shell_impl = iter->second;
248 } else { 281 } else {
249 MessagePipe pipe; 282 MessagePipe pipe;
250 shell_impl = WeakBindToPipe(new ShellImpl(this, url), pipe.handle1.Pass()); 283 shell_impl = WeakBindToPipe(
251 url_to_shell_impl_[url] = shell_impl; 284 new ShellImpl(this, requested_url, resolved_url), pipe.handle1.Pass());
285 url_to_shell_impl_[resolved_url] = shell_impl;
252 *shell_handle = pipe.handle0.Pass(); 286 *shell_handle = pipe.handle0.Pass();
253 shell_impl->client()->Initialize(GetArgsForURL(url)); 287 shell_impl->client()->Initialize(GetArgsForURL(requested_url));
254 } 288 }
255 289
256 ConnectToClient(shell_impl, url, requestor_url, service_provider.Pass()); 290 ConnectToClient(shell_impl, resolved_url, requestor_url,
291 service_provider.Pass());
257 } 292 }
258 293
259 void ApplicationManager::LoadWithContentHandler( 294 void ApplicationManager::LoadWithContentHandler(
260 const GURL& content_url, 295 const GURL& requested_url,
296 const GURL& resolved_url,
261 const GURL& requestor_url, 297 const GURL& requestor_url,
262 const GURL& content_handler_url, 298 const GURL& content_handler_url,
263 URLResponsePtr url_response, 299 URLResponsePtr url_response,
264 ServiceProviderPtr service_provider) { 300 ServiceProviderPtr service_provider) {
265 ContentHandlerConnection* connection = NULL; 301 ContentHandlerConnection* connection = NULL;
266 URLToContentHandlerMap::iterator iter = 302 URLToContentHandlerMap::iterator iter =
267 url_to_content_handler_.find(content_handler_url); 303 url_to_content_handler_.find(content_handler_url);
268 if (iter != url_to_content_handler_.end()) { 304 if (iter != url_to_content_handler_.end()) {
269 connection = iter->second; 305 connection = iter->second;
270 } else { 306 } else {
271 connection = new ContentHandlerConnection(this, content_handler_url); 307 connection = new ContentHandlerConnection(this, content_handler_url);
272 url_to_content_handler_[content_handler_url] = connection; 308 url_to_content_handler_[content_handler_url] = connection;
273 } 309 }
274 310
275 ShellPtr shell_proxy; 311 ShellPtr shell_proxy;
276 ShellImpl* shell_impl = 312 ShellImpl* shell_impl = WeakBindToProxy(
277 WeakBindToProxy(new ShellImpl(this, content_url), &shell_proxy); 313 new ShellImpl(this, requested_url, resolved_url), &shell_proxy);
278 content_shell_impls_.insert(shell_impl); 314 content_shell_impls_.insert(shell_impl);
279 shell_impl->client()->Initialize(GetArgsForURL(content_url)); 315 shell_impl->client()->Initialize(GetArgsForURL(requested_url));
280 316
281 connection->content_handler()->StartApplication(shell_proxy.Pass(), 317 connection->content_handler()->StartApplication(shell_proxy.Pass(),
282 url_response.Pass()); 318 url_response.Pass());
283 ConnectToClient( 319 ConnectToClient(
284 shell_impl, content_url, requestor_url, service_provider.Pass()); 320 shell_impl, resolved_url, requestor_url, service_provider.Pass());
285 } 321 }
286 322
287 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader, 323 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader,
288 const GURL& url) { 324 const GURL& url) {
289 URLToLoaderMap::iterator it = url_to_loader_.find(url); 325 URLToLoaderMap::iterator it = url_to_loader_.find(url);
290 if (it != url_to_loader_.end()) 326 if (it != url_to_loader_.end())
291 delete it->second; 327 delete it->second;
292 url_to_loader_[url] = loader.release(); 328 url_to_loader_[url] = loader.release();
293 } 329 }
294 330
295 void ApplicationManager::SetLoaderForScheme( 331 void ApplicationManager::SetLoaderForScheme(
296 scoped_ptr<ApplicationLoader> loader, 332 scoped_ptr<ApplicationLoader> loader,
297 const std::string& scheme) { 333 const std::string& scheme) {
298 SchemeToLoaderMap::iterator it = scheme_to_loader_.find(scheme); 334 SchemeToLoaderMap::iterator it = scheme_to_loader_.find(scheme);
299 if (it != scheme_to_loader_.end()) 335 if (it != scheme_to_loader_.end())
300 delete it->second; 336 delete it->second;
301 scheme_to_loader_[scheme] = loader.release(); 337 scheme_to_loader_[scheme] = loader.release();
302 } 338 }
303 339
304 void ApplicationManager::SetArgsForURL(const std::vector<std::string>& args, 340 void ApplicationManager::SetArgsForURL(const std::vector<std::string>& args,
305 const GURL& url) { 341 const GURL& url) {
306 url_to_args_[url] = args; 342 url_to_args_[url] = args;
307 } 343 }
308 344
309 void ApplicationManager::SetInterceptor(Interceptor* interceptor) { 345 void ApplicationManager::SetInterceptor(Interceptor* interceptor) {
310 interceptor_ = interceptor; 346 interceptor_ = interceptor;
311 } 347 }
312 348
313 ApplicationLoader* ApplicationManager::GetLoaderForURL(const GURL& url) { 349 ApplicationLoader* ApplicationManager::GetLoaderForURL(
314 URLToLoaderMap::const_iterator url_it = url_to_loader_.find(url); 350 const GURL& url, IncludeDefaultLoader include_default_loader) {
351 auto url_it = url_to_loader_.find(url);
315 if (url_it != url_to_loader_.end()) 352 if (url_it != url_to_loader_.end())
316 return url_it->second; 353 return url_it->second;
317 SchemeToLoaderMap::const_iterator scheme_it = 354 auto scheme_it = scheme_to_loader_.find(url.scheme());
318 scheme_to_loader_.find(url.scheme());
319 if (scheme_it != scheme_to_loader_.end()) 355 if (scheme_it != scheme_to_loader_.end())
320 return scheme_it->second; 356 return scheme_it->second;
321 return default_loader_.get(); 357 if (include_default_loader == INCLUDE_DEFAULT_LOADER)
358 return default_loader_.get();
359 return NULL;
322 } 360 }
323 361
324 void ApplicationManager::OnShellImplError(ShellImpl* shell_impl) { 362 void ApplicationManager::OnShellImplError(ShellImpl* shell_impl) {
325 // Called from ~ShellImpl, so we do not need to call Destroy here. 363 // Called from ~ShellImpl, so we do not need to call Destroy here.
326 auto content_shell_it = content_shell_impls_.find(shell_impl); 364 auto content_shell_it = content_shell_impls_.find(shell_impl);
327 if (content_shell_it != content_shell_impls_.end()) { 365 if (content_shell_it != content_shell_impls_.end()) {
328 delete (*content_shell_it); 366 delete (*content_shell_it);
329 content_shell_impls_.erase(content_shell_it); 367 content_shell_impls_.erase(content_shell_it);
330 return; 368 return;
331 } 369 }
332 const GURL url = shell_impl->url(); 370 const GURL url = shell_impl->url();
371 const GURL requested_url = shell_impl->requested_url();
333 // Remove the shell. 372 // Remove the shell.
334 URLToShellImplMap::iterator it = url_to_shell_impl_.find(url); 373 URLToShellImplMap::iterator it = url_to_shell_impl_.find(url);
335 DCHECK(it != url_to_shell_impl_.end()); 374 DCHECK(it != url_to_shell_impl_.end());
336 delete it->second; 375 delete it->second;
337 url_to_shell_impl_.erase(it); 376 url_to_shell_impl_.erase(it);
338 ApplicationLoader* loader = GetLoaderForURL(url); 377 ApplicationLoader* loader = GetLoaderForURL(requested_url,
378 INCLUDE_DEFAULT_LOADER);
339 if (loader) 379 if (loader)
340 loader->OnApplicationError(this, url); 380 loader->OnApplicationError(this, url);
341 if (delegate_) 381 delegate_->OnApplicationError(requested_url);
342 delegate_->OnApplicationError(url);
343 } 382 }
344 383
345 void ApplicationManager::OnContentHandlerError( 384 void ApplicationManager::OnContentHandlerError(
346 ContentHandlerConnection* content_handler) { 385 ContentHandlerConnection* content_handler) {
347 // Remove the mapping to the content handler. 386 // Remove the mapping to the content handler.
348 auto it = 387 auto it =
349 url_to_content_handler_.find(content_handler->content_handler_url()); 388 url_to_content_handler_.find(content_handler->content_handler_url());
350 DCHECK(it != url_to_content_handler_.end()); 389 DCHECK(it != url_to_content_handler_.end());
351 delete it->second; 390 delete it->second;
352 url_to_content_handler_.erase(it); 391 url_to_content_handler_.erase(it);
(...skipping 12 matching lines...) Expand all
365 return pipe.handle0.Pass(); 404 return pipe.handle0.Pass();
366 } 405 }
367 406
368 Array<String> ApplicationManager::GetArgsForURL(const GURL& url) { 407 Array<String> ApplicationManager::GetArgsForURL(const GURL& url) {
369 URLToArgsMap::const_iterator args_it = url_to_args_.find(url); 408 URLToArgsMap::const_iterator args_it = url_to_args_.find(url);
370 if (args_it != url_to_args_.end()) 409 if (args_it != url_to_args_.end())
371 return Array<String>::From(args_it->second); 410 return Array<String>::From(args_it->second);
372 return Array<String>(); 411 return Array<String>();
373 } 412 }
374 } // namespace mojo 413 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/application_manager/application_manager.h ('k') | mojo/application_manager/application_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698