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

Unified Diff: remoting/host/plugin/host_script_object.cc

Issue 9582031: Don't crash in ~HostNPScriptObject() when the object wasn't initialized. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: - Created 8 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/host/plugin/host_script_object.h ('k') | remoting/jingle_glue/jingle_thread.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 705b6ebcec19c723b750bd6fffccae4c2fb6bd7c..d25f89cdb5117907534863d57d482c9ac284b499 100644
--- a/remoting/host/plugin/host_script_object.cc
+++ b/remoting/host/plugin/host_script_object.cc
@@ -67,7 +67,6 @@ HostNPScriptObject::HostNPScriptObject(
np_thread_id_(base::PlatformThread::CurrentId()),
plugin_message_loop_proxy_(
new PluginMessageLoopProxy(plugin_thread_delegate)),
- host_context_(plugin_message_loop_proxy_),
failed_login_attempts_(0),
daemon_controller_(DaemonController::Create()),
disconnected_event_(true, false),
@@ -97,25 +96,32 @@ HostNPScriptObject::~HostNPScriptObject() {
nat_policy_.reset();
}
- // Disconnect synchronously. We cannot disconnect asynchronously
- // here because |host_context_| needs to be stopped on the plugin
- // thread, but the plugin thread may not exist after the instance
- // is destroyed.
- disconnected_event_.Reset();
- DisconnectInternal();
- disconnected_event_.Wait();
+ if (host_context_.get()) {
+ // Disconnect synchronously. We cannot disconnect asynchronously
+ // here because |host_context_| needs to be stopped on the plugin
+ // thread, but the plugin thread may not exist after the instance
+ // is destroyed.
+ disconnected_event_.Reset();
+ DisconnectInternal();
+ disconnected_event_.Wait();
- // Stop all threads.
- host_context_.Stop();
+ // Stops all threads.
+ host_context_.reset();
+ }
}
bool HostNPScriptObject::Init() {
DCHECK(plugin_message_loop_proxy_->BelongsToCurrentThread());
VLOG(2) << "Init";
- // TODO(wez): This starts a bunch of threads, which might fail.
- host_context_.Start();
+
+ host_context_.reset(new ChromotingHostContext(plugin_message_loop_proxy_));
+ if (!host_context_->Start()) {
+ host_context_.reset();
+ return false;
+ }
+
nat_policy_.reset(
- policy_hack::NatPolicy::Create(host_context_.network_message_loop()));
+ policy_hack::NatPolicy::Create(host_context_->network_message_loop()));
nat_policy_->StartWatching(
base::Bind(&HostNPScriptObject::OnNatPolicyUpdate,
base::Unretained(this)));
@@ -334,7 +340,7 @@ bool HostNPScriptObject::Enumerate(std::vector<std::string>* values) {
}
void HostNPScriptObject::OnAccessDenied(const std::string& jid) {
- DCHECK(host_context_.network_message_loop()->BelongsToCurrentThread());
+ DCHECK(host_context_->network_message_loop()->BelongsToCurrentThread());
++failed_login_attempts_;
if (failed_login_attempts_ == kMaxLoginAttempts) {
@@ -343,7 +349,7 @@ void HostNPScriptObject::OnAccessDenied(const std::string& jid) {
}
void HostNPScriptObject::OnClientAuthenticated(const std::string& jid) {
- DCHECK(host_context_.network_message_loop()->BelongsToCurrentThread());
+ DCHECK(host_context_->network_message_loop()->BelongsToCurrentThread());
if (state_ == kDisconnecting) {
// Ignore the new connection if we are disconnecting.
@@ -359,13 +365,13 @@ void HostNPScriptObject::OnClientAuthenticated(const std::string& jid) {
}
void HostNPScriptObject::OnClientDisconnected(const std::string& jid) {
- DCHECK(host_context_.network_message_loop()->BelongsToCurrentThread());
+ DCHECK(host_context_->network_message_loop()->BelongsToCurrentThread());
client_username_.clear();
DisconnectInternal();
}
void HostNPScriptObject::OnShutdown() {
- DCHECK(host_context_.network_message_loop()->BelongsToCurrentThread());
+ DCHECK(host_context_->network_message_loop()->BelongsToCurrentThread());
register_request_.reset();
log_to_server_.reset();
@@ -420,8 +426,8 @@ bool HostNPScriptObject::Connect(const NPVariant* args,
void HostNPScriptObject::ReadPolicyAndConnect(const std::string& uid,
const std::string& auth_token,
const std::string& auth_service) {
- if (!host_context_.network_message_loop()->BelongsToCurrentThread()) {
- host_context_.network_message_loop()->PostTask(
+ if (!host_context_->network_message_loop()->BelongsToCurrentThread()) {
+ host_context_->network_message_loop()->PostTask(
FROM_HERE, base::Bind(
&HostNPScriptObject::ReadPolicyAndConnect, base::Unretained(this),
uid, auth_token, auth_service));
@@ -446,8 +452,8 @@ void HostNPScriptObject::FinishConnectMainThread(
const std::string& uid,
const std::string& auth_token,
const std::string& auth_service) {
- if (host_context_.main_message_loop() != MessageLoop::current()) {
- host_context_.main_message_loop()->PostTask(FROM_HERE, base::Bind(
+ if (host_context_->main_message_loop() != MessageLoop::current()) {
+ host_context_->main_message_loop()->PostTask(FROM_HERE, base::Bind(
&HostNPScriptObject::FinishConnectMainThread, base::Unretained(this),
uid, auth_token, auth_service));
return;
@@ -458,7 +464,7 @@ void HostNPScriptObject::FinishConnectMainThread(
// 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_.reset(DesktopEnvironment::Create(&host_context_));
+ desktop_environment_.reset(DesktopEnvironment::Create(host_context_.get()));
FinishConnectNetworkThread(uid, auth_token, auth_service);
}
@@ -467,8 +473,8 @@ void HostNPScriptObject::FinishConnectNetworkThread(
const std::string& uid,
const std::string& auth_token,
const std::string& auth_service) {
- if (!host_context_.network_message_loop()->BelongsToCurrentThread()) {
- host_context_.network_message_loop()->PostTask(FROM_HERE, base::Bind(
+ if (!host_context_->network_message_loop()->BelongsToCurrentThread()) {
+ host_context_->network_message_loop()->PostTask(FROM_HERE, base::Bind(
&HostNPScriptObject::FinishConnectNetworkThread, base::Unretained(this),
uid, auth_token, auth_service));
return;
@@ -491,7 +497,7 @@ void HostNPScriptObject::FinishConnectNetworkThread(
// Create XMPP connection.
scoped_ptr<SignalStrategy> signal_strategy(
- new XmppSignalStrategy(host_context_.jingle_thread(), uid,
+ new XmppSignalStrategy(host_context_->jingle_thread(), uid,
auth_token, auth_service));
// Request registration of the host for support.
@@ -508,13 +514,13 @@ void HostNPScriptObject::FinishConnectNetworkThread(
// Create the Host.
LOG(INFO) << "NAT state: " << nat_traversal_enabled_;
host_ = new ChromotingHost(
- &host_context_, signal_strategy_.get(), desktop_environment_.get(),
+ host_context_.get(), signal_strategy_.get(), desktop_environment_.get(),
protocol::NetworkSettings(nat_traversal_enabled_));
host_->AddStatusObserver(this);
log_to_server_.reset(
new LogToServer(host_, ServerLogEntry::IT2ME, signal_strategy_.get()));
it2me_host_user_interface_.reset(
- new It2MeHostUserInterface(host_.get(), &host_context_));
+ new It2MeHostUserInterface(host_.get(), host_context_.get()));
it2me_host_user_interface_->Init();
{
@@ -605,8 +611,8 @@ bool HostNPScriptObject::StopDaemon(const NPVariant* args,
}
void HostNPScriptObject::DisconnectInternal() {
- if (!host_context_.network_message_loop()->BelongsToCurrentThread()) {
- host_context_.network_message_loop()->PostTask(
+ if (!host_context_->network_message_loop()->BelongsToCurrentThread()) {
+ host_context_->network_message_loop()->PostTask(
FROM_HERE, base::Bind(&HostNPScriptObject::DisconnectInternal,
base::Unretained(this)));
return;
@@ -634,7 +640,7 @@ void HostNPScriptObject::DisconnectInternal() {
// synchronously, bug SignalStrategy::Listener handlers are not
// allowed to destroy SignalStrategy, so post task to call
// Shutdown() later.
- host_context_.network_message_loop()->PostTask(
+ host_context_->network_message_loop()->PostTask(
FROM_HERE, base::Bind(
&ChromotingHost::Shutdown, host_,
base::Bind(&HostNPScriptObject::OnShutdownFinished,
@@ -643,14 +649,14 @@ void HostNPScriptObject::DisconnectInternal() {
}
void HostNPScriptObject::OnShutdownFinished() {
- DCHECK(host_context_.network_message_loop()->BelongsToCurrentThread());
+ DCHECK(host_context_->network_message_loop()->BelongsToCurrentThread());
disconnected_event_.Signal();
}
void HostNPScriptObject::OnNatPolicyUpdate(bool nat_traversal_enabled) {
- if (!host_context_.network_message_loop()->BelongsToCurrentThread()) {
- host_context_.network_message_loop()->PostTask(
+ if (!host_context_->network_message_loop()->BelongsToCurrentThread()) {
+ host_context_->network_message_loop()->PostTask(
FROM_HERE,
base::Bind(&HostNPScriptObject::OnNatPolicyUpdate,
base::Unretained(this), nat_traversal_enabled));
@@ -683,7 +689,7 @@ void HostNPScriptObject::OnReceivedSupportID(
bool success,
const std::string& support_id,
const base::TimeDelta& lifetime) {
- DCHECK(host_context_.network_message_loop()->BelongsToCurrentThread());
+ DCHECK(host_context_->network_message_loop()->BelongsToCurrentThread());
if (!success) {
SetState(kError);
@@ -709,7 +715,7 @@ void HostNPScriptObject::OnReceivedSupportID(
}
void HostNPScriptObject::SetState(State state) {
- DCHECK(host_context_.network_message_loop()->BelongsToCurrentThread());
+ DCHECK(host_context_->network_message_loop()->BelongsToCurrentThread());
switch (state_) {
case kDisconnected:
DCHECK(state == kStarting ||
« no previous file with comments | « remoting/host/plugin/host_script_object.h ('k') | remoting/jingle_glue/jingle_thread.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698