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 6841b213fbd6e180f7a97976cf27cd7a8527820a..e23c83bfba2820cba71c627560499f8b515c9a8b 100644 |
--- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp |
+++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp |
@@ -10781,6 +10781,76 @@ TEST_F(WebFrameTest, UniqueNames) { |
EXPECT_EQ(10u, names.size()); |
} |
+namespace { |
+bool DocumentElementChildrenHaveLayoutObjects(Document* doc) { |
+ for (Node* child = doc->documentElement()->firstChild(); child; |
esprehn
2016/12/15 21:36:48
There's no need to check this, if the documentElem
erikchen
2016/12/16 20:56:12
but the document element does have a layout object
|
+ child = child->nextSibling()) { |
+ if (child->layoutObject()) |
+ return true; |
+ } |
+ return false; |
+} |
+} // namespace |
+ |
+TEST_F(WebFrameTest, DisplayNoneIFrameHasNoLayoutObjects) { |
esprehn
2016/12/15 21:36:48
If you use a SimTest instead this whole this can b
erikchen
2016/12/16 20:56:12
Done.
|
+ registerMockedHttpURLLoad("single_invisible_iframe.html"); |
+ registerMockedHttpURLLoad("visible_iframe.html"); |
+ FrameTestHelpers::WebViewHelper webViewHelper; |
+ webViewHelper.initializeAndLoad(m_baseURL + "single_invisible_iframe.html", |
+ true); |
+ |
+ WebLocalFrameImpl* frame = webViewHelper.webView()->mainFrameImpl(); |
+ Element* element = frame->frame()->document()->querySelector("iframe"); |
+ HTMLFrameOwnerElement* frameOwnerElement = |
+ static_cast<HTMLFrameOwnerElement*>(element); |
+ |
+ Document* iframeDoc = frameOwnerElement->contentDocument(); |
+ EXPECT_FALSE(DocumentElementChildrenHaveLayoutObjects(iframeDoc)); |
+ |
+ // Changing the display from 'none' -> 'block' should cause layout objects to |
+ // appear. |
+ frame->executeScript( |
+ WebScriptSource("d = document.querySelector('iframe');" |
+ "d.style.display = 'block';")); |
+ frame->view()->updateAllLifecyclePhases(); |
+ runPendingTasks(); |
+ EXPECT_TRUE(DocumentElementChildrenHaveLayoutObjects(iframeDoc)); |
+ |
+ // Changing the display from 'block' -> 'none' should cause layout objects to |
+ // disappear. |
+ frame->executeScript( |
esprehn
2016/12/15 21:36:48
No need for JS, you can just do element->setInline
erikchen
2016/12/16 20:56:12
Done.
|
+ WebScriptSource("d = document.querySelector('iframe');" |
+ "d.style.display = 'none';")); |
+ |
+ frame->view()->updateAllLifecyclePhases(); |
+ runPendingTasks(); |
+ EXPECT_FALSE(DocumentElementChildrenHaveLayoutObjects(iframeDoc)); |
+} |
+ |
+TEST_F(WebFrameTest, NormalIFrameHasLayoutObjects) { |
esprehn
2016/12/15 21:36:48
SimTests will make this simpler:
ex. https://cs.ch
erikchen
2016/12/16 20:56:12
Done.
|
+ registerMockedHttpURLLoad("single_iframe.html"); |
+ registerMockedHttpURLLoad("visible_iframe.html"); |
+ FrameTestHelpers::WebViewHelper webViewHelper; |
+ webViewHelper.initializeAndLoad(m_baseURL + "single_iframe.html", true); |
+ |
+ WebLocalFrameImpl* frame = webViewHelper.webView()->mainFrameImpl(); |
+ Element* element = frame->frame()->document()->querySelector("iframe"); |
+ HTMLFrameOwnerElement* frameOwnerElement = |
+ static_cast<HTMLFrameOwnerElement*>(element); |
+ |
+ Document* iframeDoc = frameOwnerElement->contentDocument(); |
+ EXPECT_TRUE(DocumentElementChildrenHaveLayoutObjects(iframeDoc)); |
+ |
+ // Changing the display from 'block' -> 'none' should cause layout objects to |
+ // disappear. |
+ frame->executeScript( |
+ WebScriptSource("d = document.querySelector('iframe');" |
+ "d.style.display = 'none';")); |
+ frame->view()->updateAllLifecyclePhases(); |
+ runPendingTasks(); |
+ EXPECT_FALSE(DocumentElementChildrenHaveLayoutObjects(iframeDoc)); |
+} |
+ |
TEST_F(WebFrameTest, NoLoadingCompletionCallbacksInDetach) { |
class LoadingObserverFrameClient |
: public FrameTestHelpers::TestWebFrameClient { |