OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/host/plugin/host_script_object.h" | 5 #include "remoting/host/plugin/host_script_object.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1095 if (arg_count != 1) { | 1095 if (arg_count != 1) { |
1096 SetException("clearPairedClients: bad number of arguments"); | 1096 SetException("clearPairedClients: bad number of arguments"); |
1097 return false; | 1097 return false; |
1098 } | 1098 } |
1099 | 1099 |
1100 if (!NPVARIANT_IS_OBJECT(args[0])) { | 1100 if (!NPVARIANT_IS_OBJECT(args[0])) { |
1101 SetException("clearPairedClients: invalid callback parameter"); | 1101 SetException("clearPairedClients: invalid callback parameter"); |
1102 return false; | 1102 return false; |
1103 } | 1103 } |
1104 | 1104 |
1105 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); | 1105 scoped_ptr<ScopedRefNPObject> callback_obj( |
| 1106 new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
1106 if (pairing_registry_) { | 1107 if (pairing_registry_) { |
1107 pairing_registry_->ClearAllPairings( | 1108 pairing_registry_->ClearAllPairings( |
1108 base::Bind(&HostNPScriptObject::InvokeBooleanCallback, weak_ptr_, | 1109 base::Bind(&HostNPScriptObject::InvokeBooleanCallback, weak_ptr_, |
1109 callback_obj)); | 1110 base::Passed(&callback_obj))); |
1110 } else { | 1111 } else { |
1111 InvokeBooleanCallback(callback_obj, false); | 1112 InvokeBooleanCallback(callback_obj.Pass(), false); |
1112 } | 1113 } |
1113 | 1114 |
1114 return true; | 1115 return true; |
1115 } | 1116 } |
1116 | 1117 |
1117 bool HostNPScriptObject::DeletePairedClient(const NPVariant* args, | 1118 bool HostNPScriptObject::DeletePairedClient(const NPVariant* args, |
1118 uint32_t arg_count, | 1119 uint32_t arg_count, |
1119 NPVariant* result) { | 1120 NPVariant* result) { |
1120 if (arg_count != 2) { | 1121 if (arg_count != 2) { |
1121 SetException("deletePairedClient: bad number of arguments"); | 1122 SetException("deletePairedClient: bad number of arguments"); |
1122 return false; | 1123 return false; |
1123 } | 1124 } |
1124 | 1125 |
1125 if (!NPVARIANT_IS_STRING(args[0])) { | 1126 if (!NPVARIANT_IS_STRING(args[0])) { |
1126 SetException("deletePairedClient: bad clientId parameter"); | 1127 SetException("deletePairedClient: bad clientId parameter"); |
1127 return false; | 1128 return false; |
1128 } | 1129 } |
1129 | 1130 |
1130 if (!NPVARIANT_IS_OBJECT(args[1])) { | 1131 if (!NPVARIANT_IS_OBJECT(args[1])) { |
1131 SetException("deletePairedClient: invalid callback parameter"); | 1132 SetException("deletePairedClient: invalid callback parameter"); |
1132 return false; | 1133 return false; |
1133 } | 1134 } |
1134 | 1135 |
1135 std::string client_id = StringFromNPVariant(args[0]); | 1136 std::string client_id = StringFromNPVariant(args[0]); |
1136 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[1])); | 1137 scoped_ptr<ScopedRefNPObject> callback_obj( |
| 1138 new ScopedRefNPObject(ObjectFromNPVariant(args[1]))); |
1137 if (pairing_registry_) { | 1139 if (pairing_registry_) { |
1138 pairing_registry_->DeletePairing( | 1140 pairing_registry_->DeletePairing( |
1139 client_id, | 1141 client_id, |
1140 base::Bind(&HostNPScriptObject::InvokeBooleanCallback, | 1142 base::Bind(&HostNPScriptObject::InvokeBooleanCallback, |
1141 weak_ptr_, callback_obj)); | 1143 weak_ptr_, base::Passed(&callback_obj))); |
1142 } else { | 1144 } else { |
1143 InvokeBooleanCallback(callback_obj, false); | 1145 InvokeBooleanCallback(callback_obj.Pass(), false); |
1144 } | 1146 } |
1145 | 1147 |
1146 return true; | 1148 return true; |
1147 } | 1149 } |
1148 | 1150 |
1149 bool HostNPScriptObject::GetHostName(const NPVariant* args, | 1151 bool HostNPScriptObject::GetHostName(const NPVariant* args, |
1150 uint32_t arg_count, | 1152 uint32_t arg_count, |
1151 NPVariant* result) { | 1153 NPVariant* result) { |
1152 if (arg_count != 1) { | 1154 if (arg_count != 1) { |
1153 SetException("getHostName: bad number of arguments"); | 1155 SetException("getHostName: bad number of arguments"); |
1154 return false; | 1156 return false; |
1155 } | 1157 } |
1156 | 1158 |
1157 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); | 1159 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); |
1158 if (!callback_obj.get()) { | 1160 if (!callback_obj.get()) { |
1159 SetException("getHostName: invalid callback parameter"); | 1161 SetException("getHostName: invalid callback parameter"); |
1160 return false; | 1162 return false; |
1161 } | 1163 } |
1162 | 1164 |
1163 NPVariant host_name_val = NPVariantFromString(net::GetHostName()); | 1165 NPVariant host_name_val = NPVariantFromString(net::GetHostName()); |
1164 InvokeAndIgnoreResult(callback_obj.get(), &host_name_val, 1); | 1166 InvokeAndIgnoreResult(callback_obj, &host_name_val, 1); |
1165 g_npnetscape_funcs->releasevariantvalue(&host_name_val); | 1167 g_npnetscape_funcs->releasevariantvalue(&host_name_val); |
1166 | 1168 |
1167 return true; | 1169 return true; |
1168 } | 1170 } |
1169 | 1171 |
1170 bool HostNPScriptObject::GetPinHash(const NPVariant* args, | 1172 bool HostNPScriptObject::GetPinHash(const NPVariant* args, |
1171 uint32_t arg_count, | 1173 uint32_t arg_count, |
1172 NPVariant* result) { | 1174 NPVariant* result) { |
1173 if (arg_count != 3) { | 1175 if (arg_count != 3) { |
1174 SetException("getPinHash: bad number of arguments"); | 1176 SetException("getPinHash: bad number of arguments"); |
(...skipping 13 matching lines...) Expand all Loading... |
1188 std::string pin = StringFromNPVariant(args[1]); | 1190 std::string pin = StringFromNPVariant(args[1]); |
1189 | 1191 |
1190 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[2])); | 1192 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[2])); |
1191 if (!callback_obj.get()) { | 1193 if (!callback_obj.get()) { |
1192 SetException("getPinHash: invalid callback parameter"); | 1194 SetException("getPinHash: invalid callback parameter"); |
1193 return false; | 1195 return false; |
1194 } | 1196 } |
1195 | 1197 |
1196 NPVariant pin_hash_val = NPVariantFromString( | 1198 NPVariant pin_hash_val = NPVariantFromString( |
1197 remoting::MakeHostPinHash(host_id, pin)); | 1199 remoting::MakeHostPinHash(host_id, pin)); |
1198 InvokeAndIgnoreResult(callback_obj.get(), &pin_hash_val, 1); | 1200 InvokeAndIgnoreResult(callback_obj, &pin_hash_val, 1); |
1199 g_npnetscape_funcs->releasevariantvalue(&pin_hash_val); | 1201 g_npnetscape_funcs->releasevariantvalue(&pin_hash_val); |
1200 | 1202 |
1201 return true; | 1203 return true; |
1202 } | 1204 } |
1203 | 1205 |
1204 bool HostNPScriptObject::GenerateKeyPair(const NPVariant* args, | 1206 bool HostNPScriptObject::GenerateKeyPair(const NPVariant* args, |
1205 uint32_t arg_count, | 1207 uint32_t arg_count, |
1206 NPVariant* result) { | 1208 NPVariant* result) { |
1207 if (arg_count != 1) { | 1209 if (arg_count != 1) { |
1208 SetException("generateKeyPair: bad number of arguments"); | 1210 SetException("generateKeyPair: bad number of arguments"); |
1209 return false; | 1211 return false; |
1210 } | 1212 } |
1211 | 1213 |
1212 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); | 1214 scoped_ptr<ScopedRefNPObject> callback_obj( |
1213 if (!callback_obj.get()) { | 1215 new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
| 1216 if (!callback_obj->get()) { |
1214 SetException("generateKeyPair: invalid callback parameter"); | 1217 SetException("generateKeyPair: invalid callback parameter"); |
1215 return false; | 1218 return false; |
1216 } | 1219 } |
1217 | 1220 |
1218 // TODO(wez): HostNPScriptObject needn't be touched on worker | 1221 base::Callback<void (const std::string&, |
1219 // thread, so make DoGenerateKeyPair static and pass it a callback | 1222 const std::string&)> wrapped_callback = |
1220 // to run (crbug.com/156257). | 1223 base::Bind(&HostNPScriptObject::InvokeGenerateKeyPairCallback, weak_ptr_, |
| 1224 base::Passed(&callback_obj)); |
1221 worker_thread_->PostTask( | 1225 worker_thread_->PostTask( |
1222 FROM_HERE, base::Bind(&HostNPScriptObject::DoGenerateKeyPair, | 1226 FROM_HERE, base::Bind(&HostNPScriptObject::DoGenerateKeyPair, |
1223 base::Unretained(this), callback_obj)); | 1227 plugin_task_runner_, wrapped_callback)); |
1224 return true; | 1228 return true; |
1225 } | 1229 } |
1226 | 1230 |
1227 bool HostNPScriptObject::UpdateDaemonConfig(const NPVariant* args, | 1231 bool HostNPScriptObject::UpdateDaemonConfig(const NPVariant* args, |
1228 uint32_t arg_count, | 1232 uint32_t arg_count, |
1229 NPVariant* result) { | 1233 NPVariant* result) { |
1230 if (arg_count != 2) { | 1234 if (arg_count != 2) { |
1231 SetException("updateDaemonConfig: bad number of arguments"); | 1235 SetException("updateDaemonConfig: bad number of arguments"); |
1232 return false; | 1236 return false; |
1233 } | 1237 } |
1234 | 1238 |
1235 std::string config_str = StringFromNPVariant(args[0]); | 1239 std::string config_str = StringFromNPVariant(args[0]); |
1236 scoped_ptr<base::Value> config( | 1240 scoped_ptr<base::Value> config( |
1237 base::JSONReader::Read(config_str, base::JSON_ALLOW_TRAILING_COMMAS)); | 1241 base::JSONReader::Read(config_str, base::JSON_ALLOW_TRAILING_COMMAS)); |
1238 if (config_str.empty() || !config.get() || | 1242 if (config_str.empty() || !config.get() || |
1239 !config->IsType(base::Value::TYPE_DICTIONARY)) { | 1243 !config->IsType(base::Value::TYPE_DICTIONARY)) { |
1240 SetException("updateDaemonConfig: bad config parameter"); | 1244 SetException("updateDaemonConfig: bad config parameter"); |
1241 return false; | 1245 return false; |
1242 } | 1246 } |
1243 scoped_ptr<base::DictionaryValue> config_dict( | 1247 scoped_ptr<base::DictionaryValue> config_dict( |
1244 reinterpret_cast<base::DictionaryValue*>(config.release())); | 1248 reinterpret_cast<base::DictionaryValue*>(config.release())); |
1245 | 1249 |
1246 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[1])); | 1250 scoped_ptr<ScopedRefNPObject> callback_obj( |
1247 if (!callback_obj.get()) { | 1251 new ScopedRefNPObject(ObjectFromNPVariant(args[1]))); |
| 1252 if (!callback_obj->get()) { |
1248 SetException("updateDaemonConfig: invalid callback parameter"); | 1253 SetException("updateDaemonConfig: invalid callback parameter"); |
1249 return false; | 1254 return false; |
1250 } | 1255 } |
1251 | 1256 |
1252 if (config_dict->HasKey(kHostIdConfigPath) || | 1257 if (config_dict->HasKey(kHostIdConfigPath) || |
1253 config_dict->HasKey(kXmppLoginConfigPath)) { | 1258 config_dict->HasKey(kXmppLoginConfigPath)) { |
1254 SetException("updateDaemonConfig: trying to update immutable config " | 1259 SetException("updateDaemonConfig: trying to update immutable config " |
1255 "parameters"); | 1260 "parameters"); |
1256 return false; | 1261 return false; |
1257 } | 1262 } |
1258 | 1263 |
1259 daemon_controller_->UpdateConfig( | 1264 daemon_controller_->UpdateConfig( |
1260 config_dict.Pass(), | 1265 config_dict.Pass(), |
1261 base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, | 1266 base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, weak_ptr_, |
1262 base::Unretained(this), callback_obj)); | 1267 base::Passed(&callback_obj))); |
1263 return true; | 1268 return true; |
1264 } | 1269 } |
1265 | 1270 |
1266 bool HostNPScriptObject::GetDaemonConfig(const NPVariant* args, | 1271 bool HostNPScriptObject::GetDaemonConfig(const NPVariant* args, |
1267 uint32_t arg_count, | 1272 uint32_t arg_count, |
1268 NPVariant* result) { | 1273 NPVariant* result) { |
1269 if (arg_count != 1) { | 1274 if (arg_count != 1) { |
1270 SetException("getDaemonConfig: bad number of arguments"); | 1275 SetException("getDaemonConfig: bad number of arguments"); |
1271 return false; | 1276 return false; |
1272 } | 1277 } |
1273 | 1278 |
1274 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); | 1279 scoped_ptr<ScopedRefNPObject> callback_obj( |
1275 if (!callback_obj.get()) { | 1280 new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
| 1281 if (!callback_obj->get()) { |
1276 SetException("getDaemonConfig: invalid callback parameter"); | 1282 SetException("getDaemonConfig: invalid callback parameter"); |
1277 return false; | 1283 return false; |
1278 } | 1284 } |
1279 | 1285 |
1280 daemon_controller_->GetConfig( | 1286 daemon_controller_->GetConfig( |
1281 base::Bind(&HostNPScriptObject::InvokeGetDaemonConfigCallback, | 1287 base::Bind(&HostNPScriptObject::InvokeGetDaemonConfigCallback, weak_ptr_, |
1282 base::Unretained(this), callback_obj)); | 1288 base::Passed(&callback_obj))); |
1283 | |
1284 return true; | 1289 return true; |
1285 } | 1290 } |
1286 | 1291 |
1287 bool HostNPScriptObject::GetDaemonVersion(const NPVariant* args, | 1292 bool HostNPScriptObject::GetDaemonVersion(const NPVariant* args, |
1288 uint32_t arg_count, | 1293 uint32_t arg_count, |
1289 NPVariant* result) { | 1294 NPVariant* result) { |
1290 if (arg_count != 1) { | 1295 if (arg_count != 1) { |
1291 SetException("getDaemonVersion: bad number of arguments"); | 1296 SetException("getDaemonVersion: bad number of arguments"); |
1292 return false; | 1297 return false; |
1293 } | 1298 } |
1294 | 1299 |
1295 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); | 1300 scoped_ptr<ScopedRefNPObject> callback_obj( |
1296 if (!callback_obj.get()) { | 1301 new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
| 1302 if (!callback_obj->get()) { |
1297 SetException("getDaemonVersion: invalid callback parameter"); | 1303 SetException("getDaemonVersion: invalid callback parameter"); |
1298 return false; | 1304 return false; |
1299 } | 1305 } |
1300 | 1306 |
1301 daemon_controller_->GetVersion( | 1307 daemon_controller_->GetVersion( |
1302 base::Bind(&HostNPScriptObject::InvokeGetDaemonVersionCallback, | 1308 base::Bind(&HostNPScriptObject::InvokeGetDaemonVersionCallback, weak_ptr_, |
1303 base::Unretained(this), callback_obj)); | 1309 base::Passed(&callback_obj))); |
1304 | 1310 |
1305 return true; | 1311 return true; |
1306 } | 1312 } |
1307 | 1313 |
1308 bool HostNPScriptObject::GetPairedClients(const NPVariant* args, | 1314 bool HostNPScriptObject::GetPairedClients(const NPVariant* args, |
1309 uint32_t arg_count, | 1315 uint32_t arg_count, |
1310 NPVariant* result) { | 1316 NPVariant* result) { |
1311 if (arg_count != 1) { | 1317 if (arg_count != 1) { |
1312 SetException("getPairedClients: bad number of arguments"); | 1318 SetException("getPairedClients: bad number of arguments"); |
1313 return false; | 1319 return false; |
1314 } | 1320 } |
1315 | 1321 |
1316 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); | 1322 scoped_ptr<ScopedRefNPObject> callback_obj( |
1317 if (!callback_obj.get()) { | 1323 new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
| 1324 if (!callback_obj->get()) { |
1318 SetException("getPairedClients: invalid callback parameter"); | 1325 SetException("getPairedClients: invalid callback parameter"); |
1319 return false; | 1326 return false; |
1320 } | 1327 } |
1321 | 1328 |
1322 if (pairing_registry_) { | 1329 if (pairing_registry_) { |
1323 pairing_registry_->GetAllPairings( | 1330 pairing_registry_->GetAllPairings( |
1324 base::Bind(&HostNPScriptObject::InvokeGetPairedClientsCallback, | 1331 base::Bind(&HostNPScriptObject::InvokeGetPairedClientsCallback, |
1325 weak_ptr_, callback_obj)); | 1332 weak_ptr_, base::Passed(&callback_obj))); |
1326 } else { | 1333 } else { |
1327 scoped_ptr<base::ListValue> no_paired_clients(new base::ListValue); | 1334 scoped_ptr<base::ListValue> no_paired_clients(new base::ListValue); |
1328 InvokeGetPairedClientsCallback(callback_obj, no_paired_clients.Pass()); | 1335 InvokeGetPairedClientsCallback(callback_obj.Pass(), |
| 1336 no_paired_clients.Pass()); |
1329 } | 1337 } |
1330 return true; | 1338 return true; |
1331 } | 1339 } |
1332 | 1340 |
1333 bool HostNPScriptObject::GetUsageStatsConsent(const NPVariant* args, | 1341 bool HostNPScriptObject::GetUsageStatsConsent(const NPVariant* args, |
1334 uint32_t arg_count, | 1342 uint32_t arg_count, |
1335 NPVariant* result) { | 1343 NPVariant* result) { |
1336 if (arg_count != 1) { | 1344 if (arg_count != 1) { |
1337 SetException("getUsageStatsConsent: bad number of arguments"); | 1345 SetException("getUsageStatsConsent: bad number of arguments"); |
1338 return false; | 1346 return false; |
1339 } | 1347 } |
1340 | 1348 |
1341 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); | 1349 scoped_ptr<ScopedRefNPObject> callback_obj( |
1342 if (!callback_obj.get()) { | 1350 new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
| 1351 if (!callback_obj->get()) { |
1343 SetException("getUsageStatsConsent: invalid callback parameter"); | 1352 SetException("getUsageStatsConsent: invalid callback parameter"); |
1344 return false; | 1353 return false; |
1345 } | 1354 } |
1346 | 1355 |
1347 daemon_controller_->GetUsageStatsConsent( | 1356 daemon_controller_->GetUsageStatsConsent( |
1348 base::Bind(&HostNPScriptObject::InvokeGetUsageStatsConsentCallback, | 1357 base::Bind(&HostNPScriptObject::InvokeGetUsageStatsConsentCallback, |
1349 base::Unretained(this), callback_obj)); | 1358 weak_ptr_, base::Passed(&callback_obj))); |
1350 return true; | 1359 return true; |
1351 } | 1360 } |
1352 | 1361 |
1353 bool HostNPScriptObject::StartDaemon(const NPVariant* args, | 1362 bool HostNPScriptObject::StartDaemon(const NPVariant* args, |
1354 uint32_t arg_count, | 1363 uint32_t arg_count, |
1355 NPVariant* result) { | 1364 NPVariant* result) { |
1356 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1365 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1357 | 1366 |
1358 if (arg_count != 3) { | 1367 if (arg_count != 3) { |
1359 SetException("startDaemon: bad number of arguments"); | 1368 SetException("startDaemon: bad number of arguments"); |
1360 return false; | 1369 return false; |
1361 } | 1370 } |
1362 | 1371 |
1363 std::string config_str = StringFromNPVariant(args[0]); | 1372 std::string config_str = StringFromNPVariant(args[0]); |
1364 scoped_ptr<base::Value> config( | 1373 scoped_ptr<base::Value> config( |
1365 base::JSONReader::Read(config_str, base::JSON_ALLOW_TRAILING_COMMAS)); | 1374 base::JSONReader::Read(config_str, base::JSON_ALLOW_TRAILING_COMMAS)); |
1366 if (config_str.empty() || !config.get() || | 1375 if (config_str.empty() || !config.get() || |
1367 !config->IsType(base::Value::TYPE_DICTIONARY)) { | 1376 !config->IsType(base::Value::TYPE_DICTIONARY)) { |
1368 SetException("startDaemon: bad config parameter"); | 1377 SetException("startDaemon: bad config parameter"); |
1369 return false; | 1378 return false; |
1370 } | 1379 } |
1371 scoped_ptr<base::DictionaryValue> config_dict( | 1380 scoped_ptr<base::DictionaryValue> config_dict( |
1372 reinterpret_cast<base::DictionaryValue*>(config.release())); | 1381 reinterpret_cast<base::DictionaryValue*>(config.release())); |
1373 | 1382 |
1374 if (!NPVARIANT_IS_BOOLEAN(args[1])) { | 1383 if (!NPVARIANT_IS_BOOLEAN(args[1])) { |
1375 SetException("startDaemon: invalid consent parameter"); | 1384 SetException("startDaemon: invalid consent parameter"); |
1376 return false; | 1385 return false; |
1377 } | 1386 } |
1378 | 1387 |
1379 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[2])); | 1388 scoped_ptr<ScopedRefNPObject> callback_obj( |
1380 if (!callback_obj.get()) { | 1389 new ScopedRefNPObject(ObjectFromNPVariant(args[2]))); |
| 1390 if (!callback_obj->get()) { |
1381 SetException("startDaemon: invalid callback parameter"); | 1391 SetException("startDaemon: invalid callback parameter"); |
1382 return false; | 1392 return false; |
1383 } | 1393 } |
1384 | 1394 |
1385 daemon_controller_->SetConfigAndStart( | 1395 daemon_controller_->SetConfigAndStart( |
1386 config_dict.Pass(), | 1396 config_dict.Pass(), |
1387 NPVARIANT_TO_BOOLEAN(args[1]), | 1397 NPVARIANT_TO_BOOLEAN(args[1]), |
1388 base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, | 1398 base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, weak_ptr_, |
1389 base::Unretained(this), callback_obj)); | 1399 base::Passed(&callback_obj))); |
1390 return true; | 1400 return true; |
1391 } | 1401 } |
1392 | 1402 |
1393 bool HostNPScriptObject::StopDaemon(const NPVariant* args, | 1403 bool HostNPScriptObject::StopDaemon(const NPVariant* args, |
1394 uint32_t arg_count, | 1404 uint32_t arg_count, |
1395 NPVariant* result) { | 1405 NPVariant* result) { |
1396 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1406 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1397 | 1407 |
1398 if (arg_count != 1) { | 1408 if (arg_count != 1) { |
1399 SetException("stopDaemon: bad number of arguments"); | 1409 SetException("stopDaemon: bad number of arguments"); |
1400 return false; | 1410 return false; |
1401 } | 1411 } |
1402 | 1412 |
1403 ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); | 1413 scoped_ptr<ScopedRefNPObject> callback_obj( |
1404 if (!callback_obj.get()) { | 1414 new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
| 1415 if (!callback_obj->get()) { |
1405 SetException("stopDaemon: invalid callback parameter"); | 1416 SetException("stopDaemon: invalid callback parameter"); |
1406 return false; | 1417 return false; |
1407 } | 1418 } |
1408 | 1419 |
1409 daemon_controller_->Stop( | 1420 daemon_controller_->Stop( |
1410 base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, | 1421 base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, weak_ptr_, |
1411 base::Unretained(this), callback_obj)); | 1422 base::Passed(&callback_obj))); |
1412 return true; | 1423 return true; |
1413 } | 1424 } |
1414 | 1425 |
1415 void HostNPScriptObject::NotifyStateChanged(State state) { | 1426 void HostNPScriptObject::NotifyStateChanged(State state) { |
1416 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1427 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1417 | 1428 |
1418 state_ = state; | 1429 state_ = state; |
1419 | 1430 |
1420 if (on_state_changed_func_.get()) { | 1431 if (on_state_changed_func_.get()) { |
1421 NPVariant state_var; | 1432 NPVariant state_var; |
1422 INT32_TO_NPVARIANT(state, state_var); | 1433 INT32_TO_NPVARIANT(state, state_var); |
1423 InvokeAndIgnoreResult(on_state_changed_func_.get(), &state_var, 1); | 1434 InvokeAndIgnoreResult(on_state_changed_func_, &state_var, 1); |
1424 } | 1435 } |
1425 } | 1436 } |
1426 | 1437 |
1427 void HostNPScriptObject::NotifyNatPolicyChanged(bool nat_traversal_enabled) { | 1438 void HostNPScriptObject::NotifyNatPolicyChanged(bool nat_traversal_enabled) { |
1428 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1439 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1429 | 1440 |
1430 if (on_nat_traversal_policy_changed_func_.get()) { | 1441 if (on_nat_traversal_policy_changed_func_.get()) { |
1431 NPVariant policy; | 1442 NPVariant policy; |
1432 BOOLEAN_TO_NPVARIANT(nat_traversal_enabled, policy); | 1443 BOOLEAN_TO_NPVARIANT(nat_traversal_enabled, policy); |
1433 InvokeAndIgnoreResult(on_nat_traversal_policy_changed_func_.get(), | 1444 InvokeAndIgnoreResult(on_nat_traversal_policy_changed_func_, |
1434 &policy, 1); | 1445 &policy, 1); |
1435 } | 1446 } |
1436 } | 1447 } |
1437 | 1448 |
1438 // Stores the Access Code for the web-app to query. | 1449 // Stores the Access Code for the web-app to query. |
1439 void HostNPScriptObject::StoreAccessCode(const std::string& access_code, | 1450 void HostNPScriptObject::StoreAccessCode(const std::string& access_code, |
1440 base::TimeDelta access_code_lifetime) { | 1451 base::TimeDelta access_code_lifetime) { |
1441 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1452 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1442 | 1453 |
1443 access_code_ = access_code; | 1454 access_code_ = access_code; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1511 std::string translation = StringFromNPVariant(np_result); | 1522 std::string translation = StringFromNPVariant(np_result); |
1512 g_npnetscape_funcs->releasevariantvalue(&np_result); | 1523 g_npnetscape_funcs->releasevariantvalue(&np_result); |
1513 if (translation.empty()) { | 1524 if (translation.empty()) { |
1514 LOG(ERROR) << "Missing translation for " << tag; | 1525 LOG(ERROR) << "Missing translation for " << tag; |
1515 return false; | 1526 return false; |
1516 } | 1527 } |
1517 *result = UTF8ToUTF16(translation); | 1528 *result = UTF8ToUTF16(translation); |
1518 return true; | 1529 return true; |
1519 } | 1530 } |
1520 | 1531 |
1521 void HostNPScriptObject::DoGenerateKeyPair(const ScopedRefNPObject& callback) { | 1532 // static |
| 1533 void HostNPScriptObject::DoGenerateKeyPair( |
| 1534 const scoped_refptr<AutoThreadTaskRunner>& plugin_task_runner, |
| 1535 const base::Callback<void (const std::string&, |
| 1536 const std::string&)>& callback) { |
1522 scoped_refptr<RsaKeyPair> key_pair = RsaKeyPair::Generate(); | 1537 scoped_refptr<RsaKeyPair> key_pair = RsaKeyPair::Generate(); |
1523 InvokeGenerateKeyPairCallback(callback, key_pair->ToString(), | 1538 plugin_task_runner->PostTask(FROM_HERE, |
1524 key_pair->GetPublicKey()); | 1539 base::Bind(callback, key_pair->ToString(), |
| 1540 key_pair->GetPublicKey())); |
1525 } | 1541 } |
1526 | 1542 |
1527 void HostNPScriptObject::InvokeGenerateKeyPairCallback( | 1543 void HostNPScriptObject::InvokeGenerateKeyPairCallback( |
1528 const ScopedRefNPObject& callback, | 1544 scoped_ptr<ScopedRefNPObject> callback, |
1529 const std::string& private_key, | 1545 const std::string& private_key, |
1530 const std::string& public_key) { | 1546 const std::string& public_key) { |
1531 if (!plugin_task_runner_->BelongsToCurrentThread()) { | 1547 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1532 plugin_task_runner_->PostTask( | |
1533 FROM_HERE, base::Bind( | |
1534 &HostNPScriptObject::InvokeGenerateKeyPairCallback, | |
1535 weak_ptr_, callback, private_key, public_key)); | |
1536 return; | |
1537 } | |
1538 | 1548 |
1539 NPVariant params[2]; | 1549 NPVariant params[2]; |
1540 params[0] = NPVariantFromString(private_key); | 1550 params[0] = NPVariantFromString(private_key); |
1541 params[1] = NPVariantFromString(public_key); | 1551 params[1] = NPVariantFromString(public_key); |
1542 InvokeAndIgnoreResult(callback.get(), params, arraysize(params)); | 1552 InvokeAndIgnoreResult(*callback, params, arraysize(params)); |
1543 g_npnetscape_funcs->releasevariantvalue(&(params[0])); | 1553 g_npnetscape_funcs->releasevariantvalue(&(params[0])); |
1544 g_npnetscape_funcs->releasevariantvalue(&(params[1])); | 1554 g_npnetscape_funcs->releasevariantvalue(&(params[1])); |
1545 } | 1555 } |
1546 | 1556 |
1547 void HostNPScriptObject::InvokeAsyncResultCallback( | 1557 void HostNPScriptObject::InvokeAsyncResultCallback( |
1548 const ScopedRefNPObject& callback, | 1558 scoped_ptr<ScopedRefNPObject> callback, |
1549 DaemonController::AsyncResult result) { | 1559 DaemonController::AsyncResult result) { |
1550 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1560 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1551 | 1561 |
1552 NPVariant result_var; | 1562 NPVariant result_var; |
1553 INT32_TO_NPVARIANT(static_cast<int32>(result), result_var); | 1563 INT32_TO_NPVARIANT(static_cast<int32>(result), result_var); |
1554 InvokeAndIgnoreResult(callback.get(), &result_var, 1); | 1564 InvokeAndIgnoreResult(*callback, &result_var, 1); |
1555 g_npnetscape_funcs->releasevariantvalue(&result_var); | 1565 g_npnetscape_funcs->releasevariantvalue(&result_var); |
1556 } | 1566 } |
1557 | 1567 |
1558 void HostNPScriptObject::InvokeBooleanCallback( | 1568 void HostNPScriptObject::InvokeBooleanCallback( |
1559 const ScopedRefNPObject& callback, bool result) { | 1569 scoped_ptr<ScopedRefNPObject> callback, bool result) { |
1560 if (!plugin_task_runner_->BelongsToCurrentThread()) { | 1570 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1561 plugin_task_runner_->PostTask( | |
1562 FROM_HERE, base::Bind( | |
1563 &HostNPScriptObject::InvokeBooleanCallback, | |
1564 weak_ptr_, callback, result)); | |
1565 return; | |
1566 } | |
1567 | 1571 |
1568 NPVariant result_var; | 1572 NPVariant result_var; |
1569 BOOLEAN_TO_NPVARIANT(result, result_var); | 1573 BOOLEAN_TO_NPVARIANT(result, result_var); |
1570 InvokeAndIgnoreResult(callback.get(), &result_var, 1); | 1574 InvokeAndIgnoreResult(*callback, &result_var, 1); |
1571 g_npnetscape_funcs->releasevariantvalue(&result_var); | 1575 g_npnetscape_funcs->releasevariantvalue(&result_var); |
1572 } | 1576 } |
1573 | 1577 |
1574 void HostNPScriptObject::InvokeGetDaemonConfigCallback( | 1578 void HostNPScriptObject::InvokeGetDaemonConfigCallback( |
1575 const ScopedRefNPObject& callback, | 1579 scoped_ptr<ScopedRefNPObject> callback, |
1576 scoped_ptr<base::DictionaryValue> config) { | 1580 scoped_ptr<base::DictionaryValue> config) { |
1577 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1581 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1578 | 1582 |
1579 // There is no easy way to create a dictionary from an NPAPI plugin | 1583 // There is no easy way to create a dictionary from an NPAPI plugin |
1580 // so we have to serialize the dictionary to pass it to JavaScript. | 1584 // so we have to serialize the dictionary to pass it to JavaScript. |
1581 std::string config_str; | 1585 std::string config_str; |
1582 if (config.get()) | 1586 if (config.get()) |
1583 base::JSONWriter::Write(config.get(), &config_str); | 1587 base::JSONWriter::Write(config.get(), &config_str); |
1584 | 1588 |
1585 NPVariant config_val = NPVariantFromString(config_str); | 1589 NPVariant config_val = NPVariantFromString(config_str); |
1586 InvokeAndIgnoreResult(callback.get(), &config_val, 1); | 1590 InvokeAndIgnoreResult(*callback, &config_val, 1); |
1587 g_npnetscape_funcs->releasevariantvalue(&config_val); | 1591 g_npnetscape_funcs->releasevariantvalue(&config_val); |
1588 } | 1592 } |
1589 | 1593 |
1590 void HostNPScriptObject::InvokeGetDaemonVersionCallback( | 1594 void HostNPScriptObject::InvokeGetDaemonVersionCallback( |
1591 const ScopedRefNPObject& callback, const std::string& version) { | 1595 scoped_ptr<ScopedRefNPObject> callback, const std::string& version) { |
1592 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1596 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1593 | 1597 |
1594 NPVariant version_val = NPVariantFromString(version); | 1598 NPVariant version_val = NPVariantFromString(version); |
1595 InvokeAndIgnoreResult(callback.get(), &version_val, 1); | 1599 InvokeAndIgnoreResult(*callback, &version_val, 1); |
1596 g_npnetscape_funcs->releasevariantvalue(&version_val); | 1600 g_npnetscape_funcs->releasevariantvalue(&version_val); |
1597 } | 1601 } |
1598 | 1602 |
1599 void HostNPScriptObject::InvokeGetPairedClientsCallback( | 1603 void HostNPScriptObject::InvokeGetPairedClientsCallback( |
1600 const ScopedRefNPObject& callback, | 1604 scoped_ptr<ScopedRefNPObject> callback, |
1601 scoped_ptr<base::ListValue> paired_clients) { | 1605 scoped_ptr<base::ListValue> paired_clients) { |
1602 if (!plugin_task_runner_->BelongsToCurrentThread()) { | 1606 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1603 plugin_task_runner_->PostTask( | |
1604 FROM_HERE, base::Bind( | |
1605 &HostNPScriptObject::InvokeGetPairedClientsCallback, | |
1606 weak_ptr_, callback, base::Passed(&paired_clients))); | |
1607 return; | |
1608 } | |
1609 | 1607 |
1610 std::string paired_clients_json; | 1608 std::string paired_clients_json; |
1611 base::JSONWriter::Write(paired_clients.get(), &paired_clients_json); | 1609 base::JSONWriter::Write(paired_clients.get(), &paired_clients_json); |
1612 | 1610 |
1613 NPVariant paired_clients_val = NPVariantFromString(paired_clients_json); | 1611 NPVariant paired_clients_val = NPVariantFromString(paired_clients_json); |
1614 InvokeAndIgnoreResult(callback.get(), &paired_clients_val, 1); | 1612 InvokeAndIgnoreResult(*callback, &paired_clients_val, 1); |
1615 g_npnetscape_funcs->releasevariantvalue(&paired_clients_val); | 1613 g_npnetscape_funcs->releasevariantvalue(&paired_clients_val); |
1616 } | 1614 } |
1617 | 1615 |
1618 void HostNPScriptObject::InvokeGetUsageStatsConsentCallback( | 1616 void HostNPScriptObject::InvokeGetUsageStatsConsentCallback( |
1619 const ScopedRefNPObject& callback, | 1617 scoped_ptr<ScopedRefNPObject> callback, |
1620 const DaemonController::UsageStatsConsent& consent) { | 1618 const DaemonController::UsageStatsConsent& consent) { |
1621 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1619 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1622 | 1620 |
1623 NPVariant params[3]; | 1621 NPVariant params[3]; |
1624 BOOLEAN_TO_NPVARIANT(consent.supported, params[0]); | 1622 BOOLEAN_TO_NPVARIANT(consent.supported, params[0]); |
1625 BOOLEAN_TO_NPVARIANT(consent.allowed, params[1]); | 1623 BOOLEAN_TO_NPVARIANT(consent.allowed, params[1]); |
1626 BOOLEAN_TO_NPVARIANT(consent.set_by_policy, params[2]); | 1624 BOOLEAN_TO_NPVARIANT(consent.set_by_policy, params[2]); |
1627 InvokeAndIgnoreResult(callback.get(), params, arraysize(params)); | 1625 InvokeAndIgnoreResult(*callback, params, arraysize(params)); |
1628 g_npnetscape_funcs->releasevariantvalue(&(params[0])); | 1626 g_npnetscape_funcs->releasevariantvalue(&(params[0])); |
1629 g_npnetscape_funcs->releasevariantvalue(&(params[1])); | 1627 g_npnetscape_funcs->releasevariantvalue(&(params[1])); |
1630 g_npnetscape_funcs->releasevariantvalue(&(params[2])); | 1628 g_npnetscape_funcs->releasevariantvalue(&(params[2])); |
1631 } | 1629 } |
1632 | 1630 |
1633 void HostNPScriptObject::LogDebugInfo(const std::string& message) { | 1631 void HostNPScriptObject::LogDebugInfo(const std::string& message) { |
1634 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1632 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1635 | 1633 |
1636 if (log_debug_info_func_.get()) { | 1634 if (log_debug_info_func_.get()) { |
1637 am_currently_logging_ = true; | 1635 am_currently_logging_ = true; |
1638 NPVariant log_message; | 1636 NPVariant log_message; |
1639 STRINGZ_TO_NPVARIANT(message.c_str(), log_message); | 1637 STRINGZ_TO_NPVARIANT(message.c_str(), log_message); |
1640 bool is_good = InvokeAndIgnoreResult(log_debug_info_func_.get(), | 1638 bool is_good = InvokeAndIgnoreResult(log_debug_info_func_, |
1641 &log_message, 1); | 1639 &log_message, 1); |
1642 if (!is_good) { | 1640 if (!is_good) { |
1643 LOG(ERROR) << "ERROR - LogDebugInfo failed\n"; | 1641 LOG(ERROR) << "ERROR - LogDebugInfo failed\n"; |
1644 } | 1642 } |
1645 am_currently_logging_ = false; | 1643 am_currently_logging_ = false; |
1646 } | 1644 } |
1647 } | 1645 } |
1648 | 1646 |
1649 bool HostNPScriptObject::InvokeAndIgnoreResult(NPObject* func, | 1647 bool HostNPScriptObject::InvokeAndIgnoreResult(const ScopedRefNPObject& func, |
1650 const NPVariant* args, | 1648 const NPVariant* args, |
1651 uint32_t arg_count) { | 1649 uint32_t arg_count) { |
1652 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1650 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1653 | 1651 |
1654 NPVariant np_result; | 1652 NPVariant np_result; |
1655 bool is_good = g_npnetscape_funcs->invokeDefault(plugin_, func, args, | 1653 bool is_good = g_npnetscape_funcs->invokeDefault(plugin_, func.get(), args, |
1656 arg_count, &np_result); | 1654 arg_count, &np_result); |
1657 if (is_good) | 1655 if (is_good) |
1658 g_npnetscape_funcs->releasevariantvalue(&np_result); | 1656 g_npnetscape_funcs->releasevariantvalue(&np_result); |
1659 | 1657 |
1660 return is_good; | 1658 return is_good; |
1661 } | 1659 } |
1662 | 1660 |
1663 void HostNPScriptObject::SetException(const std::string& exception_string) { | 1661 void HostNPScriptObject::SetException(const std::string& exception_string) { |
1664 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1662 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
1665 | 1663 |
1666 g_npnetscape_funcs->setexception(parent_, exception_string.c_str()); | 1664 g_npnetscape_funcs->setexception(parent_, exception_string.c_str()); |
1667 LOG(INFO) << exception_string; | 1665 LOG(INFO) << exception_string; |
1668 } | 1666 } |
1669 | 1667 |
1670 } // namespace remoting | 1668 } // namespace remoting |
OLD | NEW |