Index: headless/app/headless_shell.cc |
diff --git a/headless/app/headless_shell.cc b/headless/app/headless_shell.cc |
index e1348e328ed10634668affd59a479af1b29429ed..cc79e1ec75d039ffb771445c8bab37e0fe107c75 100644 |
--- a/headless/app/headless_shell.cc |
+++ b/headless/app/headless_shell.cc |
@@ -14,6 +14,7 @@ |
#include "content/public/common/content_switches.h" |
#include "headless/app/headless_shell_switches.h" |
#include "headless/public/domains/page.h" |
+#include "headless/public/domains/runtime.h" |
#include "headless/public/headless_browser.h" |
#include "headless/public/headless_devtools_client.h" |
#include "headless/public/headless_devtools_target.h" |
@@ -25,6 +26,7 @@ using headless::HeadlessBrowser; |
using headless::HeadlessDevToolsClient; |
using headless::HeadlessWebContents; |
namespace page = headless::page; |
+namespace runtime = headless::runtime; |
namespace { |
// Address where to listen to incoming DevTools connections. |
@@ -32,18 +34,12 @@ const char kDevToolsHttpServerAddress[] = "127.0.0.1"; |
} |
// A sample application which demonstrates the use of the headless API. |
-class HeadlessShell : public HeadlessWebContents::Observer { |
+class HeadlessShell : public HeadlessWebContents::Observer, page::Observer { |
public: |
HeadlessShell() |
: browser_(nullptr), devtools_client_(HeadlessDevToolsClient::Create()) {} |
~HeadlessShell() override {} |
- void DevToolsTargetReady() override { |
- if (!RemoteDebuggingEnabled()) |
- web_contents_->GetDevToolsTarget()->AttachClient(devtools_client_.get()); |
- // TODO(skyostil): Implement more features to demonstrate the devtools API. |
- } |
- |
void OnStart(HeadlessBrowser* browser) { |
browser_ = browser; |
@@ -66,18 +62,43 @@ class HeadlessShell : public HeadlessWebContents::Observer { |
web_contents_->AddObserver(this); |
} |
- void ShutdownIfNeeded() { |
+ void Shutdown() { |
+ if (!web_contents_) |
+ return; |
if (!RemoteDebuggingEnabled()) { |
+ devtools_client_->GetPage()->RemoveObserver(this); |
web_contents_->GetDevToolsTarget()->DetachClient(devtools_client_.get()); |
- web_contents_->RemoveObserver(this); |
- web_contents_ = nullptr; |
- browser_->Shutdown(); |
} |
+ web_contents_->RemoveObserver(this); |
+ web_contents_ = nullptr; |
+ browser_->Shutdown(); |
} |
// HeadlessWebContents::Observer implementation: |
- void DocumentOnLoadCompletedInMainFrame() override { |
- ShutdownIfNeeded(); |
+ void DevToolsTargetReady() override { |
+ if (RemoteDebuggingEnabled()) |
+ return; |
+ web_contents_->GetDevToolsTarget()->AttachClient(devtools_client_.get()); |
+ devtools_client_->GetPage()->AddObserver(this); |
+ devtools_client_->GetPage()->Enable(); |
+ // Check if the document had already finished loading by the time we |
+ // attached. |
+ devtools_client_->GetRuntime()->Evaluate( |
+ "document.readyState", |
+ base::Bind(&HeadlessShell::OnReadyState, base::Unretained(this))); |
+ // TODO(skyostil): Implement more features to demonstrate the devtools API. |
+ } |
+ |
+ void OnReadyState(std::unique_ptr<runtime::EvaluateResult> result) { |
+ std::string ready_state; |
+ if (result->GetResult()->GetValue()->GetAsString(&ready_state) && |
+ ready_state == "complete") |
+ Shutdown(); |
+ } |
+ |
+ // page::Observer implementation: |
+ void OnLoadEventFired(const page::LoadEventFiredParams& params) override { |
+ Shutdown(); |
} |
bool RemoteDebuggingEnabled() const { |