| 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  |   17  | 
|   18 namespace mojo { |   18 namespace mojo { | 
|   19 namespace shell { |   19 namespace shell { | 
|   20  |   20  | 
|   21 ApplicationInstance::ApplicationInstance( |   21 ApplicationInstance::ApplicationInstance( | 
|   22     mojom::ShellClientPtr shell_client, |   22     mojom::ShellClientPtr shell_client, | 
|   23     ApplicationManager* manager, |   23     ApplicationManager* manager, | 
|   24     const Identity& identity, |   24     const Identity& identity, | 
|   25     uint32_t requesting_shell_client_factory_id, |  | 
|   26     const mojom::Shell::ConnectToApplicationCallback& connect_callback, |   25     const mojom::Shell::ConnectToApplicationCallback& connect_callback, | 
|   27     const base::Closure& on_application_end, |   26     const base::Closure& on_application_end, | 
|   28     const String& application_name) |   27     const String& application_name) | 
|   29     : manager_(manager), |   28     : manager_(manager), | 
|   30       id_(GenerateUniqueID()), |   29       id_(GenerateUniqueID()), | 
|   31       identity_(identity), |   30       identity_(identity), | 
|   32       allow_any_application_(identity.filter().size() == 1 && |   31       allow_any_application_(identity.filter().size() == 1 && | 
|   33                              identity.filter().count("*") == 1), |   32                              identity.filter().count("*") == 1), | 
|   34       requesting_shell_client_factory_id_(requesting_shell_client_factory_id), |  | 
|   35       connect_callback_(connect_callback), |   33       connect_callback_(connect_callback), | 
|   36       on_application_end_(on_application_end), |   34       on_application_end_(on_application_end), | 
|   37       shell_client_(std::move(shell_client)), |   35       shell_client_(std::move(shell_client)), | 
|   38       binding_(this), |   36       binding_(this), | 
|   39       pid_receiver_binding_(this), |   37       pid_receiver_binding_(this), | 
|   40       queue_requests_(false), |   38       queue_requests_(false), | 
|   41       native_runner_(nullptr), |   39       native_runner_(nullptr), | 
|   42       application_name_(application_name), |   40       application_name_(application_name), | 
|   43       pid_(base::kNullProcessId) { |   41       pid_(base::kNullProcessId) { | 
|   44   DCHECK_NE(Shell::kInvalidApplicationID, id_); |   42   DCHECK_NE(Shell::kInvalidApplicationID, id_); | 
|   45 } |   43 } | 
|   46  |   44  | 
|   47 ApplicationInstance::~ApplicationInstance() { |   45 ApplicationInstance::~ApplicationInstance() { | 
|   48   for (auto request : queued_client_requests_) { |   46   for (auto request : queued_client_requests_) | 
|   49     request->connect_callback().Run(kInvalidApplicationID, |   47     request->connect_callback().Run(kInvalidApplicationID); | 
|   50                                     kInvalidApplicationID); |  | 
|   51   } |  | 
|   52   STLDeleteElements(&queued_client_requests_); |   48   STLDeleteElements(&queued_client_requests_); | 
|   53 } |   49 } | 
|   54  |   50  | 
|   55 void ApplicationInstance::InitializeApplication() { |   51 void ApplicationInstance::InitializeApplication() { | 
|   56   shell_client_->Initialize(binding_.CreateInterfacePtrAndBind(), |   52   shell_client_->Initialize(binding_.CreateInterfacePtrAndBind(), | 
|   57                             identity_.url().spec(), id_); |   53                             identity_.url().spec(), id_); | 
|   58   binding_.set_connection_error_handler([this]() { OnConnectionError(); }); |   54   binding_.set_connection_error_handler([this]() { OnConnectionError(); }); | 
|   59 } |   55 } | 
|   60  |   56  | 
|   61 void ApplicationInstance::ConnectToClient( |   57 void ApplicationInstance::ConnectToClient( | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
|   72   native_runner_ = native_runner; |   68   native_runner_ = native_runner; | 
|   73 } |   69 } | 
|   74  |   70  | 
|   75 void ApplicationInstance::BindPIDReceiver( |   71 void ApplicationInstance::BindPIDReceiver( | 
|   76     InterfaceRequest<mojom::PIDReceiver> pid_receiver) { |   72     InterfaceRequest<mojom::PIDReceiver> pid_receiver) { | 
|   77   pid_receiver_binding_.Bind(std::move(pid_receiver)); |   73   pid_receiver_binding_.Bind(std::move(pid_receiver)); | 
|   78 } |   74 } | 
|   79  |   75  | 
|   80 void ApplicationInstance::RunConnectCallback() { |   76 void ApplicationInstance::RunConnectCallback() { | 
|   81   if (!connect_callback_.is_null()) |   77   if (!connect_callback_.is_null()) | 
|   82     connect_callback_.Run(id_, requesting_shell_client_factory_id_); |   78     connect_callback_.Run(id_); | 
|   83 } |   79 } | 
|   84  |   80  | 
|   85 // Shell implementation: |   81 // Shell implementation: | 
|   86 void ApplicationInstance::ConnectToApplication( |   82 void ApplicationInstance::ConnectToApplication( | 
|   87     URLRequestPtr app_request, |   83     URLRequestPtr app_request, | 
|   88     shell::mojom::InterfaceProviderRequest remote_interfaces, |   84     shell::mojom::InterfaceProviderRequest remote_interfaces, | 
|   89     shell::mojom::InterfaceProviderPtr local_interfaces, |   85     shell::mojom::InterfaceProviderPtr local_interfaces, | 
|   90     mojom::CapabilityFilterPtr filter, |   86     mojom::CapabilityFilterPtr filter, | 
|   91     const ConnectToApplicationCallback& callback) { |   87     const ConnectToApplicationCallback& callback) { | 
|   92   std::string url_string = app_request->url.To<std::string>(); |   88   std::string url_string = app_request->url.To<std::string>(); | 
|   93   GURL url(url_string); |   89   GURL url(url_string); | 
|   94   if (!url.is_valid()) { |   90   if (!url.is_valid()) { | 
|   95     LOG(ERROR) << "Error: invalid URL: " << url_string; |   91     LOG(ERROR) << "Error: invalid URL: " << url_string; | 
|   96     callback.Run(kInvalidApplicationID, kInvalidApplicationID); |   92     callback.Run(kInvalidApplicationID); | 
|   97     return; |   93     return; | 
|   98   } |   94   } | 
|   99   if (allow_any_application_ || |   95   if (allow_any_application_ || | 
|  100       identity_.filter().find(url.spec()) != identity_.filter().end()) { |   96       identity_.filter().find(url.spec()) != identity_.filter().end()) { | 
|  101     CapabilityFilter capability_filter = GetPermissiveCapabilityFilter(); |   97     CapabilityFilter capability_filter = GetPermissiveCapabilityFilter(); | 
|  102     if (!filter.is_null()) |   98     if (!filter.is_null()) | 
|  103       capability_filter = filter->filter.To<CapabilityFilter>(); |   99       capability_filter = filter->filter.To<CapabilityFilter>(); | 
|  104  |  100  | 
|  105     scoped_ptr<ConnectToApplicationParams> params( |  101     scoped_ptr<ConnectToApplicationParams> params( | 
|  106         new ConnectToApplicationParams); |  102         new ConnectToApplicationParams); | 
|  107     params->SetSource(this); |  103     params->SetSource(this); | 
|  108     GURL app_url(app_request->url.get()); |  104     GURL app_url(app_request->url.get()); | 
|  109     params->SetTargetURLRequest( |  105     params->SetTargetURLRequest( | 
|  110         std::move(app_request), |  106         std::move(app_request), | 
|  111         Identity(app_url, std::string(), capability_filter)); |  107         Identity(app_url, std::string(), capability_filter)); | 
|  112     params->set_remote_interfaces(std::move(remote_interfaces)); |  108     params->set_remote_interfaces(std::move(remote_interfaces)); | 
|  113     params->set_local_interfaces(std::move(local_interfaces)); |  109     params->set_local_interfaces(std::move(local_interfaces)); | 
|  114     params->set_connect_callback(callback); |  110     params->set_connect_callback(callback); | 
|  115     manager_->ConnectToApplication(std::move(params)); |  111     manager_->ConnectToApplication(std::move(params)); | 
|  116   } else { |  112   } else { | 
|  117     LOG(WARNING) << "CapabilityFilter prevented connection from: " << |  113     LOG(WARNING) << "CapabilityFilter prevented connection from: " << | 
|  118         identity_.url() << " to: " << url.spec(); |  114         identity_.url() << " to: " << url.spec(); | 
|  119     callback.Run(kInvalidApplicationID, kInvalidApplicationID); |  115     callback.Run(kInvalidApplicationID); | 
|  120   } |  116   } | 
|  121 } |  117 } | 
|  122  |  118  | 
|  123 void ApplicationInstance::QuitApplication() { |  119 void ApplicationInstance::QuitApplication() { | 
|  124   queue_requests_ = true; |  120   queue_requests_ = true; | 
|  125   shell_client_->OnQuitRequested( |  121   shell_client_->OnQuitRequested( | 
|  126       base::Bind(&ApplicationInstance::OnQuitRequestedResult, |  122       base::Bind(&ApplicationInstance::OnQuitRequestedResult, | 
|  127                  base::Unretained(this))); |  123                  base::Unretained(this))); | 
|  128 } |  124 } | 
|  129  |  125  | 
|  130 void ApplicationInstance::SetPID(uint32_t pid) { |  126 void ApplicationInstance::SetPID(uint32_t pid) { | 
|  131   // This will call us back to update pid_. |  127   // This will call us back to update pid_. | 
|  132   manager_->ApplicationPIDAvailable(id_, pid); |  128   manager_->ApplicationPIDAvailable(id_, pid); | 
|  133 } |  129 } | 
|  134  |  130  | 
|  135 uint32_t ApplicationInstance::GenerateUniqueID() const { |  131 uint32_t ApplicationInstance::GenerateUniqueID() const { | 
|  136   static uint32_t id = Shell::kInvalidApplicationID; |  132   static uint32_t id = Shell::kInvalidApplicationID; | 
|  137   ++id; |  133   ++id; | 
|  138   CHECK_NE(Shell::kInvalidApplicationID, id); |  134   CHECK_NE(Shell::kInvalidApplicationID, id); | 
|  139   return id; |  135   return id; | 
|  140 } |  136 } | 
|  141  |  137  | 
|  142 void ApplicationInstance::CallAcceptConnection( |  138 void ApplicationInstance::CallAcceptConnection( | 
|  143     scoped_ptr<ConnectToApplicationParams> params) { |  139     scoped_ptr<ConnectToApplicationParams> params) { | 
|  144   params->connect_callback().Run(id_, requesting_shell_client_factory_id_); |  140   params->connect_callback().Run(id_); | 
|  145   AllowedInterfaces interfaces; |  141   AllowedInterfaces interfaces; | 
|  146   interfaces.insert("*"); |  142   interfaces.insert("*"); | 
|  147   if (!params->source().is_null()) |  143   if (!params->source().is_null()) | 
|  148     interfaces = GetAllowedInterfaces(params->source().filter(), identity_); |  144     interfaces = GetAllowedInterfaces(params->source().filter(), identity_); | 
|  149  |  145  | 
|  150   ApplicationInstance* source = |  146   ApplicationInstance* source = | 
|  151       manager_->GetApplicationInstance(params->source()); |  147       manager_->GetApplicationInstance(params->source()); | 
|  152   uint32_t source_id = source ? source->id() : Shell::kInvalidApplicationID; |  148   uint32_t source_id = source ? source->id() : Shell::kInvalidApplicationID; | 
|  153   shell_client_->AcceptConnection( |  149   shell_client_->AcceptConnection( | 
|  154       params->source().url().spec(), source_id, params->TakeRemoteInterfaces(), |  150       params->source().url().spec(), source_id, params->TakeRemoteInterfaces(), | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  199  |  195  | 
|  200   queue_requests_ = false; |  196   queue_requests_ = false; | 
|  201   for (auto request : queued_client_requests_) |  197   for (auto request : queued_client_requests_) | 
|  202     CallAcceptConnection(make_scoped_ptr(request)); |  198     CallAcceptConnection(make_scoped_ptr(request)); | 
|  203  |  199  | 
|  204   queued_client_requests_.clear(); |  200   queued_client_requests_.clear(); | 
|  205 } |  201 } | 
|  206  |  202  | 
|  207 }  // namespace shell |  203 }  // namespace shell | 
|  208 }  // namespace mojo |  204 }  // namespace mojo | 
| OLD | NEW |