OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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_instance.h" | 5 #include "mojo/shell/application_instance.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/atomic_sequence_num.h" | 11 #include "base/atomic_sequence_num.h" |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
14 #include "mojo/common/common_type_converters.h" | 14 #include "mojo/common/common_type_converters.h" |
15 #include "mojo/common/url_type_converters.h" | 15 #include "mojo/common/url_type_converters.h" |
16 #include "mojo/shell/application_manager.h" | 16 #include "mojo/shell/application_manager.h" |
17 #include "mojo/shell/public/interfaces/content_handler.mojom.h" | 17 #include "mojo/shell/public/interfaces/content_handler.mojom.h" |
18 | 18 |
19 namespace mojo { | 19 namespace mojo { |
20 namespace shell { | 20 namespace shell { |
21 | 21 |
22 ApplicationInstance::ApplicationInstance( | 22 ApplicationInstance::ApplicationInstance( |
23 mojom::ApplicationPtr application, | 23 mojom::ShellClientPtr shell_client, |
24 ApplicationManager* manager, | 24 ApplicationManager* manager, |
25 const Identity& identity, | 25 const Identity& identity, |
26 uint32_t requesting_content_handler_id, | 26 uint32_t requesting_content_handler_id, |
27 const base::Closure& on_application_end) | 27 const base::Closure& on_application_end) |
28 : manager_(manager), | 28 : manager_(manager), |
29 id_(GenerateUniqueID()), | 29 id_(GenerateUniqueID()), |
30 identity_(identity), | 30 identity_(identity), |
31 allow_any_application_(identity.filter().size() == 1 && | 31 allow_any_application_(identity.filter().size() == 1 && |
32 identity.filter().count("*") == 1), | 32 identity.filter().count("*") == 1), |
33 requesting_content_handler_id_(requesting_content_handler_id), | 33 requesting_content_handler_id_(requesting_content_handler_id), |
34 on_application_end_(on_application_end), | 34 on_application_end_(on_application_end), |
35 application_(std::move(application)), | 35 shell_client_(std::move(shell_client)), |
36 binding_(this), | 36 binding_(this), |
37 pid_receiver_binding_(this), | 37 pid_receiver_binding_(this), |
38 queue_requests_(false), | 38 queue_requests_(false), |
39 native_runner_(nullptr), | 39 native_runner_(nullptr), |
40 pid_(base::kNullProcessId) { | 40 pid_(base::kNullProcessId) { |
41 DCHECK_NE(Shell::kInvalidApplicationID, id_); | 41 DCHECK_NE(Shell::kInvalidApplicationID, id_); |
42 } | 42 } |
43 | 43 |
44 ApplicationInstance::~ApplicationInstance() { | 44 ApplicationInstance::~ApplicationInstance() { |
45 for (auto request : queued_client_requests_) { | 45 for (auto request : queued_client_requests_) { |
46 request->connect_callback().Run(kInvalidApplicationID, | 46 request->connect_callback().Run(kInvalidApplicationID, |
47 kInvalidApplicationID); | 47 kInvalidApplicationID); |
48 } | 48 } |
49 STLDeleteElements(&queued_client_requests_); | 49 STLDeleteElements(&queued_client_requests_); |
50 } | 50 } |
51 | 51 |
52 void ApplicationInstance::InitializeApplication() { | 52 void ApplicationInstance::InitializeApplication() { |
53 application_->Initialize(binding_.CreateInterfacePtrAndBind(), | 53 shell_client_->Initialize(binding_.CreateInterfacePtrAndBind(), |
54 identity_.url().spec(), id_); | 54 identity_.url().spec(), id_); |
55 binding_.set_connection_error_handler([this]() { OnConnectionError(); }); | 55 binding_.set_connection_error_handler([this]() { OnConnectionError(); }); |
56 } | 56 } |
57 | 57 |
58 void ApplicationInstance::ConnectToClient( | 58 void ApplicationInstance::ConnectToClient( |
59 scoped_ptr<ConnectToApplicationParams> params) { | 59 scoped_ptr<ConnectToApplicationParams> params) { |
60 if (queue_requests_) { | 60 if (queue_requests_) { |
61 queued_client_requests_.push_back(params.release()); | 61 queued_client_requests_.push_back(params.release()); |
62 return; | 62 return; |
63 } | 63 } |
64 | 64 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 manager_->ConnectToApplication(std::move(params)); | 107 manager_->ConnectToApplication(std::move(params)); |
108 } else { | 108 } else { |
109 LOG(WARNING) << "CapabilityFilter prevented connection from: " << | 109 LOG(WARNING) << "CapabilityFilter prevented connection from: " << |
110 identity_.url() << " to: " << url.spec(); | 110 identity_.url() << " to: " << url.spec(); |
111 callback.Run(kInvalidApplicationID, kInvalidApplicationID); | 111 callback.Run(kInvalidApplicationID, kInvalidApplicationID); |
112 } | 112 } |
113 } | 113 } |
114 | 114 |
115 void ApplicationInstance::QuitApplication() { | 115 void ApplicationInstance::QuitApplication() { |
116 queue_requests_ = true; | 116 queue_requests_ = true; |
117 application_->OnQuitRequested( | 117 shell_client_->OnQuitRequested( |
118 base::Bind(&ApplicationInstance::OnQuitRequestedResult, | 118 base::Bind(&ApplicationInstance::OnQuitRequestedResult, |
119 base::Unretained(this))); | 119 base::Unretained(this))); |
120 } | 120 } |
121 | 121 |
122 void ApplicationInstance::SetPID(uint32_t pid) { | 122 void ApplicationInstance::SetPID(uint32_t pid) { |
123 // This will call us back to update pid_. | 123 // This will call us back to update pid_. |
124 manager_->ApplicationPIDAvailable(id_, pid); | 124 manager_->ApplicationPIDAvailable(id_, pid); |
125 } | 125 } |
126 | 126 |
127 uint32_t ApplicationInstance::GenerateUniqueID() const { | 127 uint32_t ApplicationInstance::GenerateUniqueID() const { |
128 static uint32_t id = Shell::kInvalidApplicationID; | 128 static uint32_t id = Shell::kInvalidApplicationID; |
129 ++id; | 129 ++id; |
130 CHECK_NE(Shell::kInvalidApplicationID, id); | 130 CHECK_NE(Shell::kInvalidApplicationID, id); |
131 return id; | 131 return id; |
132 } | 132 } |
133 | 133 |
134 void ApplicationInstance::CallAcceptConnection( | 134 void ApplicationInstance::CallAcceptConnection( |
135 scoped_ptr<ConnectToApplicationParams> params) { | 135 scoped_ptr<ConnectToApplicationParams> params) { |
136 params->connect_callback().Run(id_, requesting_content_handler_id_); | 136 params->connect_callback().Run(id_, requesting_content_handler_id_); |
137 AllowedInterfaces interfaces; | 137 AllowedInterfaces interfaces; |
138 interfaces.insert("*"); | 138 interfaces.insert("*"); |
139 if (!params->source().is_null()) | 139 if (!params->source().is_null()) |
140 interfaces = GetAllowedInterfaces(params->source().filter(), identity_); | 140 interfaces = GetAllowedInterfaces(params->source().filter(), identity_); |
141 | 141 |
142 ApplicationInstance* source = | 142 ApplicationInstance* source = |
143 manager_->GetApplicationInstance(params->source()); | 143 manager_->GetApplicationInstance(params->source()); |
144 uint32_t source_id = source ? source->id() : Shell::kInvalidApplicationID; | 144 uint32_t source_id = source ? source->id() : Shell::kInvalidApplicationID; |
145 application_->AcceptConnection( | 145 shell_client_->AcceptConnection( |
146 params->source().url().spec(), source_id, params->TakeServices(), | 146 params->source().url().spec(), source_id, params->TakeServices(), |
147 params->TakeExposedServices(), Array<String>::From(interfaces), | 147 params->TakeExposedServices(), Array<String>::From(interfaces), |
148 params->target().url().spec()); | 148 params->target().url().spec()); |
149 } | 149 } |
150 | 150 |
151 void ApplicationInstance::OnConnectionError() { | 151 void ApplicationInstance::OnConnectionError() { |
152 std::vector<ConnectToApplicationParams*> queued_client_requests; | 152 std::vector<ConnectToApplicationParams*> queued_client_requests; |
153 queued_client_requests_.swap(queued_client_requests); | 153 queued_client_requests_.swap(queued_client_requests); |
154 auto manager = manager_; | 154 auto manager = manager_; |
155 manager_->OnApplicationInstanceError(this); | 155 manager_->OnApplicationInstanceError(this); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 | 191 |
192 queue_requests_ = false; | 192 queue_requests_ = false; |
193 for (auto request : queued_client_requests_) | 193 for (auto request : queued_client_requests_) |
194 CallAcceptConnection(make_scoped_ptr(request)); | 194 CallAcceptConnection(make_scoped_ptr(request)); |
195 | 195 |
196 queued_client_requests_.clear(); | 196 queued_client_requests_.clear(); |
197 } | 197 } |
198 | 198 |
199 } // namespace shell | 199 } // namespace shell |
200 } // namespace mojo | 200 } // namespace mojo |
OLD | NEW |