Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1509)

Side by Side Diff: headless/lib/headless_browser_impl.cc

Issue 1430673002: Headless demo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Better javascript Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « headless/lib/headless_browser_impl.h ('k') | headless/lib/headless_content_client.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2015 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 #include "headless/lib/headless_browser_impl.h"
6
7 #include "content/public/app/content_main.h"
8 #include "content/public/browser/browser_thread.h"
9 #include "content/public/browser/tracing_controller.h"
10 #include "content/public/browser/web_contents.h"
11 #include "headless/lib/browser/headless_browser_context.h"
12 #include "headless/lib/browser/headless_browser_main_parts.h"
13 #include "headless/lib/headless_shell_main_delegate.h"
14 #include "headless/lib/web_contents_impl.h"
15 #include "net/url_request/url_request_context_getter.h"
16 #include "third_party/WebKit/public/platform/Platform.h"
17 #include "third_party/WebKit/public/platform/WebTaskRunner.h"
18 #include "third_party/WebKit/public/platform/WebThread.h"
19 #include "third_party/WebKit/public/platform/WebTraceLocation.h"
20 #include "ui/gfx/geometry/size.h"
21
22 namespace headless {
23
24 namespace {
25
26 class RendererThreadTaskRunner : public base::SingleThreadTaskRunner {
27 public:
28 RendererThreadTaskRunner() {}
29
30 bool PostDelayedTask(const tracked_objects::Location& from_here,
31 const base::Closure& task,
32 base::TimeDelta delay) override {
33 blink::Platform::current()->mainThread()->taskRunner()->postDelayedTask(
34 BLINK_FROM_HERE, new Task(task), delay.InMillisecondsF());
35 return true;
36 }
37
38 bool RunsTasksOnCurrentThread() const override { return false; }
39
40 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
41 const base::Closure& task,
42 base::TimeDelta delay) override {
43 return PostDelayedTask(from_here, task, delay);
44 }
45
46 private:
47 ~RendererThreadTaskRunner() override {}
48
49 class Task : public blink::WebTaskRunner::Task {
50 public:
51 Task(const base::Closure& function_to_run)
52 : function_to_run_(function_to_run){};
53
54 void run() override { function_to_run_.Run(); }
55
56 private:
57 base::Closure function_to_run_;
58 };
59 };
60
61 class BrowserThreadTaskRunner : public base::SingleThreadTaskRunner {
62 public:
63 BrowserThreadTaskRunner(content::BrowserThread::ID thread_id)
64 : thread_id_(thread_id) {}
65
66 bool PostDelayedTask(const tracked_objects::Location& from_here,
67 const base::Closure& task,
68 base::TimeDelta delay) override {
69 return content::BrowserThread::PostDelayedTask(thread_id_, from_here, task,
70 delay);
71 }
72
73 bool RunsTasksOnCurrentThread() const override { return false; }
74
75 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
76 const base::Closure& task,
77 base::TimeDelta delay) override {
78 return content::BrowserThread::PostNonNestableDelayedTask(
79 thread_id_, from_here, task, delay);
80 }
81
82 private:
83 ~BrowserThreadTaskRunner() override {}
84 content::BrowserThread::ID thread_id_;
85 };
86 }
87
88 HeadlessBrowserImpl::HeadlessBrowserImpl()
89 : browser_main_thread_(
90 new BrowserThreadTaskRunner(content::BrowserThread::UI))
91 , renderer_main_thread_(new RendererThreadTaskRunner())
92 , is_writing_trace_(false) {}
93
94 HeadlessBrowserImpl::~HeadlessBrowserImpl() {}
95
96 /*static*/ HeadlessBrowserImpl* HeadlessBrowserImpl::Get() {
97 static HeadlessBrowserImpl* browser = new HeadlessBrowserImpl();
98 return browser;
99 }
100
101 /*static*/ HeadlessBrowser* HeadlessBrowser::Get() {
102 return HeadlessBrowserImpl::Get();
103 }
104
105 scoped_ptr<WebContents> HeadlessBrowserImpl::CreateWebContents(
106 const gfx::Size& size) {
107 WebContentsImpl* web_contents =
108 new WebContentsImpl(browser_context(), size);
109 return scoped_ptr<WebContents>(web_contents);
110 }
111
112 scoped_refptr<base::SingleThreadTaskRunner>
113 HeadlessBrowserImpl::browser_main_thread() {
114 return browser_main_thread_;
115 }
116
117 scoped_refptr<base::SingleThreadTaskRunner>
118 HeadlessBrowserImpl::renderer_main_thread() {
119 return renderer_main_thread_;
120 }
121
122 int HeadlessBrowserImpl::Run(
123 const Options& options,
124 const base::Closure& on_browser_start_callback)
125 {
126 on_start_callback_ = make_scoped_ptr(
127 new base::Closure(on_browser_start_callback));
128
129 headless::HeadlessShellMainDelegate delegate(this);
130 content::ContentMainParams params(&delegate);
131 params.argc = options.argc;
132 params.argv = options.argv;
133 return content::ContentMain(params);
134 }
135
136 void HeadlessBrowserImpl::Stop() {
137 PostShutdownTask();
138 }
139
140 void HeadlessBrowserImpl::StartTracing(
141 const base::trace_event::TraceConfig& trace_config,
142 const base::Closure& tracing_started_callback)
143 {
144 content::TracingController::GetInstance()->StartTracing(
145 trace_config,
146 tracing_started_callback);
147 }
148
149 void HeadlessBrowserImpl::StopTracing(
150 const std::string& log_file_name,
151 const base::Closure& tracing_stopped_callback)
152 {
153 {
154 base::AutoLock lock(is_writing_trace_lock_);
155 is_writing_trace_ = true;
156 }
157 content::TracingController::GetInstance()->StopTracing(
158 content::TracingController::CreateFileSink(
159 base::FilePath(log_file_name),
160 base::Bind(&HeadlessBrowserImpl::DidFinishWritingTrace,
161 base::Unretained(this),
162 tracing_stopped_callback)));
163 }
164
165 void HeadlessBrowserImpl::DidFinishWritingTrace(
166 const base::Closure& tracing_stopped_callback)
167 {
168 {
169 base::AutoLock lock(is_writing_trace_lock_);
170 is_writing_trace_ = false;
171 }
172 tracing_stopped_callback.Run();
173 }
174
175 HeadlessBrowserContext* HeadlessBrowserImpl::browser_context() {
176 DCHECK(browser_main_parts());
177 return browser_main_parts()->browser_context();
178 }
179
180 HeadlessBrowserMainParts* HeadlessBrowserImpl::browser_main_parts() {
181 return browser_main_parts_;
182 }
183
184 void HeadlessBrowserImpl::set_browser_main_parts(
185 HeadlessBrowserMainParts* browser_main_parts) {
186 browser_main_parts_ = browser_main_parts;
187 }
188
189 void HeadlessBrowserImpl::RunOnStartCallback() {
190 DCHECK(on_start_callback_);
191 on_start_callback_->Run();
192 }
193
194 void HeadlessBrowserImpl::Shutdown() {
195 {
196 base::AutoLock lock(is_writing_trace_lock_);
197 DCHECK(!is_writing_trace_);
198 }
199
200 for (const auto& web_contents : web_contents_) {
201 web_contents->web_contents()->Close();
202 }
203 web_contents_.clear();
204 browser_main_thread()->PostTask(FROM_HERE,
205 base::MessageLoop::QuitWhenIdleClosure());
206 }
207
208 void HeadlessBrowserImpl::PostShutdownTask() {
209 browser_main_thread()->PostTask(
210 FROM_HERE,
211 base::Bind(&HeadlessBrowserImpl::Shutdown, base::Unretained(this)));
212 }
213
214 } // namespace headless
OLDNEW
« no previous file with comments | « headless/lib/headless_browser_impl.h ('k') | headless/lib/headless_content_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698