OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "chrome/test/chromedriver/capabilities.h" | 5 #include "chrome/test/chromedriver/capabilities.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
11 #include "base/json/string_escape.h" | 11 #include "base/json/string_escape.h" |
12 #include "base/logging.h" | |
12 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
13 #include "base/strings/string_split.h" | 14 #include "base/strings/string_split.h" |
14 #include "base/strings/string_tokenizer.h" | 15 #include "base/strings/string_tokenizer.h" |
15 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
16 #include "base/strings/stringprintf.h" | 17 #include "base/strings/stringprintf.h" |
17 #include "base/strings/utf_string_conversions.h" | 18 #include "base/strings/utf_string_conversions.h" |
18 #include "base/values.h" | 19 #include "base/values.h" |
19 #include "chrome/test/chromedriver/chrome/log.h" | |
20 #include "chrome/test/chromedriver/chrome/status.h" | 20 #include "chrome/test/chromedriver/chrome/status.h" |
21 #include "chrome/test/chromedriver/logging.h" | |
21 #include "net/base/net_util.h" | 22 #include "net/base/net_util.h" |
22 | 23 |
23 namespace { | 24 namespace { |
24 | 25 |
25 typedef base::Callback<Status(const base::Value&, Capabilities*)> Parser; | 26 typedef base::Callback<Status(const base::Value&, Capabilities*)> Parser; |
26 | 27 |
27 Status ParseBoolean( | 28 Status ParseBoolean( |
28 bool* to_set, | 29 bool* to_set, |
29 const base::Value& option, | 30 const base::Value& option, |
30 Capabilities* capabilities) { | 31 Capabilities* capabilities) { |
(...skipping 30 matching lines...) Expand all Loading... | |
61 const base::Value& option, | 62 const base::Value& option, |
62 Capabilities* capabilities) { | 63 Capabilities* capabilities) { |
63 const base::DictionaryValue* dict = NULL; | 64 const base::DictionaryValue* dict = NULL; |
64 if (!option.GetAsDictionary(&dict)) | 65 if (!option.GetAsDictionary(&dict)) |
65 return Status(kUnknownError, "must be a dictionary"); | 66 return Status(kUnknownError, "must be a dictionary"); |
66 to_set->reset(dict->DeepCopy()); | 67 to_set->reset(dict->DeepCopy()); |
67 return Status(kOk); | 68 return Status(kOk); |
68 } | 69 } |
69 | 70 |
70 Status IgnoreDeprecatedOption( | 71 Status IgnoreDeprecatedOption( |
71 Log* log, | |
72 const char* option_name, | 72 const char* option_name, |
73 const base::Value& option, | 73 const base::Value& option, |
74 Capabilities* capabilities) { | 74 Capabilities* capabilities) { |
75 log->AddEntry(Log::kWarning, | 75 LOG(WARNING) << "Deprecated chrome option is ignored: " << option_name; |
76 base::StringPrintf("deprecated chrome option is ignored: '%s'", | |
77 option_name)); | |
78 return Status(kOk); | 76 return Status(kOk); |
79 } | 77 } |
80 | 78 |
81 Status IgnoreCapability(const base::Value& option, Capabilities* capabilities) { | 79 Status IgnoreCapability(const base::Value& option, Capabilities* capabilities) { |
82 return Status(kOk); | 80 return Status(kOk); |
83 } | 81 } |
84 | 82 |
85 Status ParseLogPath(const base::Value& option, Capabilities* capabilities) { | 83 Status ParseLogPath(const base::Value& option, Capabilities* capabilities) { |
86 if (!option.GetAsString(&capabilities->log_path)) | 84 if (!option.GetAsString(&capabilities->log_path)) |
87 return Status(kUnknownError, "must be a string"); | 85 return Status(kUnknownError, "must be a string"); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
216 base::StringToInt(values[1], &port); | 214 base::StringToInt(values[1], &port); |
217 if (port <= 0) | 215 if (port <= 0) |
218 return Status(kUnknownError, "port must be > 0"); | 216 return Status(kUnknownError, "port must be > 0"); |
219 | 217 |
220 capabilities->debugger_address = NetAddress(values[0], port); | 218 capabilities->debugger_address = NetAddress(values[0], port); |
221 return Status(kOk); | 219 return Status(kOk); |
222 } | 220 } |
223 | 221 |
224 Status ParseLoggingPrefs(const base::Value& option, | 222 Status ParseLoggingPrefs(const base::Value& option, |
225 Capabilities* capabilities) { | 223 Capabilities* capabilities) { |
226 const base::DictionaryValue* logging_prefs_dict = NULL; | 224 const base::DictionaryValue* logging_prefs = NULL; |
227 if (!option.GetAsDictionary(&logging_prefs_dict)) | 225 if (!option.GetAsDictionary(&logging_prefs)) |
228 return Status(kUnknownError, "must be a dictionary"); | 226 return Status(kUnknownError, "capability must be a dictionary"); |
kkania
2013/09/04 23:39:30
revert
kkania
2013/09/05 15:15:11
Done.
| |
229 | 227 |
230 // TODO(klm): verify log types. | 228 for (base::DictionaryValue::Iterator pref(*logging_prefs); |
231 // TODO(klm): verify log levels. | 229 !pref.IsAtEnd(); pref.Advance()) { |
232 capabilities->logging_prefs.reset(logging_prefs_dict->DeepCopy()); | 230 std::string type = pref.key(); |
231 Log::Level level; | |
232 std::string level_name; | |
233 if (!pref.value().GetAsString(&level_name) || | |
234 !WebDriverLog::NameToLevel(level_name, &level)) { | |
235 return Status(kUnknownError, "invalid log level for '" + type + "' log"); | |
236 } | |
237 capabilities->logging_prefs.insert(std::make_pair(type, level)); | |
238 } | |
233 return Status(kOk); | 239 return Status(kOk); |
234 } | 240 } |
235 | 241 |
236 Status ParseChromeOptions( | 242 Status ParseChromeOptions( |
237 Log* log, | |
238 const base::Value& capability, | 243 const base::Value& capability, |
239 Capabilities* capabilities) { | 244 Capabilities* capabilities) { |
240 const base::DictionaryValue* chrome_options = NULL; | 245 const base::DictionaryValue* chrome_options = NULL; |
241 if (!capability.GetAsDictionary(&chrome_options)) | 246 if (!capability.GetAsDictionary(&chrome_options)) |
242 return Status(kUnknownError, "must be a dictionary"); | 247 return Status(kUnknownError, "must be a dictionary"); |
243 | 248 |
244 bool is_android = chrome_options->HasKey("androidPackage"); | 249 bool is_android = chrome_options->HasKey("androidPackage"); |
245 bool is_existing = chrome_options->HasKey("debuggerAddress"); | 250 bool is_existing = chrome_options->HasKey("debuggerAddress"); |
246 | 251 |
247 std::map<std::string, Parser> parser_map; | 252 std::map<std::string, Parser> parser_map; |
(...skipping 15 matching lines...) Expand all Loading... | |
263 } else if (is_existing) { | 268 } else if (is_existing) { |
264 parser_map["debuggerAddress"] = base::Bind(&ParseUseExistingBrowser); | 269 parser_map["debuggerAddress"] = base::Bind(&ParseUseExistingBrowser); |
265 } else { | 270 } else { |
266 parser_map["args"] = base::Bind(&ParseSwitches); | 271 parser_map["args"] = base::Bind(&ParseSwitches); |
267 parser_map["binary"] = base::Bind(&ParseFilePath, &capabilities->binary); | 272 parser_map["binary"] = base::Bind(&ParseFilePath, &capabilities->binary); |
268 parser_map["detach"] = base::Bind(&ParseBoolean, &capabilities->detach); | 273 parser_map["detach"] = base::Bind(&ParseBoolean, &capabilities->detach); |
269 parser_map["excludeSwitches"] = base::Bind(&ParseExcludeSwitches); | 274 parser_map["excludeSwitches"] = base::Bind(&ParseExcludeSwitches); |
270 parser_map["extensions"] = base::Bind(&ParseExtensions); | 275 parser_map["extensions"] = base::Bind(&ParseExtensions); |
271 parser_map["forceDevToolsScreenshot"] = base::Bind( | 276 parser_map["forceDevToolsScreenshot"] = base::Bind( |
272 &ParseBoolean, &capabilities->force_devtools_screenshot); | 277 &ParseBoolean, &capabilities->force_devtools_screenshot); |
273 parser_map["loadAsync"] = | 278 parser_map["loadAsync"] = base::Bind(&IgnoreDeprecatedOption, "loadAsync"); |
274 base::Bind(&IgnoreDeprecatedOption, log, "loadAsync"); | |
275 parser_map["localState"] = | 279 parser_map["localState"] = |
276 base::Bind(&ParseDict, &capabilities->local_state); | 280 base::Bind(&ParseDict, &capabilities->local_state); |
277 parser_map["logPath"] = base::Bind(&ParseLogPath); | 281 parser_map["logPath"] = base::Bind(&ParseLogPath); |
278 parser_map["prefs"] = base::Bind(&ParseDict, &capabilities->prefs); | 282 parser_map["prefs"] = base::Bind(&ParseDict, &capabilities->prefs); |
279 } | 283 } |
280 | 284 |
281 for (base::DictionaryValue::Iterator it(*chrome_options); !it.IsAtEnd(); | 285 for (base::DictionaryValue::Iterator it(*chrome_options); !it.IsAtEnd(); |
282 it.Advance()) { | 286 it.Advance()) { |
283 if (parser_map.find(it.key()) == parser_map.end()) { | 287 if (parser_map.find(it.key()) == parser_map.end()) { |
284 return Status(kUnknownError, | 288 return Status(kUnknownError, |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
407 Capabilities::~Capabilities() {} | 411 Capabilities::~Capabilities() {} |
408 | 412 |
409 bool Capabilities::IsAndroid() const { | 413 bool Capabilities::IsAndroid() const { |
410 return !android_package.empty(); | 414 return !android_package.empty(); |
411 } | 415 } |
412 | 416 |
413 bool Capabilities::IsExistingBrowser() const { | 417 bool Capabilities::IsExistingBrowser() const { |
414 return debugger_address.IsValid(); | 418 return debugger_address.IsValid(); |
415 } | 419 } |
416 | 420 |
417 Status Capabilities::Parse( | 421 Status Capabilities::Parse(const base::DictionaryValue& desired_caps) { |
418 const base::DictionaryValue& desired_caps, | |
419 Log* log) { | |
420 std::map<std::string, Parser> parser_map; | 422 std::map<std::string, Parser> parser_map; |
421 parser_map["chromeOptions"] = base::Bind(&ParseChromeOptions, log); | 423 parser_map["chromeOptions"] = base::Bind(&ParseChromeOptions); |
422 parser_map["loggingPrefs"] = base::Bind(&ParseLoggingPrefs); | 424 parser_map["loggingPrefs"] = base::Bind(&ParseLoggingPrefs); |
423 parser_map["proxy"] = base::Bind(&ParseProxy); | 425 parser_map["proxy"] = base::Bind(&ParseProxy); |
424 for (std::map<std::string, Parser>::iterator it = parser_map.begin(); | 426 for (std::map<std::string, Parser>::iterator it = parser_map.begin(); |
425 it != parser_map.end(); ++it) { | 427 it != parser_map.end(); ++it) { |
426 const base::Value* capability = NULL; | 428 const base::Value* capability = NULL; |
427 if (desired_caps.Get(it->first, &capability)) { | 429 if (desired_caps.Get(it->first, &capability)) { |
428 Status status = it->second.Run(*capability, this); | 430 Status status = it->second.Run(*capability, this); |
429 if (status.IsError()) { | 431 if (status.IsError()) { |
430 return Status( | 432 return Status( |
431 kUnknownError, "cannot parse capability: " + it->first, status); | 433 kUnknownError, "cannot parse capability: " + it->first, status); |
432 } | 434 } |
433 } | 435 } |
434 } | 436 } |
435 return Status(kOk); | 437 return Status(kOk); |
436 } | 438 } |
OLD | NEW |