| Index: headless/app/headless_shell.cc
|
| diff --git a/headless/app/headless_shell.cc b/headless/app/headless_shell.cc
|
| index 9fafa553a6bd280d0373d5ce9c65759a4288cd33..4d05e3e13084cbe9f76e7e7fcdd62c9f453ef531 100644
|
| --- a/headless/app/headless_shell.cc
|
| +++ b/headless/app/headless_shell.cc
|
| @@ -18,6 +18,7 @@
|
| #include "base/strings/string_number_conversions.h"
|
| #include "content/public/common/content_switches.h"
|
| #include "headless/app/headless_shell_switches.h"
|
| +#include "headless/public/domains/emulation.h"
|
| #include "headless/public/domains/page.h"
|
| #include "headless/public/domains/runtime.h"
|
| #include "headless/public/headless_browser.h"
|
| @@ -34,6 +35,7 @@ using headless::HeadlessBrowser;
|
| using headless::HeadlessBrowserContext;
|
| using headless::HeadlessDevToolsClient;
|
| using headless::HeadlessWebContents;
|
| +namespace emulation = headless::emulation;
|
| namespace page = headless::page;
|
| namespace runtime = headless::runtime;
|
|
|
| @@ -56,7 +58,9 @@ bool ParseWindowSize(std::string window_size, gfx::Size* parsed_window_size) {
|
| } // namespace
|
|
|
| // A sample application which demonstrates the use of the headless API.
|
| -class HeadlessShell : public HeadlessWebContents::Observer, page::Observer {
|
| +class HeadlessShell : public HeadlessWebContents::Observer,
|
| + emulation::ExperimentalObserver,
|
| + page::Observer {
|
| public:
|
| HeadlessShell()
|
| : browser_(nullptr),
|
| @@ -76,6 +80,8 @@ class HeadlessShell : public HeadlessWebContents::Observer, page::Observer {
|
| base::CommandLine::StringVector args =
|
| base::CommandLine::ForCurrentProcess()->GetArgs();
|
|
|
| + // TODO(alexclarke): Should we navigate to about:blank first if using
|
| + // virtual time?
|
| if (!args.empty() && !args[0].empty())
|
| builder.SetInitialURL(GURL(args[0]));
|
|
|
| @@ -92,6 +98,7 @@ class HeadlessShell : public HeadlessWebContents::Observer, page::Observer {
|
| if (!web_contents_)
|
| return;
|
| if (!RemoteDebuggingEnabled()) {
|
| + devtools_client_->GetEmulation()->GetExperimental()->RemoveObserver(this);
|
| devtools_client_->GetPage()->RemoveObserver(this);
|
| web_contents_->GetDevToolsTarget()->DetachClient(devtools_client_.get());
|
| }
|
| @@ -110,7 +117,26 @@ class HeadlessShell : public HeadlessWebContents::Observer, page::Observer {
|
| devtools_client_->GetPage()->Enable();
|
| // Check if the document had already finished loading by the time we
|
| // attached.
|
| - PollReadyState();
|
| +
|
| + devtools_client_->GetEmulation()->GetExperimental()->AddObserver(this);
|
| +
|
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + headless::switches::kVirtualTimeBudget)) {
|
| + std::string budget_ms_ascii =
|
| + base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
|
| + headless::switches::kVirtualTimeBudget);
|
| + int budget_ms;
|
| + CHECK(base::StringToInt(budget_ms_ascii, &budget_ms))
|
| + << "Expected an integer value for --virtual-time-budget=";
|
| + devtools_client_->GetEmulation()->GetExperimental()->SetVirtualTimePolicy(
|
| + emulation::SetVirtualTimePolicyParams::Builder()
|
| + .SetPolicy(emulation::VirtualTimePolicy::
|
| + PAUSE_IF_NETWORK_FETCHES_PENDING)
|
| + .SetBudget(budget_ms)
|
| + .Build());
|
| + } else {
|
| + PollReadyState();
|
| + }
|
| // TODO(skyostil): Implement more features to demonstrate the devtools API.
|
| }
|
|
|
| @@ -139,8 +165,18 @@ class HeadlessShell : public HeadlessWebContents::Observer, page::Observer {
|
| }
|
| }
|
|
|
| + // emulation::Observer implementation:
|
| + void OnVirtualTimeBudgetExpired(
|
| + const emulation::VirtualTimeBudgetExpiredParams& params) override {
|
| + OnPageReady();
|
| + }
|
| +
|
| // page::Observer implementation:
|
| void OnLoadEventFired(const page::LoadEventFiredParams& params) override {
|
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + headless::switches::kVirtualTimeBudget)) {
|
| + return;
|
| + }
|
| OnPageReady();
|
| }
|
|
|
|
|