              'events/Event.idl',
              'events/FocusEvent.idl',
              'events/HashChangeEvent.idl',
-@@ -2807,6 +2809,8 @@
+@@ -2809,6 +2811,8 @@
              'events/DragEvent.h',
              'events/ErrorEvent.cpp',
              'events/ErrorEvent.h',

                              const blink::WebURL& target) override;
diff --git a/third_party/WebKit/LayoutTests/http/tests/ironframe/ironframe.html b/third_party/WebKit/LayoutTests/http/tests/ironframe/ironframe.html
new file mode 100644
index 0000000..1bc6cdc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/ironframe/ironframe.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>

+            // XXX DMK better would be to run bounds.subtract but then there'd have to *be* a bounds.subtract method.
+            //         Also, subtraction is a not quite so defined as intersection.  Largest contiguous from 0,0?
+            //         Largest contiguous from any corner?  God forbid, pile-o-rects?  Let's just run for the hills for now
+            hostile = true;
+            //return;  // there is a rather fun attack if you try this
+        }
+    }
+
+    if(hostile){
+        do_move = false;
+        bounds.setWidth(0);
+        bounds.setHeight(0);
+    }
+    if(this->documentElement()->hasAttribute("visibilityOnly")) { do_move = false; } // XXX DMK expand on this, there are uses
+    if (do_move) {
+        FloatRect fbounds = bounds;
+        this->set_requestVisibilityRect(&fbounds);
+        rootGraphicsLayer->addChild(iframeGraphicsLayer);
+
+        // TODO: Use bounds not origBounds:
+        // bounds.intersect(mainViewIntRect) has buggy interaction with scrolling.
+        iframeGraphicsLayer->setPosition(FloatPoint(origBounds.x(), origBounds.y()));
+
+        iframeGraphicsLayer->setSize(FloatSize(bounds.size().width(), bounds.size().height()));
+        iframeGraphicsLayer->setBackgroundColor(Color::black);
+        iframeGraphicsLayer->setMasksToBounds(true);
+        iframeGraphicsLayer->setOpacity(1.0);
+        IntSize offset = IntSize(bounds.x()-origBounds.x()-topDocument().domWindow()->scrollX(), bounds.y()-origBounds.y()-topDocument().domWindow()->scrollY());
+        iframeGraphicsLayer->setOffsetFromLayoutObject(offset, GraphicsLayer::ShouldSetNeedsDisplay::SetNeedsDisplay);
+    }
+    // report.  sx and sy are
+    bounds.setWidth(fmax(bounds.size().width() - sx, 0));
+    bounds.setHeight(fmax(bounds.size().height()- sy, 0));
+    //XXX DMK correctly integrate ancestorOrigins and return a clientRect for the visible region of the frame
+    String s = String("{\"viewport\": {\"x\": " + String::number((int)mainViewFloatRect.x()) + ", \"y\": " + String::number((int)mainViewFloatRect.y()) + ", \"width\": " + String::number((int)mainViewFloatRect.size().width()) + ", \"height\": " + String::number((int)mainViewFloatRect.size().height()) + "},  \"visible\": {\"x\": " + String::number((int)bounds.x()) + ",  \"y\": " + String::number((int)bounds.y()) + ", \"width\": " + String::number((int)bounds.size().width()) + ", \"height\": " + String::number((int)bounds.size().height()) + "}}");
+
+    // TODO: With static local, on page reload if the new
+    // event matches the previous event then it's not reported.
+    DEFINE_STATIC_LOCAL(String, prev_event, ());
+    bool duplicate = false;
+    if (s == prev_event) {
