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

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

Issue 2873283002: [Reland] Allow headless TabSocket in isolated worlds & remove obsolete logic (Closed)
Patch Set: Fix GN Issue Created 3 years, 7 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
« no previous file with comments | « headless/lib/browser/headless_web_contents_impl.cc ('k') | headless/lib/renderer/DEPS » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include <string> 6 #include <string>
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/json/json_writer.h"
10 #include "content/public/test/browser_test.h" 11 #include "content/public/test/browser_test.h"
11 #include "headless/public/devtools/domains/page.h" 12 #include "headless/public/devtools/domains/page.h"
12 #include "headless/public/devtools/domains/runtime.h" 13 #include "headless/public/devtools/domains/runtime.h"
13 #include "headless/public/devtools/domains/security.h" 14 #include "headless/public/devtools/domains/security.h"
14 #include "headless/public/headless_browser.h" 15 #include "headless/public/headless_browser.h"
15 #include "headless/public/headless_devtools_client.h" 16 #include "headless/public/headless_devtools_client.h"
16 #include "headless/public/headless_tab_socket.h" 17 #include "headless/public/headless_tab_socket.h"
17 #include "headless/public/headless_web_contents.h" 18 #include "headless/public/headless_web_contents.h"
18 #include "headless/test/headless_browser_test.h" 19 #include "headless/test/headless_browser_test.h"
19 #include "printing/features/features.h" 20 #include "printing/features/features.h"
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 288
288 devtools_client_->GetSecurity()->GetExperimental()->Disable( 289 devtools_client_->GetSecurity()->GetExperimental()->Disable(
289 security::DisableParams::Builder().Build()); 290 security::DisableParams::Builder().Build());
290 devtools_client_->GetSecurity()->GetExperimental()->RemoveObserver(this); 291 devtools_client_->GetSecurity()->GetExperimental()->RemoveObserver(this);
291 FinishAsynchronousTest(); 292 FinishAsynchronousTest();
292 } 293 }
293 }; 294 };
294 295
295 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessWebContentsSecurityTest); 296 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessWebContentsSecurityTest);
296 297
297 class HeadlessTabSocketTest : public HeadlessAsyncDevTooledBrowserTest, 298 class GetHeadlessTabSocketButNoTabSocket
298 public HeadlessTabSocket::Listener { 299 : public HeadlessAsyncDevTooledBrowserTest {
299 public: 300 public:
300 void SetUp() override { 301 void SetUp() override {
301 options()->mojo_service_names.insert("headless::TabSocket"); 302 options()->mojo_service_names.insert("headless::TabSocket");
303 HeadlessAsyncDevTooledBrowserTest::SetUp();
304 }
305
306 void RunDevTooledTest() override {
307 ASSERT_THAT(web_contents_->GetHeadlessTabSocket(), testing::IsNull());
308 FinishAsynchronousTest();
309 }
310
311 HeadlessWebContents::Builder::TabSocketType GetTabSocketType() override {
312 return HeadlessWebContents::Builder::TabSocketType::NONE;
313 }
314 };
315
316 HEADLESS_ASYNC_DEVTOOLED_TEST_F(GetHeadlessTabSocketButNoTabSocket);
317
318 class HeadlessMainWorldTabSocketTest : public HeadlessAsyncDevTooledBrowserTest,
319 public HeadlessTabSocket::Listener {
320 public:
321 void SetUp() override {
322 options()->mojo_service_names.insert("headless::TabSocket");
302 HeadlessAsyncDevTooledBrowserTest::SetUp(); 323 HeadlessAsyncDevTooledBrowserTest::SetUp();
303 } 324 }
304 325
305 void RunDevTooledTest() override { 326 void RunDevTooledTest() override {
306 devtools_client_->GetRuntime()->Evaluate( 327 devtools_client_->GetRuntime()->Evaluate(
307 R"(window.TabSocket.onmessage = 328 R"(window.TabSocket.onmessage =
308 function(event) { 329 function(message) {
309 window.TabSocket.send( 330 window.TabSocket.send('Embedder sent us: ' + message);
310 'Embedder sent us: ' + event.detail.message);
311 }; 331 };
312 )"); 332 )");
313 333
314 HeadlessTabSocket* headless_tab_socket = 334 HeadlessTabSocket* headless_tab_socket =
315 web_contents_->GetHeadlessTabSocket(); 335 web_contents_->GetHeadlessTabSocket();
316 DCHECK(headless_tab_socket); 336 DCHECK(headless_tab_socket);
317 337
318 headless_tab_socket->SendMessageToTab("Hello"); 338 headless_tab_socket->SendMessageToTab("Hello");
319 headless_tab_socket->SetListener(this); 339 headless_tab_socket->SetListener(this);
320 } 340 }
321 341
322 void OnMessageFromTab(const std::string& message) override { 342 void OnMessageFromTab(const std::string& message) override {
323 EXPECT_EQ("Embedder sent us: Hello", message); 343 EXPECT_EQ("Embedder sent us: Hello", message);
324 FinishAsynchronousTest(); 344 FinishAsynchronousTest();
325 } 345 }
326 346
327 bool GetCreateTabSocket() override { return true; } 347 HeadlessWebContents::Builder::TabSocketType GetTabSocketType() override {
328 }; 348 return HeadlessWebContents::Builder::TabSocketType::MAIN_WORLD;
329 349 }
330 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessTabSocketTest); 350 };
351
352 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessMainWorldTabSocketTest);
353
354 class HeadlessMainWorldTabSocketNotThereTest
355 : public HeadlessAsyncDevTooledBrowserTest,
356 public HeadlessTabSocket::Listener {
357 public:
358 void SetUp() override {
359 options()->mojo_service_names.insert("headless::TabSocket");
360 HeadlessAsyncDevTooledBrowserTest::SetUp();
361 }
362
363 void RunDevTooledTest() override {
364 // We expect this to fail because the TabSocket is being injected into
365 // isolated worlds.
366 devtools_client_->GetRuntime()->Evaluate(
367 "window.TabSocket.send('This should not work!');",
368 base::Bind(&HeadlessMainWorldTabSocketNotThereTest::EvaluateResult,
369 base::Unretained(this)));
370
371 HeadlessTabSocket* headless_tab_socket =
372 web_contents_->GetHeadlessTabSocket();
373 DCHECK(headless_tab_socket);
374
375 headless_tab_socket->SetListener(this);
376 }
377
378 void EvaluateResult(std::unique_ptr<runtime::EvaluateResult> result) {
379 EXPECT_TRUE(result->HasExceptionDetails());
380 FinishAsynchronousTest();
381 }
382
383 void OnMessageFromTab(const std::string&) override {
384 #ifdef OS_WIN
385 FinishAsynchronousTest();
386 FAIL() << "Should not receive a message from the tab!";
387 #else
388 FAIL() << "Should not receive a message from the tab!";
389 FinishAsynchronousTest();
390 #endif
391 }
392
393 HeadlessWebContents::Builder::TabSocketType GetTabSocketType() override {
394 return HeadlessWebContents::Builder::TabSocketType::ISOLATED_WORLD;
395 }
396 };
397
398 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessMainWorldTabSocketNotThereTest);
399
400 class HeadlessIsolatedWorldTabSocketTest
401 : public HeadlessAsyncDevTooledBrowserTest,
402 public HeadlessTabSocket::Listener,
403 public runtime::Observer {
404 public:
405 void SetUp() override {
406 options()->mojo_service_names.insert("headless::TabSocket");
407 HeadlessAsyncDevTooledBrowserTest::SetUp();
408 }
409
410 void RunDevTooledTest() override {
411 devtools_client_->GetRuntime()->AddObserver(this);
412 devtools_client_->GetRuntime()->Enable();
413
414 devtools_client_->GetPage()->GetExperimental()->GetResourceTree(
415 page::GetResourceTreeParams::Builder().Build(),
416 base::Bind(&HeadlessIsolatedWorldTabSocketTest::OnResourceTree,
417 base::Unretained(this)));
418
419 HeadlessTabSocket* headless_tab_socket =
420 web_contents_->GetHeadlessTabSocket();
421 DCHECK(headless_tab_socket);
422 headless_tab_socket->SendMessageToTab("Hello!!!");
423 headless_tab_socket->SetListener(this);
424 }
425
426 void OnResourceTree(std::unique_ptr<page::GetResourceTreeResult> result) {
427 main_frame_id_ = result->GetFrameTree()->GetFrame()->GetId();
428 devtools_client_->GetPage()->GetExperimental()->CreateIsolatedWorld(
429 page::CreateIsolatedWorldParams::Builder()
430 .SetFrameId(main_frame_id_)
431 .Build());
432 }
433
434 void OnExecutionContextCreated(
435 const runtime::ExecutionContextCreatedParams& params) override {
436 const base::DictionaryValue* dictionary;
437 std::string frame_id;
438 bool is_main_world;
439 // If the isolated world was created then eval some script in it.
440 if (params.GetContext()->HasAuxData() &&
441 params.GetContext()->GetAuxData()->GetAsDictionary(&dictionary) &&
442 dictionary->GetString("frameId", &frame_id) &&
443 frame_id == main_frame_id_ &&
444 dictionary->GetBoolean("isDefault", &is_main_world) && !is_main_world) {
445 devtools_client_->GetRuntime()->Evaluate(
446 runtime::EvaluateParams::Builder()
447 .SetExpression(
448 R"(window.TabSocket.onmessage =
449 function(message) {
450 TabSocket.send('Embedder sent us: ' + message);
451 };
452 )")
453 .SetContextId(params.GetContext()->GetId())
454 .Build());
455 }
456 }
457
458 void OnMessageFromTab(const std::string& message) override {
459 EXPECT_EQ("Embedder sent us: Hello!!!", message);
460 FinishAsynchronousTest();
461 }
462
463 HeadlessWebContents::Builder::TabSocketType GetTabSocketType() override {
464 return HeadlessWebContents::Builder::TabSocketType::ISOLATED_WORLD;
465 }
466
467 private:
468 std::string main_frame_id_;
469 };
470
471 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessIsolatedWorldTabSocketTest);
472
473 class HeadlessIsolatedWorldTabSocketNotThereTest
474 : public HeadlessAsyncDevTooledBrowserTest,
475 public HeadlessTabSocket::Listener,
476 public runtime::Observer {
477 public:
478 void SetUp() override {
479 options()->mojo_service_names.insert("headless::TabSocket");
480 HeadlessAsyncDevTooledBrowserTest::SetUp();
481 }
482
483 void RunDevTooledTest() override {
484 devtools_client_->GetRuntime()->AddObserver(this);
485 devtools_client_->GetRuntime()->Enable();
486
487 devtools_client_->GetPage()->GetExperimental()->GetResourceTree(
488 page::GetResourceTreeParams::Builder().Build(),
489 base::Bind(&HeadlessIsolatedWorldTabSocketNotThereTest::OnResourceTree,
490 base::Unretained(this)));
491
492 HeadlessTabSocket* headless_tab_socket =
493 web_contents_->GetHeadlessTabSocket();
494 DCHECK(headless_tab_socket);
495 headless_tab_socket->SendMessageToTab("Hello!!!");
496 headless_tab_socket->SetListener(this);
497 }
498
499 void OnResourceTree(std::unique_ptr<page::GetResourceTreeResult> result) {
500 main_frame_id_ = result->GetFrameTree()->GetFrame()->GetId();
501 devtools_client_->GetPage()->GetExperimental()->CreateIsolatedWorld(
502 page::CreateIsolatedWorldParams::Builder()
503 .SetFrameId(main_frame_id_)
504 .Build());
505 }
506
507 void OnExecutionContextCreated(
508 const runtime::ExecutionContextCreatedParams& params) override {
509 const base::DictionaryValue* dictionary;
510 std::string frame_id;
511 bool is_main_world;
512 // If the isolated world was created then eval some script in it.
513 if (params.GetContext()->HasAuxData() &&
514 params.GetContext()->GetAuxData()->GetAsDictionary(&dictionary) &&
515 dictionary->GetString("frameId", &frame_id) &&
516 frame_id == main_frame_id_ &&
517 dictionary->GetBoolean("isDefault", &is_main_world) && !is_main_world) {
518 // We expect this to fail because the TabSocket is being injected into the
519 // main world.
520 devtools_client_->GetRuntime()->Evaluate(
521 runtime::EvaluateParams::Builder()
522 .SetExpression("window.TabSocket.send('This should not work!');")
523 .SetContextId(params.GetContext()->GetId())
524 .Build(),
525 base::Bind(
526 &HeadlessIsolatedWorldTabSocketNotThereTest::EvaluateResult,
527 base::Unretained(this)));
528 }
529 }
530
531 void EvaluateResult(std::unique_ptr<runtime::EvaluateResult> result) {
532 EXPECT_TRUE(result->HasExceptionDetails());
533 FinishAsynchronousTest();
534 }
535
536 void OnMessageFromTab(const std::string&) override {
537 #ifdef OS_WIN
538 FinishAsynchronousTest();
539 FAIL() << "Should not receive a message from the tab!";
540 #else
541 FAIL() << "Should not receive a message from the tab!";
542 FinishAsynchronousTest();
543 #endif
544 }
545
546 HeadlessWebContents::Builder::TabSocketType GetTabSocketType() override {
547 return HeadlessWebContents::Builder::TabSocketType::MAIN_WORLD;
548 }
549
550 private:
551 std::string main_frame_id_;
552 };
553
554 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessIsolatedWorldTabSocketNotThereTest);
331 555
332 } // namespace headless 556 } // namespace headless
OLDNEW
« no previous file with comments | « headless/lib/browser/headless_web_contents_impl.cc ('k') | headless/lib/renderer/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698