Index: third_party/WebKit/Source/web/tests/WebFrameTest.cpp |
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp |
index 2c181644acc35e9aaf1126f6c5b047741e68405b..c420f19f0185e29306de3d6d821ffc302078cf40 100644 |
--- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp |
+++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp |
@@ -4449,32 +4449,71 @@ class ContextLifetimeTestWebFrameClient |
int world_id; |
}; |
+ ContextLifetimeTestWebFrameClient( |
+ Vector<std::unique_ptr<Notification>>& create_notifications, |
+ Vector<std::unique_ptr<Notification>>& release_notifications) |
+ : create_notifications_(create_notifications), |
+ release_notifications_(release_notifications) {} |
+ |
~ContextLifetimeTestWebFrameClient() override { Reset(); } |
void Reset() { |
- create_notifications.clear(); |
- release_notifications.clear(); |
+ create_notifications_.clear(); |
+ release_notifications_.clear(); |
} |
- Vector<std::unique_ptr<Notification>> create_notifications; |
- Vector<std::unique_ptr<Notification>> release_notifications; |
- |
private: |
+ Vector<std::unique_ptr<Notification>>& create_notifications_; |
+ Vector<std::unique_ptr<Notification>>& release_notifications_; |
+ |
void DidCreateScriptContext(WebLocalFrame* frame, |
v8::Local<v8::Context> context, |
int world_id) override { |
- create_notifications.push_back( |
+ ASSERT_EQ(Frame(), frame); |
+ create_notifications_.push_back( |
WTF::MakeUnique<Notification>(frame, context, world_id)); |
} |
void WillReleaseScriptContext(WebLocalFrame* frame, |
v8::Local<v8::Context> context, |
int world_id) override { |
- release_notifications.push_back( |
+ ASSERT_EQ(Frame(), frame); |
+ release_notifications_.push_back( |
WTF::MakeUnique<Notification>(frame, context, world_id)); |
} |
}; |
+class ContextLifetimeTestMainFrameClient |
+ : public ContextLifetimeTestWebFrameClient { |
+ public: |
+ ContextLifetimeTestMainFrameClient( |
+ Vector<std::unique_ptr<Notification>>& create_notifications, |
+ Vector<std::unique_ptr<Notification>>& release_notifications) |
+ : ContextLifetimeTestWebFrameClient(create_notifications, |
+ release_notifications), |
+ child_client_(create_notifications, release_notifications) {} |
+ |
+ WebLocalFrame* CreateChildFrame( |
+ WebLocalFrame* parent, |
+ WebTreeScopeType scope, |
+ const WebString& name, |
+ const WebString& fallback_name, |
+ WebSandboxFlags sandbox_flags, |
+ const WebParsedFeaturePolicy& container_policy, |
+ const WebFrameOwnerProperties&) override { |
+ WebLocalFrame* frame = |
+ WebLocalFrame::Create(scope, &child_client_, nullptr, nullptr); |
+ child_client_.SetFrame(frame); |
+ parent->AppendChild(frame); |
+ return frame; |
+ } |
+ |
+ ContextLifetimeTestWebFrameClient& ChildClient() { return child_client_; } |
+ |
+ private: |
+ ContextLifetimeTestWebFrameClient child_client_; |
+}; |
+ |
TEST_P(ParameterizedWebFrameTest, ContextNotificationsLoadUnload) { |
v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); |
@@ -4483,7 +4522,12 @@ TEST_P(ParameterizedWebFrameTest, ContextNotificationsLoadUnload) { |
// Load a frame with an iframe, make sure we get the right create |
// notifications. |
- ContextLifetimeTestWebFrameClient web_frame_client; |
+ Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
+ create_notifications; |
+ Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
+ release_notifications; |
+ ContextLifetimeTestMainFrameClient web_frame_client(create_notifications, |
+ release_notifications); |
FrameTestHelpers::WebViewHelper web_view_helper; |
web_view_helper.InitializeAndLoad( |
base_url_ + "context_notifications_test.html", true, &web_frame_client); |
@@ -4491,11 +4535,11 @@ TEST_P(ParameterizedWebFrameTest, ContextNotificationsLoadUnload) { |
WebFrame* main_frame = web_view_helper.WebView()->MainFrame(); |
WebFrame* child_frame = main_frame->FirstChild(); |
- ASSERT_EQ(2u, web_frame_client.create_notifications.size()); |
- EXPECT_EQ(0u, web_frame_client.release_notifications.size()); |
+ ASSERT_EQ(2u, create_notifications.size()); |
+ EXPECT_EQ(0u, release_notifications.size()); |
- auto& first_create_notification = web_frame_client.create_notifications[0]; |
- auto& second_create_notification = web_frame_client.create_notifications[1]; |
+ auto& first_create_notification = create_notifications[0]; |
+ auto& second_create_notification = create_notifications[1]; |
EXPECT_EQ(main_frame, first_create_notification->frame); |
EXPECT_EQ(main_frame->MainWorldScriptContext(), |
@@ -4511,9 +4555,9 @@ TEST_P(ParameterizedWebFrameTest, ContextNotificationsLoadUnload) { |
// the same as the create ones, in reverse order. |
web_view_helper.Reset(); |
- ASSERT_EQ(2u, web_frame_client.release_notifications.size()); |
- auto& first_release_notification = web_frame_client.release_notifications[0]; |
- auto& second_release_notification = web_frame_client.release_notifications[1]; |
+ ASSERT_EQ(2u, release_notifications.size()); |
+ auto& first_release_notification = release_notifications[0]; |
+ auto& second_release_notification = release_notifications[1]; |
ASSERT_TRUE( |
first_create_notification->Equals(second_release_notification.get())); |
@@ -4527,7 +4571,12 @@ TEST_P(ParameterizedWebFrameTest, ContextNotificationsReload) { |
RegisterMockedHttpURLLoad("context_notifications_test.html"); |
RegisterMockedHttpURLLoad("context_notifications_test_frame.html"); |
- ContextLifetimeTestWebFrameClient web_frame_client; |
+ Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
+ create_notifications; |
+ Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
+ release_notifications; |
+ ContextLifetimeTestMainFrameClient web_frame_client(create_notifications, |
+ release_notifications); |
FrameTestHelpers::WebViewHelper web_view_helper; |
web_view_helper.InitializeAndLoad( |
base_url_ + "context_notifications_test.html", true, &web_frame_client); |
@@ -4535,25 +4584,22 @@ TEST_P(ParameterizedWebFrameTest, ContextNotificationsReload) { |
// Refresh, we should get two release notifications and two more create |
// notifications. |
FrameTestHelpers::ReloadFrame(web_view_helper.WebView()->MainFrame()); |
- ASSERT_EQ(4u, web_frame_client.create_notifications.size()); |
- ASSERT_EQ(2u, web_frame_client.release_notifications.size()); |
+ ASSERT_EQ(4u, create_notifications.size()); |
+ ASSERT_EQ(2u, release_notifications.size()); |
// The two release notifications we got should be exactly the same as the |
// first two create notifications. |
- for (size_t i = 0; i < web_frame_client.release_notifications.size(); ++i) { |
- EXPECT_TRUE(web_frame_client.release_notifications[i]->Equals( |
- web_frame_client |
- .create_notifications[web_frame_client.create_notifications.size() - |
- 3 - i] |
- .get())); |
+ for (size_t i = 0; i < release_notifications.size(); ++i) { |
+ EXPECT_TRUE(release_notifications[i]->Equals( |
+ create_notifications[create_notifications.size() - 3 - i].get())); |
} |
// The last two create notifications should be for the current frames and |
// context. |
WebFrame* main_frame = web_view_helper.WebView()->MainFrame(); |
WebFrame* child_frame = main_frame->FirstChild(); |
- auto& first_refresh_notification = web_frame_client.create_notifications[2]; |
- auto& second_refresh_notification = web_frame_client.create_notifications[3]; |
+ auto& first_refresh_notification = create_notifications[2]; |
+ auto& second_refresh_notification = create_notifications[3]; |
EXPECT_EQ(main_frame, first_refresh_notification->frame); |
EXPECT_EQ(main_frame->MainWorldScriptContext(), |
@@ -4573,7 +4619,12 @@ TEST_P(ParameterizedWebFrameTest, ContextNotificationsIsolatedWorlds) { |
RegisterMockedHttpURLLoad("context_notifications_test.html"); |
RegisterMockedHttpURLLoad("context_notifications_test_frame.html"); |
- ContextLifetimeTestWebFrameClient web_frame_client; |
+ Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
+ create_notifications; |
+ Vector<std::unique_ptr<ContextLifetimeTestWebFrameClient::Notification>> |
+ release_notifications; |
+ ContextLifetimeTestMainFrameClient web_frame_client(create_notifications, |
+ release_notifications); |
FrameTestHelpers::WebViewHelper web_view_helper; |
web_view_helper.InitializeAndLoad( |
base_url_ + "context_notifications_test.html", true, &web_frame_client); |
@@ -4588,8 +4639,8 @@ TEST_P(ParameterizedWebFrameTest, ContextNotificationsIsolatedWorlds) { |
isolated_world_id, &script_source, num_sources); |
// We should now have a new create notification. |
- ASSERT_EQ(1u, web_frame_client.create_notifications.size()); |
- auto& notification = web_frame_client.create_notifications[0]; |
+ ASSERT_EQ(1u, create_notifications.size()); |
+ auto& notification = create_notifications[0]; |
ASSERT_EQ(isolated_world_id, notification->world_id); |
ASSERT_EQ(web_view_helper.WebView()->MainFrame(), notification->frame); |
@@ -4602,14 +4653,13 @@ TEST_P(ParameterizedWebFrameTest, ContextNotificationsIsolatedWorlds) { |
// We should have gotten three release notifications (one for each of the |
// frames, plus one for the isolated context). |
- ASSERT_EQ(3u, web_frame_client.release_notifications.size()); |
+ ASSERT_EQ(3u, release_notifications.size()); |
// And one of them should be exactly the same as the create notification for |
// the isolated context. |
int match_count = 0; |
- for (size_t i = 0; i < web_frame_client.release_notifications.size(); ++i) { |
- if (web_frame_client.release_notifications[i]->Equals( |
- web_frame_client.create_notifications[0].get())) |
+ for (size_t i = 0; i < release_notifications.size(); ++i) { |
+ if (release_notifications[i]->Equals(create_notifications[0].get())) |
++match_count; |
} |
EXPECT_EQ(1, match_count); |