Index: content/renderer/render_view_browsertest.cc |
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc |
index 92d8fccb88e1ea6dc6ce81bf81d33b1e4dbc2788..092d0b295e0ee082c1548d6ff4b8e8263b9238e8 100644 |
--- a/content/renderer/render_view_browsertest.cc |
+++ b/content/renderer/render_view_browsertest.cc |
@@ -36,6 +36,7 @@ |
#include "third_party/WebKit/public/web/WebFrame.h" |
#include "third_party/WebKit/public/web/WebHistoryItem.h" |
#include "third_party/WebKit/public/web/WebRuntimeFeatures.h" |
+#include "third_party/WebKit/public/web/WebScriptSource.h" |
#include "third_party/WebKit/public/web/WebView.h" |
#include "third_party/WebKit/public/web/WebWindowFeatures.h" |
#include "ui/events/keycodes/keyboard_codes.h" |
@@ -2150,4 +2151,55 @@ TEST_F(RenderViewImplTest, SendCandidateWindowEvents) { |
EXPECT_EQ(output, "\nResult:showupdatehide"); |
} |
+class SynchronousFrameRemovalOnLoadTest : public RenderViewImplTest { |
+ protected: |
+ // Helper render view observer class that tries to remove |
+ // element with id 'frame' from top frame/document DOM |
+ // when non-top frame finishes loading. |
+ class OnLoadFrameRemover : public RenderViewObserver { |
+ public: |
+ OnLoadFrameRemover(RenderView* render_view) : |
jamesr
2014/01/15 18:56:14
one argument constructors must be marked explicit
|
+ RenderViewObserver(render_view) {} |
+ virtual ~OnLoadFrameRemover() {} |
+ |
+ virtual void DidFinishDocumentLoad(blink::WebFrame* frame) { |
jamesr
2014/01/15 18:56:14
if this is overriding a function from RenderViewOb
|
+ if (frame->top() != frame) { |
+ frame->top()->executeScript(blink::WebScriptSource( |
+ WebString::fromUTF8( |
+ "document.getElementById('frame').remove();"))); |
+ } |
+ } |
+ }; |
+}; |
+ |
+// Tests if synchronously removing a frame on its load does not cause crashes. |
+TEST_F(SynchronousFrameRemovalOnLoadTest, DynamicallyInsertedFrame) { |
+ OnLoadFrameRemover remover(view()); |
+ LoadHTML("<html>" |
+ "<head>" |
+ "<title></title>" |
+ "<script type='text/javascript' language='javascript'>" |
+ "window.onload = function () {" |
+ " frame = document.createElement('iframe');" |
+ " frame.id = 'frame';" |
+ " document.body.appendChild(frame);" |
+ "}" |
+ "</script>" |
+ "</head>" |
+ "<body></body>" |
+ "</html>"); |
+} |
+ |
+TEST_F(SynchronousFrameRemovalOnLoadTest, StaticFrame) { |
+ OnLoadFrameRemover remover(view()); |
+ LoadHTML("<html>" |
+ "<head>" |
+ "<title></title>" |
+ "</head>" |
+ "<body>" |
+ "<iframe id='frame' src='about:blank'></iframe>" |
+ "</body>" |
+ "</html>"); |
+} |
+ |
} // namespace content |