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 16888d38eb08b5520ef28a61adc88b3a4c07302b..39cd72da834d8b56278c7ecc5004de0d3e0f01a8 100644 |
--- a/remoting/host/plugin/host_script_object.cc |
+++ b/remoting/host/plugin/host_script_object.cc |
@@ -1102,13 +1102,14 @@ bool HostNPScriptObject::ClearPairedClients(const NPVariant* args, |
return false; |
} |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); |
+ scoped_ptr<ScopedRefNPObject> callback_obj( |
+ new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
if (pairing_registry_) { |
pairing_registry_->ClearAllPairings( |
base::Bind(&HostNPScriptObject::InvokeBooleanCallback, weak_ptr_, |
- callback_obj)); |
+ base::Passed(&callback_obj))); |
} else { |
- InvokeBooleanCallback(callback_obj, false); |
+ InvokeBooleanCallback(callback_obj.Pass(), false); |
} |
return true; |
@@ -1133,14 +1134,15 @@ bool HostNPScriptObject::DeletePairedClient(const NPVariant* args, |
} |
std::string client_id = StringFromNPVariant(args[0]); |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[1])); |
+ scoped_ptr<ScopedRefNPObject> callback_obj( |
+ new ScopedRefNPObject(ObjectFromNPVariant(args[1]))); |
if (pairing_registry_) { |
pairing_registry_->DeletePairing( |
client_id, |
base::Bind(&HostNPScriptObject::InvokeBooleanCallback, |
- weak_ptr_, callback_obj)); |
+ weak_ptr_, base::Passed(&callback_obj))); |
} else { |
- InvokeBooleanCallback(callback_obj, false); |
+ InvokeBooleanCallback(callback_obj.Pass(), false); |
} |
return true; |
@@ -1161,7 +1163,7 @@ bool HostNPScriptObject::GetHostName(const NPVariant* args, |
} |
NPVariant host_name_val = NPVariantFromString(net::GetHostName()); |
- InvokeAndIgnoreResult(callback_obj.get(), &host_name_val, 1); |
+ InvokeAndIgnoreResult(callback_obj, &host_name_val, 1); |
g_npnetscape_funcs->releasevariantvalue(&host_name_val); |
return true; |
@@ -1195,7 +1197,7 @@ bool HostNPScriptObject::GetPinHash(const NPVariant* args, |
NPVariant pin_hash_val = NPVariantFromString( |
remoting::MakeHostPinHash(host_id, pin)); |
- InvokeAndIgnoreResult(callback_obj.get(), &pin_hash_val, 1); |
+ InvokeAndIgnoreResult(callback_obj, &pin_hash_val, 1); |
g_npnetscape_funcs->releasevariantvalue(&pin_hash_val); |
return true; |
@@ -1209,18 +1211,20 @@ bool HostNPScriptObject::GenerateKeyPair(const NPVariant* args, |
return false; |
} |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); |
- if (!callback_obj.get()) { |
+ scoped_ptr<ScopedRefNPObject> callback_obj( |
+ new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
+ if (!callback_obj->get()) { |
SetException("generateKeyPair: invalid callback parameter"); |
return false; |
} |
- // TODO(wez): HostNPScriptObject needn't be touched on worker |
- // thread, so make DoGenerateKeyPair static and pass it a callback |
- // to run (crbug.com/156257). |
+ base::Callback<void (const std::string&, |
+ const std::string&)> wrapped_callback = |
+ base::Bind(&HostNPScriptObject::InvokeGenerateKeyPairCallback, weak_ptr_, |
+ base::Passed(&callback_obj)); |
worker_thread_->PostTask( |
FROM_HERE, base::Bind(&HostNPScriptObject::DoGenerateKeyPair, |
- base::Unretained(this), callback_obj)); |
+ plugin_task_runner_, wrapped_callback)); |
return true; |
} |
@@ -1243,8 +1247,9 @@ bool HostNPScriptObject::UpdateDaemonConfig(const NPVariant* args, |
scoped_ptr<base::DictionaryValue> config_dict( |
reinterpret_cast<base::DictionaryValue*>(config.release())); |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[1])); |
- if (!callback_obj.get()) { |
+ scoped_ptr<ScopedRefNPObject> callback_obj( |
+ new ScopedRefNPObject(ObjectFromNPVariant(args[1]))); |
+ if (!callback_obj->get()) { |
SetException("updateDaemonConfig: invalid callback parameter"); |
return false; |
} |
@@ -1258,8 +1263,8 @@ bool HostNPScriptObject::UpdateDaemonConfig(const NPVariant* args, |
daemon_controller_->UpdateConfig( |
config_dict.Pass(), |
- base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, |
- base::Unretained(this), callback_obj)); |
+ base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, weak_ptr_, |
+ base::Passed(&callback_obj))); |
return true; |
} |
@@ -1271,16 +1276,16 @@ bool HostNPScriptObject::GetDaemonConfig(const NPVariant* args, |
return false; |
} |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); |
- if (!callback_obj.get()) { |
+ scoped_ptr<ScopedRefNPObject> callback_obj( |
+ new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
+ if (!callback_obj->get()) { |
SetException("getDaemonConfig: invalid callback parameter"); |
return false; |
} |
daemon_controller_->GetConfig( |
- base::Bind(&HostNPScriptObject::InvokeGetDaemonConfigCallback, |
- base::Unretained(this), callback_obj)); |
- |
+ base::Bind(&HostNPScriptObject::InvokeGetDaemonConfigCallback, weak_ptr_, |
+ base::Passed(&callback_obj))); |
return true; |
} |
@@ -1292,15 +1297,16 @@ bool HostNPScriptObject::GetDaemonVersion(const NPVariant* args, |
return false; |
} |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); |
- if (!callback_obj.get()) { |
+ scoped_ptr<ScopedRefNPObject> callback_obj( |
+ new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
+ if (!callback_obj->get()) { |
SetException("getDaemonVersion: invalid callback parameter"); |
return false; |
} |
daemon_controller_->GetVersion( |
- base::Bind(&HostNPScriptObject::InvokeGetDaemonVersionCallback, |
- base::Unretained(this), callback_obj)); |
+ base::Bind(&HostNPScriptObject::InvokeGetDaemonVersionCallback, weak_ptr_, |
+ base::Passed(&callback_obj))); |
return true; |
} |
@@ -1313,8 +1319,9 @@ bool HostNPScriptObject::GetPairedClients(const NPVariant* args, |
return false; |
} |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); |
- if (!callback_obj.get()) { |
+ scoped_ptr<ScopedRefNPObject> callback_obj( |
+ new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
+ if (!callback_obj->get()) { |
SetException("getPairedClients: invalid callback parameter"); |
return false; |
} |
@@ -1322,10 +1329,11 @@ bool HostNPScriptObject::GetPairedClients(const NPVariant* args, |
if (pairing_registry_) { |
pairing_registry_->GetAllPairings( |
base::Bind(&HostNPScriptObject::InvokeGetPairedClientsCallback, |
- weak_ptr_, callback_obj)); |
+ weak_ptr_, base::Passed(&callback_obj))); |
} else { |
scoped_ptr<base::ListValue> no_paired_clients(new base::ListValue); |
- InvokeGetPairedClientsCallback(callback_obj, no_paired_clients.Pass()); |
+ InvokeGetPairedClientsCallback(callback_obj.Pass(), |
+ no_paired_clients.Pass()); |
} |
return true; |
} |
@@ -1338,15 +1346,16 @@ bool HostNPScriptObject::GetUsageStatsConsent(const NPVariant* args, |
return false; |
} |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); |
- if (!callback_obj.get()) { |
+ scoped_ptr<ScopedRefNPObject> callback_obj( |
+ new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
+ if (!callback_obj->get()) { |
SetException("getUsageStatsConsent: invalid callback parameter"); |
return false; |
} |
daemon_controller_->GetUsageStatsConsent( |
base::Bind(&HostNPScriptObject::InvokeGetUsageStatsConsentCallback, |
- base::Unretained(this), callback_obj)); |
+ weak_ptr_, base::Passed(&callback_obj))); |
return true; |
} |
@@ -1376,8 +1385,9 @@ bool HostNPScriptObject::StartDaemon(const NPVariant* args, |
return false; |
} |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[2])); |
- if (!callback_obj.get()) { |
+ scoped_ptr<ScopedRefNPObject> callback_obj( |
+ new ScopedRefNPObject(ObjectFromNPVariant(args[2]))); |
+ if (!callback_obj->get()) { |
SetException("startDaemon: invalid callback parameter"); |
return false; |
} |
@@ -1385,8 +1395,8 @@ bool HostNPScriptObject::StartDaemon(const NPVariant* args, |
daemon_controller_->SetConfigAndStart( |
config_dict.Pass(), |
NPVARIANT_TO_BOOLEAN(args[1]), |
- base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, |
- base::Unretained(this), callback_obj)); |
+ base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, weak_ptr_, |
+ base::Passed(&callback_obj))); |
return true; |
} |
@@ -1400,15 +1410,16 @@ bool HostNPScriptObject::StopDaemon(const NPVariant* args, |
return false; |
} |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); |
- if (!callback_obj.get()) { |
+ scoped_ptr<ScopedRefNPObject> callback_obj( |
+ new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
+ if (!callback_obj->get()) { |
SetException("stopDaemon: invalid callback parameter"); |
return false; |
} |
daemon_controller_->Stop( |
- base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, |
- base::Unretained(this), callback_obj)); |
+ base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, weak_ptr_, |
+ base::Passed(&callback_obj))); |
return true; |
} |
@@ -1420,7 +1431,7 @@ void HostNPScriptObject::NotifyStateChanged(State state) { |
if (on_state_changed_func_.get()) { |
NPVariant state_var; |
INT32_TO_NPVARIANT(state, state_var); |
- InvokeAndIgnoreResult(on_state_changed_func_.get(), &state_var, 1); |
+ InvokeAndIgnoreResult(on_state_changed_func_, &state_var, 1); |
} |
} |
@@ -1430,7 +1441,7 @@ void HostNPScriptObject::NotifyNatPolicyChanged(bool nat_traversal_enabled) { |
if (on_nat_traversal_policy_changed_func_.get()) { |
NPVariant policy; |
BOOLEAN_TO_NPVARIANT(nat_traversal_enabled, policy); |
- InvokeAndIgnoreResult(on_nat_traversal_policy_changed_func_.get(), |
+ InvokeAndIgnoreResult(on_nat_traversal_policy_changed_func_, |
&policy, 1); |
} |
} |
@@ -1518,61 +1529,54 @@ bool HostNPScriptObject::LocalizeStringWithSubstitution( |
return true; |
} |
-void HostNPScriptObject::DoGenerateKeyPair(const ScopedRefNPObject& callback) { |
+// static |
+void HostNPScriptObject::DoGenerateKeyPair( |
+ const scoped_refptr<AutoThreadTaskRunner>& plugin_task_runner, |
+ const base::Callback<void (const std::string&, |
+ const std::string&)>& callback) { |
scoped_refptr<RsaKeyPair> key_pair = RsaKeyPair::Generate(); |
- InvokeGenerateKeyPairCallback(callback, key_pair->ToString(), |
- key_pair->GetPublicKey()); |
+ plugin_task_runner->PostTask(FROM_HERE, |
+ base::Bind(callback, key_pair->ToString(), |
+ key_pair->GetPublicKey())); |
} |
void HostNPScriptObject::InvokeGenerateKeyPairCallback( |
- const ScopedRefNPObject& callback, |
+ scoped_ptr<ScopedRefNPObject> callback, |
const std::string& private_key, |
const std::string& public_key) { |
- if (!plugin_task_runner_->BelongsToCurrentThread()) { |
- plugin_task_runner_->PostTask( |
- FROM_HERE, base::Bind( |
- &HostNPScriptObject::InvokeGenerateKeyPairCallback, |
- weak_ptr_, callback, private_key, public_key)); |
- return; |
- } |
+ DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
NPVariant params[2]; |
params[0] = NPVariantFromString(private_key); |
params[1] = NPVariantFromString(public_key); |
- InvokeAndIgnoreResult(callback.get(), params, arraysize(params)); |
+ InvokeAndIgnoreResult(*callback, params, arraysize(params)); |
g_npnetscape_funcs->releasevariantvalue(&(params[0])); |
g_npnetscape_funcs->releasevariantvalue(&(params[1])); |
} |
void HostNPScriptObject::InvokeAsyncResultCallback( |
- const ScopedRefNPObject& callback, |
+ scoped_ptr<ScopedRefNPObject> callback, |
DaemonController::AsyncResult result) { |
DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
NPVariant result_var; |
INT32_TO_NPVARIANT(static_cast<int32>(result), result_var); |
- InvokeAndIgnoreResult(callback.get(), &result_var, 1); |
+ InvokeAndIgnoreResult(*callback, &result_var, 1); |
g_npnetscape_funcs->releasevariantvalue(&result_var); |
} |
void HostNPScriptObject::InvokeBooleanCallback( |
- const ScopedRefNPObject& callback, bool result) { |
- if (!plugin_task_runner_->BelongsToCurrentThread()) { |
- plugin_task_runner_->PostTask( |
- FROM_HERE, base::Bind( |
- &HostNPScriptObject::InvokeBooleanCallback, |
- weak_ptr_, callback, result)); |
- return; |
- } |
+ scoped_ptr<ScopedRefNPObject> callback, bool result) { |
+ DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
NPVariant result_var; |
BOOLEAN_TO_NPVARIANT(result, result_var); |
- InvokeAndIgnoreResult(callback.get(), &result_var, 1); |
+ InvokeAndIgnoreResult(*callback, &result_var, 1); |
g_npnetscape_funcs->releasevariantvalue(&result_var); |
} |
void HostNPScriptObject::InvokeGetDaemonConfigCallback( |
- const ScopedRefNPObject& callback, |
+ scoped_ptr<ScopedRefNPObject> callback, |
scoped_ptr<base::DictionaryValue> config) { |
DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
@@ -1583,40 +1587,34 @@ void HostNPScriptObject::InvokeGetDaemonConfigCallback( |
base::JSONWriter::Write(config.get(), &config_str); |
NPVariant config_val = NPVariantFromString(config_str); |
- InvokeAndIgnoreResult(callback.get(), &config_val, 1); |
+ InvokeAndIgnoreResult(*callback, &config_val, 1); |
g_npnetscape_funcs->releasevariantvalue(&config_val); |
} |
void HostNPScriptObject::InvokeGetDaemonVersionCallback( |
- const ScopedRefNPObject& callback, const std::string& version) { |
+ scoped_ptr<ScopedRefNPObject> callback, const std::string& version) { |
DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
NPVariant version_val = NPVariantFromString(version); |
- InvokeAndIgnoreResult(callback.get(), &version_val, 1); |
+ InvokeAndIgnoreResult(*callback, &version_val, 1); |
g_npnetscape_funcs->releasevariantvalue(&version_val); |
} |
void HostNPScriptObject::InvokeGetPairedClientsCallback( |
- const ScopedRefNPObject& callback, |
+ scoped_ptr<ScopedRefNPObject> callback, |
scoped_ptr<base::ListValue> paired_clients) { |
- if (!plugin_task_runner_->BelongsToCurrentThread()) { |
- plugin_task_runner_->PostTask( |
- FROM_HERE, base::Bind( |
- &HostNPScriptObject::InvokeGetPairedClientsCallback, |
- weak_ptr_, callback, base::Passed(&paired_clients))); |
- return; |
- } |
+ DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
std::string paired_clients_json; |
base::JSONWriter::Write(paired_clients.get(), &paired_clients_json); |
NPVariant paired_clients_val = NPVariantFromString(paired_clients_json); |
- InvokeAndIgnoreResult(callback.get(), &paired_clients_val, 1); |
+ InvokeAndIgnoreResult(*callback, &paired_clients_val, 1); |
g_npnetscape_funcs->releasevariantvalue(&paired_clients_val); |
} |
void HostNPScriptObject::InvokeGetUsageStatsConsentCallback( |
- const ScopedRefNPObject& callback, |
+ scoped_ptr<ScopedRefNPObject> callback, |
const DaemonController::UsageStatsConsent& consent) { |
DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
@@ -1624,7 +1622,7 @@ void HostNPScriptObject::InvokeGetUsageStatsConsentCallback( |
BOOLEAN_TO_NPVARIANT(consent.supported, params[0]); |
BOOLEAN_TO_NPVARIANT(consent.allowed, params[1]); |
BOOLEAN_TO_NPVARIANT(consent.set_by_policy, params[2]); |
- InvokeAndIgnoreResult(callback.get(), params, arraysize(params)); |
+ InvokeAndIgnoreResult(*callback, params, arraysize(params)); |
g_npnetscape_funcs->releasevariantvalue(&(params[0])); |
g_npnetscape_funcs->releasevariantvalue(&(params[1])); |
g_npnetscape_funcs->releasevariantvalue(&(params[2])); |
@@ -1637,7 +1635,7 @@ void HostNPScriptObject::LogDebugInfo(const std::string& message) { |
am_currently_logging_ = true; |
NPVariant log_message; |
STRINGZ_TO_NPVARIANT(message.c_str(), log_message); |
- bool is_good = InvokeAndIgnoreResult(log_debug_info_func_.get(), |
+ bool is_good = InvokeAndIgnoreResult(log_debug_info_func_, |
&log_message, 1); |
if (!is_good) { |
LOG(ERROR) << "ERROR - LogDebugInfo failed\n"; |
@@ -1646,13 +1644,13 @@ void HostNPScriptObject::LogDebugInfo(const std::string& message) { |
} |
} |
-bool HostNPScriptObject::InvokeAndIgnoreResult(NPObject* func, |
+bool HostNPScriptObject::InvokeAndIgnoreResult(const ScopedRefNPObject& func, |
const NPVariant* args, |
uint32_t arg_count) { |
DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
NPVariant np_result; |
- bool is_good = g_npnetscape_funcs->invokeDefault(plugin_, func, args, |
+ bool is_good = g_npnetscape_funcs->invokeDefault(plugin_, func.get(), args, |
arg_count, &np_result); |
if (is_good) |
g_npnetscape_funcs->releasevariantvalue(&np_result); |