gecko-dev/dom/ipc/BrowserBridgeChild.h
Andreas Farre 4b493b6a30 Bug 1595491 - Part 1: Make <embed> and <object> behave more like <iframe>. r=smaug,emilio
By making image loading in <embed> and <object> behave more like when
an <iframe> loads an image, we can make sure that the synthetic
document generated is process switched if the image is cross
origin. This is done by making image loading in nsObjectLoadingContent
follow the document loading path.

We also make sure that we pass the image size back to the embedder
element to not get stuck with the intrinsic size.

To avoid named targeting being able to target these synthetic
documents, as well as showing up in `Window.frames` and being counted
in `Window.length`, we keep a filtered list of non-synthetic browsing
contexts for that use-case.

This feature is controlled by two prefs:

* browser.opaqueResponseBlocking.syntheticBrowsingContext

  This triggers the creation of synthetic documents for images loaded
  in <object> or embed.

* browser.opaqueResponseBlocking.syntheticBrowsingContext.filter

  This turns on the filtering of synthetic browsing contexts in named
  targeting, `Window.length` and `Window.frames`.

Differential Revision: https://phabricator.services.mozilla.com/D148117
2022-08-16 16:42:58 +00:00

134 lines
4.2 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#ifndef mozilla_dom_BrowserBridgeChild_h
#define mozilla_dom_BrowserBridgeChild_h
#include "mozilla/dom/PBrowserBridgeChild.h"
#include "mozilla/dom/BrowserChild.h"
#include "mozilla/dom/ipc/IdType.h"
namespace mozilla::dom {
class BrowsingContext;
class ContentChild;
class BrowserBridgeHost;
/**
* BrowserBridgeChild implements the child actor part of the PBrowserBridge
* protocol. See PBrowserBridge for more information.
*/
class BrowserBridgeChild : public PBrowserBridgeChild {
public:
typedef mozilla::layers::LayersId LayersId;
NS_INLINE_DECL_REFCOUNTING(BrowserBridgeChild, final);
BrowserChild* Manager() {
MOZ_ASSERT(CanSend());
return static_cast<BrowserChild*>(PBrowserBridgeChild::Manager());
}
TabId GetTabId() { return mId; }
LayersId GetLayersId() { return mLayersId; }
nsFrameLoader* GetFrameLoader() const { return mFrameLoader; }
BrowsingContext* GetBrowsingContext() { return mBrowsingContext; }
nsILoadContext* GetLoadContext();
void NavigateByKey(bool aForward, bool aForDocumentNavigation);
void Activate(uint64_t aActionId);
void Deactivate(bool aWindowLowering, uint64_t aActionId);
void SetIsUnderHiddenEmbedderElement(bool aIsUnderHiddenEmbedderElement);
already_AddRefed<BrowserBridgeHost> FinishInit(nsFrameLoader* aFrameLoader);
#if defined(ACCESSIBILITY)
void SetEmbedderAccessible(PDocAccessibleChild* aDoc, uint64_t aID) {
MOZ_ASSERT((aDoc && aID) || (!aDoc && !aID));
mEmbedderAccessibleID = aID;
Unused << SendSetEmbedderAccessible(aDoc, aID);
}
uint64_t GetEmbedderAccessibleID() { return mEmbedderAccessibleID; }
# if defined(XP_WIN)
already_AddRefed<IDispatch> GetEmbeddedDocAccessible() {
return RefPtr{mEmbeddedDocAccessible}.forget();
}
# endif // defined(XP_WIN)
#endif // defined(ACCESSIBILITY)
static BrowserBridgeChild* GetFrom(nsFrameLoader* aFrameLoader);
static BrowserBridgeChild* GetFrom(nsIContent* aContent);
BrowserBridgeChild(BrowsingContext* aBrowsingContext, TabId aId,
const LayersId& aLayersId);
protected:
friend class ContentChild;
friend class PBrowserBridgeChild;
mozilla::ipc::IPCResult RecvRequestFocus(const bool& aCanRaise,
const CallerType aCallerType);
mozilla::ipc::IPCResult RecvMoveFocus(const bool& aForward,
const bool& aForDocumentNavigation);
mozilla::ipc::IPCResult RecvSetEmbeddedDocAccessibleCOMProxy(
const IDispatchHolder& aCOMProxy);
// TODO: Use MOZ_CAN_RUN_SCRIPT when it gains IPDL support (bug 1539864)
MOZ_CAN_RUN_SCRIPT_BOUNDARY mozilla::ipc::IPCResult
RecvMaybeFireEmbedderLoadEvents(
EmbedderElementEventType aFireEventAtEmbeddingElement);
mozilla::ipc::IPCResult RecvIntrinsicSizeOrRatioChanged(
const Maybe<IntrinsicSize>& aIntrinsicSize,
const Maybe<AspectRatio>& aIntrinsicRatio);
mozilla::ipc::IPCResult RecvImageLoadComplete(const nsresult& aResult);
MOZ_CAN_RUN_SCRIPT_BOUNDARY
mozilla::ipc::IPCResult RecvScrollRectIntoView(
const nsRect& aRect, const ScrollAxis& aVertical,
const ScrollAxis& aHorizontal, const ScrollFlags& aScrollFlags,
const int32_t& aAppUnitsPerDevPixel);
mozilla::ipc::IPCResult RecvSubFrameCrashed();
void ActorDestroy(ActorDestroyReason aWhy) override;
private:
~BrowserBridgeChild();
void UnblockOwnerDocsLoadEvent();
TabId mId;
LayersId mLayersId;
bool mHadInitialLoad = false;
RefPtr<nsFrameLoader> mFrameLoader;
RefPtr<BrowsingContext> mBrowsingContext;
#if defined(ACCESSIBILITY)
// We need to keep track of the embedder accessible id we last sent to the
// parent process.
uint64_t mEmbedderAccessibleID = 0;
# if defined(XP_WIN)
RefPtr<IDispatch> mEmbeddedDocAccessible;
# endif // defined(XP_WIN)
#endif // defined(ACCESSIBILITY)
};
} // namespace mozilla::dom
#endif // !defined(mozilla_dom_BrowserBridgeParent_h)