| Index: remoting/host/plugin/host_script_object.cc
 | 
| diff --git a/remoting/host/plugin/host_script_object.cc b/remoting/host/plugin/host_script_object.cc
 | 
| index 8cffb5e4842b980c67dd3802c07dc576044459b3..c900bc68aacb3f4d67696ed86a7c51399c1eb4a8 100644
 | 
| --- a/remoting/host/plugin/host_script_object.cc
 | 
| +++ b/remoting/host/plugin/host_script_object.cc
 | 
| @@ -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.h"
 | 
| +#include "remoting/host/desktop_environment_factory.h"
 | 
|  #include "remoting/host/host_config.h"
 | 
|  #include "remoting/host/host_event_logger.h"
 | 
|  #include "remoting/host/host_key_pair.h"
 | 
| @@ -93,6 +93,7 @@ HostNPScriptObject::HostNPScriptObject(
 | 
|        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),
 | 
| @@ -511,43 +512,22 @@ void HostNPScriptObject::ReadPolicyAndConnect(const std::string& uid,
 | 
|    // Only proceed to FinishConnect() if at least one policy update has been
 | 
|    // received.
 | 
|    if (policy_received_) {
 | 
| -    FinishConnectMainThread(uid, auth_token, auth_service);
 | 
| +    FinishConnect(uid, auth_token, auth_service);
 | 
|    } else {
 | 
|      // Otherwise, create the policy watcher, and thunk the connect.
 | 
|      pending_connect_ =
 | 
| -        base::Bind(&HostNPScriptObject::FinishConnectMainThread,
 | 
| +        base::Bind(&HostNPScriptObject::FinishConnect,
 | 
|                     base::Unretained(this), uid, auth_token, auth_service);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -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(
 | 
| +void HostNPScriptObject::FinishConnect(
 | 
|      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::FinishConnectNetworkThread, base::Unretained(this),
 | 
| +        &HostNPScriptObject::FinishConnect, base::Unretained(this),
 | 
|          uid, auth_token, auth_service));
 | 
|      return;
 | 
|    }
 | 
| @@ -564,12 +544,6 @@ void HostNPScriptObject::FinishConnectNetworkThread(
 | 
|      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();
 | 
| @@ -603,7 +577,8 @@ void HostNPScriptObject::FinishConnectNetworkThread(
 | 
|  
 | 
|    // Create the Host.
 | 
|    host_ = new ChromotingHost(
 | 
| -      host_context_.get(), signal_strategy_.get(), desktop_environment_.get(),
 | 
| +      host_context_.get(), signal_strategy_.get(),
 | 
| +      desktop_environment_factory_.get(),
 | 
|        CreateHostSessionManager(network_settings,
 | 
|                                 host_context_->url_request_context_getter()));
 | 
|    host_->AddStatusObserver(this);
 | 
| @@ -895,7 +870,6 @@ void HostNPScriptObject::DisconnectInternal() {
 | 
|        return;
 | 
|  
 | 
|      case kStarting:
 | 
| -      desktop_environment_.reset();
 | 
|        SetState(kDisconnecting);
 | 
|        SetState(kDisconnected);
 | 
|        return;
 | 
| @@ -925,8 +899,6 @@ void HostNPScriptObject::DisconnectInternal() {
 | 
|  
 | 
|  void HostNPScriptObject::OnShutdownFinished() {
 | 
|    DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread());
 | 
| -
 | 
| -  desktop_environment_.reset();
 | 
|  }
 | 
|  
 | 
|  void HostNPScriptObject::OnPolicyUpdate(
 | 
| 
 |