Index: headless/lib/headless_devtools_client_browsertest.cc |
diff --git a/headless/lib/headless_devtools_client_browsertest.cc b/headless/lib/headless_devtools_client_browsertest.cc |
index 8b51fecac515e7b06cec68960f844c6c65ee38a5..4bba0eaf4bb03094f80e380b443fe465ebcb617a 100644 |
--- a/headless/lib/headless_devtools_client_browsertest.cc |
+++ b/headless/lib/headless_devtools_client_browsertest.cc |
@@ -4,7 +4,9 @@ |
#include <memory> |
+#include "base/json/json_reader.h" |
#include "content/public/test/browser_test.h" |
+#include "headless/public/domains/browser.h" |
#include "headless/public/domains/network.h" |
#include "headless/public/domains/page.h" |
#include "headless/public/domains/runtime.h" |
@@ -172,4 +174,314 @@ class HeadlessDevToolsClientExperimentalTest |
HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessDevToolsClientExperimentalTest); |
+class BrowserDomainCreateAndDeletePageTest |
+ : public HeadlessAsyncDevTooledBrowserTest { |
+ void RunDevTooledTest() override { |
+ EXPECT_TRUE(embedded_test_server()->Start()); |
+ |
+ EXPECT_EQ(1u, browser()->GetAllWebContents().size()); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->NewPage( |
+ browser::NewPageParams::Builder() |
+ .SetInitialUrl(embedded_test_server()->GetURL("/hello.html").spec()) |
+ .SetWidth(1) |
+ .SetHeight(1) |
+ .Build(), |
+ base::Bind(&BrowserDomainCreateAndDeletePageTest::OnNewPageResult, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnNewPageResult(std::unique_ptr<browser::NewPageResult> result) { |
+ EXPECT_EQ(2u, browser()->GetAllWebContents().size()); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->ClosePage( |
+ browser::ClosePageParams::Builder() |
+ .SetPageId(result->GetPageId()) |
+ .Build(), |
+ base::Bind(&BrowserDomainCreateAndDeletePageTest::OnClosePageResult, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnClosePageResult(std::unique_ptr<browser::ClosePageResult> result) { |
+ EXPECT_EQ(1u, browser()->GetAllWebContents().size()); |
+ FinishAsynchronousTest(); |
+ } |
+}; |
+ |
+HEADLESS_ASYNC_DEVTOOLED_TEST_F(BrowserDomainCreateAndDeletePageTest); |
+ |
+class BrowserDomainCloseContextFailsIfInUse |
+ : public HeadlessAsyncDevTooledBrowserTest { |
+ void RunDevTooledTest() override { |
+ EXPECT_TRUE(embedded_test_server()->Start()); |
+ |
+ EXPECT_EQ(1u, browser()->GetAllWebContents().size()); |
+ devtools_client_->GetBrowser()->GetExperimental()->NewBrowserContext( |
+ browser::NewBrowserContextParams::Builder().Build(), |
+ base::Bind(&BrowserDomainCloseContextFailsIfInUse::OnContextCreated, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnContextCreated( |
+ std::unique_ptr<browser::NewBrowserContextResult> result) { |
+ context_id_ = result->GetBrowserContextId(); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->NewPage( |
+ browser::NewPageParams::Builder() |
+ .SetInitialUrl(embedded_test_server()->GetURL("/hello.html").spec()) |
+ .SetBrowserContextId(context_id_) |
+ .Build(), |
+ base::Bind(&BrowserDomainCloseContextFailsIfInUse::OnNewPageResult, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnNewPageResult(std::unique_ptr<browser::NewPageResult> result) { |
+ page_id_ = result->GetPageId(); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->CloseBrowserContext( |
+ browser::CloseBrowserContextParams::Builder() |
+ .SetBrowserContextId(context_id_) |
+ .Build(), |
+ base::Bind( |
+ &BrowserDomainCloseContextFailsIfInUse::OnCloseBrowserContextResult, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnCloseBrowserContextResult( |
+ std::unique_ptr<browser::CloseBrowserContextResult> result) { |
+ EXPECT_FALSE(result->GetSuccess()); |
+ |
+ // Close the page and try again. |
+ devtools_client_->GetBrowser()->GetExperimental()->ClosePage( |
+ browser::ClosePageParams::Builder().SetPageId(page_id_).Build(), |
+ base::Bind(&BrowserDomainCloseContextFailsIfInUse::OnClosePageResult, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnClosePageResult(std::unique_ptr<browser::ClosePageResult> result) { |
+ EXPECT_TRUE(result->GetSuccess()); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->CloseBrowserContext( |
+ browser::CloseBrowserContextParams::Builder() |
+ .SetBrowserContextId(context_id_) |
+ .Build(), |
+ base::Bind(&BrowserDomainCloseContextFailsIfInUse:: |
+ OnCloseBrowserContextResult2, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnCloseBrowserContextResult2( |
+ std::unique_ptr<browser::CloseBrowserContextResult> result) { |
+ EXPECT_TRUE(result->GetSuccess()); |
+ FinishAsynchronousTest(); |
+ } |
+ |
+ private: |
+ std::string context_id_; |
+ std::string page_id_; |
+}; |
+ |
+HEADLESS_ASYNC_DEVTOOLED_TEST_F(BrowserDomainCloseContextFailsIfInUse); |
+ |
+class BrowserDomainCreateTwoContexts : public HeadlessAsyncDevTooledBrowserTest, |
+ public browser::ExperimentalObserver { |
+ public: |
+ void RunDevTooledTest() override { |
+ EXPECT_TRUE(embedded_test_server()->Start()); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->AddObserver(this); |
+ devtools_client_->GetBrowser()->GetExperimental()->NewBrowserContext( |
+ browser::NewBrowserContextParams::Builder().Build(), |
+ base::Bind(&BrowserDomainCreateTwoContexts::OnContextOneCreated, |
+ base::Unretained(this))); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->NewBrowserContext( |
+ browser::NewBrowserContextParams::Builder().Build(), |
+ base::Bind(&BrowserDomainCreateTwoContexts::OnContextTwoCreated, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnContextOneCreated( |
+ std::unique_ptr<browser::NewBrowserContextResult> result) { |
+ context_id_one_ = result->GetBrowserContextId(); |
+ MaybeCreatePages(); |
+ } |
+ |
+ void OnContextTwoCreated( |
+ std::unique_ptr<browser::NewBrowserContextResult> result) { |
+ context_id_two_ = result->GetBrowserContextId(); |
+ MaybeCreatePages(); |
+ } |
+ |
+ void MaybeCreatePages() { |
+ if (context_id_one_.empty() || context_id_two_.empty()) |
+ return; |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->NewPage( |
+ browser::NewPageParams::Builder() |
+ .SetInitialUrl(embedded_test_server()->GetURL("/hello.html").spec()) |
+ .SetBrowserContextId(context_id_one_) |
+ .Build(), |
+ base::Bind(&BrowserDomainCreateTwoContexts::OnNewPageOneResult, |
+ base::Unretained(this))); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->NewPage( |
+ browser::NewPageParams::Builder() |
+ .SetInitialUrl(embedded_test_server()->GetURL("/hello.html").spec()) |
+ .SetBrowserContextId(context_id_two_) |
+ .Build(), |
+ base::Bind(&BrowserDomainCreateTwoContexts::OnNewPageTwoResult, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnNewPageOneResult(std::unique_ptr<browser::NewPageResult> result) { |
+ page_id_one_ = result->GetPageId(); |
+ MaybeTestIsolation(); |
+ } |
+ |
+ void OnNewPageTwoResult(std::unique_ptr<browser::NewPageResult> result) { |
+ page_id_two_ = result->GetPageId(); |
+ MaybeTestIsolation(); |
+ } |
+ |
+ void MaybeTestIsolation() { |
+ if (page_id_one_.empty() || page_id_two_.empty()) |
+ return; |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->Attach( |
+ browser::AttachParams::Builder().SetTargetId(page_id_one_).Build(), |
+ base::Bind(&BrowserDomainCreateTwoContexts::OnAttachedOne, |
+ base::Unretained(this))); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->Attach( |
+ browser::AttachParams::Builder().SetTargetId(page_id_two_).Build(), |
+ base::Bind(&BrowserDomainCreateTwoContexts::OnAttachedTwo, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnAttachedOne(std::unique_ptr<browser::AttachResult> result) { |
+ devtools_client_->GetBrowser()->GetExperimental()->SendMessage( |
+ browser::SendMessageParams::Builder() |
+ .SetTargetId(page_id_one_) |
+ .SetMessage("{\"id\":101, \"method\": \"Page.enable\"}") |
+ .Build()); |
+ } |
+ |
+ void OnAttachedTwo(std::unique_ptr<browser::AttachResult> result) { |
+ devtools_client_->GetBrowser()->GetExperimental()->SendMessage( |
+ browser::SendMessageParams::Builder() |
+ .SetTargetId(page_id_two_) |
+ .SetMessage("{\"id\":102, \"method\": \"Page.enable\"}") |
+ .Build()); |
+ } |
+ |
+ void MaybeSetCookieOnPageOne() { |
+ if (!page_one_loaded_ || !page_two_loaded_) |
+ return; |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->SendMessage( |
+ browser::SendMessageParams::Builder() |
+ .SetTargetId(page_id_one_) |
+ .SetMessage("{\"id\":201, \"method\": \"Runtime.evaluate\", " |
+ "\"params\": {\"expression\": " |
+ "\"document.cookie = 'foo=bar';\"}}") |
+ .Build()); |
+ } |
+ |
+ void OnDispatchMessage( |
+ const browser::DispatchMessageParams& params) override { |
+ std::unique_ptr<base::Value> message = |
+ base::JSONReader::Read(params.GetMessage(), base::JSON_PARSE_RFC); |
+ const base::DictionaryValue* message_dict; |
+ if (!message || !message->GetAsDictionary(&message_dict)) { |
+ return; |
+ } |
+ std::string method; |
+ if (message_dict->GetString("method", &method) && |
+ method == "Page.loadEventFired") { |
+ if (params.GetTargetId() == page_id_one_) { |
+ page_one_loaded_ = true; |
+ } else if (params.GetTargetId() == page_id_two_) { |
+ page_two_loaded_ = true; |
+ } |
+ MaybeSetCookieOnPageOne(); |
+ return; |
+ } |
+ const base::DictionaryValue* result_dict; |
+ if (message_dict->GetDictionary("result", &result_dict)) { |
+ // There's a nested result. We want the inner one. |
+ if (!result_dict->GetDictionary("result", &result_dict)) |
+ return; |
+ std::string value; |
+ if (params.GetTargetId() == page_id_one_) { |
+ // TODO(alexclarke): Make some better bindings for Browser.sendMessage. |
+ devtools_client_->GetBrowser()->GetExperimental()->SendMessage( |
+ browser::SendMessageParams::Builder() |
+ .SetTargetId(page_id_two_) |
+ .SetMessage("{\"id\":202, \"method\": \"Runtime.evaluate\", " |
+ "\"params\": {\"expression\": " |
+ "\"document.cookie;\"}}") |
+ .Build()); |
+ } else if (params.GetTargetId() == page_id_two_ && |
+ result_dict->GetString("value", &value)) { |
+ EXPECT_EQ("", value) << "Page 2 should not share cookies from page one"; |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->ClosePage( |
+ browser::ClosePageParams::Builder().SetPageId(page_id_one_).Build(), |
+ base::Bind(&BrowserDomainCreateTwoContexts::OnClosePage, |
+ base::Unretained(this))); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->ClosePage( |
+ browser::ClosePageParams::Builder().SetPageId(page_id_two_).Build(), |
+ base::Bind(&BrowserDomainCreateTwoContexts::OnClosePage, |
+ base::Unretained(this))); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->RemoveObserver(this); |
+ } |
+ } |
+ } |
+ |
+ void OnClosePage(std::unique_ptr<browser::ClosePageResult> result) { |
+ page_close_count_++; |
+ |
+ if (page_close_count_ < 2) |
+ return; |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->CloseBrowserContext( |
+ browser::CloseBrowserContextParams::Builder() |
+ .SetBrowserContextId(context_id_one_) |
+ .Build(), |
+ base::Bind(&BrowserDomainCreateTwoContexts::OnCloseContext, |
+ base::Unretained(this))); |
+ |
+ devtools_client_->GetBrowser()->GetExperimental()->CloseBrowserContext( |
+ browser::CloseBrowserContextParams::Builder() |
+ .SetBrowserContextId(context_id_two_) |
+ .Build(), |
+ base::Bind(&BrowserDomainCreateTwoContexts::OnCloseContext, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnCloseContext( |
+ std::unique_ptr<browser::CloseBrowserContextResult> result) { |
+ EXPECT_TRUE(result->GetSuccess()); |
+ if (++context_closed_count_ < 2) |
+ return; |
+ |
+ FinishAsynchronousTest(); |
+ } |
+ |
+ private: |
+ std::string context_id_one_; |
+ std::string context_id_two_; |
+ std::string page_id_one_; |
+ std::string page_id_two_; |
+ bool page_one_loaded_ = false; |
+ bool page_two_loaded_ = false; |
+ int page_close_count_ = 0; |
+ int context_closed_count_ = 0; |
+}; |
+ |
+HEADLESS_ASYNC_DEVTOOLED_TEST_F(BrowserDomainCreateTwoContexts); |
+ |
} // namespace headless |