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

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

Issue 1578473002: Pass application ids via AcceptConnection & ConnectToApplication callback. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 11 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_apptest.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 <stdint.h> 7 #include <stdint.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 14 matching lines...) Expand all
25 #include "mojo/shell/switches.h" 25 #include "mojo/shell/switches.h"
26 26
27 namespace mojo { 27 namespace mojo {
28 namespace shell { 28 namespace shell {
29 29
30 namespace { 30 namespace {
31 31
32 // Used by TestAPI. 32 // Used by TestAPI.
33 bool has_created_instance = false; 33 bool has_created_instance = false;
34 34
35 void OnEmptyOnConnectCallback(uint32_t content_handler_id) {} 35 void OnEmptyOnConnectCallback(uint32_t remote_id, uint32_t content_handler_id) {
36 }
36 37
37 } // namespace 38 } // namespace
38 39
39 // static 40 // static
40 ApplicationManager::TestAPI::TestAPI(ApplicationManager* manager) 41 ApplicationManager::TestAPI::TestAPI(ApplicationManager* manager)
41 : manager_(manager) { 42 : manager_(manager) {
42 } 43 }
43 44
44 ApplicationManager::TestAPI::~TestAPI() { 45 ApplicationManager::TestAPI::~TestAPI() {
45 } 46 }
(...skipping 21 matching lines...) Expand all
67 native_runner_factory_(std::move(native_runner_factory)), 68 native_runner_factory_(std::move(native_runner_factory)),
68 weak_ptr_factory_(this) { 69 weak_ptr_factory_(this) {
69 package_manager_->SetApplicationManager(this); 70 package_manager_->SetApplicationManager(this);
70 SetLoaderForURL(make_scoped_ptr(new ShellApplicationLoader(this)), 71 SetLoaderForURL(make_scoped_ptr(new ShellApplicationLoader(this)),
71 GURL("mojo:shell")); 72 GURL("mojo:shell"));
72 } 73 }
73 74
74 ApplicationManager::~ApplicationManager() { 75 ApplicationManager::~ApplicationManager() {
75 TerminateShellConnections(); 76 TerminateShellConnections();
76 STLDeleteValues(&url_to_loader_); 77 STLDeleteValues(&url_to_loader_);
78 for (auto& runner : native_runners_)
79 runner.reset();
77 } 80 }
78 81
79 void ApplicationManager::TerminateShellConnections() { 82 void ApplicationManager::TerminateShellConnections() {
80 STLDeleteValues(&identity_to_instance_); 83 STLDeleteValues(&identity_to_instance_);
81 } 84 }
82 85
83 void ApplicationManager::ConnectToApplication( 86 void ApplicationManager::ConnectToApplication(
84 scoped_ptr<ConnectToApplicationParams> params) { 87 scoped_ptr<ConnectToApplicationParams> params) {
85 TRACE_EVENT_INSTANT1("mojo_shell", "ApplicationManager::ConnectToApplication", 88 TRACE_EVENT_INSTANT1("mojo_shell", "ApplicationManager::ConnectToApplication",
86 TRACE_EVENT_SCOPE_THREAD, "original_url", 89 TRACE_EVENT_SCOPE_THREAD, "original_url",
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 mojom::ApplicationManagerListenerPtr listener) { 152 mojom::ApplicationManagerListenerPtr listener) {
150 Array<mojom::ApplicationInfoPtr> applications; 153 Array<mojom::ApplicationInfoPtr> applications;
151 for (auto& entry : identity_to_instance_) 154 for (auto& entry : identity_to_instance_)
152 applications.push_back(CreateApplicationInfoForInstance(entry.second)); 155 applications.push_back(CreateApplicationInfoForInstance(entry.second));
153 listener->SetRunningApplications(std::move(applications)); 156 listener->SetRunningApplications(std::move(applications));
154 157
155 listeners_.AddInterfacePtr(std::move(listener)); 158 listeners_.AddInterfacePtr(std::move(listener));
156 } 159 }
157 160
158 void ApplicationManager::ApplicationPIDAvailable( 161 void ApplicationManager::ApplicationPIDAvailable(
159 int id, 162 uint32_t id,
160 base::ProcessId pid) { 163 base::ProcessId pid) {
161 for (auto& instance : identity_to_instance_) { 164 for (auto& instance : identity_to_instance_) {
162 if (instance.second->id() == id) { 165 if (instance.second->id() == id) {
163 instance.second->set_pid(pid); 166 instance.second->set_pid(pid);
164 break; 167 break;
165 } 168 }
166 } 169 }
167 listeners_.ForAllPtrs( 170 listeners_.ForAllPtrs(
168 [this, id, pid](mojom::ApplicationManagerListener* listener) { 171 [this, id, pid](mojom::ApplicationManagerListener* listener) {
169 listener->ApplicationPIDAvailable(id, pid); 172 listener->ApplicationPIDAvailable(id, pid);
(...skipping 12 matching lines...) Expand all
182 return application_request; 185 return application_request;
183 } 186 }
184 187
185 InterfaceRequest<Application> ApplicationManager::CreateInstance( 188 InterfaceRequest<Application> ApplicationManager::CreateInstance(
186 const Identity& target_id, 189 const Identity& target_id,
187 const base::Closure& on_application_end, 190 const base::Closure& on_application_end,
188 ApplicationInstance** resulting_instance) { 191 ApplicationInstance** resulting_instance) {
189 ApplicationPtr application; 192 ApplicationPtr application;
190 InterfaceRequest<Application> application_request = GetProxy(&application); 193 InterfaceRequest<Application> application_request = GetProxy(&application);
191 ApplicationInstance* instance = new ApplicationInstance( 194 ApplicationInstance* instance = new ApplicationInstance(
192 std::move(application), this, target_id, Shell::kInvalidContentHandlerID, 195 std::move(application), this, target_id, Shell::kInvalidApplicationID,
193 on_application_end); 196 on_application_end);
194 DCHECK(identity_to_instance_.find(target_id) == 197 DCHECK(identity_to_instance_.find(target_id) ==
195 identity_to_instance_.end()); 198 identity_to_instance_.end());
196 identity_to_instance_[target_id] = instance; 199 identity_to_instance_[target_id] = instance;
197 mojom::ApplicationInfoPtr application_info = 200 mojom::ApplicationInfoPtr application_info =
198 CreateApplicationInfoForInstance(instance); 201 CreateApplicationInfoForInstance(instance);
199 listeners_.ForAllPtrs( 202 listeners_.ForAllPtrs(
200 [this, &application_info](mojom::ApplicationManagerListener* listener) { 203 [this, &application_info](mojom::ApplicationManagerListener* listener) {
201 listener->ApplicationInstanceCreated(application_info.Clone()); 204 listener->ApplicationInstanceCreated(application_info.Clone());
202 }); 205 });
203 instance->InitializeApplication(); 206 instance->InitializeApplication();
204 if (resulting_instance) 207 if (resulting_instance)
205 *resulting_instance = instance; 208 *resulting_instance = instance;
206 return application_request; 209 return application_request;
207 } 210 }
208 211
209 void ApplicationManager::HandleFetchCallback( 212 void ApplicationManager::HandleFetchCallback(
210 scoped_ptr<ConnectToApplicationParams> params, 213 scoped_ptr<ConnectToApplicationParams> params,
211 scoped_ptr<Fetcher> fetcher) { 214 scoped_ptr<Fetcher> fetcher) {
212 if (!fetcher) { 215 if (!fetcher) {
213 // Network error. Drop |params| to tell the requestor. 216 // Network error. Drop |params| to tell the requestor.
214 params->connect_callback().Run(Shell::kInvalidContentHandlerID); 217 params->connect_callback().Run(Shell::kInvalidApplicationID,
218 Shell::kInvalidApplicationID);
215 return; 219 return;
216 } 220 }
217 221
218 GURL redirect_url = fetcher->GetRedirectURL(); 222 GURL redirect_url = fetcher->GetRedirectURL();
219 if (!redirect_url.is_empty()) { 223 if (!redirect_url.is_empty()) {
220 // And around we go again... Whee! 224 // And around we go again... Whee!
221 // TODO(sky): this loses the original URL info. 225 // TODO(sky): this loses the original URL info.
222 URLRequestPtr new_request = URLRequest::New(); 226 URLRequestPtr new_request = URLRequest::New();
223 new_request->url = redirect_url.spec(); 227 new_request->url = redirect_url.spec();
224 HttpHeaderPtr header = HttpHeader::New(); 228 HttpHeaderPtr header = HttpHeader::New();
(...skipping 15 matching lines...) Expand all
240 Identity target = params->target(); 244 Identity target = params->target();
241 Shell::ConnectToApplicationCallback connect_callback = 245 Shell::ConnectToApplicationCallback connect_callback =
242 params->connect_callback(); 246 params->connect_callback();
243 params->set_connect_callback(EmptyConnectCallback()); 247 params->set_connect_callback(EmptyConnectCallback());
244 ApplicationInstance* app = nullptr; 248 ApplicationInstance* app = nullptr;
245 InterfaceRequest<Application> request( 249 InterfaceRequest<Application> request(
246 CreateAndConnectToInstance(std::move(params), &app)); 250 CreateAndConnectToInstance(std::move(params), &app));
247 251
248 uint32_t content_handler_id = package_manager_->HandleWithContentHandler( 252 uint32_t content_handler_id = package_manager_->HandleWithContentHandler(
249 fetcher.get(), source, target.url(), target.filter(), &request); 253 fetcher.get(), source, target.url(), target.filter(), &request);
250 if (content_handler_id != Shell::kInvalidContentHandlerID) { 254 if (content_handler_id != Shell::kInvalidApplicationID) {
251 app->set_requesting_content_handler_id(content_handler_id); 255 app->set_requesting_content_handler_id(content_handler_id);
252 connect_callback.Run(content_handler_id); 256 connect_callback.Run(app->id(), content_handler_id);
253 return; 257 return;
254 } 258 }
255 259
256 // TODO(erg): Have a better way of switching the sandbox on. For now, switch 260 // TODO(erg): Have a better way of switching the sandbox on. For now, switch
257 // it on hard coded when we're using some of the sandboxable core services. 261 // it on hard coded when we're using some of the sandboxable core services.
258 bool start_sandboxed = false; 262 bool start_sandboxed = false;
259 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( 263 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
260 switches::kMojoNoSandbox)) { 264 switches::kMojoNoSandbox)) {
261 start_sandboxed = (target.url() == GURL("mojo://core_services/") && 265 start_sandboxed = (target.url() == GURL("mojo://core_services/") &&
262 target.qualifier() == "Core") || 266 target.qualifier() == "Core") ||
263 target.url() == GURL("mojo://html_viewer/"); 267 target.url() == GURL("mojo://html_viewer/");
264 } 268 }
265 269
266 connect_callback.Run(Shell::kInvalidContentHandlerID); 270 connect_callback.Run(app->id(), Shell::kInvalidApplicationID);
267 271
268 fetcher->AsPath( 272 fetcher->AsPath(
269 task_runner_, 273 task_runner_,
270 base::Bind(&ApplicationManager::RunNativeApplication, 274 base::Bind(&ApplicationManager::RunNativeApplication,
271 weak_ptr_factory_.GetWeakPtr(), 275 weak_ptr_factory_.GetWeakPtr(),
272 base::Passed(std::move(request)), start_sandboxed, 276 base::Passed(std::move(request)), start_sandboxed,
273 base::Passed(std::move(fetcher)), base::Unretained(app))); 277 base::Passed(std::move(fetcher)), base::Unretained(app)));
274 } 278 }
275 279
276 void ApplicationManager::RunNativeApplication( 280 void ApplicationManager::RunNativeApplication(
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 } 362 }
359 } 363 }
360 } 364 }
361 365
362 Shell::ConnectToApplicationCallback EmptyConnectCallback() { 366 Shell::ConnectToApplicationCallback EmptyConnectCallback() {
363 return base::Bind(&OnEmptyOnConnectCallback); 367 return base::Bind(&OnEmptyOnConnectCallback);
364 } 368 }
365 369
366 } // namespace shell 370 } // namespace shell
367 } // namespace mojo 371 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/shell/application_manager.h ('k') | mojo/shell/application_manager_apptest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698