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
3// found in the LICENSE file.
4
5#ifndef CHROME_TEST_WEBDRIVER_WEBDRIVER_CAPABILITIES_PARSER_H_
6#define CHROME_TEST_WEBDRIVER_WEBDRIVER_CAPABILITIES_PARSER_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/command_line.h"
13#include "base/files/file_path.h"
14#include "base/memory/scoped_ptr.h"
15#include "chrome/test/webdriver/webdriver_logging.h"
16
17namespace base {
18class DictionaryValue;
19class Value;
20}
21
22namespace webdriver {
23
24class Error;
25
26// Contains all the capabilities that a user may request when starting a
27// new session.
28struct Capabilities {
29  Capabilities();
30  ~Capabilities();
31
32  // Command line to use for starting Chrome.
33  CommandLine command;
34
35  // Channel ID to use for connecting to an already running Chrome.
36  std::string channel;
37
38  // Whether the lifetime of the started Chrome browser process should be
39  // bound to ChromeDriver's process. If true, Chrome will not quit if
40  // ChromeDriver dies.
41  bool detach;
42
43  // List of paths for extensions to install on startup.
44  std::vector<base::FilePath> extensions;
45
46  // Whether Chrome should not block when loading.
47  bool load_async;
48
49  // Local state preferences to apply after Chrome starts but during session
50  // initialization. These preferences apply to all profiles in the user
51  // data directory that Chrome is running in.
52  scoped_ptr<base::DictionaryValue> local_state;
53
54  // The minimum level to log for each log type.
55  LogLevel log_levels[LogType::kNum];
56
57  // By default, ChromeDriver configures Chrome in such a way as convenient
58  // for website testing. E.g., it configures Chrome so that sites are allowed
59  // to use the geolocation API without requesting the user's consent.
60  // If this is set to true, ChromeDriver will not modify Chrome's default
61  // behavior.
62  bool no_website_testing_defaults;
63
64  // Set of switches which should be removed from default list when launching
65  // Chrome.
66  std::set<std::string> exclude_switches;
67
68  // Profile-level preferences to apply after Chrome starts but during session
69  // initialization.
70  scoped_ptr<base::DictionaryValue> prefs;
71
72  // Path to a custom profile to use.
73  base::FilePath profile;
74};
75
76// Parses the given capabilities dictionary to produce a |Capabilities|
77// instance.
78// See webdriver's desired capabilities for more info.
79class CapabilitiesParser {
80 public:
81  // Create a new parser. |capabilities_dict| is the dictionary for all
82  // of the user's desired capabilities. |root_path| is the root directory
83  // to use for writing any necessary files to disk. This function will not
84  // create it or delete it. All files written to disk will be placed in
85  // this directory.
86  CapabilitiesParser(const base::DictionaryValue* capabilities_dict,
87                     const base::FilePath& root_path,
88                     const Logger& logger,
89                     Capabilities* capabilities);
90  ~CapabilitiesParser();
91
92  // Parses the capabilities. May return an error.
93  Error* Parse();
94
95 private:
96  Error* ParseArgs(const base::Value* option);
97  Error* ParseBinary(const base::Value* option);
98  Error* ParseChannel(const base::Value* option);
99  Error* ParseDetach(const base::Value* option);
100  Error* ParseExcludeSwitches(const base::Value* options);
101  Error* ParseExtensions(const base::Value* option);
102  Error* ParseLoadAsync(const base::Value* option);
103  Error* ParseLocalState(const base::Value* option);
104  Error* ParseLoggingPrefs(const base::Value* option);
105  Error* ParseNativeEvents(const base::Value* option);
106  Error* ParseNoProxy(const base::Value* option);
107  Error* ParseNoWebsiteTestingDefaults(const base::Value* option);
108  Error* ParsePrefs(const base::Value* option);
109  Error* ParseProfile(const base::Value* option);
110  Error* ParseProxy(const base::Value* option);
111  Error* ParseProxyAutoDetect(const base::DictionaryValue* options);
112  Error* ParseProxyAutoconfigUrl(const base::DictionaryValue* options);
113  Error* ParseProxyServers(const base::DictionaryValue* options);
114
115
116  // The capabilities dictionary to parse.
117  const base::DictionaryValue* dict_;
118
119  // The root directory under which to write all files.
120  const base::FilePath root_;
121
122  // Reference to the logger to use.
123  const Logger& logger_;
124
125  // A pointer to the capabilities to modify while parsing.
126  Capabilities* caps_;
127
128  DISALLOW_COPY_AND_ASSIGN(CapabilitiesParser);
129};
130
131}  // namespace webdriver
132
133#endif  // CHROME_TEST_WEBDRIVER_WEBDRIVER_CAPABILITIES_PARSER_H_
134