OLD | NEW |
| (Empty) |
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_BROWSER_EXTENSIONS_API_RECORD_RECORD_API_H_ | |
6 #define CHROME_BROWSER_EXTENSIONS_API_RECORD_RECORD_API_H_ | |
7 | |
8 #include "base/command_line.h" | |
9 #include "base/files/file_path.h" | |
10 #include "base/time/time.h" | |
11 #include "chrome/browser/extensions/extension_function.h" | |
12 | |
13 namespace { | |
14 | |
15 const base::FilePath::CharType kURLErrorsSuffix[] = | |
16 FILE_PATH_LITERAL(".errors"); | |
17 const char kErrorsKey[] = "errors"; | |
18 const char kStatsKey[] = "stats"; | |
19 | |
20 }; | |
21 | |
22 namespace extensions { | |
23 | |
24 // ProcessStrategy abstracts the API's starting and waiting on a test | |
25 // browser instance. This lets us browser-test the API without actually | |
26 // firing up a sub browser instance. | |
27 class ProcessStrategy { | |
28 public: | |
29 // Needed to void build warnings | |
30 virtual ~ProcessStrategy(); | |
31 | |
32 // Used only in test version to pump the blocking pool queue, | |
33 // which doesn't otherwise happen during test. | |
34 virtual void PumpBlockingPool() {} | |
35 | |
36 // Start up process with given commandline. Real version does just | |
37 // that; test version mocks it up, generating errors or good results, | |
38 // as configured. If there are any problems running the process itself, | |
39 // as opposed to errors in the cycler URL list, etc, report these via | |
40 // |errors| | |
41 virtual void RunProcess(const CommandLine& line, | |
42 std::vector<std::string> *errors) = 0; | |
43 }; | |
44 | |
45 // Production (default) version of ProcessStrategy. See ProcessStrategy | |
46 // comments for more info. This subclass actually starts a sub browser | |
47 // instance. | |
48 class ProductionProcessStrategy : public ProcessStrategy { | |
49 public: | |
50 virtual void RunProcess(const CommandLine& line, | |
51 std::vector<std::string> *errors) OVERRIDE; | |
52 }; | |
53 | |
54 // Both page cycler calls (capture and replay) have a great deal in common, | |
55 // including the need to build and write a url list file, set the user | |
56 // data dir, start a sub-instance of Chrome, and parse a resultant error | |
57 // file. This base class encapslates those common elements. | |
58 class RunPageCyclerFunction : public AsyncExtensionFunction { | |
59 public: | |
60 explicit RunPageCyclerFunction(ProcessStrategy* strategy); | |
61 | |
62 // Make a CommandLine copy of |original|, removing all switches in | |
63 // |to_remove|. | |
64 static CommandLine RemoveSwitches(const CommandLine& original, | |
65 const std::vector<std::string>& to_remove); | |
66 | |
67 // Return ProcessStrategy, to allow for test versions. | |
68 virtual const ProcessStrategy &GetProcessStrategy(); | |
69 | |
70 protected: | |
71 virtual ~RunPageCyclerFunction(); | |
72 | |
73 // Gather common page cycler parameters and store them, then do blocking | |
74 // thread invocation of RunTestBrowser. | |
75 virtual bool RunImpl() OVERRIDE; | |
76 | |
77 // Parse the JS parameters, and store them as member data. | |
78 virtual bool ParseJSParameters() = 0; | |
79 | |
80 // Do a vanilla test browser run, bracketing it immediately before and | |
81 // after with a call of AddSwitches to add special commandline options | |
82 // for Capture or Replay, and ReadReplyFiles to do any special post-run | |
83 // data collection. Gather any error results into |errors_| and then do a | |
84 // BrowserThread call of Finish to return JS values. | |
85 virtual void RunTestBrowser(); | |
86 virtual void AddSwitches(CommandLine* command_line) {} | |
87 | |
88 // The test browser communicates URL errors, performance statistics, and | |
89 // possibly other data by posting them to text files. ReadReplyFiles | |
90 // collects these data for return to the JS side caller. | |
91 virtual void ReadReplyFiles() {} | |
92 | |
93 // Return the values gathered in RunTestBrowser. No common code here; all | |
94 // logic is in subclasses. | |
95 virtual void Finish() {} | |
96 | |
97 base::FilePath user_data_dir_; | |
98 std::string url_contents_; | |
99 int repeat_count_; | |
100 std::vector<std::string> errors_; | |
101 | |
102 // Base CommandLine on which to build the test browser CommandLine | |
103 CommandLine base_command_line_; | |
104 | |
105 // ProcessStrategy to use for this run. | |
106 scoped_ptr<ProcessStrategy> process_strategy_; | |
107 }; | |
108 | |
109 class RecordCaptureURLsFunction : public RunPageCyclerFunction { | |
110 public: | |
111 DECLARE_EXTENSION_FUNCTION("experimental.record.captureURLs", | |
112 EXPERIMENTAL_RECORD_CAPTUREURLS) | |
113 | |
114 RecordCaptureURLsFunction(); | |
115 explicit RecordCaptureURLsFunction(ProcessStrategy* strategy); | |
116 | |
117 private: | |
118 virtual ~RecordCaptureURLsFunction() {} | |
119 | |
120 // Read the ReplayDetails parameter if it exists. | |
121 virtual bool ParseJSParameters() OVERRIDE; | |
122 | |
123 // Add record-mode. | |
124 virtual void AddSwitches(CommandLine* command_line) OVERRIDE; | |
125 | |
126 // Return error list. | |
127 virtual void Finish() OVERRIDE; | |
128 }; | |
129 | |
130 class RecordReplayURLsFunction : public RunPageCyclerFunction { | |
131 public: | |
132 DECLARE_EXTENSION_FUNCTION("experimental.record.replayURLs", | |
133 EXPERIMENTAL_RECORD_REPLAYURLS) | |
134 | |
135 RecordReplayURLsFunction(); | |
136 explicit RecordReplayURLsFunction(ProcessStrategy* strategy); | |
137 | |
138 private: | |
139 virtual ~RecordReplayURLsFunction(); | |
140 | |
141 // Read the ReplayDetails parameter if it exists. | |
142 virtual bool ParseJSParameters() OVERRIDE; | |
143 | |
144 // Add visit-urls-count and load-extension. | |
145 virtual void AddSwitches(CommandLine* command_line) OVERRIDE; | |
146 | |
147 // Read stats file. | |
148 virtual void ReadReplyFiles() OVERRIDE; | |
149 | |
150 // Return error list, statistical results, and runtime. | |
151 virtual void Finish() OVERRIDE; | |
152 | |
153 // These data are additional information added to the sub-browser | |
154 // commandline or used to repeatedly run the sub-browser. | |
155 base::FilePath extension_path_; | |
156 base::FilePath stats_file_path_; | |
157 | |
158 // This time datum marks the start and end of the sub-browser run. | |
159 base::Time timer_; | |
160 | |
161 // These two data are additional information returned to caller. | |
162 double run_time_ms_; | |
163 std::string stats_; | |
164 }; | |
165 | |
166 } // namespace extensions | |
167 | |
168 #endif // CHROME_BROWSER_EXTENSIONS_API_RECORD_RECORD_API_H_ | |
OLD | NEW |