Blame layout/generic/nsSubDocumentFrame.h

Packit f0b94e
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
Packit f0b94e
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
#ifndef NSSUBDOCUMENTFRAME_H_
Packit f0b94e
#define NSSUBDOCUMENTFRAME_H_
Packit f0b94e
Packit f0b94e
#include "mozilla/Attributes.h"
Packit f0b94e
#include "nsAtomicContainerFrame.h"
Packit f0b94e
#include "nsIReflowCallback.h"
Packit f0b94e
#include "nsFrameLoader.h"
Packit f0b94e
#include "Units.h"
Packit f0b94e
Packit f0b94e
/******************************************************************************
Packit f0b94e
 * nsSubDocumentFrame
Packit f0b94e
 *****************************************************************************/
Packit f0b94e
class nsSubDocumentFrame final : public nsAtomicContainerFrame,
Packit f0b94e
                                 public nsIReflowCallback {
Packit f0b94e
 public:
Packit f0b94e
  NS_DECL_FRAMEARENA_HELPERS(nsSubDocumentFrame)
Packit f0b94e
Packit f0b94e
  explicit nsSubDocumentFrame(nsStyleContext* aContext);
Packit f0b94e
Packit f0b94e
#ifdef DEBUG_FRAME_DUMP
Packit f0b94e
  void List(FILE* out = stderr, const char* aPrefix = "",
Packit f0b94e
            uint32_t aFlags = 0) const override;
Packit f0b94e
  nsresult GetFrameName(nsAString& aResult) const override;
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
  NS_DECL_QUERYFRAME
Packit f0b94e
Packit f0b94e
  bool IsFrameOfType(uint32_t aFlags) const override {
Packit f0b94e
    return nsAtomicContainerFrame::IsFrameOfType(
Packit f0b94e
        aFlags & ~(nsIFrame::eReplaced | nsIFrame::eReplacedSizing |
Packit f0b94e
                   nsIFrame::eReplacedContainsBlock));
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  void Init(nsIContent* aContent, nsContainerFrame* aParent,
Packit f0b94e
            nsIFrame* aPrevInFlow) override;
Packit f0b94e
Packit f0b94e
  void DestroyFrom(nsIFrame* aDestructRoot,
Packit f0b94e
                   PostDestroyData& aPostDestroyData) override;
Packit f0b94e
Packit f0b94e
  nscoord GetMinISize(gfxContext* aRenderingContext) override;
Packit f0b94e
  nscoord GetPrefISize(gfxContext* aRenderingContext) override;
Packit f0b94e
Packit f0b94e
  mozilla::IntrinsicSize GetIntrinsicSize() override;
Packit f0b94e
  nsSize GetIntrinsicRatio() override;
Packit f0b94e
Packit f0b94e
  mozilla::LogicalSize ComputeAutoSize(
Packit f0b94e
      gfxContext* aRenderingContext, mozilla::WritingMode aWritingMode,
Packit f0b94e
      const mozilla::LogicalSize& aCBSize, nscoord aAvailableISize,
Packit f0b94e
      const mozilla::LogicalSize& aMargin, const mozilla::LogicalSize& aBorder,
Packit f0b94e
      const mozilla::LogicalSize& aPadding, ComputeSizeFlags aFlags) override;
Packit f0b94e
Packit f0b94e
  mozilla::LogicalSize ComputeSize(
Packit f0b94e
      gfxContext* aRenderingContext, mozilla::WritingMode aWritingMode,
Packit f0b94e
      const mozilla::LogicalSize& aCBSize, nscoord aAvailableISize,
Packit f0b94e
      const mozilla::LogicalSize& aMargin, const mozilla::LogicalSize& aBorder,
Packit f0b94e
      const mozilla::LogicalSize& aPadding, ComputeSizeFlags aFlags) override;
Packit f0b94e
Packit f0b94e
  void Reflow(nsPresContext* aPresContext, ReflowOutput& aDesiredSize,
Packit f0b94e
              const ReflowInput& aReflowInput,
Packit f0b94e
              nsReflowStatus& aStatus) override;
Packit f0b94e
Packit f0b94e
  void BuildDisplayList(nsDisplayListBuilder* aBuilder,
Packit f0b94e
                        const nsDisplayListSet& aLists) override;
Packit f0b94e
Packit f0b94e
  nsresult AttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
Packit f0b94e
                            int32_t aModType) override;
Packit f0b94e
Packit f0b94e
  // if the content is "visibility:hidden", then just hide the view
Packit f0b94e
  // and all our contents. We don't extend "visibility:hidden" to
Packit f0b94e
  // the child content ourselves, since it belongs to a different
Packit f0b94e
  // document and CSS doesn't inherit in there.
Packit f0b94e
  bool SupportsVisibilityHidden() override { return false; }
Packit f0b94e
Packit f0b94e
#ifdef ACCESSIBILITY
Packit f0b94e
  mozilla::a11y::AccType AccessibleType() override;
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
  nsresult GetDocShell(nsIDocShell** aDocShell);
Packit f0b94e
  nsresult BeginSwapDocShells(nsIFrame* aOther);
Packit f0b94e
  void EndSwapDocShells(nsIFrame* aOther);
Packit f0b94e
  nsView* EnsureInnerView();
Packit f0b94e
  nsIFrame* GetSubdocumentRootFrame();
Packit f0b94e
  enum { IGNORE_PAINT_SUPPRESSION = 0x1 };
Packit f0b94e
  nsIPresShell* GetSubdocumentPresShellForPainting(uint32_t aFlags);
Packit f0b94e
  mozilla::ScreenIntSize GetSubdocumentSize();
Packit f0b94e
Packit f0b94e
  // nsIReflowCallback
Packit f0b94e
  bool ReflowFinished() override;
Packit f0b94e
  void ReflowCallbackCanceled() override;
Packit f0b94e
Packit f0b94e
  bool ShouldClipSubdocument() {
Packit f0b94e
    nsFrameLoader* frameLoader = FrameLoader();
Packit f0b94e
    return !frameLoader || frameLoader->ShouldClipSubdocument();
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  bool ShouldClampScrollPosition() {
Packit f0b94e
    nsFrameLoader* frameLoader = FrameLoader();
Packit f0b94e
    return !frameLoader || frameLoader->ShouldClampScrollPosition();
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * Return true if pointer event hit-testing should be allowed to target
Packit f0b94e
   * content in the subdocument.
Packit f0b94e
   */
Packit f0b94e
  bool PassPointerEventsToChildren();
Packit f0b94e
Packit f0b94e
  void MaybeShowViewer() {
Packit f0b94e
    if (!mDidCreateDoc && !mCallingShow) {
Packit f0b94e
      ShowViewer();
Packit f0b94e
    }
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
 protected:
Packit f0b94e
  friend class AsyncFrameInit;
Packit f0b94e
Packit f0b94e
  // Helper method to look up the HTML marginwidth & marginheight attributes.
Packit f0b94e
  mozilla::CSSIntSize GetMarginAttributes();
Packit f0b94e
Packit f0b94e
  nsFrameLoader* FrameLoader();
Packit f0b94e
Packit f0b94e
  bool IsInline() { return mIsInline; }
Packit f0b94e
Packit f0b94e
  nscoord GetIntrinsicISize();
Packit f0b94e
  nscoord GetIntrinsicBSize();
Packit f0b94e
Packit f0b94e
  // Show our document viewer. The document viewer is hidden via a script
Packit f0b94e
  // runner, so that we can save and restore the presentation if we're
Packit f0b94e
  // being reframed.
Packit f0b94e
  void ShowViewer();
Packit f0b94e
Packit f0b94e
  /* Obtains the frame we should use for intrinsic size information if we are
Packit f0b94e
   * an HTML <object> or <embed>  (a replaced element - not <iframe>)
Packit f0b94e
   * and our sub-document has an intrinsic size. The frame returned is the
Packit f0b94e
   * frame for the document element of the document we're embedding.
Packit f0b94e
   *
Packit f0b94e
   * Called "Obtain*" and not "Get*" because of comment on GetDocShell that
Packit f0b94e
   * says it should be called ObtainDocShell because of its side effects.
Packit f0b94e
   */
Packit f0b94e
  nsIFrame* ObtainIntrinsicSizeFrame();
Packit f0b94e
Packit f0b94e
  nsView* GetViewInternal() const override { return mOuterView; }
Packit f0b94e
  void SetViewInternal(nsView* aView) override { mOuterView = aView; }
Packit f0b94e
Packit f0b94e
  RefPtr<nsFrameLoader> mFrameLoader;
Packit f0b94e
  nsView* mOuterView;
Packit f0b94e
  nsView* mInnerView;
Packit f0b94e
  Maybe<bool> mPreviouslyNeededLayer;
Packit f0b94e
  bool mIsInline;
Packit f0b94e
  bool mPostedReflowCallback;
Packit f0b94e
  bool mDidCreateDoc;
Packit f0b94e
  bool mCallingShow;
Packit f0b94e
  WeakFrame mPreviousCaret;
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
#endif /* NSSUBDOCUMENTFRAME_H_ */