AI 146317: Traverse the frame tree and compute the largest rectangle that holds all
  the frames. If this rectangle is larger than the computed content, make
  the frame's view size equal to the computed total so that the content
  will be the correct size.
  When expanded iframes, set the width and height to the content width and
  height plus the padding and border.
  BUG=1719555

Automated import of CL 146317
diff --git a/WebCore/rendering/RenderPartObject.cpp b/WebCore/rendering/RenderPartObject.cpp
index 828026e..47a5954 100644
--- a/WebCore/rendering/RenderPartObject.cpp
+++ b/WebCore/rendering/RenderPartObject.cpp
@@ -349,10 +349,11 @@
             // Update the dimensions to get the correct minimum preferred width
             updateWidgetPosition();
 
-            // Use the preferred width if it is larger.
-            setWidth(max(w, root->minPrefWidth()));
             int extraWidth = paddingLeft() + paddingRight() + borderLeft() + borderRight();
             int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
+            // Use the preferred width if it is larger.
+            setWidth(max(w, root->minPrefWidth()) + extraWidth);
+
             // Resize the view to recalc the height.
             int height = h - extraHeight;
             int width = w - extraWidth;
@@ -367,10 +368,10 @@
                 view->layout();
             int contentHeight = view->contentsHeight();
             int contentWidth = view->contentsWidth();
-            // Do not shrink iframes with specified sizes
-            if (contentHeight > h || style()->height().isAuto())
-                setHeight(contentHeight);
-            setWidth(contentWidth);
+            // Do not shrink iframes with a specified height.
+            if (contentHeight > (h - extraHeight)  || style()->height().isAuto())
+                setHeight(contentHeight + extraHeight);
+            setWidth(contentWidth + extraWidth);
 
             // Update one last time
             updateWidgetPosition();
@@ -404,8 +405,9 @@
     // width
     updateWidgetPosition();
 
+    int extraWidth = paddingLeft() + paddingRight() + borderLeft() + borderRight();
     // Set the width
-    setWidth(max(width(), root->minPrefWidth()));
+    setWidth(max(width(), root->minPrefWidth()) + extraWidth);
 
     // Update based on the new width
     updateWidgetPosition();
@@ -414,7 +416,7 @@
     while (view->needsLayout())
         view->layout();
 
-    setWidth(view->contentsWidth());
+    setWidth(view->contentsWidth() + extraWidth);
 
     // Update one last time to ensure the dimensions.
     updateWidgetPosition();
@@ -437,8 +439,9 @@
 
     // Do not shrink the height if the size is specified
     int h = view->contentsHeight();
-    if (h > height() || style()->height().isAuto())
-        setHeight(h);
+    int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
+    if (h > height() - extraHeight || style()->height().isAuto())
+        setHeight(h + extraHeight);
 
     // Update one last time to ensure the dimensions.
     updateWidgetPosition();
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp
index 7afd985..c358d90 100644
--- a/WebKit/android/jni/WebViewCore.cpp
+++ b/WebKit/android/jni/WebViewCore.cpp
@@ -70,7 +70,9 @@
 #include "PluginWidgetAndroid.h"
 #include "Position.h"
 #include "ProgressTracker.h"
+#include "RenderBox.h"
 #include "RenderLayer.h"
+#include "RenderPart.h"
 #include "RenderText.h"
 #include "RenderTextControl.h"
 #include "RenderThemeAndroid.h"
@@ -374,6 +376,66 @@
     WebCore::FrameView* view = m_mainFrame->view();
     int width = view->contentsWidth();
     int height = view->contentsHeight();
+
+    // Use the contents width and height as a starting point.
+    SkIRect contentRect;
+    contentRect.set(0, 0, width, height);
+    SkIRect total(contentRect);
+
+    // Traverse all the frames and add their sizes if they are in the visible
+    // rectangle.
+    for (WebCore::Frame* frame = m_mainFrame->tree()->traverseNext(); frame;
+            frame = frame->tree()->traverseNext()) {
+        // If the frame doesn't have an owner then it is the top frame and the
+        // view size is the frame size.
+        WebCore::RenderPart* owner = frame->ownerRenderer();
+        if (owner) {
+            int x = owner->x();
+            int y = owner->y();
+
+            // Traverse the tree up to the parent to find the absolute position
+            // of this frame.
+            WebCore::Frame* parent = frame->tree()->parent();
+            while (parent) {
+                WebCore::RenderPart* parentOwner = parent->ownerRenderer();
+                if (parentOwner) {
+                    x += parentOwner->x();
+                    y += parentOwner->y();
+                }
+                parent = parent->tree()->parent();
+            }
+            // Use the owner dimensions so that padding and border are
+            // included.
+            int right = x + owner->width();
+            int bottom = y + owner->height();
+            SkIRect frameRect = {x, y, right, bottom};
+            if (SkIRect::Intersects(total, frameRect))
+                total.join(x, y, right, bottom);
+        }
+    }
+
+    // If the new total is larger than the content, resize the view to include
+    // all the content.
+    if (!contentRect.contains(total)) {
+        // Resize the view to change the overflow clip.
+        view->resize(total.width(), total.height());
+
+        // We have to force a layout in order for the clip to change.
+        m_mainFrame->contentRenderer()->setNeedsLayoutAndPrefWidthsRecalc();
+        view->forceLayout();
+
+        // Relayout similar to above
+        m_skipContentDraw = true;
+        bool success = layoutIfNeededRecursive(m_mainFrame);
+        m_skipContentDraw = false;
+        if (!success)
+            return;
+
+        // Set the computed content width
+        width = view->contentsWidth();
+        height = view->contentsHeight();
+    }
+
     content->checkDimensions(width, height, &m_addInval);
 
     // The inval region may replace existing pictures. The existing pictures