| Index: content/renderer/render_view_browsertest.cc
|
| diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
|
| index 7ffa3fa224bdf5fc290403450f776f3d1c7a39ab..799dc55b28847c2e05fbe9a81fbd3ab17701c1c8 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"
|
| @@ -2240,4 +2241,57 @@ TEST_F(RenderViewImplTest, FocusElementCallsFocusedNodeChanged) {
|
| render_thread_->sink().ClearMessages();
|
| }
|
|
|
| +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:
|
| + explicit OnLoadFrameRemover(RenderView* render_view) :
|
| + RenderViewObserver(render_view) {}
|
| + virtual ~OnLoadFrameRemover() {}
|
| +
|
| + virtual void DidFinishDocumentLoad(blink::WebFrame* frame) OVERRIDE {
|
| + 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("<!DOCTYPE html>"
|
| + "<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("<!DOCTYPE html>"
|
| + "<html>"
|
| + "<head>"
|
| + "<title></title>"
|
| + "</head>"
|
| + "<body>"
|
| + "<iframe id='frame' src='about:blank'></iframe>"
|
| + "</body>"
|
| + "</html>");
|
| +}
|
| +
|
| } // namespace content
|
|
|