| Index: headless/test/headless_browser_test.cc | 
| diff --git a/headless/test/headless_browser_test.cc b/headless/test/headless_browser_test.cc | 
| index 380ccd7a28642277040a118c05977807c05e4b58..d308fbead5842407acbc9488a97a1262e48dcc4c 100644 | 
| --- a/headless/test/headless_browser_test.cc | 
| +++ b/headless/test/headless_browser_test.cc | 
| @@ -15,6 +15,7 @@ | 
| #include "headless/lib/headless_content_main_delegate.h" | 
| #include "headless/public/domains/network.h" | 
| #include "headless/public/domains/page.h" | 
| +#include "headless/public/domains/runtime.h" | 
| #include "headless/public/headless_devtools_client.h" | 
| #include "headless/public/headless_devtools_target.h" | 
| #include "headless/public/headless_web_contents.h" | 
| @@ -67,6 +68,43 @@ class WaitForLoadObserver : public page::Observer, public network::Observer { | 
| DISALLOW_COPY_AND_ASSIGN(WaitForLoadObserver); | 
| }; | 
|  | 
| +class EvaluateHelper { | 
| + public: | 
| +  EvaluateHelper(HeadlessBrowserTest* browser_test, | 
| +                 HeadlessWebContents* web_contents, | 
| +                 const std::string& script_to_eval) | 
| +      : browser_test_(browser_test), | 
| +        web_contents_(web_contents), | 
| +        devtools_client_(HeadlessDevToolsClient::Create()) { | 
| +    web_contents_->GetDevToolsTarget()->AttachClient(devtools_client_.get()); | 
| +    devtools_client_->GetRuntime()->Evaluate( | 
| +        script_to_eval, | 
| +        base::Bind(&EvaluateHelper::OnEvaluateResult, base::Unretained(this))); | 
| +  } | 
| + | 
| +  ~EvaluateHelper() { | 
| +    web_contents_->GetDevToolsTarget()->DetachClient(devtools_client_.get()); | 
| +  } | 
| + | 
| +  void OnEvaluateResult(std::unique_ptr<runtime::EvaluateResult> result) { | 
| +    result_ = std::move(result); | 
| +    browser_test_->FinishAsynchronousTest(); | 
| +  } | 
| + | 
| +  std::unique_ptr<runtime::EvaluateResult> TakeResult() { | 
| +    return std::move(result_); | 
| +  } | 
| + | 
| + private: | 
| +  HeadlessBrowserTest* browser_test_;  // Not owned. | 
| +  HeadlessWebContents* web_contents_;  // Not owned. | 
| +  std::unique_ptr<HeadlessDevToolsClient> devtools_client_; | 
| + | 
| +  std::unique_ptr<runtime::EvaluateResult> result_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(EvaluateHelper); | 
| +}; | 
| + | 
| }  // namespace | 
|  | 
| HeadlessBrowserTest::HeadlessBrowserTest() { | 
| @@ -114,6 +152,14 @@ bool HeadlessBrowserTest::WaitForLoad(HeadlessWebContents* web_contents) { | 
| return observer.navigation_succeeded(); | 
| } | 
|  | 
| +std::unique_ptr<runtime::EvaluateResult> HeadlessBrowserTest::EvaluateScript( | 
| +    HeadlessWebContents* web_contents, | 
| +    const std::string& script) { | 
| +  EvaluateHelper helper(this, web_contents, script); | 
| +  RunAsynchronousTest(); | 
| +  return helper.TakeResult(); | 
| +} | 
| + | 
| void HeadlessBrowserTest::RunAsynchronousTest() { | 
| base::MessageLoop::ScopedNestableTaskAllower nestable_allower( | 
| base::MessageLoop::current()); | 
|  |