Backed out 9 changesets (bug 1500257) for multiple failures e.g. test_browserElement_oop_FirstPaint.html on a CLOSED TREE

Backed out changeset 6097503e6300 (bug 1500257)
Backed out changeset a62c02951031 (bug 1500257)
Backed out changeset 62ad54fb95eb (bug 1500257)
Backed out changeset caafb04b7dd4 (bug 1500257)
Backed out changeset c19bc81c4f43 (bug 1500257)
Backed out changeset 697a9159e0d2 (bug 1500257)
Backed out changeset f228f043e6cf (bug 1500257)
Backed out changeset 12d7dba34733 (bug 1500257)
Backed out changeset 3abe61f5dc5c (bug 1500257)
This commit is contained in:
Andreea Pavel 2019-02-10 05:31:06 +02:00
Родитель 58d897fe29
Коммит 5fc1f2fe6f
26 изменённых файлов: 126 добавлений и 830 удалений

Просмотреть файл

@ -101,8 +101,6 @@
#include "mozilla/dom/ParentSHistory.h"
#include "mozilla/dom/ChildSHistory.h"
#include "mozilla/dom/CanonicalBrowsingContext.h"
#include "mozilla/dom/ContentChild.h"
#include "mozilla/dom/RemoteFrameChild.h"
#include "mozilla/dom/HTMLBodyElement.h"
@ -351,19 +349,13 @@ nsresult nsFrameLoader::ReallyStartLoadingInternal() {
AUTO_PROFILER_LABEL("nsFrameLoader::ReallyStartLoadingInternal", OTHER);
if (IsRemoteFrame()) {
if (!mRemoteBrowser && !mRemoteFrameChild && !TryRemoteBrowser()) {
if (!mRemoteBrowser && !TryRemoteBrowser()) {
NS_WARNING("Couldn't create child process for iframe.");
return NS_ERROR_FAILURE;
}
if (mRemoteFrameChild) {
nsAutoCString spec;
mURIToLoad->GetSpec(spec);
Unused << mRemoteFrameChild->SendLoadURL(spec);
} else {
// FIXME get error codes from child
mRemoteBrowser->LoadURL(mURIToLoad);
}
// FIXME get error codes from child
mRemoteBrowser->LoadURL(mURIToLoad);
if (!mRemoteBrowserShown) {
// This can fail if it's too early to show the frame, we will retry later.
@ -798,7 +790,7 @@ bool nsFrameLoader::ShowRemoteFrame(const ScreenIntSize& size,
NS_ASSERTION(IsRemoteFrame(),
"ShowRemote only makes sense on remote frames.");
if (!mRemoteBrowser && !mRemoteFrameChild && !TryRemoteBrowser()) {
if (!mRemoteBrowser && !TryRemoteBrowser()) {
NS_ERROR("Couldn't create child process.");
return false;
}
@ -817,25 +809,12 @@ bool nsFrameLoader::ShowRemoteFrame(const ScreenIntSize& size,
return false;
}
if (mRemoteFrameChild) {
nsCOMPtr<nsISupports> container =
mOwnerContent->OwnerDoc()->GetContainer();
nsCOMPtr<nsIBaseWindow> baseWindow = do_QueryInterface(container);
nsCOMPtr<nsIWidget> mainWidget;
baseWindow->GetMainWidget(getter_AddRefs(mainWidget));
nsSizeMode sizeMode =
mainWidget ? mainWidget->SizeMode() : nsSizeMode_Normal;
Unused << mRemoteFrameChild->SendShow(
size, ParentWindowIsActive(mOwnerContent->OwnerDoc()), sizeMode);
mRemoteBrowserShown = true;
return true;
RenderFrame* rf = GetCurrentRenderFrame();
if (!rf) {
return false;
}
RenderFrame* rf =
mRemoteBrowser ? mRemoteBrowser->GetRenderFrame() : nullptr;
if (!rf || !rf->AttachLayerManager()) {
if (!rf->AttachLayerManager()) {
// This is just not going to work.
return false;
}
@ -853,11 +832,7 @@ bool nsFrameLoader::ShowRemoteFrame(const ScreenIntSize& size,
// Don't show remote iframe if we are waiting for the completion of reflow.
if (!aFrame || !(aFrame->GetStateBits() & NS_FRAME_FIRST_REFLOW)) {
if (mRemoteBrowser) {
mRemoteBrowser->UpdateDimensions(dimensions, size);
} else if (mRemoteFrameChild) {
mRemoteFrameChild->UpdateDimensions(dimensions, size);
}
mRemoteBrowser->UpdateDimensions(dimensions, size);
}
}
@ -946,11 +921,6 @@ nsresult nsFrameLoader::SwapWithOtherRemoteLoader(
return NS_ERROR_NOT_IMPLEMENTED;
}
// FIXME: Consider supporting FrameLoader swapping for remote sub frames.
if (mRemoteFrameChild) {
return NS_ERROR_NOT_IMPLEMENTED;
}
if (!mRemoteBrowser || !aOther->mRemoteBrowser) {
return NS_ERROR_NOT_IMPLEMENTED;
}
@ -1694,11 +1664,6 @@ void nsFrameLoader::DestroyDocShell() {
mRemoteBrowser->Destroy();
}
if (mRemoteFrameChild) {
Unused << mRemoteFrameChild->Send__delete__(mRemoteFrameChild);
mRemoteFrameChild = nullptr;
}
// Fire the "unload" event if we're in-process.
if (mChildMessageManager) {
mChildMessageManager->FireUnloadEvent();
@ -1740,11 +1705,6 @@ void nsFrameLoader::DestroyComplete() {
mRemoteBrowser = nullptr;
}
if (mRemoteFrameChild) {
Unused << mRemoteFrameChild->Send__delete__(mRemoteFrameChild);
mRemoteFrameChild = nullptr;
}
if (mMessageManager) {
mMessageManager->Disconnect();
}
@ -1774,6 +1734,10 @@ void nsFrameLoader::SetOwnerContent(Element* aContent) {
UpdateReflectorGlobal(jsapi.cx(), wrapper, rv);
Unused << NS_WARN_IF(rv.Failed());
}
if (RenderFrame* rfp = GetCurrentRenderFrame()) {
rfp->OwnerContentChanged(aContent);
}
}
bool nsFrameLoader::OwnerIsMozBrowserFrame() {
@ -1816,13 +1780,6 @@ bool nsFrameLoader::ShouldUseRemoteProcess() {
return false;
}
// Check if the force fission test attribute is enabled.
if (XRE_IsContentProcess() &&
Preferences::GetBool("browser.fission.oopif.attribute", false) &&
mOwnerContent->HasAttr(kNameSpaceID_None, nsGkAtoms::fission)) {
return true;
}
if (XRE_IsContentProcess() &&
!(PR_GetEnv("MOZ_NESTED_OOP_TABS") ||
Preferences::GetBool("dom.ipc.tabs.nested.enabled", false))) {
@ -1844,6 +1801,14 @@ bool nsFrameLoader::ShouldUseRemoteProcess() {
nsGkAtoms::_true, eCaseMatters);
}
bool nsFrameLoader::IsRemoteFrame() {
if (mRemoteFrame) {
MOZ_ASSERT(!mDocShell, "Found a remote frame with a DocShell");
return true;
}
return false;
}
static already_AddRefed<BrowsingContext> CreateBrowsingContext(
BrowsingContext* aParentContext, BrowsingContext* aOpenerContext,
const nsAString& aName, bool aIsContent) {
@ -2310,7 +2275,7 @@ nsresult nsFrameLoader::GetWindowDimensions(nsIntRect& aRect) {
nsresult nsFrameLoader::UpdatePositionAndSize(nsSubDocumentFrame* aIFrame) {
if (IsRemoteFrame()) {
if (mRemoteBrowser || mRemoteFrameChild) {
if (mRemoteBrowser) {
ScreenIntSize size = aIFrame->GetSubdocumentSize();
// If we were not able to show remote frame before, we should probably
// retry now to send correct showInfo.
@ -2320,11 +2285,7 @@ nsresult nsFrameLoader::UpdatePositionAndSize(nsSubDocumentFrame* aIFrame) {
nsIntRect dimensions;
NS_ENSURE_SUCCESS(GetWindowDimensions(dimensions), NS_ERROR_FAILURE);
mLazySize = size;
if (mRemoteBrowser) {
mRemoteBrowser->UpdateDimensions(dimensions, size);
} else if (mRemoteFrameChild) {
mRemoteFrameChild->UpdateDimensions(dimensions, size);
}
mRemoteBrowser->UpdateDimensions(dimensions, size);
}
return NS_OK;
}
@ -2426,7 +2387,7 @@ static Tuple<ContentParent*, TabParent*> GetContentParent(Element* aBrowser) {
}
bool nsFrameLoader::TryRemoteBrowser() {
NS_ASSERTION(!mRemoteBrowser && !mRemoteFrameChild,
NS_ASSERTION(!mRemoteBrowser,
"TryRemoteBrowser called with a remote browser already?");
if (!mOwnerContent) {
@ -2472,9 +2433,7 @@ bool nsFrameLoader::TryRemoteBrowser() {
// iframes for JS plugins also get to skip these checks. We control the URL
// that gets loaded, but the load is triggered from the document containing
// the plugin.
// out of process iframes also get to skip this check.
if (!OwnerIsMozBrowserFrame() && !IsForJSPlugin() &&
!XRE_IsContentProcess()) {
if (!OwnerIsMozBrowserFrame() && !IsForJSPlugin()) {
if (parentDocShell->ItemType() != nsIDocShellTreeItem::typeChrome) {
// Allow about:addon an exception to this rule so it can load remote
// extension options pages.
@ -2544,14 +2503,6 @@ bool nsFrameLoader::TryRemoteBrowser() {
}
nsCOMPtr<Element> ownerElement = mOwnerContent;
// If we're in a content process, create a RemoteFrameChild actor.
if (XRE_IsContentProcess()) {
mRemoteFrameChild = RemoteFrameChild::Create(
this, context, NS_LITERAL_STRING(DEFAULT_REMOTE_TYPE));
return !!mRemoteFrameChild;
}
mRemoteBrowser =
ContentParent::CreateBrowser(context, ownerElement, openerContentParent,
sameTabGroupAs, nextTabParentId);
@ -2611,24 +2562,15 @@ bool nsFrameLoader::TryRemoteBrowser() {
return true;
}
bool nsFrameLoader::IsRemoteFrame() {
if (mRemoteFrame) {
MOZ_ASSERT(!mDocShell, "Found a remote frame with a DocShell");
return true;
}
return false;
}
mozilla::dom::PBrowserParent* nsFrameLoader::GetRemoteBrowser() const {
return mRemoteBrowser;
}
mozilla::layers::LayersId nsFrameLoader::GetLayersId() const {
MOZ_ASSERT(mRemoteFrame);
RenderFrame* nsFrameLoader::GetCurrentRenderFrame() const {
if (mRemoteBrowser) {
return mRemoteBrowser->GetRenderFrame()->GetLayersId();
return mRemoteBrowser->GetRenderFrame();
}
return mRemoteFrameChild->GetLayersId();
return nullptr;
}
void nsFrameLoader::ActivateRemoteFrame(ErrorResult& aRv) {

Просмотреть файл

@ -24,7 +24,6 @@
#include "mozilla/dom/Element.h"
#include "mozilla/dom/ParentSHistory.h"
#include "mozilla/Attributes.h"
#include "mozilla/layers/LayersTypes.h"
#include "nsStubMutationObserver.h"
#include "Units.h"
#include "nsIFrame.h"
@ -59,7 +58,6 @@ class ProcessMessageManager;
class Promise;
class TabParent;
class MutableTabContext;
class RemoteFrameChild;
namespace ipc {
class StructuredCloneData;
@ -272,26 +270,23 @@ class nsFrameLoader final : public nsStubMutationObserver,
return mOwnerContent ? mOwnerContent->OwnerDoc() : nullptr;
}
/**
* Returns whether this frame is a remote frame.
*
* This is true for either a top-level remote browser in the parent process,
* or a remote subframe in the child process.
*/
bool IsRemoteFrame();
/**
* Returns the IPDL actor used if this is a top-level remote browser, or null
* otherwise.
*/
PBrowserParent* GetRemoteBrowser() const;
/**
* Returns the layers ID that this remote frame is using to render.
* The "current" render frame is the one on which the most recent
* remote layer-tree transaction was executed. If no content has
* been drawn yet, or the remote browser doesn't have any drawn
* content for whatever reason, return nullptr. The returned render
* frame has an associated shadow layer tree.
*
* This must only be called if this is a remote frame.
* Note that the returned render frame might not be a frame
* constructed for this->GetURL(). This can happen, e.g., if the
* <browser> was just navigated to a new URL, but hasn't painted the
* new page yet. A render frame for the previous page may be
* returned. (In-process <browser> behaves similarly, and this
* behavior seems desirable.)
*/
mozilla::layers::LayersId GetLayersId() const;
RenderFrame* GetCurrentRenderFrame() const;
mozilla::dom::ChromeMessageSender* GetFrameMessageManager() {
return mMessageManager;
@ -363,6 +358,11 @@ class nsFrameLoader final : public nsStubMutationObserver,
bool ShouldUseRemoteProcess();
/**
* Return true if the frame is a remote frame. Return false otherwise
*/
bool IsRemoteFrame();
bool IsForJSPlugin() { return mJSPluginID != nsFakePluginTag::NOT_JSPLUGIN; }
/**
@ -456,9 +456,6 @@ class nsFrameLoader final : public nsStubMutationObserver,
TabParent* mRemoteBrowser;
uint64_t mChildID;
// This is used when this refers to a remote sub frame
RefPtr<mozilla::dom::RemoteFrameChild> mRemoteFrameChild;
int32_t mJSPluginID;
// Holds the last known size of the frame.

Просмотреть файл

@ -19,7 +19,6 @@ include protocol PFileDescriptorSet;
include protocol PIPCBlobInputStream;
include protocol PPaymentRequest;
include protocol PWindowGlobal;
include protocol PRemoteFrame;
include DOMTypes;
include IPCBlob;
@ -143,7 +142,6 @@ nested(upto inside_cpow) sync protocol PBrowser
manages PPluginWidget;
manages PPaymentRequest;
manages PWindowGlobal;
manages PRemoteFrame;
both:
async AsyncMessage(nsString aMessage, CpowEntry[] aCpows,
@ -176,11 +174,6 @@ parent:
*/
async PWindowGlobal(WindowGlobalInit init);
/**
* Construct a new Remote iframe actor.
*/
async PRemoteFrame(nsString aPresentationURL, nsString aRemoteType);
/**
* Sends an NS_NATIVE_CHILD_OF_SHAREABLE_WINDOW to be adopted by the
* widget's shareable window on the chrome side. Only used on Windows.

Просмотреть файл

@ -1,42 +0,0 @@
/* -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 8 -*- */
/* vim: set sw=4 ts=8 et tw=80 ft=cpp : */
/* 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/. */
include protocol PBrowser;
include DOMTypes;
using ScreenIntSize from "Units.h";
using nsSizeMode from "nsIWidgetListener.h";
using mozilla::layers::LayersObserverEpoch from "mozilla/layers/LayersTypes.h";
using mozilla::layers::LayersId from "mozilla/layers/LayersTypes.h";
namespace mozilla {
namespace dom {
/**
* PRemoteFrame corresponds to a remote iframe.
*/
async protocol PRemoteFrame {
manager PBrowser;
child:
async SetLayersId(LayersId layersId);
parent:
// Destroy the remote web browser due to the nsFrameLoader going away.
async __delete__();
// DocShell messaging.
async LoadURL(nsCString aSpec);
// Out of process rendering.
async Show(ScreenIntSize size, bool parentIsActive, nsSizeMode sizeMode);
async UpdateDimensions(DimensionInfo dimensions) compressall;
async RenderLayers(bool aEnabled, bool aForceRepaint, LayersObserverEpoch aEpoch);
};
} // namespace dom
} // namespace mozilla

Просмотреть файл

@ -1,88 +0,0 @@
/* -*- 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/. */
#include "mozilla/dom/RemoteFrameChild.h"
using namespace mozilla::ipc;
namespace mozilla {
namespace dom {
RemoteFrameChild::RemoteFrameChild(nsFrameLoader* aFrameLoader)
: mLayersId{0}, mIPCOpen(true), mFrameLoader(aFrameLoader) {}
RemoteFrameChild::~RemoteFrameChild() {}
already_AddRefed<RemoteFrameChild> RemoteFrameChild::Create(
nsFrameLoader* aFrameLoader, const TabContext& aContext,
const nsString& aRemoteType) {
MOZ_ASSERT(XRE_IsContentProcess());
// Determine our embedder's TabChild actor.
RefPtr<Element> owner = aFrameLoader->GetOwnerContent();
MOZ_DIAGNOSTIC_ASSERT(owner);
nsCOMPtr<nsIDocShell> docShell = do_GetInterface(owner->GetOwnerGlobal());
MOZ_DIAGNOSTIC_ASSERT(docShell);
RefPtr<TabChild> tabChild = TabChild::GetFrom(docShell);
MOZ_DIAGNOSTIC_ASSERT(tabChild);
RefPtr<RemoteFrameChild> remoteFrame = new RemoteFrameChild(aFrameLoader);
// Reference is freed in TabChild::DeallocPRemoteFrameChild.
tabChild->SendPRemoteFrameConstructor(
do_AddRef(remoteFrame).take(),
PromiseFlatString(aContext.PresentationURL()), aRemoteType);
remoteFrame->mIPCOpen = true;
return remoteFrame.forget();
}
void RemoteFrameChild::UpdateDimensions(const nsIntRect& aRect,
const mozilla::ScreenIntSize& aSize) {
MOZ_DIAGNOSTIC_ASSERT(mIPCOpen);
RefPtr<Element> owner = mFrameLoader->GetOwnerContent();
nsCOMPtr<nsIWidget> widget = nsContentUtils::WidgetForContent(owner);
if (!widget) {
widget = nsContentUtils::WidgetForDocument(owner->OwnerDoc());
}
MOZ_DIAGNOSTIC_ASSERT(widget);
CSSToLayoutDeviceScale widgetScale = widget->GetDefaultScale();
LayoutDeviceIntRect devicePixelRect = ViewAs<LayoutDevicePixel>(
aRect, PixelCastJustification::LayoutDeviceIsScreenForTabDims);
LayoutDeviceIntSize devicePixelSize = ViewAs<LayoutDevicePixel>(
aSize, PixelCastJustification::LayoutDeviceIsScreenForTabDims);
// XXX What are clientOffset and chromeOffset used for? Are they meaningful
// for nested iframes with transforms?
LayoutDeviceIntPoint clientOffset;
LayoutDeviceIntPoint chromeOffset;
CSSRect unscaledRect = devicePixelRect / widgetScale;
CSSSize unscaledSize = devicePixelSize / widgetScale;
hal::ScreenOrientation orientation = hal::eScreenOrientation_Default;
DimensionInfo di(unscaledRect, unscaledSize, orientation, clientOffset,
chromeOffset);
Unused << SendUpdateDimensions(di);
}
IPCResult RemoteFrameChild::RecvSetLayersId(
const mozilla::layers::LayersId& aLayersId) {
MOZ_ASSERT(!mLayersId.IsValid() && aLayersId.IsValid());
mLayersId = aLayersId;
return IPC_OK();
}
void RemoteFrameChild::ActorDestroy(ActorDestroyReason aWhy) {
mIPCOpen = false;
}
} // namespace dom
} // namespace mozilla

Просмотреть файл

@ -1,57 +0,0 @@
/* -*- 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_RemoteFrameChild_h
#define mozilla_dom_RemoteFrameChild_h
#include "mozilla/dom/PRemoteFrameChild.h"
#include "mozilla/dom/TabChild.h"
namespace mozilla {
namespace dom {
/**
* Child side for a remote frame.
*/
class RemoteFrameChild : public PRemoteFrameChild {
public:
NS_INLINE_DECL_REFCOUNTING(RemoteFrameChild);
TabChild* Manager() {
MOZ_ASSERT(mIPCOpen);
return static_cast<TabChild*>(PRemoteFrameChild::Manager());
}
mozilla::layers::LayersId GetLayersId() { return mLayersId; }
static already_AddRefed<RemoteFrameChild> Create(nsFrameLoader* aFrameLoader,
const TabContext& aContext,
const nsString& aRemoteType);
void UpdateDimensions(const nsIntRect& aRect,
const mozilla::ScreenIntSize& aSize);
protected:
friend class PRemoteFrameChild;
mozilla::ipc::IPCResult RecvSetLayersId(
const mozilla::layers::LayersId& aLayersId);
void ActorDestroy(ActorDestroyReason aWhy) override;
private:
explicit RemoteFrameChild(nsFrameLoader* aFrameLoader);
~RemoteFrameChild();
mozilla::layers::LayersId mLayersId;
bool mIPCOpen;
RefPtr<nsFrameLoader> mFrameLoader;
};
} // namespace dom
} // namespace mozilla
#endif // !defined(mozilla_dom_RemoteFrameParent_h)

Просмотреть файл

@ -1,119 +0,0 @@
/* -*- 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/. */
#include "mozilla/dom/RemoteFrameParent.h"
#include "mozilla/dom/ContentParent.h"
#include "mozilla/dom/ContentProcessManager.h"
using namespace mozilla::ipc;
using namespace mozilla::layout;
namespace mozilla {
namespace dom {
RemoteFrameParent::RemoteFrameParent() : mIPCOpen(false) {}
RemoteFrameParent::~RemoteFrameParent() {}
nsresult RemoteFrameParent::Init(const nsString& aPresentationURL,
const nsString& aRemoteType) {
mIPCOpen = true;
// FIXME: This should actually use a non-bogus TabContext, probably inherited
// from our Manager().
OriginAttributes attrs;
attrs.mInIsolatedMozBrowser = false;
attrs.mAppId = nsIScriptSecurityManager::NO_APP_ID;
attrs.SyncAttributesWithPrivateBrowsing(false);
MutableTabContext tabContext;
tabContext.SetTabContext(false, 0, UIStateChangeType_Set,
UIStateChangeType_Set, attrs, aPresentationURL);
ProcessPriority initialPriority = PROCESS_PRIORITY_FOREGROUND;
// Get our ConstructorSender object.
RefPtr<nsIContentParent> constructorSender =
ContentParent::GetNewOrUsedBrowserProcess(
nullptr, aRemoteType, initialPriority, nullptr, false);
if (NS_WARN_IF(!constructorSender)) {
MOZ_ASSERT(false, "Unable to allocate content process!");
return NS_ERROR_FAILURE;
}
ContentProcessManager* cpm = ContentProcessManager::GetSingleton();
TabId tabId(nsContentUtils::GenerateTabId());
cpm->RegisterRemoteFrame(tabId, ContentParentId(0), TabId(0),
tabContext.AsIPCTabContext(),
constructorSender->ChildID());
// Construct the TabParent object for our subframe.
uint32_t chromeFlags = 0;
RefPtr<TabParent> tabParent(
new TabParent(constructorSender, tabId, tabContext, chromeFlags));
PBrowserParent* browser = constructorSender->SendPBrowserConstructor(
// DeallocPBrowserParent() releases this ref.
tabParent.forget().take(), tabId, TabId(0), tabContext.AsIPCTabContext(),
chromeFlags, constructorSender->ChildID(),
constructorSender->IsForBrowser());
if (NS_WARN_IF(!browser)) {
MOZ_ASSERT(false, "Browser Constructor Failed");
return NS_ERROR_FAILURE;
}
// Set our TabParent object to the newly created browser.
mTabParent = TabParent::GetFrom(browser);
mTabParent->SetOwnerElement(Manager()->GetOwnerElement());
mTabParent->InitRendering();
RenderFrame* rf = mTabParent->GetRenderFrame();
if (NS_WARN_IF(!rf)) {
MOZ_ASSERT(false, "No RenderFrame");
return NS_ERROR_FAILURE;
}
// Send the newly created layers ID back into content.
Unused << SendSetLayersId(rf->GetLayersId());
return NS_OK;
}
IPCResult RemoteFrameParent::RecvShow(const ScreenIntSize& aSize,
const bool& aParentIsActive,
const nsSizeMode& aSizeMode) {
RenderFrame* rf = mTabParent->GetRenderFrame();
if (!rf->AttachLayerManager()) {
MOZ_CRASH();
}
Unused << mTabParent->SendShow(aSize, mTabParent->GetShowInfo(),
aParentIsActive, aSizeMode);
return IPC_OK();
}
IPCResult RemoteFrameParent::RecvLoadURL(const nsCString& aUrl) {
Unused << mTabParent->SendLoadURL(aUrl, mTabParent->GetShowInfo());
return IPC_OK();
}
IPCResult RemoteFrameParent::RecvUpdateDimensions(
const DimensionInfo& aDimensions) {
Unused << mTabParent->SendUpdateDimensions(aDimensions);
return IPC_OK();
}
IPCResult RemoteFrameParent::RecvRenderLayers(
const bool& aEnabled, const bool& aForceRepaint,
const layers::LayersObserverEpoch& aEpoch) {
Unused << mTabParent->SendRenderLayers(aEnabled, aForceRepaint, aEpoch);
return IPC_OK();
}
void RemoteFrameParent::ActorDestroy(ActorDestroyReason aWhy) {
mIPCOpen = false;
}
} // namespace dom
} // namespace mozilla

Просмотреть файл

@ -1,58 +0,0 @@
/* -*- 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_RemoteFrameParent_h
#define mozilla_dom_RemoteFrameParent_h
#include "mozilla/dom/PRemoteFrameParent.h"
#include "mozilla/dom/TabParent.h"
namespace mozilla {
namespace dom {
class RemoteFrameParent : public PRemoteFrameParent {
public:
NS_INLINE_DECL_REFCOUNTING(RemoteFrameParent);
RemoteFrameParent();
// Initialize this actor after performing startup.
nsresult Init(const nsString& aPresentationURL, const nsString& aRemoteType);
TabParent* GetTabParent() { return mTabParent; }
// Get our manager actor.
TabParent* Manager() {
MOZ_ASSERT(mIPCOpen);
return static_cast<TabParent*>(PRemoteFrameParent::Manager());
}
protected:
friend class PRemoteFrameParent;
mozilla::ipc::IPCResult RecvShow(const ScreenIntSize& aSize,
const bool& aParentIsActive,
const nsSizeMode& aSizeMode);
mozilla::ipc::IPCResult RecvLoadURL(const nsCString& aUrl);
mozilla::ipc::IPCResult RecvUpdateDimensions(
const DimensionInfo& aDimensions);
mozilla::ipc::IPCResult RecvRenderLayers(const bool& aEnabled,
const bool& aForceRepaint,
const LayersObserverEpoch& aEpoch);
void ActorDestroy(ActorDestroyReason aWhy) override;
private:
~RemoteFrameParent();
RefPtr<TabParent> mTabParent;
bool mIPCOpen;
};
} // namespace dom
} // namespace mozilla
#endif // !defined(mozilla_dom_RemoteFrameParent_h)

Просмотреть файл

@ -30,7 +30,6 @@
#include "mozilla/dom/PaymentRequestChild.h"
#include "mozilla/dom/PBrowser.h"
#include "mozilla/dom/WindowProxyHolder.h"
#include "mozilla/dom/RemoteFrameChild.h"
#include "mozilla/gfx/CrossProcessPaint.h"
#include "mozilla/IMEStateManager.h"
#include "mozilla/ipc/URIUtils.h"
@ -3180,18 +3179,6 @@ bool TabChild::DeallocPWindowGlobalChild(PWindowGlobalChild* aActor) {
return true;
}
PRemoteFrameChild* TabChild::AllocPRemoteFrameChild(const nsString&,
const nsString&) {
MOZ_CRASH("We should never be manually allocating PRemoteFrameChild actors");
return nullptr;
}
bool TabChild::DeallocPRemoteFrameChild(PRemoteFrameChild* aActor) {
// This reference was added in RemoteFrameChild::Create.
static_cast<RemoteFrameChild*>(aActor)->Release();
return true;
}
ScreenIntSize TabChild::GetInnerSize() {
LayoutDeviceIntSize innerSize =
RoundedToInt(mUnscaledInnerSize * mPuppetWidget->GetDefaultScale());

Просмотреть файл

@ -670,11 +670,6 @@ class TabChild final : public TabChildBase,
virtual bool DeallocPWindowGlobalChild(PWindowGlobalChild* aActor) override;
virtual PRemoteFrameChild* AllocPRemoteFrameChild(
const nsString& aName, const nsString& aRemoteType) override;
virtual bool DeallocPRemoteFrameChild(PRemoteFrameChild* aActor) override;
virtual mozilla::ipc::IPCResult RecvDestroy() override;
virtual mozilla::ipc::IPCResult RecvSetDocShellIsActive(

Просмотреть файл

@ -22,7 +22,6 @@
#include "mozilla/dom/indexedDB/ActorsParent.h"
#include "mozilla/dom/IPCBlobUtils.h"
#include "mozilla/dom/PaymentRequestParent.h"
#include "mozilla/dom/RemoteFrameParent.h"
#include "mozilla/EventStateManager.h"
#include "mozilla/gfx/2D.h"
#include "mozilla/gfx/DataSurfaceHelpers.h"
@ -304,10 +303,6 @@ void TabParent::SetOwnerElement(Element* aElement) {
Unused << SendSetWidgetNativeData(widgetNativeData);
}
}
if (mRenderFrame.IsInitialized()) {
mRenderFrame.OwnerContentChanged();
}
}
NS_IMETHODIMP TabParent::GetOwnerElement(Element** aElement) {
@ -621,8 +616,16 @@ void TabParent::LoadURL(nsIURI* aURI) {
}
void TabParent::InitRendering() {
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
MOZ_ASSERT(!mRenderFrame.IsInitialized());
mRenderFrame.Initialize(this);
MOZ_ASSERT(frameLoader);
if (!frameLoader) {
return;
}
mRenderFrame.Initialize(frameLoader);
MOZ_ASSERT(mRenderFrame.IsInitialized());
layers::LayersId layersId = mRenderFrame.GetLayersId();
@ -1012,25 +1015,6 @@ bool TabParent::DeallocPWindowGlobalParent(PWindowGlobalParent* aActor) {
return true;
}
IPCResult TabParent::RecvPRemoteFrameConstructor(PRemoteFrameParent* aActor,
const nsString& aName,
const nsString& aRemoteType) {
static_cast<RemoteFrameParent*>(aActor)->Init(aName, aRemoteType);
return IPC_OK();
}
PRemoteFrameParent* TabParent::AllocPRemoteFrameParent(
const nsString& aName, const nsString& aRemoteType) {
// Reference freed in DeallocPRemoteFrameParent.
return do_AddRef(new RemoteFrameParent()).take();
}
bool TabParent::DeallocPRemoteFrameParent(PRemoteFrameParent* aActor) {
// Free reference from AllocPRemoteFrameParent.
static_cast<RemoteFrameParent*>(aActor)->Release();
return true;
}
void TabParent::SendMouseEvent(const nsAString& aType, float aX, float aY,
int32_t aButton, int32_t aClickCount,
int32_t aModifiers,

Просмотреть файл

@ -316,15 +316,6 @@ class TabParent final : public PBrowserParent,
virtual mozilla::ipc::IPCResult RecvPWindowGlobalConstructor(
PWindowGlobalParent* aActor, const WindowGlobalInit& aInit) override;
PRemoteFrameParent* AllocPRemoteFrameParent(const nsString& aPresentationURL,
const nsString& aRemoteType);
bool DeallocPRemoteFrameParent(PRemoteFrameParent* aActor);
virtual mozilla::ipc::IPCResult RecvPRemoteFrameConstructor(
PRemoteFrameParent* aActor, const nsString& aPresentationURL,
const nsString& aRemoteType) override;
void LoadURL(nsIURI* aURI);
void InitRendering();
@ -558,8 +549,6 @@ class TabParent final : public PBrowserParent,
void NavigateByKey(bool aForward, bool aForDocumentNavigation);
ShowInfo GetShowInfo();
protected:
bool ReceiveMessage(
const nsString& aMessage, bool aSync, ipc::StructuredCloneData* aData,
@ -728,6 +717,8 @@ class TabParent final : public PBrowserParent,
int32_t mActiveSupressDisplayportCount;
#endif
ShowInfo GetShowInfo();
private:
// This is used when APZ needs to find the TabParent associated with a layer
// to dispatch events.

Просмотреть файл

@ -47,8 +47,6 @@ EXPORTS.mozilla.dom += [
'nsIContentChild.h',
'nsIContentParent.h',
'PermissionMessageUtils.h',
'RemoteFrameChild.h',
'RemoteFrameParent.h',
'TabChild.h',
'TabContext.h',
'TabMessageUtils.h',
@ -88,8 +86,6 @@ UNIFIED_SOURCES += [
'PermissionMessageUtils.cpp',
'PreallocatedProcessManager.cpp',
'ProcessPriorityManager.cpp',
'RemoteFrameChild.cpp',
'RemoteFrameParent.cpp',
'SharedMap.cpp',
'SharedStringMap.cpp',
'StructuredCloneData.cpp',
@ -124,7 +120,6 @@ IPDL_SOURCES += [
'PPluginWidget.ipdl',
'PProcessHangMonitor.ipdl',
'PrefsTypes.ipdlh',
'PRemoteFrame.ipdl',
'PTabContext.ipdlh',
'PURLClassifier.ipdl',
'PURLClassifierInfo.ipdlh',

Просмотреть файл

@ -20,7 +20,6 @@
#include "mozilla/jsipc/CrossProcessObjectWrappers.h"
#include "mozilla/ipc/FileDescriptorSetParent.h"
#include "mozilla/ipc/PFileDescriptorSetParent.h"
#include "mozilla/ipc/PIPCBlobInputStreamParent.h"
#include "mozilla/ipc/IPCStreamAlloc.h"
#include "mozilla/ipc/IPCStreamDestination.h"
#include "mozilla/ipc/IPCStreamSource.h"
@ -31,7 +30,6 @@
#include "nsPrintfCString.h"
#include "xpcpublic.h"
using namespace mozilla::ipc;
using namespace mozilla::jsipc;
// XXX need another bug to move this to a common header.

Просмотреть файл

@ -1 +0,0 @@
<h1>This is a dummy file!</h1>

Просмотреть файл

@ -23,7 +23,3 @@ support-files =
!/dom/canvas/test/captureStream_common.js
[test_Preallocated.html]
skip-if = !e10s
[test_force_oop_iframe.html]
skip-if = !e10s || webrender # oop-iframes trigger a debug assertion in webrender picture caching
support-files =
file_dummy.html

Просмотреть файл

@ -1,55 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/AddTask.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/ChromeTask.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<script type="application/javascript">
"use strict";
/* eslint-env mozilla/frame-script */
add_task(async function() {
await SpecialPowers.pushPrefEnv({"set": [["browser.fission.oopif.attribute", true]]});
// This iframe should be loaded out of process. Unfortunately as of the time
// of this test's creation, many different events which we could use to detect
// this load have not been implemented yet.
let contentCreated = ChromeTask.spawn(null, async function() {
let wgp = await new Promise(resolve => {
function observer(parent) {
info("WGP with origin: " + parent.documentPrincipal.origin);
if (parent.documentPrincipal.origin !== "http://mochi.test:8888") {
return;
}
Services.obs.removeObserver(observer, "window-global-created");
resolve(parent);
}
Services.obs.addObserver(observer, "window-global-created");
});
is(wgp.isInProcess, false, "not in-process");
ok(wgp.rootFrameLoader, "Has frameloader");
ok(wgp.documentPrincipal, "Has document principal");
});
var iframe = document.createElement("iframe");
iframe.setAttribute("fission", "true");
iframe.setAttribute("src", "file_dummy.html");
document.body.appendChild(iframe);
// Check that this isn't loaded in-process, or using a nested tabParent object.
let frameLoader = SpecialPowers.wrap(iframe).frameLoader;
is(frameLoader.docShell, null);
is(frameLoader.tabParent, null);
await contentCreated;
});
</script>
</body>
</html>

Просмотреть файл

@ -4,7 +4,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
using mozilla::TimeStamp from "mozilla/TimeStamp.h";
using mozilla::gfx::OpenVRControllerType from "VRMessageUtils.h";
using mozilla::gfx::OpenVRControllerType from "gfxVR.h";
using mozilla::dom::NativeThreadId from "mozilla/dom/TabMessageUtils.h";
include GraphicsMessages;

Просмотреть файл

@ -301,7 +301,10 @@ void nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
if (!IsVisibleForPainting()) return;
nsFrameLoader* frameLoader = FrameLoader();
bool isRemoteFrame = frameLoader && frameLoader->IsRemoteFrame();
RenderFrame* rf = nullptr;
if (frameLoader) {
rf = frameLoader->GetCurrentRenderFrame();
}
// If we are pointer-events:none then we don't need to HitTest background
bool pointerEventsNone =
@ -309,7 +312,7 @@ void nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
if (!aBuilder->IsForEventDelivery() || !pointerEventsNone) {
nsDisplayListCollection decorations(aBuilder);
DisplayBorderBackgroundOutline(aBuilder, decorations);
if (isRemoteFrame) {
if (rf) {
// 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
@ -332,7 +335,7 @@ void nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
return;
}
if (isRemoteFrame) {
if (rf) {
// We're the subdoc for <browser remote="true"> and it has
// painted content. Display its shadow layer tree.
DisplayListClipState::AutoSaveRestore clipState(aBuilder);
@ -995,6 +998,10 @@ nsFrameLoader* nsSubDocumentFrame::FrameLoader() const {
return mFrameLoader;
}
mozilla::layout::RenderFrame* nsSubDocumentFrame::GetRenderFrame() const {
return FrameLoader() ? FrameLoader()->GetCurrentRenderFrame() : nullptr;
}
// XXX this should be called ObtainDocShell or something like that,
// to indicate that it could have side effects
nsIDocShell* nsSubDocumentFrame::GetDocShell() {

Просмотреть файл

@ -118,7 +118,7 @@ class nsSubDocumentFrame final : public nsAtomicContainerFrame,
}
}
nsFrameLoader* FrameLoader() const;
mozilla::layout::RenderFrame* GetRenderFrame() const;
protected:
friend class AsyncFrameInit;
@ -126,6 +126,8 @@ class nsSubDocumentFrame final : public nsAtomicContainerFrame,
// Helper method to look up the HTML marginwidth & marginheight attributes.
mozilla::CSSIntSize GetMarginAttributes();
nsFrameLoader* FrameLoader() const;
bool IsInline() { return mIsInline; }
nscoord GetIntrinsicISize();

Просмотреть файл

@ -8,7 +8,6 @@
#include "mozilla/dom/ContentParent.h"
#include "mozilla/dom/TabParent.h"
#include "mozilla/dom/RemoteFrameChild.h"
#include "mozilla/layers/CompositorBridgeParent.h"
#include "mozilla/layers/CompositorTypes.h"
#include "mozilla/layers/LayerTransactionParent.h"
@ -29,32 +28,43 @@ using namespace mozilla::layers;
namespace mozilla {
namespace layout {
static already_AddRefed<LayerManager> GetLayerManager(TabParent* aTabParent) {
if (Element* element = aTabParent->GetOwnerElement()) {
return nsContentUtils::LayerManagerForContent(element);
static already_AddRefed<LayerManager> GetLayerManager(
nsFrameLoader* aFrameLoader) {
if (nsIContent* content = aFrameLoader->GetOwnerContent()) {
RefPtr<LayerManager> lm = nsContentUtils::LayerManagerForContent(content);
if (lm) {
return lm.forget();
}
}
return nullptr;
Document* doc = aFrameLoader->GetOwnerDoc();
if (!doc) {
return nullptr;
}
return nsContentUtils::LayerManagerForDocument(doc);
}
RenderFrame::RenderFrame()
: mLayersId{0},
mTabParent(nullptr),
mFrameLoader(nullptr),
mLayerManager(nullptr),
mInitialized(false),
mLayersConnected(false) {}
RenderFrame::~RenderFrame() {}
bool RenderFrame::Initialize(TabParent* aTabParent) {
if (mInitialized || !aTabParent) {
bool RenderFrame::Initialize(nsFrameLoader* aFrameLoader) {
if (mInitialized || !aFrameLoader) {
return false;
}
mTabParent = aTabParent;
RefPtr<LayerManager> lm = GetLayerManager(mTabParent);
mFrameLoader = aFrameLoader;
RefPtr<LayerManager> lm = GetLayerManager(mFrameLoader);
PCompositorBridgeChild* compositor =
lm ? lm->GetCompositorBridgeChild() : nullptr;
mTabProcessId = mTabParent->Manager()->AsContentParent()->OtherPid();
TabParent* browser = TabParent::GetFrom(aFrameLoader);
mTabProcessId = browser->Manager()->AsContentParent()->OtherPid();
// Our remote frame will push layers updates to the compositor,
// and we'll keep an indirect reference to that tree.
@ -71,12 +81,12 @@ void RenderFrame::Destroy() {
GPUProcessManager::Get()->UnmapLayerTreeId(mLayersId, mTabProcessId);
}
mTabParent = nullptr;
mFrameLoader = nullptr;
mLayerManager = nullptr;
}
void RenderFrame::EnsureLayersConnected(CompositorOptions* aCompositorOptions) {
RefPtr<LayerManager> lm = GetLayerManager(mTabParent);
RefPtr<LayerManager> lm = GetLayerManager(mFrameLoader);
if (!lm) {
return;
}
@ -92,8 +102,8 @@ void RenderFrame::EnsureLayersConnected(CompositorOptions* aCompositorOptions) {
LayerManager* RenderFrame::AttachLayerManager() {
RefPtr<LayerManager> lm;
if (mTabParent) {
lm = GetLayerManager(mTabParent);
if (mFrameLoader) {
lm = GetLayerManager(mFrameLoader);
}
// Perhaps the document containing this frame currently has no presentation?
@ -107,11 +117,17 @@ LayerManager* RenderFrame::AttachLayerManager() {
return mLayerManager;
}
void RenderFrame::OwnerContentChanged() { Unused << AttachLayerManager(); }
void RenderFrame::OwnerContentChanged(nsIContent* aContent) {
MOZ_ASSERT(!mFrameLoader || mFrameLoader->GetOwnerContent() == aContent,
"Don't build new map if owner is same!");
Unused << AttachLayerManager();
}
void RenderFrame::GetTextureFactoryIdentifier(
TextureFactoryIdentifier* aTextureFactoryIdentifier) const {
RefPtr<LayerManager> lm = mTabParent ? GetLayerManager(mTabParent) : nullptr;
RefPtr<LayerManager> lm =
mFrameLoader ? GetLayerManager(mFrameLoader) : nullptr;
// Perhaps the document containing this frame currently has no presentation?
if (lm) {
*aTextureFactoryIdentifier = lm->GetTextureFactoryIdentifier();
@ -169,10 +185,10 @@ nsDisplayRemote::nsDisplayRemote(nsDisplayListBuilder* aBuilder,
mEventRegionsOverride |= EventRegionsOverride::ForceDispatchToContent;
}
if (nsFrameLoader* frameLoader = GetFrameLoader()) {
// TODO: We need to handle acquiring a TabId in the remote sub-frame case
// for fission.
if (TabParent* browser = TabParent::GetFrom(frameLoader)) {
nsFrameLoader* frameLoader = GetRenderFrame()->GetFrameLoader();
if (frameLoader) {
TabParent* browser = TabParent::GetFrom(frameLoader);
if (browser) {
mTabId = browser->GetTabId();
}
}
@ -189,12 +205,13 @@ mozilla::LayerState nsDisplayRemote::GetLayerState(
bool nsDisplayRemote::HasDeletedFrame() const {
// RenderFrame might change without invalidating nsSubDocumentFrame.
return !GetFrameLoader() || nsDisplayItem::HasDeletedFrame();
return !GetRenderFrame() || nsDisplayItem::HasDeletedFrame();
}
already_AddRefed<Layer> nsDisplayRemote::BuildLayer(
nsDisplayListBuilder* aBuilder, LayerManager* aManager,
const ContainerLayerParameters& aContainerParameters) {
MOZ_ASSERT(GetRenderFrame());
MOZ_ASSERT(mFrame, "Makes no sense to have a shadow tree without a frame");
if (IsTempLayerManager(aManager)) {
@ -210,7 +227,7 @@ already_AddRefed<Layer> nsDisplayRemote::BuildLayer(
return nullptr;
}
LayersId remoteId = GetRemoteLayersId();
LayersId remoteId = GetRenderFrame()->GetLayersId();
if (!remoteId.IsValid()) {
return nullptr;
@ -295,12 +312,11 @@ bool nsDisplayRemote::UpdateScrollData(
}
LayersId nsDisplayRemote::GetRemoteLayersId() const {
nsFrameLoader* frameLoader = GetFrameLoader();
MOZ_ASSERT(frameLoader && frameLoader->IsRemoteFrame());
return frameLoader->GetLayersId();
MOZ_ASSERT(GetRenderFrame());
return GetRenderFrame()->GetLayersId();
}
nsFrameLoader* nsDisplayRemote::GetFrameLoader() const {
return mFrame ? static_cast<nsSubDocumentFrame*>(mFrame)->FrameLoader()
mozilla::layout::RenderFrame* nsDisplayRemote::GetRenderFrame() const {
return mFrame ? static_cast<nsSubDocumentFrame*>(mFrame)->GetRenderFrame()
: nullptr;
}

Просмотреть файл

@ -21,20 +21,12 @@ class nsSubDocumentFrame;
namespace mozilla {
namespace dom {
class TabParent;
} // namespace dom
namespace layers {
struct TextureFactoryIdentifier;
} // namespace layers
namespace layout {
/**
* RenderFrame connects and manages layer trees for remote frames. It is
* directly owned by a TabParent and always lives in the parent process.
*/
class RenderFrame final {
typedef mozilla::layers::CompositorOptions CompositorOptions;
typedef mozilla::layers::LayerManager LayerManager;
@ -45,13 +37,14 @@ class RenderFrame final {
RenderFrame();
virtual ~RenderFrame();
bool Initialize(dom::TabParent* aTabParent);
bool Initialize(nsFrameLoader* aFrameLoader);
void Destroy();
void EnsureLayersConnected(CompositorOptions* aCompositorOptions);
LayerManager* AttachLayerManager();
void OwnerContentChanged();
void OwnerContentChanged(nsIContent* aContent);
nsFrameLoader* GetFrameLoader() const { return mFrameLoader; }
LayersId GetLayersId() const { return mLayersId; }
CompositorOptions GetCompositorOptions() const { return mCompositorOptions; }
@ -62,17 +55,17 @@ class RenderFrame final {
bool IsLayersConnected() const { return mLayersConnected; }
private:
// The process id of the remote frame. This is used by the compositor to
// do security checks on incoming layer transactions.
base::ProcessId mTabProcessId;
// The layers id of the remote frame.
// When our child frame is pushing transactions directly to the
// compositor, this is the ID of its layer tree in the compositor's
// context.
LayersId mLayersId;
// The compositor options for this layers id. This is only meaningful if
// the compositor actually knows about this layers id (i.e. when
// mLayersConnected is true).
CompositorOptions mCompositorOptions;
dom::TabParent* mTabParent;
RefPtr<nsFrameLoader> mFrameLoader;
RefPtr<LayerManager> mLayerManager;
bool mInitialized;
@ -86,8 +79,9 @@ class RenderFrame final {
} // namespace mozilla
/**
* A nsDisplayRemote will graft a remote frame's shadow layer tree (for a given
* nsFrameLoader) into its parent frame's layer tree.
* A DisplayRemote exists solely to graft a child process's shadow
* layer tree (for a given RenderFrame) into its parent
* process's layer tree.
*/
class nsDisplayRemote final : public nsDisplayItem {
typedef mozilla::dom::TabId TabId;
@ -129,7 +123,7 @@ class nsDisplayRemote final : public nsDisplayItem {
private:
LayersId GetRemoteLayersId() const;
nsFrameLoader* GetFrameLoader() const;
RenderFrame* GetRenderFrame() const;
TabId mTabId;
LayoutDeviceIntPoint mOffset;

Просмотреть файл

@ -2682,7 +2682,7 @@ pref("csp.overrule_about_uris_without_csp_whitelist", false);
pref("csp.skip_about_page_has_csp_assert", false);
// assertion flag will be set to false after fixing Bug 1473549
pref("security.allow_eval_with_system_principal", false);
pref("security.uris_using_eval_with_system_principal", "autocomplete.xml,redux.js,react-redux.js,content-task.js,content-task.js,tree.xml,dialog.xml,preferencesbindings.js,wizard.xml,lodash.js,jszip.js,ajv-4.1.1.js,updates.js,setup,jsol.js,parent_utils.js,chrometask_chromescript");
pref("security.uris_using_eval_with_system_principal", "autocomplete.xml,redux.js,react-redux.js,content-task.js,content-task.js,tree.xml,dialog.xml,preferencesbindings.js,wizard.xml,lodash.js,jszip.js,ajv-4.1.1.js,updates.js,setup,jsol.js,parent_utils.js");
#endif
// Default Content Security Policy to apply to signed contents.

Просмотреть файл

@ -1,179 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80 filetype=javascript: */
/* 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/. */
"use strict";
function ChromeTask_ChromeScript() {
"use strict";
const {Task} = ChromeUtils.import("resource://testing-common/Task.jsm");
const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
const AssertCls = ChromeUtils.import("resource://testing-common/Assert.jsm", null).Assert;
addMessageListener("chrome-task:spawn", function(aData) {
let id = aData.id;
let source = aData.runnable || "()=>{}";
function getStack(aStack) {
let frames = [];
for (let frame = aStack; frame; frame = frame.caller) {
frames.push(frame.filename + ":" + frame.name + ":" + frame.lineNumber);
}
return frames.join("\n");
}
/* eslint-disable no-unused-vars */
var Assert = new AssertCls((err, message, stack) => {
sendAsyncMessage("chrome-task:test-result", {
id,
condition: !err,
name: err ? err.message : message,
stack: getStack(err ? err.stack : stack),
});
});
var ok = Assert.ok.bind(Assert);
var is = Assert.equal.bind(Assert);
var isnot = Assert.notEqual.bind(Assert);
function todo(expr, name) {
sendAsyncMessage("chrome-task:test-todo", {id, expr, name});
}
function todo_is(a, b, name) {
sendAsyncMessage("chrome-task:test-todo_is", {id, a, b, name});
}
function info(name) {
sendAsyncMessage("chrome-task:test-info", {id, name});
}
/* eslint-enable no-unused-vars */
try {
let runnablestr = `
(() => {
return (${source});
})();`;
// eslint-disable-next-line no-eval
let runnable = eval(runnablestr);
let iterator = runnable.call(this, aData.arg);
Task.spawn(iterator).then((val) => {
sendAsyncMessage("chrome-task:complete", {
id,
result: val,
});
}, (e) => {
sendAsyncMessage("chrome-task:complete", {
id,
error: e.toString(),
});
});
} catch (e) {
sendAsyncMessage("chrome-task:complete", {
id,
error: e.toString(),
});
}
});
}
/**
* This object provides the public module functions.
*/
var ChromeTask = {
/**
* the ChromeScript if it has already been loaded.
*/
_chromeScript: null,
/**
* Mapping from message id to associated promise.
*/
_promises: new Map(),
/**
* Incrementing integer to generate unique message id.
*/
_messageID: 1,
/**
* Creates and starts a new task in the chrome process.
*
* @param arg A single serializable argument that will be passed to the
* task when executed on the content process.
* @param task
* - A generator or function which will be serialized and sent to
* the remote browser to be executed. Unlike Task.spawn, this
* argument may not be an iterator as it will be serialized and
* sent to the remote browser.
* @return A promise object where you can register completion callbacks to be
* called when the task terminates.
* @resolves With the final returned value of the task if it executes
* successfully.
* @rejects An error message if execution fails.
*/
spawn: function ChromeTask_spawn(arg, task) {
// Load the frame script if needed.
let handle = ChromeTask._chromeScript;
if (!handle) {
handle = SpecialPowers.loadChromeScript(ChromeTask_ChromeScript);
handle.addMessageListener("chrome-task:complete", ChromeTask.onComplete);
handle.addMessageListener("chrome-task:test-result", ChromeTask.onResult);
handle.addMessageListener("chrome-task:test-info", ChromeTask.onInfo);
handle.addMessageListener("chrome-task:test-todo", ChromeTask.onTodo);
handle.addMessageListener("chrome-task:test-todo_is", ChromeTask.onTodoIs);
ChromeTask._chromeScript = handle;
}
let deferred = {};
deferred.promise = new Promise((resolve, reject) => {
deferred.resolve = resolve;
deferred.reject = reject;
});
let id = ChromeTask._messageID++;
ChromeTask._promises.set(id, deferred);
handle.sendAsyncMessage(
"chrome-task:spawn",
{
id,
runnable: task.toString(),
arg,
});
return deferred.promise;
},
onComplete(aData) {
let deferred = ChromeTask._promises.get(aData.id);
ChromeTask._promises.delete(aData.id);
if (aData.error) {
deferred.reject(aData.error);
} else {
deferred.resolve(aData.result);
}
},
onResult(aData) {
SimpleTest.record(aData.condition, aData.name);
},
onInfo(aData) {
SimpleTest.info(aData.name);
},
onTodo(aData) {
SimpleTest.todo(aData.expr, aData.name);
},
onTodoIs(aData) {
SimpleTest.todo_is(aData.a, aData.b, aData.name);
},
};

Просмотреть файл

@ -8,7 +8,6 @@ TEST_HARNESS_FILES.testing.mochitest.tests.SimpleTest += [
'/docshell/test/chrome/docshell_helpers.js',
'/testing/specialpowers/content/MozillaLogger.js',
'AddTask.js',
'ChromeTask.js',
'EventUtils.js',
'ExtensionTestUtils.js',
'iframe-between-tests.html',

Просмотреть файл

@ -424,7 +424,6 @@ STATIC_ATOMS = [
Atom("figure", "figure"),
Atom("findbar", "findbar"),
Atom("fixed", "fixed"),
Atom("fission", "fission"),
Atom("flags", "flags"),
Atom("flex", "flex"),
Atom("flip", "flip"),