Home | History | Annotate | Download | only in rendering
      1 /*
      2  * Copyright (C) 2010 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "RenderFrameBase.h"
     28 
     29 #include "FrameView.h"
     30 #include "HTMLFrameElementBase.h"
     31 #include "RenderView.h"
     32 
     33 namespace WebCore {
     34 
     35 RenderFrameBase::RenderFrameBase(Element* element)
     36     : RenderPart(element)
     37 {
     38 }
     39 
     40 void RenderFrameBase::layoutWithFlattening(bool fixedWidth, bool fixedHeight)
     41 {
     42     FrameView* childFrameView = static_cast<FrameView*>(widget());
     43     RenderView* childRoot = childFrameView ? static_cast<RenderView*>(childFrameView->frame()->contentRenderer()) : 0;
     44 
     45     // Do not expand frames which has zero width or height
     46     if (!width() || !height() || !childRoot) {
     47         updateWidgetPosition();
     48         if (childFrameView)
     49             childFrameView->layout();
     50         setNeedsLayout(false);
     51         return;
     52     }
     53 
     54     // need to update to calculate min/max correctly
     55     updateWidgetPosition();
     56     if (childRoot->preferredLogicalWidthsDirty())
     57         childRoot->computePreferredLogicalWidths();
     58 
     59     // if scrollbars are off, and the width or height are fixed
     60     // we obey them and do not expand. With frame flattening
     61     // no subframe much ever become scrollable.
     62 
     63     HTMLFrameElementBase* element = static_cast<HTMLFrameElementBase*>(node());
     64     bool isScrollable = element->scrollingMode() != ScrollbarAlwaysOff;
     65 
     66     // consider iframe inset border
     67     int hBorder = borderLeft() + borderRight();
     68     int vBorder = borderTop() + borderBottom();
     69 
     70     // make sure minimum preferred width is enforced
     71     if (isScrollable || !fixedWidth) {
     72         setWidth(max(width(), childRoot->minPreferredLogicalWidth() + hBorder));
     73         // update again to pass the new width to the child frame
     74         updateWidgetPosition();
     75         childFrameView->layout();
     76     }
     77 
     78     // expand the frame by setting frame height = content height
     79     if (isScrollable || !fixedHeight || childRoot->isFrameSet())
     80         setHeight(max(height(), childFrameView->contentsHeight() + vBorder));
     81     if (isScrollable || !fixedWidth || childRoot->isFrameSet())
     82         setWidth(max(width(), childFrameView->contentsWidth() + hBorder));
     83 
     84     updateWidgetPosition();
     85 
     86     ASSERT(!childFrameView->layoutPending());
     87     ASSERT(!childRoot->needsLayout());
     88     ASSERT(!childRoot->firstChild() || !childRoot->firstChild()->firstChild() || !childRoot->firstChild()->firstChild()->needsLayout());
     89 
     90     setNeedsLayout(false);
     91 }
     92 
     93 }
     94