| 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 a74f498118b72f22b739dffb1d6bd453be248e1e..dc6c450e4baa688c5aabb34204c7a367ecb7f863 100644
 | 
| --- a/remoting/host/plugin/host_script_object.cc
 | 
| +++ b/remoting/host/plugin/host_script_object.cc
 | 
| @@ -54,6 +54,7 @@ const char* kFuncNameGenerateKeyPair = "generateKeyPair";
 | 
|  const char* kFuncNameUpdateDaemonConfig = "updateDaemonConfig";
 | 
|  const char* kFuncNameGetDaemonConfig = "getDaemonConfig";
 | 
|  const char* kFuncNameGetDaemonVersion = "getDaemonVersion";
 | 
| +const char* kFuncNameGetUsageStatsConsent = "getUsageStatsConsent";
 | 
|  const char* kFuncNameStartDaemon = "startDaemon";
 | 
|  const char* kFuncNameStopDaemon = "stopDaemon";
 | 
|  
 | 
| @@ -163,6 +164,7 @@ bool HostNPScriptObject::HasMethod(const std::string& method_name) {
 | 
|            method_name == kFuncNameUpdateDaemonConfig ||
 | 
|            method_name == kFuncNameGetDaemonConfig ||
 | 
|            method_name == kFuncNameGetDaemonVersion ||
 | 
| +          method_name == kFuncNameGetUsageStatsConsent ||
 | 
|            method_name == kFuncNameStartDaemon ||
 | 
|            method_name == kFuncNameStopDaemon);
 | 
|  }
 | 
| @@ -200,6 +202,8 @@ bool HostNPScriptObject::Invoke(const std::string& method_name,
 | 
|      return GetDaemonConfig(args, arg_count, result);
 | 
|    } else if (method_name == kFuncNameGetDaemonVersion) {
 | 
|      return GetDaemonVersion(args, arg_count, result);
 | 
| +  } else if (method_name == kFuncNameGetUsageStatsConsent) {
 | 
| +    return GetUsageStatsConsent(args, arg_count, result);
 | 
|    } else if (method_name == kFuncNameStartDaemon) {
 | 
|      return StartDaemon(args, arg_count, result);
 | 
|    } else if (method_name == kFuncNameStopDaemon) {
 | 
| @@ -373,6 +377,7 @@ bool HostNPScriptObject::Enumerate(std::vector<std::string>* values) {
 | 
|      kFuncNameUpdateDaemonConfig,
 | 
|      kFuncNameGetDaemonConfig,
 | 
|      kFuncNameGetDaemonVersion,
 | 
| +    kFuncNameGetUsageStatsConsent,
 | 
|      kFuncNameStartDaemon,
 | 
|      kFuncNameStopDaemon
 | 
|    };
 | 
| @@ -762,10 +767,32 @@ bool HostNPScriptObject::GetDaemonVersion(const NPVariant* args,
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| +bool HostNPScriptObject::GetUsageStatsConsent(const NPVariant* args,
 | 
| +                                              uint32_t arg_count,
 | 
| +                                              NPVariant* result) {
 | 
| +  if (arg_count != 1) {
 | 
| +    SetException("getUsageStatsConsent: bad number of arguments");
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0]));
 | 
| +  if (!callback_obj.get()) {
 | 
| +    SetException("getUsageStatsConsent: invalid callback parameter");
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  // We control lifetime of the |daemon_controller_| so it's safe to
 | 
| +  // use base::Unretained() here.
 | 
| +  daemon_controller_->GetUsageStatsConsent(
 | 
| +      base::Bind(&HostNPScriptObject::InvokeGetUsageStatsConsentCallback,
 | 
| +                 base::Unretained(this), callback_obj));
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
|  bool HostNPScriptObject::StartDaemon(const NPVariant* args,
 | 
|                                       uint32_t arg_count,
 | 
|                                       NPVariant* result) {
 | 
| -  if (arg_count != 2) {
 | 
| +  if (arg_count != 3) {
 | 
|      SetException("startDaemon: bad number of arguments");
 | 
|      return false;
 | 
|    }
 | 
| @@ -775,13 +802,18 @@ bool HostNPScriptObject::StartDaemon(const NPVariant* args,
 | 
|        base::JSONReader::Read(config_str, base::JSON_ALLOW_TRAILING_COMMAS));
 | 
|    if (config_str.empty() || !config.get() ||
 | 
|        !config->IsType(base::Value::TYPE_DICTIONARY)) {
 | 
| -    SetException("updateDaemonConfig: bad config parameter");
 | 
| +    SetException("startDaemon: bad config parameter");
 | 
|      return false;
 | 
|    }
 | 
|    scoped_ptr<base::DictionaryValue> config_dict(
 | 
|        reinterpret_cast<base::DictionaryValue*>(config.release()));
 | 
|  
 | 
| -  ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[1]));
 | 
| +  if (!NPVARIANT_IS_BOOLEAN(args[1])) {
 | 
| +    SetException("startDaemon: invalid consent parameter");
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[2]));
 | 
|    if (!callback_obj.get()) {
 | 
|      SetException("startDaemon: invalid callback parameter");
 | 
|      return false;
 | 
| @@ -789,6 +821,7 @@ 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));
 | 
|    return true;
 | 
| @@ -1142,6 +1175,30 @@ void HostNPScriptObject::InvokeGetDaemonVersionCallback(
 | 
|    g_npnetscape_funcs->releasevariantvalue(&version_val);
 | 
|  }
 | 
|  
 | 
| +void HostNPScriptObject::InvokeGetUsageStatsConsentCallback(
 | 
| +    const ScopedRefNPObject& callback,
 | 
| +    bool supported,
 | 
| +    bool allowed,
 | 
| +    bool set_by_policy) {
 | 
| +  if (!plugin_message_loop_proxy_->BelongsToCurrentThread()) {
 | 
| +    plugin_message_loop_proxy_->PostTask(
 | 
| +        FROM_HERE, base::Bind(
 | 
| +            &HostNPScriptObject::InvokeGetUsageStatsConsentCallback,
 | 
| +            base::Unretained(this), callback, supported, allowed,
 | 
| +            set_by_policy));
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  NPVariant params[3];
 | 
| +  BOOLEAN_TO_NPVARIANT(supported, params[0]);
 | 
| +  BOOLEAN_TO_NPVARIANT(allowed, params[1]);
 | 
| +  BOOLEAN_TO_NPVARIANT(set_by_policy, params[2]);
 | 
| +  InvokeAndIgnoreResult(callback.get(), params, arraysize(params));
 | 
| +  g_npnetscape_funcs->releasevariantvalue(&(params[0]));
 | 
| +  g_npnetscape_funcs->releasevariantvalue(&(params[1]));
 | 
| +  g_npnetscape_funcs->releasevariantvalue(&(params[2]));
 | 
| +}
 | 
| +
 | 
|  void HostNPScriptObject::LogDebugInfo(const std::string& message) {
 | 
|    DCHECK(plugin_message_loop_proxy_->BelongsToCurrentThread());
 | 
|    if (log_debug_info_func_.get()) {
 | 
| 
 |