2001-09-29 00:14:13 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2006-03-29 22:29:03 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* rendering object for replaced elements that contain a document, such
|
|
|
|
* as <frame>, <iframe>, and some <object>s
|
|
|
|
*/
|
|
|
|
|
2013-09-25 05:43:43 +04:00
|
|
|
#include "nsSubDocumentFrame.h"
|
|
|
|
|
2015-07-13 18:53:10 +03:00
|
|
|
#include "gfxPrefs.h"
|
|
|
|
|
2010-08-21 03:24:41 +04:00
|
|
|
#include "mozilla/layout/RenderFrameParent.h"
|
|
|
|
|
1999-02-12 20:45:58 +03:00
|
|
|
#include "nsCOMPtr.h"
|
2005-01-12 22:45:38 +03:00
|
|
|
#include "nsGenericHTMLElement.h"
|
2014-01-12 08:05:49 +04:00
|
|
|
#include "nsGenericHTMLFrameElement.h"
|
2012-09-30 20:40:24 +04:00
|
|
|
#include "nsAttrValueInlines.h"
|
1999-12-18 05:09:29 +03:00
|
|
|
#include "nsIDocShell.h"
|
1999-11-19 10:35:27 +03:00
|
|
|
#include "nsIContentViewer.h"
|
2004-08-01 03:15:21 +04:00
|
|
|
#include "nsPresContext.h"
|
1998-07-16 03:42:14 +04:00
|
|
|
#include "nsIPresShell.h"
|
|
|
|
#include "nsIDocument.h"
|
2013-01-03 17:23:11 +04:00
|
|
|
#include "nsView.h"
|
2013-01-05 07:12:24 +04:00
|
|
|
#include "nsViewManager.h"
|
2007-01-30 03:06:41 +03:00
|
|
|
#include "nsGkAtoms.h"
|
1998-09-10 03:30:30 +04:00
|
|
|
#include "nsStyleConsts.h"
|
1998-09-10 21:23:31 +04:00
|
|
|
#include "nsFrameSetFrame.h"
|
1998-09-10 04:39:38 +04:00
|
|
|
#include "nsIDOMHTMLFrameElement.h"
|
2000-02-29 09:51:48 +03:00
|
|
|
#include "nsIScrollable.h"
|
2014-02-28 03:04:46 +04:00
|
|
|
#include "nsNameSpaceManager.h"
|
2006-01-26 05:29:17 +03:00
|
|
|
#include "nsDisplayList.h"
|
2007-11-18 15:09:03 +03:00
|
|
|
#include "nsIScrollableFrame.h"
|
|
|
|
#include "nsIObjectLoadingContent.h"
|
|
|
|
#include "nsLayoutUtils.h"
|
2010-09-18 15:28:49 +04:00
|
|
|
#include "FrameLayerBuilder.h"
|
2014-09-24 08:33:00 +04:00
|
|
|
#include "nsPluginFrame.h"
|
2011-08-11 17:29:50 +04:00
|
|
|
#include "nsContentUtils.h"
|
2012-11-10 01:46:28 +04:00
|
|
|
#include "nsIPermissionManager.h"
|
2013-09-11 00:56:05 +04:00
|
|
|
#include "nsServiceManagerUtils.h"
|
2015-01-09 11:55:18 +03:00
|
|
|
#include "nsIDOMMutationEvent.h"
|
2016-08-18 00:55:49 +03:00
|
|
|
#include "mozilla/Preferences.h"
|
1999-05-11 02:49:39 +04:00
|
|
|
|
2010-09-18 15:28:49 +04:00
|
|
|
using namespace mozilla;
|
2011-08-11 17:29:50 +04:00
|
|
|
using mozilla::layout::RenderFrameParent;
|
2010-09-18 15:28:49 +04:00
|
|
|
|
2016-08-18 00:55:49 +03:00
|
|
|
static bool sShowPreviousPage = true;
|
|
|
|
|
2010-09-18 15:28:49 +04:00
|
|
|
static nsIDocument*
|
2013-01-03 17:23:11 +04:00
|
|
|
GetDocumentFromView(nsView* aView)
|
2010-09-18 15:28:49 +04:00
|
|
|
{
|
|
|
|
NS_PRECONDITION(aView, "");
|
|
|
|
|
2016-04-05 09:33:36 +03:00
|
|
|
nsViewManager* vm = aView->GetViewManager();
|
|
|
|
nsIPresShell* ps = vm ? vm->GetPresShell() : nullptr;
|
2012-07-30 18:20:58 +04:00
|
|
|
return ps ? ps->GetDocument() : nullptr;
|
2010-09-18 15:28:49 +04:00
|
|
|
}
|
|
|
|
|
2006-03-27 01:30:36 +04:00
|
|
|
nsSubDocumentFrame::nsSubDocumentFrame(nsStyleContext* aContext)
|
2016-04-18 09:17:58 +03:00
|
|
|
: nsAtomicContainerFrame(aContext)
|
2017-03-21 03:22:13 +03:00
|
|
|
, mOuterView(nullptr)
|
2016-12-01 11:06:50 +03:00
|
|
|
, mInnerView(nullptr)
|
2011-10-17 18:59:28 +04:00
|
|
|
, mIsInline(false)
|
|
|
|
, mPostedReflowCallback(false)
|
|
|
|
, mDidCreateDoc(false)
|
|
|
|
, mCallingShow(false)
|
1998-07-16 03:42:14 +04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2001-08-17 07:13:07 +04:00
|
|
|
#ifdef ACCESSIBILITY
|
2012-09-29 01:53:44 +04:00
|
|
|
a11y::AccType
|
|
|
|
nsSubDocumentFrame::AccessibleType()
|
2001-05-18 03:52:32 +04:00
|
|
|
{
|
2012-12-18 05:25:52 +04:00
|
|
|
return a11y::eOuterDocType;
|
2001-05-18 03:52:32 +04:00
|
|
|
}
|
2001-08-17 07:13:07 +04:00
|
|
|
#endif
|
2001-05-18 03:52:32 +04:00
|
|
|
|
2009-01-12 22:20:59 +03:00
|
|
|
NS_QUERYFRAME_HEAD(nsSubDocumentFrame)
|
2010-08-31 04:49:07 +04:00
|
|
|
NS_QUERYFRAME_ENTRY(nsSubDocumentFrame)
|
2016-04-18 09:17:58 +03:00
|
|
|
NS_QUERYFRAME_TAIL_INHERITING(nsAtomicContainerFrame)
|
2001-05-12 01:11:38 +04:00
|
|
|
|
2016-04-26 03:23:21 +03:00
|
|
|
class AsyncFrameInit : public Runnable
|
2010-04-14 12:33:47 +04:00
|
|
|
{
|
|
|
|
public:
|
2014-09-01 07:36:37 +04:00
|
|
|
explicit AsyncFrameInit(nsIFrame* aFrame) : mFrame(aFrame) {}
|
2016-08-08 05:18:10 +03:00
|
|
|
NS_IMETHOD Run() override
|
2010-04-14 12:33:47 +04:00
|
|
|
{
|
2016-01-15 01:03:11 +03:00
|
|
|
PROFILER_LABEL("mozilla", "AsyncFrameInit::Run", js::ProfileEntry::Category::OTHER);
|
2010-04-14 12:33:47 +04:00
|
|
|
if (mFrame.IsAlive()) {
|
|
|
|
static_cast<nsSubDocumentFrame*>(mFrame.GetFrame())->ShowViewer();
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
private:
|
2017-03-01 20:03:14 +03:00
|
|
|
WeakFrame mFrame;
|
2010-04-14 12:33:47 +04:00
|
|
|
};
|
|
|
|
|
2012-08-14 08:06:44 +04:00
|
|
|
static void
|
2013-01-03 17:23:11 +04:00
|
|
|
InsertViewsInReverseOrder(nsView* aSibling, nsView* aParent);
|
2012-08-14 08:06:44 +04:00
|
|
|
|
|
|
|
static void
|
2013-01-03 17:23:11 +04:00
|
|
|
EndSwapDocShellsForViews(nsView* aView);
|
2012-08-14 08:06:44 +04:00
|
|
|
|
2013-03-20 05:47:48 +04:00
|
|
|
void
|
2014-05-25 02:20:40 +04:00
|
|
|
nsSubDocumentFrame::Init(nsIContent* aContent,
|
|
|
|
nsContainerFrame* aParent,
|
|
|
|
nsIFrame* aPrevInFlow)
|
1999-04-27 22:21:30 +04:00
|
|
|
{
|
|
|
|
// determine if we are a <frame> or <iframe>
|
2014-10-24 19:08:00 +04:00
|
|
|
nsCOMPtr<nsIDOMHTMLFrameElement> frameElem = do_QueryInterface(aContent);
|
|
|
|
mIsInline = frameElem ? false : true;
|
2001-09-19 05:53:00 +04:00
|
|
|
|
2016-08-18 00:55:49 +03:00
|
|
|
static bool addedShowPreviousPage = false;
|
|
|
|
if (!addedShowPreviousPage) {
|
2016-12-20 02:34:00 +03:00
|
|
|
// If layout.show_previous_page is true then during loading of a new page we
|
|
|
|
// will draw the previous page if the new page has painting suppressed.
|
2016-08-18 00:55:49 +03:00
|
|
|
Preferences::AddBoolVarCache(&sShowPreviousPage, "layout.show_previous_page", true);
|
|
|
|
addedShowPreviousPage = true;
|
|
|
|
}
|
|
|
|
|
2016-04-18 09:17:58 +03:00
|
|
|
nsAtomicContainerFrame::Init(aContent, aParent, aPrevInFlow);
|
2001-09-19 05:53:00 +04:00
|
|
|
|
2017-03-21 03:22:13 +03:00
|
|
|
// CreateView() creates this frame's view, stored in mOuterView. It needs to
|
|
|
|
// be created first since it's the parent of the inner view, stored in
|
|
|
|
// mInnerView.
|
|
|
|
CreateView();
|
2012-03-22 07:15:19 +04:00
|
|
|
EnsureInnerView();
|
2002-02-20 00:33:26 +03:00
|
|
|
|
2012-11-29 04:26:39 +04:00
|
|
|
// Set the primary frame now so that nsDocumentViewer::FindContainerView
|
2012-08-24 13:16:15 +04:00
|
|
|
// called from within EndSwapDocShellsForViews below can find it if needed.
|
|
|
|
aContent->SetPrimaryFrame(this);
|
|
|
|
|
2012-08-14 08:06:44 +04:00
|
|
|
// If we have a detached subdoc's root view on our frame loader, re-insert
|
|
|
|
// it into the view tree. This happens when we've been reframed, and
|
|
|
|
// ensures the presentation persists across reframes. If the frame element
|
|
|
|
// has changed documents however, we blow away the presentation.
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameloader = FrameLoader();
|
2012-08-14 08:06:44 +04:00
|
|
|
if (frameloader) {
|
|
|
|
nsCOMPtr<nsIDocument> oldContainerDoc;
|
2016-05-05 00:12:48 +03:00
|
|
|
nsIFrame* detachedFrame =
|
|
|
|
frameloader->GetDetachedSubdocFrame(getter_AddRefs(oldContainerDoc));
|
|
|
|
frameloader->SetDetachedSubdocFrame(nullptr, nullptr);
|
|
|
|
MOZ_ASSERT(oldContainerDoc || !detachedFrame);
|
|
|
|
if (oldContainerDoc) {
|
|
|
|
nsView* detachedView =
|
|
|
|
detachedFrame ? detachedFrame->GetView() : nullptr;
|
|
|
|
if (detachedView && oldContainerDoc == aContent->OwnerDoc()) {
|
2012-08-14 08:06:44 +04:00
|
|
|
// Restore stashed presentation.
|
2016-05-05 00:12:48 +03:00
|
|
|
::InsertViewsInReverseOrder(detachedView, mInnerView);
|
2012-08-14 08:06:44 +04:00
|
|
|
::EndSwapDocShellsForViews(mInnerView->GetFirstChild());
|
|
|
|
} else {
|
|
|
|
// Presentation is for a different document, don't restore it.
|
|
|
|
frameloader->Hide();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-04-14 12:33:47 +04:00
|
|
|
nsContentUtils::AddScriptRunner(new AsyncFrameInit(this));
|
2008-08-11 12:38:43 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
nsSubDocumentFrame::ShowViewer()
|
|
|
|
{
|
2010-05-28 23:34:50 +04:00
|
|
|
if (mCallingShow) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-08-11 12:38:43 +04:00
|
|
|
if (!PresContext()->IsDynamic()) {
|
2006-04-11 05:48:48 +04:00
|
|
|
// We let the printing code take care of loading the document; just
|
2010-09-18 15:28:50 +04:00
|
|
|
// create the inner view for it to use.
|
|
|
|
(void) EnsureInnerView();
|
2004-07-29 23:41:39 +04:00
|
|
|
} else {
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameloader = FrameLoader();
|
2009-10-16 23:42:29 +04:00
|
|
|
if (frameloader) {
|
2015-04-01 01:09:02 +03:00
|
|
|
CSSIntSize margin = GetMarginAttributes();
|
2017-03-01 20:03:14 +03:00
|
|
|
AutoWeakFrame weakThis(this);
|
2011-10-17 18:59:28 +04:00
|
|
|
mCallingShow = true;
|
2014-01-12 08:05:49 +04:00
|
|
|
const nsAttrValue* attrValue =
|
|
|
|
GetContent()->AsElement()->GetParsedAttr(nsGkAtoms::scrolling);
|
|
|
|
int32_t scrolling =
|
|
|
|
nsGenericHTMLFrameElement::MapScrollingAttribute(attrValue);
|
2011-09-29 10:19:26 +04:00
|
|
|
bool didCreateDoc =
|
2010-05-28 23:34:50 +04:00
|
|
|
frameloader->Show(margin.width, margin.height,
|
2014-01-12 08:05:49 +04:00
|
|
|
scrolling, scrolling, this);
|
2010-05-28 23:34:50 +04:00
|
|
|
if (!weakThis.IsAlive()) {
|
|
|
|
return;
|
|
|
|
}
|
2011-10-17 18:59:28 +04:00
|
|
|
mCallingShow = false;
|
2010-05-28 23:34:50 +04:00
|
|
|
mDidCreateDoc = didCreateDoc;
|
2008-08-11 12:38:43 +04:00
|
|
|
}
|
2001-09-19 05:53:00 +04:00
|
|
|
}
|
1998-09-03 05:16:27 +04:00
|
|
|
}
|
|
|
|
|
2010-08-31 04:46:26 +04:00
|
|
|
nsIFrame*
|
|
|
|
nsSubDocumentFrame::GetSubdocumentRootFrame()
|
|
|
|
{
|
|
|
|
if (!mInnerView)
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2013-01-03 17:23:11 +04:00
|
|
|
nsView* subdocView = mInnerView->GetFirstChild();
|
2012-07-30 18:20:58 +04:00
|
|
|
return subdocView ? subdocView->GetFrame() : nullptr;
|
2010-08-31 04:46:26 +04:00
|
|
|
}
|
|
|
|
|
2014-06-07 06:23:21 +04:00
|
|
|
nsIPresShell*
|
|
|
|
nsSubDocumentFrame::GetSubdocumentPresShellForPainting(uint32_t aFlags)
|
|
|
|
{
|
|
|
|
if (!mInnerView)
|
|
|
|
return nullptr;
|
|
|
|
|
|
|
|
nsView* subdocView = mInnerView->GetFirstChild();
|
|
|
|
if (!subdocView)
|
|
|
|
return nullptr;
|
|
|
|
|
|
|
|
nsIPresShell* presShell = nullptr;
|
|
|
|
|
|
|
|
nsIFrame* subdocRootFrame = subdocView->GetFrame();
|
|
|
|
if (subdocRootFrame) {
|
|
|
|
presShell = subdocRootFrame->PresContext()->PresShell();
|
|
|
|
}
|
|
|
|
|
|
|
|
// If painting is suppressed in the presshell, we try to look for a better
|
|
|
|
// presshell to use.
|
|
|
|
if (!presShell || (presShell->IsPaintingSuppressed() &&
|
|
|
|
!(aFlags & IGNORE_PAINT_SUPPRESSION))) {
|
|
|
|
// During page transition mInnerView will sometimes have two children, the
|
|
|
|
// first being the new page that may not have any frame, and the second
|
|
|
|
// being the old page that will probably have a frame.
|
|
|
|
nsView* nextView = subdocView->GetNextSibling();
|
|
|
|
nsIFrame* frame = nullptr;
|
|
|
|
if (nextView) {
|
|
|
|
frame = nextView->GetFrame();
|
|
|
|
}
|
|
|
|
if (frame) {
|
|
|
|
nsIPresShell* ps = frame->PresContext()->PresShell();
|
2016-08-18 00:55:49 +03:00
|
|
|
if (!presShell || (ps && !ps->IsPaintingSuppressed() && sShowPreviousPage)) {
|
2014-06-07 06:23:21 +04:00
|
|
|
subdocView = nextView;
|
|
|
|
subdocRootFrame = frame;
|
|
|
|
presShell = ps;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!presShell) {
|
|
|
|
// If we don't have a frame we use this roundabout way to get the pres shell.
|
|
|
|
if (!mFrameLoader)
|
|
|
|
return nullptr;
|
|
|
|
nsCOMPtr<nsIDocShell> docShell;
|
|
|
|
mFrameLoader->GetDocShell(getter_AddRefs(docShell));
|
|
|
|
if (!docShell)
|
|
|
|
return nullptr;
|
|
|
|
presShell = docShell->GetPresShell();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return presShell;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-03-05 12:13:05 +03:00
|
|
|
ScreenIntSize
|
2013-01-10 11:23:55 +04:00
|
|
|
nsSubDocumentFrame::GetSubdocumentSize()
|
|
|
|
{
|
|
|
|
if (GetStateBits() & NS_FRAME_FIRST_REFLOW) {
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameloader = FrameLoader();
|
2013-01-10 11:23:55 +04:00
|
|
|
if (frameloader) {
|
|
|
|
nsCOMPtr<nsIDocument> oldContainerDoc;
|
2016-05-05 00:12:48 +03:00
|
|
|
nsIFrame* detachedFrame =
|
|
|
|
frameloader->GetDetachedSubdocFrame(getter_AddRefs(oldContainerDoc));
|
|
|
|
nsView* view = detachedFrame ? detachedFrame->GetView() : nullptr;
|
|
|
|
if (view) {
|
|
|
|
nsSize size = view->GetBounds().Size();
|
|
|
|
nsPresContext* presContext = detachedFrame->PresContext();
|
2015-03-05 12:13:05 +03:00
|
|
|
return ScreenIntSize(presContext->AppUnitsToDevPixels(size.width),
|
|
|
|
presContext->AppUnitsToDevPixels(size.height));
|
2013-01-10 11:23:55 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
// Pick some default size for now. Using 10x10 because that's what the
|
|
|
|
// code used to do.
|
2015-03-05 12:13:05 +03:00
|
|
|
return ScreenIntSize(10, 10);
|
2013-01-10 11:23:55 +04:00
|
|
|
} else {
|
|
|
|
nsSize docSizeAppUnits;
|
|
|
|
nsPresContext* presContext = PresContext();
|
|
|
|
nsCOMPtr<nsIDOMHTMLFrameElement> frameElem =
|
|
|
|
do_QueryInterface(GetContent());
|
|
|
|
if (frameElem) {
|
|
|
|
docSizeAppUnits = GetSize();
|
|
|
|
} else {
|
|
|
|
docSizeAppUnits = GetContentRect().Size();
|
|
|
|
}
|
2014-11-15 03:45:24 +03:00
|
|
|
// Adjust subdocument size, according to 'object-fit' and the
|
|
|
|
// subdocument's intrinsic size and ratio.
|
|
|
|
nsIFrame* subDocRoot = ObtainIntrinsicSizeFrame();
|
|
|
|
if (subDocRoot) {
|
|
|
|
nsRect destRect =
|
|
|
|
nsLayoutUtils::ComputeObjectDestRect(nsRect(nsPoint(), docSizeAppUnits),
|
|
|
|
subDocRoot->GetIntrinsicSize(),
|
|
|
|
subDocRoot->GetIntrinsicRatio(),
|
|
|
|
StylePosition());
|
|
|
|
docSizeAppUnits = destRect.Size();
|
|
|
|
}
|
|
|
|
|
2015-03-05 12:13:05 +03:00
|
|
|
return ScreenIntSize(presContext->AppUnitsToDevPixels(docSizeAppUnits.width),
|
|
|
|
presContext->AppUnitsToDevPixels(docSizeAppUnits.height));
|
2013-01-10 11:23:55 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-10 06:59:59 +04:00
|
|
|
static void
|
|
|
|
WrapBackgroundColorInOwnLayer(nsDisplayListBuilder* aBuilder,
|
|
|
|
nsIFrame* aFrame,
|
|
|
|
nsDisplayList* aList)
|
|
|
|
{
|
|
|
|
nsDisplayList tempItems;
|
|
|
|
nsDisplayItem* item;
|
|
|
|
while ((item = aList->RemoveBottom()) != nullptr) {
|
|
|
|
if (item->GetType() == nsDisplayItem::TYPE_BACKGROUND_COLOR) {
|
|
|
|
nsDisplayList tmpList;
|
|
|
|
tmpList.AppendToTop(item);
|
2017-02-01 01:07:35 +03:00
|
|
|
item = new (aBuilder) nsDisplayOwnLayer(aBuilder, aFrame, &tmpList, aBuilder->CurrentActiveScrolledRoot());
|
2014-01-10 06:59:59 +04:00
|
|
|
}
|
|
|
|
tempItems.AppendToTop(item);
|
|
|
|
}
|
|
|
|
aList->AppendToTop(&tempItems);
|
|
|
|
}
|
|
|
|
|
2013-02-14 15:12:27 +04:00
|
|
|
void
|
2006-01-26 05:29:17 +03:00
|
|
|
nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
const nsDisplayListSet& aLists)
|
|
|
|
{
|
|
|
|
if (!IsVisibleForPainting(aBuilder))
|
2013-02-14 15:12:27 +04:00
|
|
|
return;
|
2006-01-26 05:29:17 +03:00
|
|
|
|
2014-01-10 06:59:59 +04:00
|
|
|
nsFrameLoader* frameLoader = FrameLoader();
|
|
|
|
RenderFrameParent* rfp = nullptr;
|
|
|
|
if (frameLoader) {
|
2015-06-09 13:30:08 +03:00
|
|
|
rfp = frameLoader->GetCurrentRenderFrame();
|
2014-01-10 06:59:59 +04:00
|
|
|
}
|
|
|
|
|
2013-08-13 11:56:57 +04:00
|
|
|
// If we are pointer-events:none then we don't need to HitTest background
|
2016-04-12 08:52:41 +03:00
|
|
|
bool pointerEventsNone =
|
|
|
|
StyleUserInterface()->mPointerEvents == NS_STYLE_POINTER_EVENTS_NONE;
|
2013-12-18 09:37:24 +04:00
|
|
|
if (!aBuilder->IsForEventDelivery() || !pointerEventsNone) {
|
2014-01-10 06:59:59 +04:00
|
|
|
nsDisplayListCollection decorations;
|
|
|
|
DisplayBorderBackgroundOutline(aBuilder, decorations);
|
|
|
|
if (rfp) {
|
|
|
|
// Wrap background colors of <iframe>s with remote subdocuments in their
|
|
|
|
// own layer so we generate a ColorLayer. This is helpful for optimizing
|
|
|
|
// compositing; we can skip compositing the ColorLayer when the
|
|
|
|
// remote content is opaque.
|
|
|
|
WrapBackgroundColorInOwnLayer(aBuilder, this, decorations.BorderBackground());
|
|
|
|
}
|
|
|
|
decorations.MoveTo(aLists);
|
2013-08-13 11:56:57 +04:00
|
|
|
}
|
2010-08-21 03:24:41 +04:00
|
|
|
|
2016-10-05 15:27:02 +03:00
|
|
|
if (aBuilder->IsForEventDelivery() && pointerEventsNone) {
|
2015-02-03 18:52:51 +03:00
|
|
|
return;
|
2013-12-18 09:37:24 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
// If we're passing pointer events to children then we have to descend into
|
|
|
|
// subdocuments no matter what, to determine which parts are transparent for
|
2015-02-03 18:52:51 +03:00
|
|
|
// hit-testing or event regions.
|
2016-10-05 15:27:02 +03:00
|
|
|
bool needToDescend = aBuilder->GetDescendIntoSubdocuments();
|
2015-02-03 18:52:51 +03:00
|
|
|
if (!mInnerView || !needToDescend) {
|
2013-02-14 15:12:27 +04:00
|
|
|
return;
|
2013-12-18 09:37:24 +04:00
|
|
|
}
|
2010-09-04 00:10:45 +04:00
|
|
|
|
2014-01-10 06:59:59 +04:00
|
|
|
if (rfp) {
|
|
|
|
rfp->BuildDisplayList(aBuilder, this, aDirtyRect, aLists);
|
|
|
|
return;
|
2010-08-21 03:24:41 +04:00
|
|
|
}
|
|
|
|
|
2014-06-07 06:23:21 +04:00
|
|
|
nsCOMPtr<nsIPresShell> presShell =
|
|
|
|
GetSubdocumentPresShellForPainting(
|
|
|
|
aBuilder->IsIgnoringPaintSuppression() ? IGNORE_PAINT_SUPPRESSION : 0);
|
2009-05-19 13:57:31 +04:00
|
|
|
|
2014-06-07 06:23:21 +04:00
|
|
|
if (!presShell) {
|
|
|
|
return;
|
2009-05-19 13:57:31 +04:00
|
|
|
}
|
2009-04-25 12:19:23 +04:00
|
|
|
|
2014-06-07 06:23:21 +04:00
|
|
|
nsIFrame* subdocRootFrame = presShell->GetRootFrame();
|
|
|
|
|
2010-08-08 22:49:07 +04:00
|
|
|
nsPresContext* presContext = presShell->GetPresContext();
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t parentAPD = PresContext()->AppUnitsPerDevPixel();
|
|
|
|
int32_t subdocAPD = presContext->AppUnitsPerDevPixel();
|
2010-07-19 06:23:48 +04:00
|
|
|
|
2009-05-15 07:11:59 +04:00
|
|
|
nsRect dirty;
|
2013-09-27 09:56:00 +04:00
|
|
|
bool haveDisplayPort = false;
|
2014-02-28 02:01:52 +04:00
|
|
|
bool ignoreViewportScrolling = false;
|
|
|
|
nsIFrame* savedIgnoreScrollFrame = nullptr;
|
2010-07-19 06:23:48 +04:00
|
|
|
if (subdocRootFrame) {
|
2014-03-27 05:46:24 +04:00
|
|
|
// get the dirty rect relative to the root frame of the subdoc
|
|
|
|
dirty = aDirtyRect + GetOffsetToCrossDoc(subdocRootFrame);
|
|
|
|
// and convert into the appunits of the subdoc
|
2015-03-27 00:44:40 +03:00
|
|
|
dirty = dirty.ScaleToOtherAppUnitsRoundOut(parentAPD, subdocAPD);
|
2014-03-27 05:46:24 +04:00
|
|
|
|
2014-03-19 21:29:24 +04:00
|
|
|
if (nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame()) {
|
2015-10-12 23:21:49 +03:00
|
|
|
nsIScrollableFrame* rootScrollableFrame = presShell->GetRootScrollFrameAsScrollable();
|
|
|
|
MOZ_ASSERT(rootScrollableFrame);
|
2016-01-09 09:25:58 +03:00
|
|
|
// Use a copy, so the dirty rect doesn't get modified to the display port.
|
|
|
|
nsRect copy = dirty;
|
2015-10-12 23:21:49 +03:00
|
|
|
haveDisplayPort = rootScrollableFrame->DecideScrollableLayer(aBuilder,
|
2016-01-09 09:25:58 +03:00
|
|
|
©, /* aAllowCreateDisplayPort = */ true);
|
2015-10-12 23:21:49 +03:00
|
|
|
if (!gfxPrefs::LayoutUseContainersForRootFrames()) {
|
|
|
|
haveDisplayPort = false;
|
2014-03-19 21:29:24 +04:00
|
|
|
}
|
2010-07-19 06:23:48 +04:00
|
|
|
|
2014-03-19 21:29:24 +04:00
|
|
|
ignoreViewportScrolling = presShell->IgnoringViewportScrolling();
|
|
|
|
if (ignoreViewportScrolling) {
|
|
|
|
savedIgnoreScrollFrame = aBuilder->GetIgnoreScrollFrame();
|
|
|
|
aBuilder->SetIgnoreScrollFrame(rootScrollFrame);
|
|
|
|
}
|
2014-02-28 02:01:52 +04:00
|
|
|
}
|
|
|
|
|
2016-10-05 15:27:02 +03:00
|
|
|
aBuilder->EnterPresShell(subdocRootFrame, pointerEventsNone);
|
2014-09-06 08:16:33 +04:00
|
|
|
} else {
|
|
|
|
dirty = aDirtyRect;
|
2009-05-15 07:11:59 +04:00
|
|
|
}
|
|
|
|
|
2013-04-04 15:36:45 +04:00
|
|
|
DisplayListClipState::AutoSaveRestore clipState(aBuilder);
|
2013-03-04 13:56:02 +04:00
|
|
|
if (ShouldClipSubdocument()) {
|
2013-04-04 15:36:45 +04:00
|
|
|
clipState.ClipContainingBlockDescendantsToContentBox(aBuilder, this);
|
2010-07-16 01:07:53 +04:00
|
|
|
}
|
|
|
|
|
2013-03-04 13:56:02 +04:00
|
|
|
nsIScrollableFrame *sf = presShell->GetRootScrollFrameAsScrollable();
|
2013-10-29 17:27:15 +04:00
|
|
|
bool constructResolutionItem = subdocRootFrame &&
|
2015-03-07 02:07:59 +03:00
|
|
|
(presShell->GetResolution() != 1.0);
|
2013-03-04 13:56:02 +04:00
|
|
|
bool constructZoomItem = subdocRootFrame && parentAPD != subdocAPD;
|
2014-12-18 02:37:28 +03:00
|
|
|
bool needsOwnLayer = false;
|
|
|
|
if (constructResolutionItem ||
|
|
|
|
constructZoomItem ||
|
|
|
|
haveDisplayPort ||
|
|
|
|
presContext->IsRootContentDocument() ||
|
|
|
|
(sf && sf->IsScrollingActive(aBuilder)))
|
|
|
|
{
|
|
|
|
needsOwnLayer = true;
|
|
|
|
}
|
2015-06-30 13:43:07 +03:00
|
|
|
if (!needsOwnLayer && aBuilder->IsBuildingLayerEventRegions() &&
|
|
|
|
nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(presShell))
|
|
|
|
{
|
|
|
|
needsOwnLayer = true;
|
|
|
|
}
|
2013-03-04 13:56:02 +04:00
|
|
|
|
|
|
|
nsDisplayList childItems;
|
|
|
|
|
|
|
|
{
|
2013-04-04 15:36:45 +04:00
|
|
|
DisplayListClipState::AutoSaveRestore nestedClipState(aBuilder);
|
2013-03-04 13:56:02 +04:00
|
|
|
if (needsOwnLayer) {
|
|
|
|
// Clear current clip. There's no point in propagating it down, since
|
|
|
|
// the layer we will construct will be clipped by the current clip.
|
|
|
|
// In fact for nsDisplayZoom propagating it down would be incorrect since
|
|
|
|
// nsDisplayZoom changes the meaning of appunits.
|
2017-02-01 01:07:35 +03:00
|
|
|
nestedClipState.Clear();
|
2010-07-19 06:23:48 +04:00
|
|
|
}
|
2010-08-08 22:49:07 +04:00
|
|
|
|
2013-03-04 13:56:02 +04:00
|
|
|
if (subdocRootFrame) {
|
2014-07-17 03:08:28 +04:00
|
|
|
nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame();
|
2014-04-12 03:39:22 +04:00
|
|
|
nsDisplayListBuilder::AutoCurrentScrollParentIdSetter idSetter(
|
2016-05-24 12:13:59 +03:00
|
|
|
aBuilder,
|
|
|
|
ignoreViewportScrolling && rootScrollFrame && rootScrollFrame->GetContent()
|
|
|
|
? nsLayoutUtils::FindOrCreateIDFor(rootScrollFrame->GetContent())
|
|
|
|
: aBuilder->GetCurrentScrollParentId());
|
2014-04-12 03:39:22 +04:00
|
|
|
|
2015-02-11 00:28:07 +03:00
|
|
|
aBuilder->SetAncestorHasApzAwareEventHandler(false);
|
2013-03-04 13:56:02 +04:00
|
|
|
subdocRootFrame->
|
|
|
|
BuildDisplayListForStackingContext(aBuilder, dirty, &childItems);
|
2010-08-08 22:49:07 +04:00
|
|
|
}
|
2009-07-04 13:30:59 +04:00
|
|
|
|
2013-03-04 13:56:02 +04:00
|
|
|
if (!aBuilder->IsForEventDelivery()) {
|
|
|
|
// If we are going to use a displayzoom below then any items we put under
|
|
|
|
// it need to have underlying frames from the subdocument. So we need to
|
|
|
|
// calculate the bounds based on which frame will be the underlying frame
|
|
|
|
// for the canvas background color item.
|
2013-04-09 16:30:51 +04:00
|
|
|
nsRect bounds = GetContentRectRelativeToSelf() +
|
|
|
|
aBuilder->ToReferenceFrame(this);
|
2013-03-04 13:56:02 +04:00
|
|
|
if (subdocRootFrame) {
|
2015-03-27 00:44:40 +03:00
|
|
|
bounds = bounds.ScaleToOtherAppUnitsRoundOut(parentAPD, subdocAPD);
|
2013-03-04 13:56:02 +04:00
|
|
|
}
|
2011-01-13 20:45:14 +03:00
|
|
|
|
2013-03-04 13:56:02 +04:00
|
|
|
// If we are in print preview/page layout we want to paint the grey
|
|
|
|
// background behind the page, not the canvas color. The canvas color gets
|
|
|
|
// painted on the page itself.
|
|
|
|
if (nsLayoutUtils::NeedsPrintPreviewBackground(presContext)) {
|
|
|
|
presShell->AddPrintPreviewBackgroundItem(
|
|
|
|
*aBuilder, childItems, subdocRootFrame ? subdocRootFrame : this,
|
|
|
|
bounds);
|
|
|
|
} else {
|
2014-09-06 08:16:33 +04:00
|
|
|
// Invoke AutoBuildingDisplayList to ensure that the correct dirty rect
|
|
|
|
// is used to compute the visible rect if AddCanvasBackgroundColorItem
|
|
|
|
// creates a display item.
|
|
|
|
nsIFrame* frame = subdocRootFrame ? subdocRootFrame : this;
|
|
|
|
nsDisplayListBuilder::AutoBuildingDisplayList
|
|
|
|
building(aBuilder, frame, dirty, true);
|
2013-03-04 13:56:02 +04:00
|
|
|
// Add the canvas background color to the bottom of the list. This
|
|
|
|
// happens after we've built the list so that AddCanvasBackgroundColorItem
|
|
|
|
// can monkey with the contents if necessary.
|
|
|
|
uint32_t flags = nsIPresShell::FORCE_DRAW;
|
|
|
|
presShell->AddCanvasBackgroundColorItem(
|
2014-09-06 08:16:33 +04:00
|
|
|
*aBuilder, childItems, frame, bounds, NS_RGBA(0,0,0,0), flags);
|
2013-03-04 13:56:02 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-01-13 20:45:14 +03:00
|
|
|
|
2014-07-22 09:50:11 +04:00
|
|
|
if (subdocRootFrame) {
|
2016-11-10 06:46:26 +03:00
|
|
|
aBuilder->LeavePresShell(subdocRootFrame, &childItems);
|
2014-07-22 09:50:11 +04:00
|
|
|
|
|
|
|
if (ignoreViewportScrolling) {
|
|
|
|
aBuilder->SetIgnoreScrollFrame(savedIgnoreScrollFrame);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-29 17:27:15 +04:00
|
|
|
// Generate a resolution and/or zoom item if needed. If one or both of those is
|
2014-02-28 02:01:53 +04:00
|
|
|
// created, we don't need to create a separate nsDisplaySubDocument.
|
2013-10-29 17:27:15 +04:00
|
|
|
|
2014-02-28 02:01:53 +04:00
|
|
|
uint32_t flags = nsDisplayOwnLayer::GENERATE_SUBDOC_INVALIDATIONS;
|
2014-02-28 02:01:53 +04:00
|
|
|
// If ignoreViewportScrolling is true then the top most layer we create here
|
|
|
|
// is going to become the scrollable layer for the root scroll frame, so we
|
|
|
|
// want to add nsDisplayOwnLayer::GENERATE_SCROLLABLE_LAYER to whatever layer
|
|
|
|
// becomes the topmost. We do this below.
|
2013-03-04 13:56:02 +04:00
|
|
|
if (constructZoomItem) {
|
2014-02-28 02:01:53 +04:00
|
|
|
uint32_t zoomFlags = flags;
|
|
|
|
if (ignoreViewportScrolling && !constructResolutionItem) {
|
|
|
|
zoomFlags |= nsDisplayOwnLayer::GENERATE_SCROLLABLE_LAYER;
|
|
|
|
}
|
2012-02-29 09:53:37 +04:00
|
|
|
nsDisplayZoom* zoomItem =
|
|
|
|
new (aBuilder) nsDisplayZoom(aBuilder, subdocRootFrame, &childItems,
|
2014-02-28 02:01:53 +04:00
|
|
|
subdocAPD, parentAPD, zoomFlags);
|
2012-02-29 09:53:37 +04:00
|
|
|
childItems.AppendToTop(zoomItem);
|
2013-10-29 17:27:15 +04:00
|
|
|
needsOwnLayer = false;
|
|
|
|
}
|
2014-02-28 02:01:52 +04:00
|
|
|
// Wrap the zoom item in the resolution item if we have both because we want the
|
|
|
|
// resolution scale applied on top of the app units per dev pixel conversion.
|
2014-02-28 02:01:53 +04:00
|
|
|
if (ignoreViewportScrolling) {
|
|
|
|
flags |= nsDisplayOwnLayer::GENERATE_SCROLLABLE_LAYER;
|
|
|
|
}
|
2014-02-28 02:01:52 +04:00
|
|
|
if (constructResolutionItem) {
|
|
|
|
nsDisplayResolution* resolutionItem =
|
|
|
|
new (aBuilder) nsDisplayResolution(aBuilder, subdocRootFrame, &childItems,
|
2014-02-28 02:01:53 +04:00
|
|
|
flags);
|
2014-02-28 02:01:52 +04:00
|
|
|
childItems.AppendToTop(resolutionItem);
|
|
|
|
needsOwnLayer = false;
|
|
|
|
}
|
2013-10-29 17:27:15 +04:00
|
|
|
if (needsOwnLayer) {
|
2012-02-29 09:53:37 +04:00
|
|
|
// We always want top level content documents to be in their own layer.
|
2014-02-28 02:01:53 +04:00
|
|
|
nsDisplaySubDocument* layerItem = new (aBuilder) nsDisplaySubDocument(
|
2013-03-04 13:56:02 +04:00
|
|
|
aBuilder, subdocRootFrame ? subdocRootFrame : this,
|
2014-02-28 02:01:53 +04:00
|
|
|
&childItems, flags);
|
2012-02-29 09:53:37 +04:00
|
|
|
childItems.AppendToTop(layerItem);
|
|
|
|
}
|
2010-08-22 04:55:55 +04:00
|
|
|
|
2016-03-26 00:49:43 +03:00
|
|
|
if (aBuilder->IsForFrameVisibility()) {
|
2013-02-25 04:59:22 +04:00
|
|
|
// We don't add the childItems to the return list as we're dealing with them here.
|
2016-03-26 00:49:43 +03:00
|
|
|
presShell->RebuildApproximateFrameVisibilityDisplayList(childItems);
|
2013-03-04 13:56:02 +04:00
|
|
|
childItems.DeleteAll();
|
2012-02-29 09:53:37 +04:00
|
|
|
} else {
|
2013-03-04 13:56:02 +04:00
|
|
|
aLists.Content()->AppendToTop(&childItems);
|
2009-05-15 07:11:59 +04:00
|
|
|
}
|
2006-01-26 05:29:17 +03:00
|
|
|
}
|
|
|
|
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
nscoord
|
2014-07-24 21:03:26 +04:00
|
|
|
nsSubDocumentFrame::GetIntrinsicISize()
|
1998-07-16 03:42:14 +04:00
|
|
|
{
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
if (!IsInline()) {
|
2015-08-12 13:02:02 +03:00
|
|
|
return 0; // HTML <frame> has no useful intrinsic isize
|
1998-10-12 21:00:32 +04:00
|
|
|
}
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
|
2015-03-03 14:08:59 +03:00
|
|
|
if (mContent->IsXULElement()) {
|
2015-08-12 13:02:02 +03:00
|
|
|
return 0; // XUL <iframe> and <browser> have no useful intrinsic isize
|
1998-10-12 21:00:32 +04:00
|
|
|
}
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
|
2012-07-30 18:20:58 +04:00
|
|
|
NS_ASSERTION(ObtainIntrinsicSizeFrame() == nullptr,
|
2015-08-12 13:02:02 +03:00
|
|
|
"Intrinsic isize should come from the embedded document.");
|
2007-11-18 15:09:03 +03:00
|
|
|
|
2015-08-12 13:02:02 +03:00
|
|
|
// We must be an HTML <iframe>. Default to size of 300px x 150px, for IE
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
// compat (and per CSS2.1 draft).
|
2015-08-12 13:02:02 +03:00
|
|
|
WritingMode wm = GetWritingMode();
|
|
|
|
return nsPresContext::CSSPixelsToAppUnits(wm.IsVertical() ? 150 : 300);
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nscoord
|
2014-07-24 21:03:26 +04:00
|
|
|
nsSubDocumentFrame::GetIntrinsicBSize()
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
{
|
|
|
|
// <frame> processing does not use this routine, only <iframe>
|
|
|
|
NS_ASSERTION(IsInline(), "Shouldn't have been called");
|
|
|
|
|
2015-03-03 14:08:59 +03:00
|
|
|
if (mContent->IsXULElement()) {
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
return 0;
|
1998-07-22 03:20:04 +04:00
|
|
|
}
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
|
2012-07-30 18:20:58 +04:00
|
|
|
NS_ASSERTION(ObtainIntrinsicSizeFrame() == nullptr,
|
2015-08-12 13:02:02 +03:00
|
|
|
"Intrinsic bsize should come from the embedded document.");
|
2007-11-18 15:09:03 +03:00
|
|
|
|
2015-08-12 13:02:02 +03:00
|
|
|
// Use size of 300px x 150px, for compatibility with IE, and per CSS2.1 draft.
|
|
|
|
WritingMode wm = GetWritingMode();
|
|
|
|
return nsPresContext::CSSPixelsToAppUnits(wm.IsVertical() ? 300 : 150);
|
1998-07-27 09:59:37 +04:00
|
|
|
}
|
|
|
|
|
2014-01-06 03:31:14 +04:00
|
|
|
#ifdef DEBUG_FRAME_DUMP
|
2013-04-30 22:38:52 +04:00
|
|
|
void
|
2014-01-27 02:07:02 +04:00
|
|
|
nsSubDocumentFrame::List(FILE* out, const char* aPrefix, uint32_t aFlags) const
|
2012-09-19 18:36:35 +04:00
|
|
|
{
|
2014-01-27 02:07:02 +04:00
|
|
|
nsCString str;
|
|
|
|
ListGeneric(str, aPrefix, aFlags);
|
|
|
|
fprintf_stderr(out, "%s\n", str.get());
|
2012-09-19 18:36:35 +04:00
|
|
|
|
|
|
|
if (aFlags & TRAVERSE_SUBDOCUMENT_FRAMES) {
|
2014-01-27 02:07:02 +04:00
|
|
|
nsSubDocumentFrame* f = const_cast<nsSubDocumentFrame*>(this);
|
2012-09-19 18:36:35 +04:00
|
|
|
nsIFrame* subdocRootFrame = f->GetSubdocumentRootFrame();
|
|
|
|
if (subdocRootFrame) {
|
2014-01-27 02:07:02 +04:00
|
|
|
nsCString pfx(aPrefix);
|
|
|
|
pfx += " ";
|
|
|
|
subdocRootFrame->List(out, pfx.get(), aFlags);
|
2012-09-19 18:36:35 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-02-18 11:47:48 +04:00
|
|
|
nsresult nsSubDocumentFrame::GetFrameName(nsAString& aResult) const
|
1998-07-27 09:59:37 +04:00
|
|
|
{
|
2001-11-14 04:33:42 +03:00
|
|
|
return MakeFrameName(NS_LITERAL_STRING("FrameOuter"), aResult);
|
1998-07-16 03:42:14 +04:00
|
|
|
}
|
1999-11-02 01:12:45 +03:00
|
|
|
#endif
|
1998-07-16 03:42:14 +04:00
|
|
|
|
2003-10-31 23:19:18 +03:00
|
|
|
nsIAtom*
|
2004-01-10 08:36:32 +03:00
|
|
|
nsSubDocumentFrame::GetType() const
|
1999-05-11 02:49:39 +04:00
|
|
|
{
|
2006-12-26 20:47:52 +03:00
|
|
|
return nsGkAtoms::subDocumentFrame;
|
1999-05-11 02:49:39 +04:00
|
|
|
}
|
|
|
|
|
2007-11-18 15:09:03 +03:00
|
|
|
/* virtual */ nscoord
|
2014-07-24 21:03:25 +04:00
|
|
|
nsSubDocumentFrame::GetMinISize(nsRenderingContext *aRenderingContext)
|
2007-11-18 15:09:03 +03:00
|
|
|
{
|
|
|
|
nscoord result;
|
|
|
|
DISPLAY_MIN_WIDTH(this, result);
|
|
|
|
|
|
|
|
nsIFrame* subDocRoot = ObtainIntrinsicSizeFrame();
|
|
|
|
if (subDocRoot) {
|
2014-07-24 21:03:25 +04:00
|
|
|
result = subDocRoot->GetMinISize(aRenderingContext);
|
2007-11-18 15:09:03 +03:00
|
|
|
} else {
|
2014-07-24 21:03:26 +04:00
|
|
|
result = GetIntrinsicISize();
|
2007-11-18 15:09:03 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* virtual */ nscoord
|
2014-07-24 21:03:25 +04:00
|
|
|
nsSubDocumentFrame::GetPrefISize(nsRenderingContext *aRenderingContext)
|
2007-11-18 15:09:03 +03:00
|
|
|
{
|
|
|
|
nscoord result;
|
|
|
|
DISPLAY_PREF_WIDTH(this, result);
|
|
|
|
|
|
|
|
nsIFrame* subDocRoot = ObtainIntrinsicSizeFrame();
|
|
|
|
if (subDocRoot) {
|
2014-07-24 21:03:25 +04:00
|
|
|
result = subDocRoot->GetPrefISize(aRenderingContext);
|
2007-11-18 15:09:03 +03:00
|
|
|
} else {
|
2014-07-24 21:03:26 +04:00
|
|
|
result = GetIntrinsicISize();
|
2007-11-18 15:09:03 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2013-10-01 01:26:04 +04:00
|
|
|
/* virtual */ IntrinsicSize
|
2008-03-19 03:11:01 +03:00
|
|
|
nsSubDocumentFrame::GetIntrinsicSize()
|
|
|
|
{
|
|
|
|
nsIFrame* subDocRoot = ObtainIntrinsicSizeFrame();
|
|
|
|
if (subDocRoot) {
|
|
|
|
return subDocRoot->GetIntrinsicSize();
|
|
|
|
}
|
2016-04-18 09:17:58 +03:00
|
|
|
return nsAtomicContainerFrame::GetIntrinsicSize();
|
2008-03-19 03:11:01 +03:00
|
|
|
}
|
|
|
|
|
2007-11-18 15:09:03 +03:00
|
|
|
/* virtual */ nsSize
|
|
|
|
nsSubDocumentFrame::GetIntrinsicRatio()
|
|
|
|
{
|
|
|
|
nsIFrame* subDocRoot = ObtainIntrinsicSizeFrame();
|
|
|
|
if (subDocRoot) {
|
|
|
|
return subDocRoot->GetIntrinsicRatio();
|
|
|
|
}
|
2016-04-18 09:17:58 +03:00
|
|
|
return nsAtomicContainerFrame::GetIntrinsicRatio();
|
2007-11-18 15:09:03 +03:00
|
|
|
}
|
|
|
|
|
2014-08-24 18:34:51 +04:00
|
|
|
/* virtual */
|
|
|
|
LogicalSize
|
2016-11-05 04:57:06 +03:00
|
|
|
nsSubDocumentFrame::ComputeAutoSize(nsRenderingContext* aRenderingContext,
|
|
|
|
WritingMode aWM,
|
|
|
|
const LogicalSize& aCBSize,
|
|
|
|
nscoord aAvailableISize,
|
|
|
|
const LogicalSize& aMargin,
|
|
|
|
const LogicalSize& aBorder,
|
|
|
|
const LogicalSize& aPadding,
|
|
|
|
ComputeSizeFlags aFlags)
|
2008-02-19 20:53:46 +03:00
|
|
|
{
|
|
|
|
if (!IsInline()) {
|
2014-08-24 18:34:51 +04:00
|
|
|
return nsFrame::ComputeAutoSize(aRenderingContext, aWM, aCBSize,
|
|
|
|
aAvailableISize, aMargin, aBorder,
|
2016-11-05 04:57:06 +03:00
|
|
|
aPadding, aFlags);
|
2008-02-19 20:53:46 +03:00
|
|
|
}
|
|
|
|
|
2016-01-28 02:11:00 +03:00
|
|
|
const WritingMode wm = GetWritingMode();
|
|
|
|
LogicalSize result(wm, GetIntrinsicISize(), GetIntrinsicBSize());
|
|
|
|
return result.ConvertTo(aWM, wm);
|
2008-02-19 20:53:46 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-08-24 18:34:44 +04:00
|
|
|
/* virtual */
|
|
|
|
LogicalSize
|
2016-11-05 04:57:06 +03:00
|
|
|
nsSubDocumentFrame::ComputeSize(nsRenderingContext* aRenderingContext,
|
|
|
|
WritingMode aWM,
|
|
|
|
const LogicalSize& aCBSize,
|
|
|
|
nscoord aAvailableISize,
|
|
|
|
const LogicalSize& aMargin,
|
|
|
|
const LogicalSize& aBorder,
|
|
|
|
const LogicalSize& aPadding,
|
|
|
|
ComputeSizeFlags aFlags)
|
2007-11-18 15:09:03 +03:00
|
|
|
{
|
|
|
|
nsIFrame* subDocRoot = ObtainIntrinsicSizeFrame();
|
|
|
|
if (subDocRoot) {
|
2016-11-05 04:57:06 +03:00
|
|
|
return ComputeSizeWithIntrinsicDimensions(aRenderingContext, aWM,
|
|
|
|
subDocRoot->GetIntrinsicSize(),
|
|
|
|
subDocRoot->GetIntrinsicRatio(),
|
|
|
|
aCBSize, aMargin, aBorder,
|
2016-11-05 04:57:06 +03:00
|
|
|
aPadding, aFlags);
|
2007-11-18 15:09:03 +03:00
|
|
|
}
|
2016-04-18 09:17:58 +03:00
|
|
|
return nsAtomicContainerFrame::ComputeSize(aRenderingContext, aWM,
|
|
|
|
aCBSize, aAvailableISize,
|
|
|
|
aMargin, aBorder, aPadding,
|
|
|
|
aFlags);
|
2007-11-18 15:09:03 +03:00
|
|
|
}
|
|
|
|
|
2014-05-13 04:47:52 +04:00
|
|
|
void
|
2009-01-22 09:52:54 +03:00
|
|
|
nsSubDocumentFrame::Reflow(nsPresContext* aPresContext,
|
2016-07-21 13:36:38 +03:00
|
|
|
ReflowOutput& aDesiredSize,
|
2016-07-21 13:36:39 +03:00
|
|
|
const ReflowInput& aReflowInput,
|
2004-01-10 08:36:32 +03:00
|
|
|
nsReflowStatus& aStatus)
|
1998-07-16 03:42:14 +04:00
|
|
|
{
|
2015-03-30 01:38:40 +03:00
|
|
|
MarkInReflow();
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
DO_GLOBAL_REFLOW_COUNT("nsSubDocumentFrame");
|
2016-07-21 13:36:39 +03:00
|
|
|
DISPLAY_REFLOW(aPresContext, this, aReflowInput, aDesiredSize, aStatus);
|
1998-07-27 22:05:11 +04:00
|
|
|
NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS,
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
("enter nsSubDocumentFrame::Reflow: maxSize=%d,%d",
|
2016-07-21 13:36:39 +03:00
|
|
|
aReflowInput.AvailableWidth(), aReflowInput.AvailableHeight()));
|
1998-07-27 22:05:11 +04:00
|
|
|
|
2016-07-21 13:36:39 +03:00
|
|
|
NS_ASSERTION(aReflowInput.ComputedWidth() != NS_UNCONSTRAINEDSIZE,
|
2016-01-28 02:11:00 +03:00
|
|
|
"Shouldn't have unconstrained stuff here "
|
|
|
|
"thanks to the rules of reflow");
|
2016-07-21 13:36:39 +03:00
|
|
|
NS_ASSERTION(NS_INTRINSICSIZE != aReflowInput.ComputedHeight(),
|
2016-01-28 02:11:00 +03:00
|
|
|
"Shouldn't have unconstrained stuff here "
|
|
|
|
"thanks to ComputeAutoSize");
|
|
|
|
|
2017-02-14 12:55:48 +03:00
|
|
|
aStatus.Reset();
|
2004-01-10 08:36:32 +03:00
|
|
|
|
2009-12-25 00:20:06 +03:00
|
|
|
NS_ASSERTION(mContent->GetPrimaryFrame() == this,
|
2007-09-21 03:28:26 +04:00
|
|
|
"Shouldn't happen");
|
|
|
|
|
2013-04-02 15:03:03 +04:00
|
|
|
// XUL <iframe> or <browser>, or HTML <iframe>, <object> or <embed>
|
2016-07-21 13:36:39 +03:00
|
|
|
aDesiredSize.SetSize(aReflowInput.GetWritingMode(),
|
|
|
|
aReflowInput.ComputedSizeWithBorderPadding());
|
2013-04-02 15:03:03 +04:00
|
|
|
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
// "offset" is the offset of our content area from our frame's
|
|
|
|
// top-left corner.
|
2016-07-21 13:36:39 +03:00
|
|
|
nsPoint offset = nsPoint(aReflowInput.ComputedPhysicalBorderPadding().left,
|
|
|
|
aReflowInput.ComputedPhysicalBorderPadding().top);
|
1998-07-16 03:42:14 +04:00
|
|
|
|
2008-10-05 00:00:09 +04:00
|
|
|
if (mInnerView) {
|
2016-07-21 13:36:39 +03:00
|
|
|
const nsMargin& bp = aReflowInput.ComputedPhysicalBorderPadding();
|
2014-11-15 03:45:24 +03:00
|
|
|
nsSize innerSize(aDesiredSize.Width() - bp.LeftRight(),
|
|
|
|
aDesiredSize.Height() - bp.TopBottom());
|
|
|
|
|
|
|
|
// Size & position the view according to 'object-fit' & 'object-position'.
|
|
|
|
nsIFrame* subDocRoot = ObtainIntrinsicSizeFrame();
|
|
|
|
IntrinsicSize intrinsSize;
|
|
|
|
nsSize intrinsRatio;
|
|
|
|
if (subDocRoot) {
|
|
|
|
intrinsSize = subDocRoot->GetIntrinsicSize();
|
|
|
|
intrinsRatio = subDocRoot->GetIntrinsicRatio();
|
|
|
|
}
|
|
|
|
nsRect destRect =
|
|
|
|
nsLayoutUtils::ComputeObjectDestRect(nsRect(offset, innerSize),
|
|
|
|
intrinsSize, intrinsRatio,
|
|
|
|
StylePosition());
|
|
|
|
|
2013-01-05 07:12:24 +04:00
|
|
|
nsViewManager* vm = mInnerView->GetViewManager();
|
2014-11-15 03:45:24 +03:00
|
|
|
vm->MoveViewTo(mInnerView, destRect.x, destRect.y);
|
|
|
|
vm->ResizeView(mInnerView, nsRect(nsPoint(0, 0), destRect.Size()), true);
|
2008-10-05 00:00:09 +04:00
|
|
|
}
|
1998-07-16 03:42:14 +04:00
|
|
|
|
2011-12-05 16:38:46 +04:00
|
|
|
aDesiredSize.SetOverflowAreasToDesiredBounds();
|
|
|
|
if (!ShouldClipSubdocument()) {
|
|
|
|
nsIFrame* subdocRootFrame = GetSubdocumentRootFrame();
|
|
|
|
if (subdocRootFrame) {
|
|
|
|
aDesiredSize.mOverflowAreas.UnionWith(subdocRootFrame->GetOverflowAreas() + offset);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-05-21 14:06:08 +04:00
|
|
|
FinishAndStoreOverflow(&aDesiredSize);
|
|
|
|
|
2007-09-21 03:28:26 +04:00
|
|
|
if (!aPresContext->IsPaginated() && !mPostedReflowCallback) {
|
|
|
|
PresContext()->PresShell()->PostReflowCallback(this);
|
2011-10-17 18:59:28 +04:00
|
|
|
mPostedReflowCallback = true;
|
2004-01-10 08:36:32 +03:00
|
|
|
}
|
|
|
|
|
1998-07-27 22:05:11 +04:00
|
|
|
NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS,
|
2017-02-14 13:41:41 +03:00
|
|
|
("exit nsSubDocumentFrame::Reflow: size=%d,%d status=%s",
|
|
|
|
aDesiredSize.Width(), aDesiredSize.Height(), ToString(aStatus).c_str()));
|
1998-07-27 22:05:11 +04:00
|
|
|
|
2016-07-21 13:36:39 +03:00
|
|
|
NS_FRAME_SET_TRUNCATION(aStatus, aReflowInput, aDesiredSize);
|
1998-07-16 03:42:14 +04:00
|
|
|
}
|
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool
|
2007-09-21 03:28:26 +04:00
|
|
|
nsSubDocumentFrame::ReflowFinished()
|
|
|
|
{
|
2009-10-05 15:52:19 +04:00
|
|
|
if (mFrameLoader) {
|
2017-03-01 20:03:14 +03:00
|
|
|
AutoWeakFrame weakFrame(this);
|
2007-11-09 08:58:47 +03:00
|
|
|
|
2009-10-05 15:52:19 +04:00
|
|
|
mFrameLoader->UpdatePositionAndSize(this);
|
2009-12-16 04:33:05 +03:00
|
|
|
|
2009-10-05 15:52:19 +04:00
|
|
|
if (weakFrame.IsAlive()) {
|
|
|
|
// Make sure that we can post a reflow callback in the future.
|
2011-10-17 18:59:28 +04:00
|
|
|
mPostedReflowCallback = false;
|
2009-10-05 15:52:19 +04:00
|
|
|
}
|
2010-12-04 06:44:00 +03:00
|
|
|
} else {
|
2011-10-17 18:59:28 +04:00
|
|
|
mPostedReflowCallback = false;
|
2007-09-21 03:28:26 +04:00
|
|
|
}
|
2011-10-17 18:59:28 +04:00
|
|
|
return false;
|
2007-09-21 03:28:26 +04:00
|
|
|
}
|
|
|
|
|
2007-12-01 10:22:44 +03:00
|
|
|
void
|
|
|
|
nsSubDocumentFrame::ReflowCallbackCanceled()
|
|
|
|
{
|
2011-10-17 18:59:28 +04:00
|
|
|
mPostedReflowCallback = false;
|
2007-12-01 10:22:44 +03:00
|
|
|
}
|
2007-09-21 03:28:26 +04:00
|
|
|
|
2014-02-18 11:47:48 +04:00
|
|
|
nsresult
|
2012-08-22 19:56:38 +04:00
|
|
|
nsSubDocumentFrame::AttributeChanged(int32_t aNameSpaceID,
|
2004-01-10 08:36:32 +03:00
|
|
|
nsIAtom* aAttribute,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aModType)
|
1998-10-03 01:59:59 +04:00
|
|
|
{
|
2006-02-22 06:58:48 +03:00
|
|
|
if (aNameSpaceID != kNameSpaceID_None) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2001-04-12 12:16:54 +04:00
|
|
|
// If the noResize attribute changes, dis/allow frame to be resized
|
2008-03-21 14:18:10 +03:00
|
|
|
if (aAttribute == nsGkAtoms::noresize) {
|
2006-02-22 06:58:48 +03:00
|
|
|
// Note that we're not doing content type checks, but that's ok -- if
|
|
|
|
// they'd fail we will just end up with a null framesetFrame.
|
2015-03-03 14:09:00 +03:00
|
|
|
if (mContent->GetParent()->IsHTMLElement(nsGkAtoms::frameset)) {
|
2003-07-05 19:30:50 +04:00
|
|
|
nsIFrame* parentFrame = GetParent();
|
2001-04-12 12:16:54 +04:00
|
|
|
|
|
|
|
if (parentFrame) {
|
2002-04-17 08:17:16 +04:00
|
|
|
// There is no interface for nsHTMLFramesetFrame so QI'ing to
|
|
|
|
// concrete class, yay!
|
2009-01-12 22:20:59 +03:00
|
|
|
nsHTMLFramesetFrame* framesetFrame = do_QueryFrame(parentFrame);
|
2001-04-12 12:16:54 +04:00
|
|
|
if (framesetFrame) {
|
|
|
|
framesetFrame->RecalculateBorderResize();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-01-17 17:35:32 +03:00
|
|
|
else if (aAttribute == nsGkAtoms::showresizer) {
|
|
|
|
nsIFrame* rootFrame = GetSubdocumentRootFrame();
|
|
|
|
if (rootFrame) {
|
|
|
|
rootFrame->PresContext()->PresShell()->
|
|
|
|
FrameNeedsReflow(rootFrame, nsIPresShell::eResize, NS_FRAME_IS_DIRTY);
|
|
|
|
}
|
|
|
|
}
|
2011-05-13 21:41:00 +04:00
|
|
|
else if (aAttribute == nsGkAtoms::marginwidth ||
|
|
|
|
aAttribute == nsGkAtoms::marginheight) {
|
|
|
|
|
|
|
|
// Retrieve the attributes
|
2015-04-01 01:09:02 +03:00
|
|
|
CSSIntSize margins = GetMarginAttributes();
|
2011-05-13 21:41:00 +04:00
|
|
|
|
|
|
|
// Notify the frameloader
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameloader = FrameLoader();
|
2011-05-13 21:41:00 +04:00
|
|
|
if (frameloader)
|
|
|
|
frameloader->MarginsChanged(margins.width, margins.height);
|
|
|
|
}
|
2002-04-17 08:17:16 +04:00
|
|
|
|
1998-10-03 01:59:59 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2005-10-27 01:46:39 +04:00
|
|
|
nsIFrame*
|
2006-03-27 01:30:36 +04:00
|
|
|
NS_NewSubDocumentFrame(nsIPresShell* aPresShell, nsStyleContext* aContext)
|
1998-09-10 03:30:30 +04:00
|
|
|
{
|
2006-03-27 01:30:36 +04:00
|
|
|
return new (aPresShell) nsSubDocumentFrame(aContext);
|
1998-09-10 03:30:30 +04:00
|
|
|
}
|
|
|
|
|
2009-09-12 20:49:24 +04:00
|
|
|
NS_IMPL_FRAMEARENA_HELPERS(nsSubDocumentFrame)
|
|
|
|
|
2016-04-26 03:23:21 +03:00
|
|
|
class nsHideViewer : public Runnable {
|
2012-08-14 08:06:44 +04:00
|
|
|
public:
|
|
|
|
nsHideViewer(nsIContent* aFrameElement,
|
|
|
|
nsFrameLoader* aFrameLoader,
|
|
|
|
nsIPresShell* aPresShell,
|
|
|
|
bool aHideViewerIfFrameless)
|
|
|
|
: mFrameElement(aFrameElement),
|
|
|
|
mFrameLoader(aFrameLoader),
|
|
|
|
mPresShell(aPresShell),
|
|
|
|
mHideViewerIfFrameless(aHideViewerIfFrameless)
|
|
|
|
{
|
|
|
|
NS_ASSERTION(mFrameElement, "Must have a frame element");
|
|
|
|
NS_ASSERTION(mFrameLoader, "Must have a frame loader");
|
|
|
|
NS_ASSERTION(mPresShell, "Must have a presshell");
|
|
|
|
}
|
|
|
|
|
2016-08-08 05:18:10 +03:00
|
|
|
NS_IMETHOD Run() override
|
2012-08-14 08:06:44 +04:00
|
|
|
{
|
|
|
|
// Flush frames, to ensure any pending display:none changes are made.
|
|
|
|
// Note it can be unsafe to flush if we've destroyed the presentation
|
|
|
|
// for some other reason, like if we're shutting down.
|
|
|
|
if (!mPresShell->IsDestroying()) {
|
2017-01-05 10:31:56 +03:00
|
|
|
mPresShell->FlushPendingNotifications(FlushType::Frames);
|
2012-08-14 08:06:44 +04:00
|
|
|
}
|
2016-04-02 09:54:00 +03:00
|
|
|
|
|
|
|
// Either the frame has been constructed by now, or it never will be,
|
|
|
|
// either way we want to clear the stashed views.
|
2016-05-05 00:12:48 +03:00
|
|
|
mFrameLoader->SetDetachedSubdocFrame(nullptr, nullptr);
|
2016-04-02 09:54:00 +03:00
|
|
|
|
2015-05-28 01:18:36 +03:00
|
|
|
nsSubDocumentFrame* frame = do_QueryFrame(mFrameElement->GetPrimaryFrame());
|
2012-08-21 09:07:03 +04:00
|
|
|
if ((!frame && mHideViewerIfFrameless) ||
|
|
|
|
mPresShell->IsDestroying()) {
|
|
|
|
// Either the frame element has no nsIFrame or the presshell is being
|
2016-04-02 09:54:00 +03:00
|
|
|
// destroyed. Hide the nsFrameLoader, which destroys the presentation.
|
2012-08-14 08:06:44 +04:00
|
|
|
mFrameLoader->Hide();
|
2012-08-21 09:07:03 +04:00
|
|
|
}
|
2012-08-14 08:06:44 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
private:
|
|
|
|
nsCOMPtr<nsIContent> mFrameElement;
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> mFrameLoader;
|
2012-08-14 08:06:44 +04:00
|
|
|
nsCOMPtr<nsIPresShell> mPresShell;
|
|
|
|
bool mHideViewerIfFrameless;
|
|
|
|
};
|
|
|
|
|
2013-01-03 17:23:11 +04:00
|
|
|
static nsView*
|
|
|
|
BeginSwapDocShellsForViews(nsView* aSibling);
|
2012-08-14 08:06:44 +04:00
|
|
|
|
2006-04-10 04:16:29 +04:00
|
|
|
void
|
2009-12-24 08:21:15 +03:00
|
|
|
nsSubDocumentFrame::DestroyFrom(nsIFrame* aDestructRoot)
|
1998-07-16 03:42:14 +04:00
|
|
|
{
|
2007-09-21 03:28:26 +04:00
|
|
|
if (mPostedReflowCallback) {
|
|
|
|
PresContext()->PresShell()->CancelReflowCallback(this);
|
2011-10-17 18:59:28 +04:00
|
|
|
mPostedReflowCallback = false;
|
2007-09-21 03:28:26 +04:00
|
|
|
}
|
2012-08-14 08:06:44 +04:00
|
|
|
|
2012-08-14 08:06:44 +04:00
|
|
|
// Detach the subdocument's views and stash them in the frame loader.
|
|
|
|
// We can then reattach them if we're being reframed (for example if
|
|
|
|
// the frame has been made position:fixed).
|
2016-04-02 09:54:00 +03:00
|
|
|
RefPtr<nsFrameLoader> frameloader = FrameLoader();
|
2012-08-14 08:06:44 +04:00
|
|
|
if (frameloader) {
|
2013-01-03 17:23:11 +04:00
|
|
|
nsView* detachedViews = ::BeginSwapDocShellsForViews(mInnerView->GetFirstChild());
|
2016-05-05 00:12:48 +03:00
|
|
|
|
|
|
|
if (detachedViews && detachedViews->GetFrame()) {
|
|
|
|
MOZ_ASSERT(mContent->OwnerDoc());
|
|
|
|
frameloader->SetDetachedSubdocFrame(
|
|
|
|
detachedViews->GetFrame(), mContent->OwnerDoc());
|
|
|
|
|
|
|
|
// We call nsFrameLoader::HideViewer() in a script runner so that we can
|
|
|
|
// safely determine whether the frame is being reframed or destroyed.
|
|
|
|
nsContentUtils::AddScriptRunner(
|
|
|
|
new nsHideViewer(mContent,
|
|
|
|
frameloader,
|
|
|
|
PresContext()->PresShell(),
|
|
|
|
(mDidCreateDoc || mCallingShow)));
|
|
|
|
} else {
|
|
|
|
frameloader->SetDetachedSubdocFrame(nullptr, nullptr);
|
|
|
|
if (mDidCreateDoc || mCallingShow) {
|
|
|
|
frameloader->Hide();
|
|
|
|
}
|
|
|
|
}
|
2012-08-14 08:06:44 +04:00
|
|
|
}
|
|
|
|
|
2016-04-18 09:17:58 +03:00
|
|
|
nsAtomicContainerFrame::DestroyFrom(aDestructRoot);
|
2012-08-15 21:10:55 +04:00
|
|
|
}
|
|
|
|
|
2015-04-01 01:09:02 +03:00
|
|
|
CSSIntSize
|
2009-08-10 23:42:53 +04:00
|
|
|
nsSubDocumentFrame::GetMarginAttributes()
|
1998-07-16 03:42:14 +04:00
|
|
|
{
|
2015-04-01 01:09:02 +03:00
|
|
|
CSSIntSize result(-1, -1);
|
2005-01-12 22:45:38 +03:00
|
|
|
nsGenericHTMLElement *content = nsGenericHTMLElement::FromContent(mContent);
|
|
|
|
if (content) {
|
2006-12-26 20:47:52 +03:00
|
|
|
const nsAttrValue* attr = content->GetParsedAttr(nsGkAtoms::marginwidth);
|
2005-01-25 03:02:58 +03:00
|
|
|
if (attr && attr->Type() == nsAttrValue::eInteger)
|
|
|
|
result.width = attr->GetIntegerValue();
|
2006-12-26 20:47:52 +03:00
|
|
|
attr = content->GetParsedAttr(nsGkAtoms::marginheight);
|
2005-01-25 03:02:58 +03:00
|
|
|
if (attr && attr->Type() == nsAttrValue::eInteger)
|
|
|
|
result.height = attr->GetIntegerValue();
|
2001-05-19 04:17:01 +04:00
|
|
|
}
|
2004-01-10 08:36:32 +03:00
|
|
|
return result;
|
1999-05-11 02:49:39 +04:00
|
|
|
}
|
|
|
|
|
2009-10-16 23:42:29 +04:00
|
|
|
nsFrameLoader*
|
|
|
|
nsSubDocumentFrame::FrameLoader()
|
2002-04-17 08:17:16 +04:00
|
|
|
{
|
2004-01-10 08:36:32 +03:00
|
|
|
nsIContent* content = GetContent();
|
2009-10-16 23:42:29 +04:00
|
|
|
if (!content)
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2002-04-17 08:17:16 +04:00
|
|
|
|
|
|
|
if (!mFrameLoader) {
|
2005-02-08 09:55:00 +03:00
|
|
|
nsCOMPtr<nsIFrameLoaderOwner> loaderOwner = do_QueryInterface(content);
|
|
|
|
if (loaderOwner) {
|
2016-08-11 19:09:22 +03:00
|
|
|
mFrameLoader = loaderOwner->GetFrameLoader();
|
2002-04-17 08:17:16 +04:00
|
|
|
}
|
|
|
|
}
|
2009-10-16 23:42:29 +04:00
|
|
|
return mFrameLoader;
|
|
|
|
}
|
2002-04-17 08:17:16 +04:00
|
|
|
|
2009-10-16 23:42:29 +04:00
|
|
|
// XXX this should be called ObtainDocShell or something like that,
|
|
|
|
// to indicate that it could have side effects
|
2010-08-31 04:49:11 +04:00
|
|
|
nsresult
|
2009-10-16 23:42:29 +04:00
|
|
|
nsSubDocumentFrame::GetDocShell(nsIDocShell **aDocShell)
|
|
|
|
{
|
2012-07-30 18:20:58 +04:00
|
|
|
*aDocShell = nullptr;
|
2009-10-16 23:42:29 +04:00
|
|
|
|
|
|
|
NS_ENSURE_STATE(FrameLoader());
|
2002-04-17 08:17:16 +04:00
|
|
|
return mFrameLoader->GetDocShell(aDocShell);
|
1998-07-16 03:42:14 +04:00
|
|
|
}
|
|
|
|
|
2010-09-18 15:28:49 +04:00
|
|
|
static void
|
|
|
|
DestroyDisplayItemDataForFrames(nsIFrame* aFrame)
|
|
|
|
{
|
|
|
|
FrameLayerBuilder::DestroyDisplayItemDataFor(aFrame);
|
|
|
|
|
2011-08-25 00:54:29 +04:00
|
|
|
nsIFrame::ChildListIterator lists(aFrame);
|
|
|
|
for (; !lists.IsDone(); lists.Next()) {
|
|
|
|
nsFrameList::Enumerator childFrames(lists.CurrentList());
|
|
|
|
for (; !childFrames.AtEnd(); childFrames.Next()) {
|
|
|
|
DestroyDisplayItemDataForFrames(childFrames.get());
|
2010-09-18 15:28:49 +04:00
|
|
|
}
|
2011-08-25 00:54:29 +04:00
|
|
|
}
|
2010-09-18 15:28:49 +04:00
|
|
|
}
|
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
static bool
|
2010-09-18 15:28:49 +04:00
|
|
|
BeginSwapDocShellsForDocument(nsIDocument* aDocument, void*)
|
|
|
|
{
|
|
|
|
NS_PRECONDITION(aDocument, "");
|
|
|
|
|
|
|
|
nsIPresShell* shell = aDocument->GetShell();
|
2014-02-04 03:47:57 +04:00
|
|
|
if (shell) {
|
|
|
|
// Disable painting while the views are detached, see bug 946929.
|
|
|
|
shell->SetNeverPainting(true);
|
|
|
|
|
|
|
|
nsIFrame* rootFrame = shell->GetRootFrame();
|
|
|
|
if (rootFrame) {
|
|
|
|
::DestroyDisplayItemDataForFrames(rootFrame);
|
|
|
|
}
|
2010-09-18 15:28:49 +04:00
|
|
|
}
|
2014-06-19 06:09:35 +04:00
|
|
|
aDocument->EnumerateActivityObservers(
|
2014-09-24 08:34:00 +04:00
|
|
|
nsPluginFrame::BeginSwapDocShells, nullptr);
|
2012-07-30 18:20:58 +04:00
|
|
|
aDocument->EnumerateSubDocuments(BeginSwapDocShellsForDocument, nullptr);
|
2011-10-17 18:59:28 +04:00
|
|
|
return true;
|
2010-09-18 15:28:49 +04:00
|
|
|
}
|
|
|
|
|
2013-01-03 17:23:11 +04:00
|
|
|
static nsView*
|
|
|
|
BeginSwapDocShellsForViews(nsView* aSibling)
|
2010-09-18 15:28:49 +04:00
|
|
|
{
|
|
|
|
// Collect the removed sibling views in reverse order in 'removedViews'.
|
2013-01-03 17:23:11 +04:00
|
|
|
nsView* removedViews = nullptr;
|
2010-09-18 15:28:49 +04:00
|
|
|
while (aSibling) {
|
|
|
|
nsIDocument* doc = ::GetDocumentFromView(aSibling);
|
|
|
|
if (doc) {
|
2012-07-30 18:20:58 +04:00
|
|
|
::BeginSwapDocShellsForDocument(doc, nullptr);
|
2010-09-18 15:28:49 +04:00
|
|
|
}
|
2013-01-03 17:23:11 +04:00
|
|
|
nsView* next = aSibling->GetNextSibling();
|
2010-09-18 15:28:49 +04:00
|
|
|
aSibling->GetViewManager()->RemoveChild(aSibling);
|
|
|
|
aSibling->SetNextSibling(removedViews);
|
|
|
|
removedViews = aSibling;
|
|
|
|
aSibling = next;
|
|
|
|
}
|
|
|
|
return removedViews;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-01-03 17:23:11 +04:00
|
|
|
InsertViewsInReverseOrder(nsView* aSibling, nsView* aParent)
|
2010-09-18 15:28:49 +04:00
|
|
|
{
|
|
|
|
NS_PRECONDITION(aParent, "");
|
|
|
|
NS_PRECONDITION(!aParent->GetFirstChild(), "inserting into non-empty list");
|
|
|
|
|
2013-01-05 07:12:24 +04:00
|
|
|
nsViewManager* vm = aParent->GetViewManager();
|
2010-09-18 15:28:49 +04:00
|
|
|
while (aSibling) {
|
2013-01-03 17:23:11 +04:00
|
|
|
nsView* next = aSibling->GetNextSibling();
|
2012-07-30 18:20:58 +04:00
|
|
|
aSibling->SetNextSibling(nullptr);
|
2011-10-17 18:59:28 +04:00
|
|
|
// true means 'after' in document order which is 'before' in view order,
|
2010-09-18 15:28:49 +04:00
|
|
|
// so this call prepends the child, thus reversing the siblings as we go.
|
2012-07-30 18:20:58 +04:00
|
|
|
vm->InsertChild(aParent, aSibling, nullptr, true);
|
2010-09-18 15:28:49 +04:00
|
|
|
aSibling = next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-31 04:49:11 +04:00
|
|
|
nsresult
|
2008-08-11 12:38:43 +04:00
|
|
|
nsSubDocumentFrame::BeginSwapDocShells(nsIFrame* aOther)
|
|
|
|
{
|
|
|
|
if (!aOther || aOther->GetType() != nsGkAtoms::subDocumentFrame) {
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsSubDocumentFrame* other = static_cast<nsSubDocumentFrame*>(aOther);
|
2010-05-28 23:34:50 +04:00
|
|
|
if (!mFrameLoader || !mDidCreateDoc || mCallingShow ||
|
|
|
|
!other->mFrameLoader || !other->mDidCreateDoc) {
|
2008-08-11 12:38:43 +04:00
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
2010-09-18 15:28:49 +04:00
|
|
|
if (mInnerView && other->mInnerView) {
|
2013-01-03 17:23:11 +04:00
|
|
|
nsView* ourSubdocViews = mInnerView->GetFirstChild();
|
|
|
|
nsView* ourRemovedViews = ::BeginSwapDocShellsForViews(ourSubdocViews);
|
|
|
|
nsView* otherSubdocViews = other->mInnerView->GetFirstChild();
|
|
|
|
nsView* otherRemovedViews = ::BeginSwapDocShellsForViews(otherSubdocViews);
|
2008-08-11 12:38:43 +04:00
|
|
|
|
2010-09-18 15:28:49 +04:00
|
|
|
::InsertViewsInReverseOrder(ourRemovedViews, other->mInnerView);
|
|
|
|
::InsertViewsInReverseOrder(otherRemovedViews, mInnerView);
|
|
|
|
}
|
2008-08-11 12:38:43 +04:00
|
|
|
mFrameLoader.swap(other->mFrameLoader);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
static bool
|
2010-09-18 15:28:49 +04:00
|
|
|
EndSwapDocShellsForDocument(nsIDocument* aDocument, void*)
|
|
|
|
{
|
|
|
|
NS_PRECONDITION(aDocument, "");
|
|
|
|
|
2010-09-18 15:28:50 +04:00
|
|
|
// Our docshell and view trees have been updated for the new hierarchy.
|
2011-04-17 05:22:44 +04:00
|
|
|
// Now also update all nsDeviceContext::mWidget to that of the
|
2010-09-18 15:28:50 +04:00
|
|
|
// container view in the new hierarchy.
|
2013-11-15 20:32:12 +04:00
|
|
|
nsCOMPtr<nsIDocShell> ds = aDocument->GetDocShell();
|
2010-09-18 15:28:50 +04:00
|
|
|
if (ds) {
|
|
|
|
nsCOMPtr<nsIContentViewer> cv;
|
|
|
|
ds->GetContentViewer(getter_AddRefs(cv));
|
|
|
|
while (cv) {
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsPresContext> pc;
|
2011-10-15 11:33:26 +04:00
|
|
|
cv->GetPresContext(getter_AddRefs(pc));
|
2014-02-04 03:47:57 +04:00
|
|
|
if (pc && pc->GetPresShell()) {
|
|
|
|
pc->GetPresShell()->SetNeverPainting(ds->IsInvisible());
|
|
|
|
}
|
2012-07-30 18:20:58 +04:00
|
|
|
nsDeviceContext* dc = pc ? pc->DeviceContext() : nullptr;
|
2011-10-15 11:33:26 +04:00
|
|
|
if (dc) {
|
2013-01-03 17:23:11 +04:00
|
|
|
nsView* v = cv->FindContainerView();
|
2012-07-30 18:20:58 +04:00
|
|
|
dc->Init(v ? v->GetNearestWidget(nullptr) : nullptr);
|
2010-09-18 15:28:50 +04:00
|
|
|
}
|
|
|
|
nsCOMPtr<nsIContentViewer> prev;
|
|
|
|
cv->GetPreviousViewer(getter_AddRefs(prev));
|
|
|
|
cv = prev;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-19 06:09:35 +04:00
|
|
|
aDocument->EnumerateActivityObservers(
|
2014-09-24 08:34:00 +04:00
|
|
|
nsPluginFrame::EndSwapDocShells, nullptr);
|
2012-07-30 18:20:58 +04:00
|
|
|
aDocument->EnumerateSubDocuments(EndSwapDocShellsForDocument, nullptr);
|
2011-10-17 18:59:28 +04:00
|
|
|
return true;
|
2010-09-18 15:28:49 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-01-03 17:23:11 +04:00
|
|
|
EndSwapDocShellsForViews(nsView* aSibling)
|
2010-09-18 15:28:49 +04:00
|
|
|
{
|
|
|
|
for ( ; aSibling; aSibling = aSibling->GetNextSibling()) {
|
|
|
|
nsIDocument* doc = ::GetDocumentFromView(aSibling);
|
|
|
|
if (doc) {
|
2012-07-30 18:20:58 +04:00
|
|
|
::EndSwapDocShellsForDocument(doc, nullptr);
|
2010-09-18 15:28:49 +04:00
|
|
|
}
|
2012-08-29 09:39:01 +04:00
|
|
|
nsIFrame *frame = aSibling->GetFrame();
|
2013-03-04 23:49:39 +04:00
|
|
|
if (frame) {
|
|
|
|
nsIFrame* parent = nsLayoutUtils::GetCrossDocParentFrame(frame);
|
|
|
|
if (parent->HasAnyStateBits(NS_FRAME_IN_POPUP)) {
|
|
|
|
nsIFrame::AddInPopupStateBitToDescendants(frame);
|
|
|
|
} else {
|
|
|
|
nsIFrame::RemoveInPopupStateBitFromDescendants(frame);
|
|
|
|
}
|
|
|
|
if (frame->HasInvalidFrameInSubtree()) {
|
2016-06-02 09:35:31 +03:00
|
|
|
while (parent && !parent->HasAnyStateBits(NS_FRAME_DESCENDANT_NEEDS_PAINT | NS_FRAME_IS_NONDISPLAY)) {
|
2013-03-04 23:49:39 +04:00
|
|
|
parent->AddStateBits(NS_FRAME_DESCENDANT_NEEDS_PAINT);
|
|
|
|
parent = nsLayoutUtils::GetCrossDocParentFrame(parent);
|
|
|
|
}
|
2012-08-29 09:39:01 +04:00
|
|
|
}
|
|
|
|
}
|
2010-09-18 15:28:49 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-08-11 12:38:43 +04:00
|
|
|
void
|
|
|
|
nsSubDocumentFrame::EndSwapDocShells(nsIFrame* aOther)
|
|
|
|
{
|
|
|
|
nsSubDocumentFrame* other = static_cast<nsSubDocumentFrame*>(aOther);
|
2017-03-01 20:03:14 +03:00
|
|
|
AutoWeakFrame weakThis(this);
|
|
|
|
AutoWeakFrame weakOther(aOther);
|
2010-09-18 15:28:49 +04:00
|
|
|
|
|
|
|
if (mInnerView) {
|
|
|
|
::EndSwapDocShellsForViews(mInnerView->GetFirstChild());
|
|
|
|
}
|
|
|
|
if (other->mInnerView) {
|
|
|
|
::EndSwapDocShellsForViews(other->mInnerView->GetFirstChild());
|
|
|
|
}
|
2008-08-11 12:38:43 +04:00
|
|
|
|
|
|
|
// Now make sure we reflow both frames, in case their contents
|
|
|
|
// determine their size.
|
|
|
|
// And repaint them, for good measure, in case there's nothing
|
|
|
|
// interesting that happens during reflow.
|
2010-05-28 23:34:50 +04:00
|
|
|
if (weakThis.IsAlive()) {
|
|
|
|
PresContext()->PresShell()->
|
|
|
|
FrameNeedsReflow(this, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY);
|
2010-08-31 04:49:12 +04:00
|
|
|
InvalidateFrameSubtree();
|
2010-05-28 23:34:50 +04:00
|
|
|
}
|
|
|
|
if (weakOther.IsAlive()) {
|
|
|
|
other->PresContext()->PresShell()->
|
|
|
|
FrameNeedsReflow(other, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY);
|
2010-08-31 04:49:12 +04:00
|
|
|
other->InvalidateFrameSubtree();
|
2010-05-28 23:34:50 +04:00
|
|
|
}
|
2008-08-11 12:38:43 +04:00
|
|
|
}
|
|
|
|
|
2013-01-03 17:23:11 +04:00
|
|
|
nsView*
|
2010-09-18 15:28:50 +04:00
|
|
|
nsSubDocumentFrame::EnsureInnerView()
|
2001-11-03 17:59:39 +03:00
|
|
|
{
|
2008-08-11 12:38:43 +04:00
|
|
|
if (mInnerView) {
|
2009-10-16 23:42:29 +04:00
|
|
|
return mInnerView;
|
2008-08-11 12:38:43 +04:00
|
|
|
}
|
2009-10-16 23:42:29 +04:00
|
|
|
|
2001-11-03 17:59:39 +03:00
|
|
|
// create, init, set the parent of the view
|
2013-01-03 17:23:11 +04:00
|
|
|
nsView* outerView = GetView();
|
2004-01-10 08:36:32 +03:00
|
|
|
NS_ASSERTION(outerView, "Must have an outer view already");
|
|
|
|
nsRect viewBounds(0, 0, 0, 0); // size will be fixed during reflow
|
2001-11-03 17:59:39 +03:00
|
|
|
|
2013-01-05 07:12:24 +04:00
|
|
|
nsViewManager* viewMan = outerView->GetViewManager();
|
2013-01-03 17:23:11 +04:00
|
|
|
nsView* innerView = viewMan->CreateView(viewBounds, outerView);
|
2004-11-04 18:06:50 +03:00
|
|
|
if (!innerView) {
|
|
|
|
NS_ERROR("Could not create inner view");
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2004-11-04 18:06:50 +03:00
|
|
|
}
|
|
|
|
mInnerView = innerView;
|
2012-07-30 18:20:58 +04:00
|
|
|
viewMan->InsertChild(outerView, innerView, nullptr, true);
|
2001-11-03 17:59:39 +03:00
|
|
|
|
2009-10-16 23:42:29 +04:00
|
|
|
return mInnerView;
|
1998-07-16 03:42:14 +04:00
|
|
|
}
|
2007-11-18 15:09:03 +03:00
|
|
|
|
|
|
|
nsIFrame*
|
|
|
|
nsSubDocumentFrame::ObtainIntrinsicSizeFrame()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIObjectLoadingContent> olc = do_QueryInterface(GetContent());
|
|
|
|
if (olc) {
|
|
|
|
// We are an HTML <object>, <embed> or <applet> (a replaced element).
|
|
|
|
|
|
|
|
// Try to get an nsIFrame for our sub-document's document element
|
2012-07-30 18:20:58 +04:00
|
|
|
nsIFrame* subDocRoot = nullptr;
|
2007-11-18 15:09:03 +03:00
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShell> docShell;
|
|
|
|
GetDocShell(getter_AddRefs(docShell));
|
|
|
|
if (docShell) {
|
2012-12-29 05:56:42 +04:00
|
|
|
nsCOMPtr<nsIPresShell> presShell = docShell->GetPresShell();
|
2007-11-18 15:09:03 +03:00
|
|
|
if (presShell) {
|
|
|
|
nsIScrollableFrame* scrollable = presShell->GetRootScrollFrameAsScrollable();
|
|
|
|
if (scrollable) {
|
|
|
|
nsIFrame* scrolled = scrollable->GetScrolledFrame();
|
|
|
|
if (scrolled) {
|
2016-01-29 17:42:14 +03:00
|
|
|
subDocRoot = scrolled->PrincipalChildList().FirstChild();
|
2007-11-18 15:09:03 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (subDocRoot && subDocRoot->GetContent() &&
|
|
|
|
subDocRoot->GetContent()->NodeInfo()->Equals(nsGkAtoms::svg, kNameSpaceID_SVG)) {
|
|
|
|
return subDocRoot; // SVG documents have an intrinsic size
|
|
|
|
}
|
|
|
|
}
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2007-11-18 15:09:03 +03:00
|
|
|
}
|