Index: remoting/host/plugin/host_script_object.cc |
=================================================================== |
--- remoting/host/plugin/host_script_object.cc (revision 155274) |
+++ remoting/host/plugin/host_script_object.cc (working copy) |
@@ -19,7 +19,7 @@ |
#include "remoting/base/auth_token_util.h" |
#include "remoting/host/chromoting_host.h" |
#include "remoting/host/chromoting_host_context.h" |
-#include "remoting/host/desktop_environment_factory.h" |
+#include "remoting/host/desktop_environment.h" |
#include "remoting/host/host_config.h" |
#include "remoting/host/host_event_logger.h" |
#include "remoting/host/host_key_pair.h" |
@@ -93,7 +93,6 @@ |
np_thread_id_(base::PlatformThread::CurrentId()), |
plugin_task_runner_( |
new PluginThreadTaskRunner(plugin_thread_delegate)), |
- desktop_environment_factory_(new DesktopEnvironmentFactory()), |
failed_login_attempts_(0), |
disconnected_event_(true, false), |
nat_traversal_enabled_(false), |
@@ -512,22 +511,43 @@ |
// Only proceed to FinishConnect() if at least one policy update has been |
// received. |
if (policy_received_) { |
- FinishConnect(uid, auth_token, auth_service); |
+ FinishConnectMainThread(uid, auth_token, auth_service); |
} else { |
// Otherwise, create the policy watcher, and thunk the connect. |
pending_connect_ = |
- base::Bind(&HostNPScriptObject::FinishConnect, |
+ base::Bind(&HostNPScriptObject::FinishConnectMainThread, |
base::Unretained(this), uid, auth_token, auth_service); |
} |
} |
-void HostNPScriptObject::FinishConnect( |
+void HostNPScriptObject::FinishConnectMainThread( |
const std::string& uid, |
const std::string& auth_token, |
const std::string& auth_service) { |
+ if (!host_context_->capture_task_runner()->BelongsToCurrentThread()) { |
+ host_context_->capture_task_runner()->PostTask(FROM_HERE, base::Bind( |
+ &HostNPScriptObject::FinishConnectMainThread, base::Unretained(this), |
+ uid, auth_token, auth_service)); |
+ return; |
+ } |
+ |
+ // DesktopEnvironment must be initialized on the capture thread. |
+ // |
+ // TODO(sergeyu): Fix DesktopEnvironment so that it can be created |
+ // on either the UI or the network thread so that we can avoid |
+ // jumping to the main thread here. |
+ desktop_environment_ = DesktopEnvironment::Create(host_context_.get()); |
+ |
+ FinishConnectNetworkThread(uid, auth_token, auth_service); |
+} |
+ |
+void HostNPScriptObject::FinishConnectNetworkThread( |
+ const std::string& uid, |
+ const std::string& auth_token, |
+ const std::string& auth_service) { |
if (!host_context_->network_task_runner()->BelongsToCurrentThread()) { |
host_context_->network_task_runner()->PostTask(FROM_HERE, base::Bind( |
- &HostNPScriptObject::FinishConnect, base::Unretained(this), |
+ &HostNPScriptObject::FinishConnectNetworkThread, base::Unretained(this), |
uid, auth_token, auth_service)); |
return; |
} |
@@ -544,6 +564,12 @@ |
return; |
} |
+ // Verify that DesktopEnvironment has been created. |
+ if (desktop_environment_.get() == NULL) { |
+ SetState(kError); |
+ return; |
+ } |
+ |
// Generate a key pair for the Host to use. |
// TODO(wez): Move this to the worker thread. |
host_key_pair_.Generate(); |
@@ -577,8 +603,7 @@ |
// Create the Host. |
host_ = new ChromotingHost( |
- host_context_.get(), signal_strategy_.get(), |
- desktop_environment_factory_.get(), |
+ host_context_.get(), signal_strategy_.get(), desktop_environment_.get(), |
CreateHostSessionManager(network_settings, |
host_context_->url_request_context_getter())); |
host_->AddStatusObserver(this); |
@@ -870,6 +895,7 @@ |
return; |
case kStarting: |
+ desktop_environment_.reset(); |
SetState(kDisconnecting); |
SetState(kDisconnected); |
return; |
@@ -899,6 +925,8 @@ |
void HostNPScriptObject::OnShutdownFinished() { |
DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
+ |
+ desktop_environment_.reset(); |
} |
void HostNPScriptObject::OnPolicyUpdate( |