OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <iostream> | 5 #include <iostream> |
6 #include <memory> | 6 #include <memory> |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/base64.h" | 9 #include "base/base64.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 #include "headless/public/headless_devtools_client.h" | 24 #include "headless/public/headless_devtools_client.h" |
25 #include "headless/public/headless_devtools_target.h" | 25 #include "headless/public/headless_devtools_target.h" |
26 #include "headless/public/headless_web_contents.h" | 26 #include "headless/public/headless_web_contents.h" |
27 #include "net/base/file_stream.h" | 27 #include "net/base/file_stream.h" |
28 #include "net/base/io_buffer.h" | 28 #include "net/base/io_buffer.h" |
29 #include "net/base/ip_address.h" | 29 #include "net/base/ip_address.h" |
30 #include "net/base/net_errors.h" | 30 #include "net/base/net_errors.h" |
31 #include "ui/gfx/geometry/size.h" | 31 #include "ui/gfx/geometry/size.h" |
32 | 32 |
33 using headless::HeadlessBrowser; | 33 using headless::HeadlessBrowser; |
| 34 using headless::HeadlessBrowserContext; |
34 using headless::HeadlessDevToolsClient; | 35 using headless::HeadlessDevToolsClient; |
35 using headless::HeadlessWebContents; | 36 using headless::HeadlessWebContents; |
36 namespace page = headless::page; | 37 namespace page = headless::page; |
37 namespace runtime = headless::runtime; | 38 namespace runtime = headless::runtime; |
38 | 39 |
39 namespace { | 40 namespace { |
40 // Address where to listen to incoming DevTools connections. | 41 // Address where to listen to incoming DevTools connections. |
41 const char kDevToolsHttpServerAddress[] = "127.0.0.1"; | 42 const char kDevToolsHttpServerAddress[] = "127.0.0.1"; |
42 // Default file name for screenshot. Can be overriden by "--screenshot" switch. | 43 // Default file name for screenshot. Can be overriden by "--screenshot" switch. |
43 const char kDefaultScreenshotFileName[] = "screenshot.png"; | 44 const char kDefaultScreenshotFileName[] = "screenshot.png"; |
44 } | 45 } |
45 | 46 |
46 // A sample application which demonstrates the use of the headless API. | 47 // A sample application which demonstrates the use of the headless API. |
47 class HeadlessShell : public HeadlessWebContents::Observer, page::Observer { | 48 class HeadlessShell : public HeadlessWebContents::Observer, page::Observer { |
48 public: | 49 public: |
49 HeadlessShell() | 50 HeadlessShell() |
50 : browser_(nullptr), | 51 : browser_(nullptr), |
51 devtools_client_(HeadlessDevToolsClient::Create()), | 52 devtools_client_(HeadlessDevToolsClient::Create()), |
52 web_contents_(nullptr), | 53 web_contents_(nullptr), |
53 processed_page_ready_(false) {} | 54 processed_page_ready_(false) {} |
54 ~HeadlessShell() override {} | 55 ~HeadlessShell() override {} |
55 | 56 |
56 void OnStart(HeadlessBrowser* browser) { | 57 void OnStart(HeadlessBrowser* browser) { |
57 browser_ = browser; | 58 browser_ = browser; |
58 | 59 |
59 HeadlessWebContents::Builder builder(browser_->CreateWebContentsBuilder()); | 60 browser_context_ = browser_->CreateBrowserContextBuilder().Build(); |
| 61 |
| 62 HeadlessWebContents::Builder builder( |
| 63 browser_context_->CreateWebContentsBuilder()); |
60 base::CommandLine::StringVector args = | 64 base::CommandLine::StringVector args = |
61 base::CommandLine::ForCurrentProcess()->GetArgs(); | 65 base::CommandLine::ForCurrentProcess()->GetArgs(); |
62 | 66 |
63 if (!args.empty() && !args[0].empty()) | 67 if (!args.empty() && !args[0].empty()) |
64 builder.SetInitialURL(GURL(args[0])); | 68 builder.SetInitialURL(GURL(args[0])); |
65 | 69 |
66 web_contents_ = builder.Build(); | 70 web_contents_ = builder.Build(); |
67 if (!web_contents_) { | 71 if (!web_contents_) { |
68 LOG(ERROR) << "Navigation failed"; | 72 LOG(ERROR) << "Navigation failed"; |
69 browser_->Shutdown(); | 73 browser_->Shutdown(); |
70 return; | 74 return; |
71 } | 75 } |
72 web_contents_->AddObserver(this); | 76 web_contents_->AddObserver(this); |
73 } | 77 } |
74 | 78 |
75 void Shutdown() { | 79 void Shutdown() { |
76 if (!web_contents_) | 80 if (!web_contents_) |
77 return; | 81 return; |
78 if (!RemoteDebuggingEnabled()) { | 82 if (!RemoteDebuggingEnabled()) { |
79 devtools_client_->GetPage()->RemoveObserver(this); | 83 devtools_client_->GetPage()->RemoveObserver(this); |
80 web_contents_->GetDevToolsTarget()->DetachClient(devtools_client_.get()); | 84 web_contents_->GetDevToolsTarget()->DetachClient(devtools_client_.get()); |
81 } | 85 } |
82 web_contents_->RemoveObserver(this); | 86 web_contents_->RemoveObserver(this); |
83 web_contents_ = nullptr; | 87 web_contents_ = nullptr; |
| 88 browser_context_.reset(); |
84 browser_->Shutdown(); | 89 browser_->Shutdown(); |
85 } | 90 } |
86 | 91 |
87 // HeadlessWebContents::Observer implementation: | 92 // HeadlessWebContents::Observer implementation: |
88 void DevToolsTargetReady() override { | 93 void DevToolsTargetReady() override { |
89 if (RemoteDebuggingEnabled()) | 94 if (RemoteDebuggingEnabled()) |
90 return; | 95 return; |
91 web_contents_->GetDevToolsTarget()->AttachClient(devtools_client_.get()); | 96 web_contents_->GetDevToolsTarget()->AttachClient(devtools_client_.get()); |
92 devtools_client_->GetPage()->AddObserver(this); | 97 devtools_client_->GetPage()->AddObserver(this); |
93 devtools_client_->GetPage()->Enable(); | 98 devtools_client_->GetPage()->Enable(); |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 return command_line.HasSwitch(switches::kRemoteDebuggingPort); | 278 return command_line.HasSwitch(switches::kRemoteDebuggingPort); |
274 } | 279 } |
275 | 280 |
276 private: | 281 private: |
277 GURL url_; | 282 GURL url_; |
278 HeadlessBrowser* browser_; // Not owned. | 283 HeadlessBrowser* browser_; // Not owned. |
279 std::unique_ptr<HeadlessDevToolsClient> devtools_client_; | 284 std::unique_ptr<HeadlessDevToolsClient> devtools_client_; |
280 HeadlessWebContents* web_contents_; | 285 HeadlessWebContents* web_contents_; |
281 bool processed_page_ready_; | 286 bool processed_page_ready_; |
282 std::unique_ptr<net::FileStream> screenshot_file_stream_; | 287 std::unique_ptr<net::FileStream> screenshot_file_stream_; |
| 288 std::unique_ptr<HeadlessBrowserContext> browser_context_; |
283 | 289 |
284 DISALLOW_COPY_AND_ASSIGN(HeadlessShell); | 290 DISALLOW_COPY_AND_ASSIGN(HeadlessShell); |
285 }; | 291 }; |
286 | 292 |
287 int main(int argc, const char** argv) { | 293 int main(int argc, const char** argv) { |
288 headless::RunChildProcessIfNeeded(argc, argv); | 294 headless::RunChildProcessIfNeeded(argc, argv); |
289 HeadlessShell shell; | 295 HeadlessShell shell; |
290 HeadlessBrowser::Options::Builder builder(argc, argv); | 296 HeadlessBrowser::Options::Builder builder(argc, argv); |
291 | 297 |
292 // Enable devtools if requested. | 298 // Enable devtools if requested. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 if (command_line.HasSwitch(switches::kHostResolverRules)) { | 338 if (command_line.HasSwitch(switches::kHostResolverRules)) { |
333 builder.SetHostResolverRules( | 339 builder.SetHostResolverRules( |
334 command_line.GetSwitchValueASCII(switches::kHostResolverRules)); | 340 command_line.GetSwitchValueASCII(switches::kHostResolverRules)); |
335 } | 341 } |
336 | 342 |
337 if (command_line.HasSwitch(headless::switches::kUseGL)) { | 343 if (command_line.HasSwitch(headless::switches::kUseGL)) { |
338 builder.SetGLImplementation( | 344 builder.SetGLImplementation( |
339 command_line.GetSwitchValueASCII(headless::switches::kUseGL)); | 345 command_line.GetSwitchValueASCII(headless::switches::kUseGL)); |
340 } | 346 } |
341 | 347 |
| 348 if (command_line.HasSwitch(headless::switches::kUserDataDir)) { |
| 349 builder.SetUserDataDir( |
| 350 command_line.GetSwitchValuePath(headless::switches::kUserDataDir)); |
| 351 } |
| 352 |
342 return HeadlessBrowserMain( | 353 return HeadlessBrowserMain( |
343 builder.Build(), | 354 builder.Build(), |
344 base::Bind(&HeadlessShell::OnStart, base::Unretained(&shell))); | 355 base::Bind(&HeadlessShell::OnStart, base::Unretained(&shell))); |
345 } | 356 } |
OLD | NEW |