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 6562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6573 | 6573 |
6574 // Make sure that an embedder-triggered detach with a remote frame parent | 6574 // Make sure that an embedder-triggered detach with a remote frame parent |
6575 // doesn't leave behind dangling pointers. | 6575 // doesn't leave behind dangling pointers. |
6576 TEST_F(WebFrameTest, EmbedderTriggeredDetachWithRemoteMainFrame) | 6576 TEST_F(WebFrameTest, EmbedderTriggeredDetachWithRemoteMainFrame) |
6577 { | 6577 { |
6578 // FIXME: Refactor some of this logic into WebViewHelper to make it easier t
o | 6578 // FIXME: Refactor some of this logic into WebViewHelper to make it easier t
o |
6579 // write tests with a top-level remote frame. | 6579 // write tests with a top-level remote frame. |
6580 FrameTestHelpers::TestWebViewClient viewClient; | 6580 FrameTestHelpers::TestWebViewClient viewClient; |
6581 FrameTestHelpers::TestWebRemoteFrameClient remoteClient; | 6581 FrameTestHelpers::TestWebRemoteFrameClient remoteClient; |
6582 WebView* view = WebView::create(&viewClient); | 6582 WebView* view = WebView::create(&viewClient); |
6583 view->setMainFrame(remoteClient.frame()); | 6583 view->setMainFrame(WebRemoteFrame::create(&remoteClient)); |
6584 FrameTestHelpers::TestWebFrameClient childFrameClient; | 6584 FrameTestHelpers::TestWebFrameClient childFrameClient; |
6585 WebLocalFrame* childFrame = view->mainFrame()->toWebRemoteFrame()->createLoc
alChild("", WebSandboxFlags::None, &childFrameClient); | 6585 WebLocalFrame* childFrame = view->mainFrame()->toWebRemoteFrame()->createLoc
alChild("", WebSandboxFlags::None, &childFrameClient); |
6586 | 6586 |
6587 // Purposely keep the LocalFrame alive so it's the last thing to be destroye
d. | 6587 // Purposely keep the LocalFrame alive so it's the last thing to be destroye
d. |
6588 RefPtrWillBePersistent<Frame> childCoreFrame = toCoreFrame(childFrame); | 6588 RefPtrWillBePersistent<Frame> childCoreFrame = toCoreFrame(childFrame); |
6589 view->close(); | 6589 view->close(); |
6590 childCoreFrame.clear(); | 6590 childCoreFrame.clear(); |
6591 } | 6591 } |
6592 | 6592 |
6593 class WebFrameSwapTest : public WebFrameTest { | 6593 class WebFrameSwapTest : public WebFrameTest { |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6787 TEST_F(WebFrameSwapTest, SwapPreservesGlobalContext) | 6787 TEST_F(WebFrameSwapTest, SwapPreservesGlobalContext) |
6788 { | 6788 { |
6789 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 6789 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
6790 v8::Local<v8::Value> windowTop = mainFrame()->executeScriptAndReturnValue(We
bScriptSource("window")); | 6790 v8::Local<v8::Value> windowTop = mainFrame()->executeScriptAndReturnValue(We
bScriptSource("window")); |
6791 ASSERT_TRUE(windowTop->IsObject()); | 6791 ASSERT_TRUE(windowTop->IsObject()); |
6792 v8::Local<v8::Value> originalWindow = mainFrame()->executeScriptAndReturnVal
ue(WebScriptSource( | 6792 v8::Local<v8::Value> originalWindow = mainFrame()->executeScriptAndReturnVal
ue(WebScriptSource( |
6793 "document.querySelector('#frame2').contentWindow;")); | 6793 "document.querySelector('#frame2').contentWindow;")); |
6794 ASSERT_TRUE(originalWindow->IsObject()); | 6794 ASSERT_TRUE(originalWindow->IsObject()); |
6795 | 6795 |
6796 // Make sure window reference stays the same when swapping to a remote frame
. | 6796 // Make sure window reference stays the same when swapping to a remote frame
. |
6797 FrameTestHelpers::TestWebRemoteFrameClient remoteClient; | 6797 WebRemoteFrame* remoteFrame = WebRemoteFrame::create(nullptr); |
6798 WebRemoteFrame* remoteFrame = remoteClient.frame(); | |
6799 WebFrame* targetFrame = mainFrame()->firstChild()->nextSibling(); | 6798 WebFrame* targetFrame = mainFrame()->firstChild()->nextSibling(); |
6800 targetFrame->swap(remoteFrame); | 6799 targetFrame->swap(remoteFrame); |
6801 // FIXME: This cleanup should be unnecessary, but the interaction between fr
ame detach | 6800 // FIXME: This cleanup should be unnecessary, but the interaction between fr
ame detach |
6802 // and swap is completely broken atm. swap() calls detachChildren() on the f
rame being | 6801 // and swap is completely broken atm. swap() calls detachChildren() on the f
rame being |
6803 // swapped out, and frame B has a child. When the child of B is detached, it
schedules a | 6802 // swapped out, and frame B has a child. When the child of B is detached, it
schedules a |
6804 // FrameLoader timer to check for load completion in its parent. | 6803 // FrameLoader timer to check for load completion in its parent. |
6805 // Other tests end up spinning the message loop (e.g. to wait for load compl
etion of | 6804 // Other tests end up spinning the message loop (e.g. to wait for load compl
etion of |
6806 // another test page, so this timer callback is processed before FrameHost a
nd Page are | 6805 // another test page, so this timer callback is processed before FrameHost a
nd Page are |
6807 // destroyed by the reset() at the end of the test case. However, this test
does not spin | 6806 // destroyed by the reset() at the end of the test case. However, this test
does not spin |
6808 // the event loop in its body, so the timer task remains in the queue and en
ds up running | 6807 // the event loop in its body, so the timer task remains in the queue and en
ds up running |
(...skipping 26 matching lines...) Expand all Loading... |
6835 // Manually reset to break WebViewHelper's dependency on the stack allocated | 6834 // Manually reset to break WebViewHelper's dependency on the stack allocated |
6836 // TestWebFrameClient. | 6835 // TestWebFrameClient. |
6837 reset(); | 6836 reset(); |
6838 remoteFrame->close(); | 6837 remoteFrame->close(); |
6839 } | 6838 } |
6840 | 6839 |
6841 TEST_F(WebFrameSwapTest, RemoteFramesAreIndexable) | 6840 TEST_F(WebFrameSwapTest, RemoteFramesAreIndexable) |
6842 { | 6841 { |
6843 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 6842 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
6844 | 6843 |
6845 FrameTestHelpers::TestWebRemoteFrameClient remoteClient; | 6844 WebRemoteFrame* remoteFrame = WebRemoteFrame::create(nullptr); |
6846 WebRemoteFrame* remoteFrame = remoteClient.frame(); | |
6847 mainFrame()->lastChild()->swap(remoteFrame); | 6845 mainFrame()->lastChild()->swap(remoteFrame); |
6848 remoteFrame->setReplicatedOrigin(SecurityOrigin::createUnique()); | 6846 remoteFrame->setReplicatedOrigin(SecurityOrigin::createUnique()); |
6849 v8::Local<v8::Value> remoteWindow = mainFrame()->executeScriptAndReturnValue
(WebScriptSource("window[2]")); | 6847 v8::Local<v8::Value> remoteWindow = mainFrame()->executeScriptAndReturnValue
(WebScriptSource("window[2]")); |
6850 EXPECT_TRUE(remoteWindow->IsObject()); | 6848 EXPECT_TRUE(remoteWindow->IsObject()); |
6851 v8::Local<v8::Value> windowLength = mainFrame()->executeScriptAndReturnValue
(WebScriptSource("window.length")); | 6849 v8::Local<v8::Value> windowLength = mainFrame()->executeScriptAndReturnValue
(WebScriptSource("window.length")); |
6852 ASSERT_TRUE(windowLength->IsNumber()); | 6850 ASSERT_TRUE(windowLength->IsNumber()); |
6853 v8::Local<v8::Integer> windowLengthInteger = windowLength->ToInteger(); | 6851 v8::Local<v8::Integer> windowLengthInteger = windowLength->ToInteger(); |
6854 EXPECT_EQ(3, windowLengthInteger->Value()); | 6852 EXPECT_EQ(3, windowLengthInteger->Value()); |
6855 | |
6856 reset(); | |
6857 } | 6853 } |
6858 | 6854 |
6859 TEST_F(WebFrameSwapTest, RemoteFrameLengthAccess) | 6855 TEST_F(WebFrameSwapTest, RemoteFrameLengthAccess) |
6860 { | 6856 { |
6861 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 6857 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
6862 | 6858 |
6863 FrameTestHelpers::TestWebRemoteFrameClient remoteClient; | 6859 WebRemoteFrame* remoteFrame = WebRemoteFrame::create(nullptr); |
6864 WebRemoteFrame* remoteFrame = remoteClient.frame(); | |
6865 mainFrame()->lastChild()->swap(remoteFrame); | 6860 mainFrame()->lastChild()->swap(remoteFrame); |
6866 remoteFrame->setReplicatedOrigin(SecurityOrigin::createUnique()); | 6861 remoteFrame->setReplicatedOrigin(SecurityOrigin::createUnique()); |
6867 v8::Local<v8::Value> remoteWindowLength = mainFrame()->executeScriptAndRetur
nValue(WebScriptSource("window[2].length")); | 6862 v8::Local<v8::Value> remoteWindowLength = mainFrame()->executeScriptAndRetur
nValue(WebScriptSource("window[2].length")); |
6868 ASSERT_TRUE(remoteWindowLength->IsNumber()); | 6863 ASSERT_TRUE(remoteWindowLength->IsNumber()); |
6869 v8::Local<v8::Integer> remoteWindowLengthInteger = remoteWindowLength->ToInt
eger(); | 6864 v8::Local<v8::Integer> remoteWindowLengthInteger = remoteWindowLength->ToInt
eger(); |
6870 EXPECT_EQ(0, remoteWindowLengthInteger->Value()); | 6865 EXPECT_EQ(0, remoteWindowLengthInteger->Value()); |
6871 | |
6872 reset(); | |
6873 } | 6866 } |
6874 | 6867 |
6875 TEST_F(WebFrameSwapTest, RemoteWindowNamedAccess) | 6868 TEST_F(WebFrameSwapTest, RemoteWindowNamedAccess) |
6876 { | 6869 { |
6877 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 6870 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
6878 | 6871 |
6879 // FIXME: Once OOPIF unit test infrastructure is in place, test that named | 6872 // FIXME: Once OOPIF unit test infrastructure is in place, test that named |
6880 // window access on a remote window works. For now, just test that accessing | 6873 // window access on a remote window works. For now, just test that accessing |
6881 // a named property doesn't crash. | 6874 // a named property doesn't crash. |
6882 FrameTestHelpers::TestWebRemoteFrameClient remoteClient; | 6875 WebRemoteFrame* remoteFrame = WebRemoteFrame::create(nullptr); |
6883 WebRemoteFrame* remoteFrame = remoteClient.frame(); | |
6884 mainFrame()->lastChild()->swap(remoteFrame); | 6876 mainFrame()->lastChild()->swap(remoteFrame); |
6885 remoteFrame->setReplicatedOrigin(SecurityOrigin::createUnique()); | 6877 remoteFrame->setReplicatedOrigin(SecurityOrigin::createUnique()); |
6886 v8::Local<v8::Value> remoteWindowProperty = mainFrame()->executeScriptAndRet
urnValue(WebScriptSource("window[2].foo")); | 6878 v8::Local<v8::Value> remoteWindowProperty = mainFrame()->executeScriptAndRet
urnValue(WebScriptSource("window[2].foo")); |
6887 EXPECT_TRUE(remoteWindowProperty.IsEmpty()); | 6879 EXPECT_TRUE(remoteWindowProperty.IsEmpty()); |
6888 | |
6889 reset(); | |
6890 } | 6880 } |
6891 | 6881 |
6892 class RemoteToLocalSwapWebFrameClient : public FrameTestHelpers::TestWebFrameCli
ent { | 6882 class RemoteToLocalSwapWebFrameClient : public FrameTestHelpers::TestWebFrameCli
ent { |
6893 public: | 6883 public: |
6894 explicit RemoteToLocalSwapWebFrameClient(WebRemoteFrame* remoteFrame) | 6884 explicit RemoteToLocalSwapWebFrameClient(WebRemoteFrame* remoteFrame) |
6895 : m_historyCommitType(WebHistoryInertCommit) | 6885 : m_historyCommitType(WebHistoryInertCommit) |
6896 , m_remoteFrame(remoteFrame) | 6886 , m_remoteFrame(remoteFrame) |
6897 { | 6887 { |
6898 } | 6888 } |
6899 | 6889 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6939 | 6929 |
6940 const WebURLRequest& lastRequest() const { return m_lastRequest; } | 6930 const WebURLRequest& lastRequest() const { return m_lastRequest; } |
6941 | 6931 |
6942 private: | 6932 private: |
6943 WebURLRequest m_lastRequest; | 6933 WebURLRequest m_lastRequest; |
6944 }; | 6934 }; |
6945 | 6935 |
6946 TEST_F(WebFrameSwapTest, NavigateRemoteFrameViaLocation) | 6936 TEST_F(WebFrameSwapTest, NavigateRemoteFrameViaLocation) |
6947 { | 6937 { |
6948 RemoteNavigationClient client; | 6938 RemoteNavigationClient client; |
6949 WebRemoteFrame* remoteFrame = client.frame(); | 6939 WebRemoteFrame* remoteFrame = WebRemoteFrame::create(&client); |
6950 WebFrame* targetFrame = mainFrame()->firstChild(); | 6940 WebFrame* targetFrame = mainFrame()->firstChild(); |
6951 ASSERT_TRUE(targetFrame); | 6941 ASSERT_TRUE(targetFrame); |
6952 targetFrame->swap(remoteFrame); | 6942 targetFrame->swap(remoteFrame); |
6953 ASSERT_TRUE(mainFrame()->firstChild()); | 6943 ASSERT_TRUE(mainFrame()->firstChild()); |
6954 ASSERT_EQ(mainFrame()->firstChild(), remoteFrame); | 6944 ASSERT_EQ(mainFrame()->firstChild(), remoteFrame); |
6955 | 6945 |
6956 remoteFrame->setReplicatedOrigin(WebSecurityOrigin::createFromString("http:/
/127.0.0.1")); | 6946 remoteFrame->setReplicatedOrigin(WebSecurityOrigin::createFromString("http:/
/127.0.0.1")); |
6957 mainFrame()->executeScript(WebScriptSource( | 6947 mainFrame()->executeScript(WebScriptSource( |
6958 "document.getElementsByTagName('iframe')[0].contentWindow.location = 'da
ta:text/html,hi'")); | 6948 "document.getElementsByTagName('iframe')[0].contentWindow.location = 'da
ta:text/html,hi'")); |
6959 ASSERT_FALSE(client.lastRequest().isNull()); | 6949 ASSERT_FALSE(client.lastRequest().isNull()); |
6960 EXPECT_EQ(WebURL(toKURL("data:text/html,hi")), client.lastRequest().url()); | 6950 EXPECT_EQ(WebURL(toKURL("data:text/html,hi")), client.lastRequest().url()); |
6961 | 6951 |
6962 // Manually reset to break WebViewHelper's dependency on the stack allocated | 6952 // Manually reset to break WebViewHelper's dependency on the stack allocated |
6963 // TestWebFrameClient. | 6953 // TestWebFrameClient. |
6964 reset(); | 6954 reset(); |
| 6955 remoteFrame->close(); |
6965 } | 6956 } |
6966 | 6957 |
6967 class MockDocumentThreadableLoaderClient : public DocumentThreadableLoaderClient
{ | 6958 class MockDocumentThreadableLoaderClient : public DocumentThreadableLoaderClient
{ |
6968 public: | 6959 public: |
6969 MockDocumentThreadableLoaderClient() : m_failed(false) { } | 6960 MockDocumentThreadableLoaderClient() : m_failed(false) { } |
6970 virtual void didFail(const ResourceError&) override { m_failed = true;} | 6961 virtual void didFail(const ResourceError&) override { m_failed = true;} |
6971 | 6962 |
6972 void reset() { m_failed = false; } | 6963 void reset() { m_failed = false; } |
6973 bool failed() { return m_failed; } | 6964 bool failed() { return m_failed; } |
6974 | 6965 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7072 EXPECT_EQ(4u, frameClient.provisionalLoadCount()); | 7063 EXPECT_EQ(4u, frameClient.provisionalLoadCount()); |
7073 EXPECT_FALSE(frameClient.wasLastProvisionalLoadATransition()); | 7064 EXPECT_FALSE(frameClient.wasLastProvisionalLoadATransition()); |
7074 EXPECT_EQ(1u, frameClient.navigationalDataReceivedCount()); | 7065 EXPECT_EQ(1u, frameClient.navigationalDataReceivedCount()); |
7075 } | 7066 } |
7076 | 7067 |
7077 TEST_F(WebFrameTest, DetachRemoteFrame) | 7068 TEST_F(WebFrameTest, DetachRemoteFrame) |
7078 { | 7069 { |
7079 FrameTestHelpers::TestWebViewClient viewClient; | 7070 FrameTestHelpers::TestWebViewClient viewClient; |
7080 FrameTestHelpers::TestWebRemoteFrameClient remoteClient; | 7071 FrameTestHelpers::TestWebRemoteFrameClient remoteClient; |
7081 WebView* view = WebView::create(&viewClient); | 7072 WebView* view = WebView::create(&viewClient); |
7082 view->setMainFrame(remoteClient.frame()); | 7073 view->setMainFrame(WebRemoteFrame::create(&remoteClient)); |
7083 FrameTestHelpers::TestWebRemoteFrameClient childFrameClient; | 7074 FrameTestHelpers::TestWebRemoteFrameClient childFrameClient; |
7084 WebRemoteFrame* childFrame = view->mainFrame()->toWebRemoteFrame()->createRe
moteChild("", WebSandboxFlags::None, &childFrameClient); | 7075 WebRemoteFrame* childFrame = view->mainFrame()->toWebRemoteFrame()->createRe
moteChild("", WebSandboxFlags::None, &childFrameClient); |
7085 childFrame->detach(); | 7076 childFrame->detach(); |
7086 view->close(); | 7077 view->close(); |
7087 } | 7078 } |
7088 | 7079 |
7089 } // namespace blink | 7080 } // namespace blink |
OLD | NEW |