Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: headless/lib/headless_devtools_client_browsertest.cc

Issue 2119063002: Add commands to manage tabs and contexts to Browser Domain (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing Sami's comments. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <memory> 5 #include <memory>
6 6
7 #include "base/json/json_reader.h"
7 #include "content/public/test/browser_test.h" 8 #include "content/public/test/browser_test.h"
9 #include "headless/public/domains/browser.h"
8 #include "headless/public/domains/network.h" 10 #include "headless/public/domains/network.h"
9 #include "headless/public/domains/page.h" 11 #include "headless/public/domains/page.h"
10 #include "headless/public/domains/runtime.h" 12 #include "headless/public/domains/runtime.h"
11 #include "headless/public/headless_browser.h" 13 #include "headless/public/headless_browser.h"
12 #include "headless/public/headless_devtools_client.h" 14 #include "headless/public/headless_devtools_client.h"
13 #include "headless/test/headless_browser_test.h" 15 #include "headless/test/headless_browser_test.h"
14 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
15 #include "url/gurl.h" 17 #include "url/gurl.h"
16 18
17 namespace headless { 19 namespace headless {
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 } 167 }
166 168
167 void OnFrameStoppedLoading( 169 void OnFrameStoppedLoading(
168 const page::FrameStoppedLoadingParams& params) override { 170 const page::FrameStoppedLoadingParams& params) override {
169 FinishAsynchronousTest(); 171 FinishAsynchronousTest();
170 } 172 }
171 }; 173 };
172 174
173 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessDevToolsClientExperimentalTest); 175 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessDevToolsClientExperimentalTest);
174 176
177 class BrowserDomainCreateAndDeletePageTest
178 : public HeadlessAsyncDevTooledBrowserTest {
179 void RunDevTooledTest() override {
180 EXPECT_TRUE(embedded_test_server()->Start());
181
182 EXPECT_EQ(1u, browser()->GetAllWebContents().size());
183
184 devtools_client_->GetBrowser()->GetExperimental()->NewPage(
185 browser::NewPageParams::Builder()
186 .SetInitialUrl(embedded_test_server()->GetURL("/hello.html").spec())
187 .SetWidth(1)
188 .SetHeight(1)
189 .Build(),
190 base::Bind(&BrowserDomainCreateAndDeletePageTest::OnNewPageResult,
191 base::Unretained(this)));
192 }
193
194 void OnNewPageResult(std::unique_ptr<browser::NewPageResult> result) {
195 EXPECT_EQ(2u, browser()->GetAllWebContents().size());
196
197 devtools_client_->GetBrowser()->GetExperimental()->ClosePage(
198 browser::ClosePageParams::Builder()
199 .SetPageId(result->GetPageId())
200 .Build(),
201 base::Bind(&BrowserDomainCreateAndDeletePageTest::OnClosePageResult,
202 base::Unretained(this)));
203 }
204
205 void OnClosePageResult(std::unique_ptr<browser::ClosePageResult> result) {
206 EXPECT_EQ(1u, browser()->GetAllWebContents().size());
207 FinishAsynchronousTest();
208 }
209 };
210
211 HEADLESS_ASYNC_DEVTOOLED_TEST_F(BrowserDomainCreateAndDeletePageTest);
212
213 class BrowserDomainCloseContextFailsIfInUse
214 : public HeadlessAsyncDevTooledBrowserTest {
215 void RunDevTooledTest() override {
216 EXPECT_TRUE(embedded_test_server()->Start());
217
218 EXPECT_EQ(1u, browser()->GetAllWebContents().size());
219 devtools_client_->GetBrowser()->GetExperimental()->NewBrowserContext(
220 browser::NewBrowserContextParams::Builder().Build(),
221 base::Bind(&BrowserDomainCloseContextFailsIfInUse::OnContextCreated,
222 base::Unretained(this)));
223 }
224
225 void OnContextCreated(
226 std::unique_ptr<browser::NewBrowserContextResult> result) {
227 context_id_ = result->GetBrowserContextId();
228
229 devtools_client_->GetBrowser()->GetExperimental()->NewPage(
230 browser::NewPageParams::Builder()
231 .SetInitialUrl(embedded_test_server()->GetURL("/hello.html").spec())
232 .SetBrowserContextId(context_id_)
233 .Build(),
234 base::Bind(&BrowserDomainCloseContextFailsIfInUse::OnNewPageResult,
235 base::Unretained(this)));
236 }
237
238 void OnNewPageResult(std::unique_ptr<browser::NewPageResult> result) {
239 page_id_ = result->GetPageId();
240
241 devtools_client_->GetBrowser()->GetExperimental()->CloseBrowserContext(
242 browser::CloseBrowserContextParams::Builder()
243 .SetBrowserContextId(context_id_)
244 .Build(),
245 base::Bind(
246 &BrowserDomainCloseContextFailsIfInUse::OnCloseBrowserContextResult,
247 base::Unretained(this)));
248 }
249
250 void OnCloseBrowserContextResult(
251 std::unique_ptr<browser::CloseBrowserContextResult> result) {
252 EXPECT_FALSE(result->GetSuccess());
253
254 // Close the page and try again.
255 devtools_client_->GetBrowser()->GetExperimental()->ClosePage(
256 browser::ClosePageParams::Builder().SetPageId(page_id_).Build(),
257 base::Bind(&BrowserDomainCloseContextFailsIfInUse::OnClosePageResult,
258 base::Unretained(this)));
259 }
260
261 void OnClosePageResult(std::unique_ptr<browser::ClosePageResult> result) {
262 EXPECT_TRUE(result->GetSuccess());
263
264 devtools_client_->GetBrowser()->GetExperimental()->CloseBrowserContext(
265 browser::CloseBrowserContextParams::Builder()
266 .SetBrowserContextId(context_id_)
267 .Build(),
268 base::Bind(&BrowserDomainCloseContextFailsIfInUse::
269 OnCloseBrowserContextResult2,
270 base::Unretained(this)));
271 }
272
273 void OnCloseBrowserContextResult2(
274 std::unique_ptr<browser::CloseBrowserContextResult> result) {
275 EXPECT_TRUE(result->GetSuccess());
276 FinishAsynchronousTest();
277 }
278
279 private:
280 std::string context_id_;
281 std::string page_id_;
282 };
283
284 HEADLESS_ASYNC_DEVTOOLED_TEST_F(BrowserDomainCloseContextFailsIfInUse);
285
286 class BrowserDomainCreateTwoContexts : public HeadlessAsyncDevTooledBrowserTest,
287 public browser::ExperimentalObserver {
288 public:
289 void RunDevTooledTest() override {
290 EXPECT_TRUE(embedded_test_server()->Start());
291
292 devtools_client_->GetBrowser()->GetExperimental()->AddObserver(this);
293 devtools_client_->GetBrowser()->GetExperimental()->NewBrowserContext(
294 browser::NewBrowserContextParams::Builder().Build(),
295 base::Bind(&BrowserDomainCreateTwoContexts::OnContextOneCreated,
296 base::Unretained(this)));
297
298 devtools_client_->GetBrowser()->GetExperimental()->NewBrowserContext(
299 browser::NewBrowserContextParams::Builder().Build(),
300 base::Bind(&BrowserDomainCreateTwoContexts::OnContextTwoCreated,
301 base::Unretained(this)));
302 }
303
304 void OnContextOneCreated(
305 std::unique_ptr<browser::NewBrowserContextResult> result) {
306 context_id_one_ = result->GetBrowserContextId();
307 MaybeCreatePages();
308 }
309
310 void OnContextTwoCreated(
311 std::unique_ptr<browser::NewBrowserContextResult> result) {
312 context_id_two_ = result->GetBrowserContextId();
313 MaybeCreatePages();
314 }
315
316 void MaybeCreatePages() {
317 if (context_id_one_.empty() || context_id_two_.empty())
318 return;
319
320 devtools_client_->GetBrowser()->GetExperimental()->NewPage(
321 browser::NewPageParams::Builder()
322 .SetInitialUrl(embedded_test_server()->GetURL("/hello.html").spec())
323 .SetBrowserContextId(context_id_one_)
324 .Build(),
325 base::Bind(&BrowserDomainCreateTwoContexts::OnNewPageOneResult,
326 base::Unretained(this)));
327
328 devtools_client_->GetBrowser()->GetExperimental()->NewPage(
329 browser::NewPageParams::Builder()
330 .SetInitialUrl(embedded_test_server()->GetURL("/hello.html").spec())
331 .SetBrowserContextId(context_id_two_)
332 .Build(),
333 base::Bind(&BrowserDomainCreateTwoContexts::OnNewPageTwoResult,
334 base::Unretained(this)));
335 }
336
337 void OnNewPageOneResult(std::unique_ptr<browser::NewPageResult> result) {
338 page_id_one_ = result->GetPageId();
339 MaybeTestIsolation();
340 }
341
342 void OnNewPageTwoResult(std::unique_ptr<browser::NewPageResult> result) {
343 page_id_two_ = result->GetPageId();
344 MaybeTestIsolation();
345 }
346
347 void MaybeTestIsolation() {
348 if (page_id_one_.empty() || page_id_two_.empty())
349 return;
350
351 devtools_client_->GetBrowser()->GetExperimental()->Attach(
352 browser::AttachParams::Builder().SetTargetId(page_id_one_).Build(),
353 base::Bind(&BrowserDomainCreateTwoContexts::OnAttachedOne,
354 base::Unretained(this)));
355
356 devtools_client_->GetBrowser()->GetExperimental()->Attach(
357 browser::AttachParams::Builder().SetTargetId(page_id_two_).Build(),
358 base::Bind(&BrowserDomainCreateTwoContexts::OnAttachedTwo,
359 base::Unretained(this)));
360 }
361
362 void OnAttachedOne(std::unique_ptr<browser::AttachResult> result) {
363 devtools_client_->GetBrowser()->GetExperimental()->SendMessage(
364 browser::SendMessageParams::Builder()
365 .SetTargetId(page_id_one_)
366 .SetMessage("{\"id\":101, \"method\": \"Page.enable\"}")
367 .Build());
368 }
369
370 void OnAttachedTwo(std::unique_ptr<browser::AttachResult> result) {
371 devtools_client_->GetBrowser()->GetExperimental()->SendMessage(
372 browser::SendMessageParams::Builder()
373 .SetTargetId(page_id_two_)
374 .SetMessage("{\"id\":102, \"method\": \"Page.enable\"}")
375 .Build());
376 }
377
378 void MaybeSetCookieOnPageOne() {
379 if (!page_one_loaded_ || !page_two_loaded_)
380 return;
381
382 devtools_client_->GetBrowser()->GetExperimental()->SendMessage(
383 browser::SendMessageParams::Builder()
384 .SetTargetId(page_id_one_)
385 .SetMessage("{\"id\":201, \"method\": \"Runtime.evaluate\", "
386 "\"params\": {\"expression\": "
387 "\"document.cookie = 'foo=bar';\"}}")
388 .Build());
389 }
390
391 void OnDispatchMessage(
392 const browser::DispatchMessageParams& params) override {
393 std::unique_ptr<base::Value> message =
394 base::JSONReader::Read(params.GetMessage(), base::JSON_PARSE_RFC);
395 const base::DictionaryValue* message_dict;
396 if (!message || !message->GetAsDictionary(&message_dict)) {
397 return;
398 }
399 std::string method;
400 if (message_dict->GetString("method", &method) &&
401 method == "Page.loadEventFired") {
402 if (params.GetTargetId() == page_id_one_) {
403 page_one_loaded_ = true;
404 } else if (params.GetTargetId() == page_id_two_) {
405 page_two_loaded_ = true;
406 }
407 MaybeSetCookieOnPageOne();
408 return;
409 }
410 const base::DictionaryValue* result_dict;
411 if (message_dict->GetDictionary("result", &result_dict)) {
412 // There's a nested result. We want the inner one.
413 if (!result_dict->GetDictionary("result", &result_dict))
414 return;
415 std::string value;
416 if (params.GetTargetId() == page_id_one_) {
417 // TODO(alexclarke): Make some better bindings for Browser.sendMessage.
418 devtools_client_->GetBrowser()->GetExperimental()->SendMessage(
419 browser::SendMessageParams::Builder()
420 .SetTargetId(page_id_two_)
421 .SetMessage("{\"id\":202, \"method\": \"Runtime.evaluate\", "
422 "\"params\": {\"expression\": "
423 "\"document.cookie;\"}}")
424 .Build());
425 } else if (params.GetTargetId() == page_id_two_ &&
426 result_dict->GetString("value", &value)) {
427 EXPECT_EQ("", value) << "Page 2 should not share cookies from page one";
428
429 devtools_client_->GetBrowser()->GetExperimental()->ClosePage(
430 browser::ClosePageParams::Builder().SetPageId(page_id_one_).Build(),
431 base::Bind(&BrowserDomainCreateTwoContexts::OnClosePage,
432 base::Unretained(this)));
433
434 devtools_client_->GetBrowser()->GetExperimental()->ClosePage(
435 browser::ClosePageParams::Builder().SetPageId(page_id_two_).Build(),
436 base::Bind(&BrowserDomainCreateTwoContexts::OnClosePage,
437 base::Unretained(this)));
438
439 devtools_client_->GetBrowser()->GetExperimental()->RemoveObserver(this);
440 }
441 }
442 }
443
444 void OnClosePage(std::unique_ptr<browser::ClosePageResult> result) {
445 page_close_count_++;
446
447 if (page_close_count_ < 2)
448 return;
449
450 devtools_client_->GetBrowser()->GetExperimental()->CloseBrowserContext(
451 browser::CloseBrowserContextParams::Builder()
452 .SetBrowserContextId(context_id_one_)
453 .Build(),
454 base::Bind(&BrowserDomainCreateTwoContexts::OnCloseContext,
455 base::Unretained(this)));
456
457 devtools_client_->GetBrowser()->GetExperimental()->CloseBrowserContext(
458 browser::CloseBrowserContextParams::Builder()
459 .SetBrowserContextId(context_id_two_)
460 .Build(),
461 base::Bind(&BrowserDomainCreateTwoContexts::OnCloseContext,
462 base::Unretained(this)));
463 }
464
465 void OnCloseContext(
466 std::unique_ptr<browser::CloseBrowserContextResult> result) {
467 EXPECT_TRUE(result->GetSuccess());
468 if (++context_closed_count_ < 2)
469 return;
470
471 FinishAsynchronousTest();
472 }
473
474 private:
475 std::string context_id_one_;
476 std::string context_id_two_;
477 std::string page_id_one_;
478 std::string page_id_two_;
479 bool page_one_loaded_ = false;
480 bool page_two_loaded_ = false;
481 int page_close_count_ = 0;
482 int context_closed_count_ = 0;
483 };
484
485 HEADLESS_ASYNC_DEVTOOLED_TEST_F(BrowserDomainCreateTwoContexts);
486
175 } // namespace headless 487 } // namespace headless
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698