| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 4431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4442 bool Equals(Notification* other) { | 4442 bool Equals(Notification* other) { |
| 4443 return other && frame == other->frame && context == other->context && | 4443 return other && frame == other->frame && context == other->context && |
| 4444 world_id == other->world_id; | 4444 world_id == other->world_id; |
| 4445 } | 4445 } |
| 4446 | 4446 |
| 4447 WebLocalFrame* frame; | 4447 WebLocalFrame* frame; |
| 4448 v8::Persistent<v8::Context> context; | 4448 v8::Persistent<v8::Context> context; |
| 4449 int world_id; | 4449 int world_id; |
| 4450 }; | 4450 }; |
| 4451 | 4451 |
| 4452 ContextLifetimeTestWebFrameClient( |
| 4453 Vector<std::unique_ptr<Notification>>& create_notifications, |
| 4454 Vector<std::unique_ptr<Notification>>& release_notifications) |
| 4455 : create_notifications_(create_notifications), |
| 4456 release_notifications_(release_notifications) {} |
| 4457 |
| 4452 ~ContextLifetimeTestWebFrameClient() override { Reset(); } | 4458 ~ContextLifetimeTestWebFrameClient() override { Reset(); } |
| 4453 | 4459 |
| 4454 void Reset() { | 4460 void Reset() { |
| 4455 create_notifications.clear(); | 4461 create_notifications_.clear(); |
| 4456 release_notifications.clear(); | 4462 release_notifications_.clear(); |
| 4457 } | 4463 } |
| 4458 | 4464 |
| 4459 Vector<std::unique_ptr<Notification>> create_notifications; | 4465 private: |
| 4460 Vector<std::unique_ptr<Notification>> release_notifications; | 4466 Vector<std::unique_ptr<Notification>>& create_notifications_; |
| 4467 Vector<std::unique_ptr<Notification>>& release_notifications_; |
| 4461 | 4468 |
| 4462 private: | |
| 4463 void DidCreateScriptContext(WebLocalFrame* frame, | 4469 void DidCreateScriptContext(WebLocalFrame* frame, |
| 4464 v8::Local<v8::Context> context, | 4470 v8::Local<v8::Context> context, |
| 4465 int world_id) override { | 4471 int world_id) override { |
| 4466 create_notifications.push_back( | 4472 ASSERT_EQ(Frame(), frame); |
| 4473 create_notifications_.push_back( |
| 4467 WTF::MakeUnique<Notification>(frame, context, world_id)); | 4474 WTF::MakeUnique<Notification>(frame, context, world_id)); |
| 4468 } | 4475 } |
| 4469 | 4476 |
| 4470 void WillReleaseScriptContext(WebLocalFrame* frame, | 4477 void WillReleaseScriptContext(WebLocalFrame* frame, |
| 4471 v8::Local<v8::Context> context, | 4478 v8::Local<v8::Context> context, |
| 4472 int world_id) override { | 4479 int world_id) override { |
| 4473 release_notifications.push_back( | 4480 ASSERT_EQ(Frame(), frame); |
| 4481 release_notifications_.push_back( |
| 4474 WTF::MakeUnique<Notification>(frame, context, world_id)); | 4482 WTF::MakeUnique<Notification>(frame, context, world_id)); |
| 4475 } | 4483 } |
| 4476 }; | 4484 }; |
| 4477 | 4485 |
| 4486 class ContextLifetimeTestMainFrameClient |
| 4487 : public ContextLifetimeTestWebFrameClient { |
| 4488 public: |
| 4489 ContextLifetimeTestMainFrameClient( |
| 4490 Vector<std::unique_ptr<Notification>>& create_notifications, |
| 4491 Vector<std::unique_ptr<Notification>>& release_notifications) |
| 4492 : ContextLifetimeTestWebFrameClient(create_notifications, |
| 4493 release_notifications), |
| 4494 child_client_(create_notifications, release_notifications) {} |
| 4495 |
| 4496 WebLocalFrame* CreateChildFrame( |
| 4497 WebLocalFrame* parent, |
| 4498 WebTreeScopeType scope, |
| 4499 const WebString& name, |
| 4500 const WebString& fallback_name, |
| 4501 WebSandboxFlags sandbox_flags, |
| 4502 const WebParsedFeaturePolicy& container_policy, |
| 4503 const WebFrameOwnerProperties&) override { |
| 4504 WebLocalFrame* frame = |
| 4505 WebLocalFrame::Create(scope, &child_client_, nullptr, nullptr); |
| 4506 child_client_.SetFrame(frame); |
| 4507 parent->AppendChild(frame); |
| 4508 return frame; |
| 4509 } |
| 4510 |
| 4511 ContextLifetimeTestWebFrameClient& ChildClient() { return child_client_; } |
| 4512 |
| 4513 private: |
| 4514 ContextLifetimeTestWebFrameClient child_client_; |
| 4515 }; |
| 4516 |
| 4478 TEST_P(ParameterizedWebFrameTest, ContextNotificationsLoadUnload) { | 4517 TEST_P(ParameterizedWebFrameTest, ContextNotificationsLoadUnload) { |
| 4479 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 4518 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); |
| 4480 | 4519 |
| 4481 RegisterMockedHttpURLLoad("context_notifications_test.html"); | 4520 RegisterMockedHttpURLLoad("context_notifications_test.html"); |
| 4482 RegisterMockedHttpURLLoad("context_notifications_test_frame.html"); | 4521 RegisterMockedHttpURLLoad("context_notifications_test_frame.html"); |
| 4483 | 4522 |
| 4484 // Load a frame with an iframe, make sure we get the right create | 4523 // Load a frame with an iframe, make sure we get the right create |
| 4485 // notifications. | 4524 // notifications. |
| 4486 ContextLifetimeTestWebFrameClient web_frame_client; | 4525 Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
| 4526 create_notifications; |
| 4527 Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
| 4528 release_notifications; |
| 4529 ContextLifetimeTestMainFrameClient web_frame_client(create_notifications, |
| 4530 release_notifications); |
| 4487 FrameTestHelpers::WebViewHelper web_view_helper; | 4531 FrameTestHelpers::WebViewHelper web_view_helper; |
| 4488 web_view_helper.InitializeAndLoad( | 4532 web_view_helper.InitializeAndLoad( |
| 4489 base_url_ + "context_notifications_test.html", true, &web_frame_client); | 4533 base_url_ + "context_notifications_test.html", true, &web_frame_client); |
| 4490 | 4534 |
| 4491 WebFrame* main_frame = web_view_helper.WebView()->MainFrame(); | 4535 WebFrame* main_frame = web_view_helper.WebView()->MainFrame(); |
| 4492 WebFrame* child_frame = main_frame->FirstChild(); | 4536 WebFrame* child_frame = main_frame->FirstChild(); |
| 4493 | 4537 |
| 4494 ASSERT_EQ(2u, web_frame_client.create_notifications.size()); | 4538 ASSERT_EQ(2u, create_notifications.size()); |
| 4495 EXPECT_EQ(0u, web_frame_client.release_notifications.size()); | 4539 EXPECT_EQ(0u, release_notifications.size()); |
| 4496 | 4540 |
| 4497 auto& first_create_notification = web_frame_client.create_notifications[0]; | 4541 auto& first_create_notification = create_notifications[0]; |
| 4498 auto& second_create_notification = web_frame_client.create_notifications[1]; | 4542 auto& second_create_notification = create_notifications[1]; |
| 4499 | 4543 |
| 4500 EXPECT_EQ(main_frame, first_create_notification->frame); | 4544 EXPECT_EQ(main_frame, first_create_notification->frame); |
| 4501 EXPECT_EQ(main_frame->MainWorldScriptContext(), | 4545 EXPECT_EQ(main_frame->MainWorldScriptContext(), |
| 4502 first_create_notification->context); | 4546 first_create_notification->context); |
| 4503 EXPECT_EQ(0, first_create_notification->world_id); | 4547 EXPECT_EQ(0, first_create_notification->world_id); |
| 4504 | 4548 |
| 4505 EXPECT_EQ(child_frame, second_create_notification->frame); | 4549 EXPECT_EQ(child_frame, second_create_notification->frame); |
| 4506 EXPECT_EQ(child_frame->MainWorldScriptContext(), | 4550 EXPECT_EQ(child_frame->MainWorldScriptContext(), |
| 4507 second_create_notification->context); | 4551 second_create_notification->context); |
| 4508 EXPECT_EQ(0, second_create_notification->world_id); | 4552 EXPECT_EQ(0, second_create_notification->world_id); |
| 4509 | 4553 |
| 4510 // Close the view. We should get two release notifications that are exactly | 4554 // Close the view. We should get two release notifications that are exactly |
| 4511 // the same as the create ones, in reverse order. | 4555 // the same as the create ones, in reverse order. |
| 4512 web_view_helper.Reset(); | 4556 web_view_helper.Reset(); |
| 4513 | 4557 |
| 4514 ASSERT_EQ(2u, web_frame_client.release_notifications.size()); | 4558 ASSERT_EQ(2u, release_notifications.size()); |
| 4515 auto& first_release_notification = web_frame_client.release_notifications[0]; | 4559 auto& first_release_notification = release_notifications[0]; |
| 4516 auto& second_release_notification = web_frame_client.release_notifications[1]; | 4560 auto& second_release_notification = release_notifications[1]; |
| 4517 | 4561 |
| 4518 ASSERT_TRUE( | 4562 ASSERT_TRUE( |
| 4519 first_create_notification->Equals(second_release_notification.get())); | 4563 first_create_notification->Equals(second_release_notification.get())); |
| 4520 ASSERT_TRUE( | 4564 ASSERT_TRUE( |
| 4521 second_create_notification->Equals(first_release_notification.get())); | 4565 second_create_notification->Equals(first_release_notification.get())); |
| 4522 } | 4566 } |
| 4523 | 4567 |
| 4524 TEST_P(ParameterizedWebFrameTest, ContextNotificationsReload) { | 4568 TEST_P(ParameterizedWebFrameTest, ContextNotificationsReload) { |
| 4525 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 4569 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); |
| 4526 | 4570 |
| 4527 RegisterMockedHttpURLLoad("context_notifications_test.html"); | 4571 RegisterMockedHttpURLLoad("context_notifications_test.html"); |
| 4528 RegisterMockedHttpURLLoad("context_notifications_test_frame.html"); | 4572 RegisterMockedHttpURLLoad("context_notifications_test_frame.html"); |
| 4529 | 4573 |
| 4530 ContextLifetimeTestWebFrameClient web_frame_client; | 4574 Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
| 4575 create_notifications; |
| 4576 Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
| 4577 release_notifications; |
| 4578 ContextLifetimeTestMainFrameClient web_frame_client(create_notifications, |
| 4579 release_notifications); |
| 4531 FrameTestHelpers::WebViewHelper web_view_helper; | 4580 FrameTestHelpers::WebViewHelper web_view_helper; |
| 4532 web_view_helper.InitializeAndLoad( | 4581 web_view_helper.InitializeAndLoad( |
| 4533 base_url_ + "context_notifications_test.html", true, &web_frame_client); | 4582 base_url_ + "context_notifications_test.html", true, &web_frame_client); |
| 4534 | 4583 |
| 4535 // Refresh, we should get two release notifications and two more create | 4584 // Refresh, we should get two release notifications and two more create |
| 4536 // notifications. | 4585 // notifications. |
| 4537 FrameTestHelpers::ReloadFrame(web_view_helper.WebView()->MainFrame()); | 4586 FrameTestHelpers::ReloadFrame(web_view_helper.WebView()->MainFrame()); |
| 4538 ASSERT_EQ(4u, web_frame_client.create_notifications.size()); | 4587 ASSERT_EQ(4u, create_notifications.size()); |
| 4539 ASSERT_EQ(2u, web_frame_client.release_notifications.size()); | 4588 ASSERT_EQ(2u, release_notifications.size()); |
| 4540 | 4589 |
| 4541 // The two release notifications we got should be exactly the same as the | 4590 // The two release notifications we got should be exactly the same as the |
| 4542 // first two create notifications. | 4591 // first two create notifications. |
| 4543 for (size_t i = 0; i < web_frame_client.release_notifications.size(); ++i) { | 4592 for (size_t i = 0; i < release_notifications.size(); ++i) { |
| 4544 EXPECT_TRUE(web_frame_client.release_notifications[i]->Equals( | 4593 EXPECT_TRUE(release_notifications[i]->Equals( |
| 4545 web_frame_client | 4594 create_notifications[create_notifications.size() - 3 - i].get())); |
| 4546 .create_notifications[web_frame_client.create_notifications.size() - | |
| 4547 3 - i] | |
| 4548 .get())); | |
| 4549 } | 4595 } |
| 4550 | 4596 |
| 4551 // The last two create notifications should be for the current frames and | 4597 // The last two create notifications should be for the current frames and |
| 4552 // context. | 4598 // context. |
| 4553 WebFrame* main_frame = web_view_helper.WebView()->MainFrame(); | 4599 WebFrame* main_frame = web_view_helper.WebView()->MainFrame(); |
| 4554 WebFrame* child_frame = main_frame->FirstChild(); | 4600 WebFrame* child_frame = main_frame->FirstChild(); |
| 4555 auto& first_refresh_notification = web_frame_client.create_notifications[2]; | 4601 auto& first_refresh_notification = create_notifications[2]; |
| 4556 auto& second_refresh_notification = web_frame_client.create_notifications[3]; | 4602 auto& second_refresh_notification = create_notifications[3]; |
| 4557 | 4603 |
| 4558 EXPECT_EQ(main_frame, first_refresh_notification->frame); | 4604 EXPECT_EQ(main_frame, first_refresh_notification->frame); |
| 4559 EXPECT_EQ(main_frame->MainWorldScriptContext(), | 4605 EXPECT_EQ(main_frame->MainWorldScriptContext(), |
| 4560 first_refresh_notification->context); | 4606 first_refresh_notification->context); |
| 4561 EXPECT_EQ(0, first_refresh_notification->world_id); | 4607 EXPECT_EQ(0, first_refresh_notification->world_id); |
| 4562 | 4608 |
| 4563 EXPECT_EQ(child_frame, second_refresh_notification->frame); | 4609 EXPECT_EQ(child_frame, second_refresh_notification->frame); |
| 4564 EXPECT_EQ(child_frame->MainWorldScriptContext(), | 4610 EXPECT_EQ(child_frame->MainWorldScriptContext(), |
| 4565 second_refresh_notification->context); | 4611 second_refresh_notification->context); |
| 4566 EXPECT_EQ(0, second_refresh_notification->world_id); | 4612 EXPECT_EQ(0, second_refresh_notification->world_id); |
| 4567 } | 4613 } |
| 4568 | 4614 |
| 4569 TEST_P(ParameterizedWebFrameTest, ContextNotificationsIsolatedWorlds) { | 4615 TEST_P(ParameterizedWebFrameTest, ContextNotificationsIsolatedWorlds) { |
| 4570 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 4616 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 4571 v8::HandleScope handle_scope(isolate); | 4617 v8::HandleScope handle_scope(isolate); |
| 4572 | 4618 |
| 4573 RegisterMockedHttpURLLoad("context_notifications_test.html"); | 4619 RegisterMockedHttpURLLoad("context_notifications_test.html"); |
| 4574 RegisterMockedHttpURLLoad("context_notifications_test_frame.html"); | 4620 RegisterMockedHttpURLLoad("context_notifications_test_frame.html"); |
| 4575 | 4621 |
| 4576 ContextLifetimeTestWebFrameClient web_frame_client; | 4622 Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
| 4623 create_notifications; |
| 4624 Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
| 4625 release_notifications; |
| 4626 ContextLifetimeTestMainFrameClient web_frame_client(create_notifications, |
| 4627 release_notifications); |
| 4577 FrameTestHelpers::WebViewHelper web_view_helper; | 4628 FrameTestHelpers::WebViewHelper web_view_helper; |
| 4578 web_view_helper.InitializeAndLoad( | 4629 web_view_helper.InitializeAndLoad( |
| 4579 base_url_ + "context_notifications_test.html", true, &web_frame_client); | 4630 base_url_ + "context_notifications_test.html", true, &web_frame_client); |
| 4580 | 4631 |
| 4581 // Add an isolated world. | 4632 // Add an isolated world. |
| 4582 web_frame_client.Reset(); | 4633 web_frame_client.Reset(); |
| 4583 | 4634 |
| 4584 int isolated_world_id = 42; | 4635 int isolated_world_id = 42; |
| 4585 WebScriptSource script_source("hi!"); | 4636 WebScriptSource script_source("hi!"); |
| 4586 int num_sources = 1; | 4637 int num_sources = 1; |
| 4587 web_view_helper.WebView()->MainFrame()->ExecuteScriptInIsolatedWorld( | 4638 web_view_helper.WebView()->MainFrame()->ExecuteScriptInIsolatedWorld( |
| 4588 isolated_world_id, &script_source, num_sources); | 4639 isolated_world_id, &script_source, num_sources); |
| 4589 | 4640 |
| 4590 // We should now have a new create notification. | 4641 // We should now have a new create notification. |
| 4591 ASSERT_EQ(1u, web_frame_client.create_notifications.size()); | 4642 ASSERT_EQ(1u, create_notifications.size()); |
| 4592 auto& notification = web_frame_client.create_notifications[0]; | 4643 auto& notification = create_notifications[0]; |
| 4593 ASSERT_EQ(isolated_world_id, notification->world_id); | 4644 ASSERT_EQ(isolated_world_id, notification->world_id); |
| 4594 ASSERT_EQ(web_view_helper.WebView()->MainFrame(), notification->frame); | 4645 ASSERT_EQ(web_view_helper.WebView()->MainFrame(), notification->frame); |
| 4595 | 4646 |
| 4596 // We don't have an API to enumarate isolated worlds for a frame, but we can | 4647 // We don't have an API to enumarate isolated worlds for a frame, but we can |
| 4597 // at least assert that the context we got is *not* the main world's context. | 4648 // at least assert that the context we got is *not* the main world's context. |
| 4598 ASSERT_NE(web_view_helper.WebView()->MainFrame()->MainWorldScriptContext(), | 4649 ASSERT_NE(web_view_helper.WebView()->MainFrame()->MainWorldScriptContext(), |
| 4599 v8::Local<v8::Context>::New(isolate, notification->context)); | 4650 v8::Local<v8::Context>::New(isolate, notification->context)); |
| 4600 | 4651 |
| 4601 web_view_helper.Reset(); | 4652 web_view_helper.Reset(); |
| 4602 | 4653 |
| 4603 // We should have gotten three release notifications (one for each of the | 4654 // We should have gotten three release notifications (one for each of the |
| 4604 // frames, plus one for the isolated context). | 4655 // frames, plus one for the isolated context). |
| 4605 ASSERT_EQ(3u, web_frame_client.release_notifications.size()); | 4656 ASSERT_EQ(3u, release_notifications.size()); |
| 4606 | 4657 |
| 4607 // And one of them should be exactly the same as the create notification for | 4658 // And one of them should be exactly the same as the create notification for |
| 4608 // the isolated context. | 4659 // the isolated context. |
| 4609 int match_count = 0; | 4660 int match_count = 0; |
| 4610 for (size_t i = 0; i < web_frame_client.release_notifications.size(); ++i) { | 4661 for (size_t i = 0; i < release_notifications.size(); ++i) { |
| 4611 if (web_frame_client.release_notifications[i]->Equals( | 4662 if (release_notifications[i]->Equals(create_notifications[0].get())) |
| 4612 web_frame_client.create_notifications[0].get())) | |
| 4613 ++match_count; | 4663 ++match_count; |
| 4614 } | 4664 } |
| 4615 EXPECT_EQ(1, match_count); | 4665 EXPECT_EQ(1, match_count); |
| 4616 } | 4666 } |
| 4617 | 4667 |
| 4618 TEST_P(ParameterizedWebFrameTest, FindInPage) { | 4668 TEST_P(ParameterizedWebFrameTest, FindInPage) { |
| 4619 RegisterMockedHttpURLLoad("find.html"); | 4669 RegisterMockedHttpURLLoad("find.html"); |
| 4620 FrameTestHelpers::WebViewHelper web_view_helper; | 4670 FrameTestHelpers::WebViewHelper web_view_helper; |
| 4621 web_view_helper.InitializeAndLoad(base_url_ + "find.html"); | 4671 web_view_helper.InitializeAndLoad(base_url_ + "find.html"); |
| 4622 ASSERT_TRUE(web_view_helper.WebView()->MainFrameImpl()); | 4672 ASSERT_TRUE(web_view_helper.WebView()->MainFrameImpl()); |
| (...skipping 7374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11997 | 12047 |
| 11998 // Failing the original child frame navigation and trying to render fallback | 12048 // Failing the original child frame navigation and trying to render fallback |
| 11999 // content shouldn't crash. It should return NoLoadInProgress. This is so the | 12049 // content shouldn't crash. It should return NoLoadInProgress. This is so the |
| 12000 // caller won't attempt to replace the correctly empty frame with an error | 12050 // caller won't attempt to replace the correctly empty frame with an error |
| 12001 // page. | 12051 // page. |
| 12002 EXPECT_EQ(WebLocalFrame::NoLoadInProgress, | 12052 EXPECT_EQ(WebLocalFrame::NoLoadInProgress, |
| 12003 child->MaybeRenderFallbackContent(WebURLError())); | 12053 child->MaybeRenderFallbackContent(WebURLError())); |
| 12004 } | 12054 } |
| 12005 | 12055 |
| 12006 } // namespace blink | 12056 } // namespace blink |
| OLD | NEW |