--- a/dom/base/nsFrameLoader.cpp
+++ b/dom/base/nsFrameLoader.cpp
@@ -1190,30 +1190,16 @@ nsFrameLoader::SwapWithOtherLoader(nsFra
ourContent->HasAttr(kNameSpaceID_None, nsGkAtoms::srcdoc);
bool otherHasSrcdoc = otherContent->IsHTMLElement(nsGkAtoms::iframe) &&
otherContent->HasAttr(kNameSpaceID_None, nsGkAtoms::srcdoc);
if (ourHasSrcdoc || otherHasSrcdoc) {
// Ignore this case entirely for now, since we support XUL <-> HTML swapping
return NS_ERROR_NOT_IMPLEMENTED;
}
- bool ourPassPointerEvents =
- ourContent->AttrValueIs(kNameSpaceID_None,
- nsGkAtoms::mozpasspointerevents,
- nsGkAtoms::_true,
- eCaseMatters);
- bool otherPassPointerEvents =
- otherContent->AttrValueIs(kNameSpaceID_None,
- nsGkAtoms::mozpasspointerevents,
- nsGkAtoms::_true,
- eCaseMatters);
- if (ourPassPointerEvents != otherPassPointerEvents) {
- return NS_ERROR_NOT_IMPLEMENTED;
- }
-
bool ourFullscreenAllowed =
ourContent->IsXULElement() ||
(OwnerIsMozBrowserOrAppFrame() &&
(ourContent->HasAttr(kNameSpaceID_None, nsGkAtoms::allowfullscreen) ||
ourContent->HasAttr(kNameSpaceID_None, nsGkAtoms::mozallowfullscreen)));
bool otherFullscreenAllowed =
otherContent->IsXULElement() ||
(aOther->OwnerIsMozBrowserOrAppFrame() &&
@@ -2657,23 +2643,16 @@ nsFrameLoader::TryRemoteBrowser()
nsCOMPtr<nsIDOMChromeWindow> rootChromeWin = do_QueryInterface(rootWin);
if (rootChromeWin) {
nsCOMPtr<nsIBrowserDOMWindow> browserDOMWin;
rootChromeWin->GetBrowserDOMWindow(getter_AddRefs(browserDOMWin));
mRemoteBrowser->SetBrowserDOMWindow(browserDOMWin);
}
- if (mOwnerContent->AttrValueIs(kNameSpaceID_None,
- nsGkAtoms::mozpasspointerevents,
- nsGkAtoms::_true,
- eCaseMatters)) {
- Unused << mRemoteBrowser->SendSetUpdateHitRegion(true);
- }
-
ReallyLoadFrameScripts();
InitializeBrowserAPI();
return true;
}
mozilla::dom::PBrowserParent*
nsFrameLoader::GetRemoteBrowser() const
@@ -2703,30 +2682,16 @@ NS_IMETHODIMP
nsFrameLoader::DeactivateRemoteFrame() {
if (mRemoteBrowser) {
mRemoteBrowser->Deactivate();
return NS_OK;
}
return NS_ERROR_UNEXPECTED;
}
-void
-nsFrameLoader::ActivateUpdateHitRegion() {
- if (mRemoteBrowser) {
- Unused << mRemoteBrowser->SendSetUpdateHitRegion(true);
- }
-}
-
-void
-nsFrameLoader::DeactivateUpdateHitRegion() {
- if (mRemoteBrowser) {
- Unused << mRemoteBrowser->SendSetUpdateHitRegion(false);
- }
-}
-
NS_IMETHODIMP
nsFrameLoader::SendCrossProcessMouseEvent(const nsAString& aType,
float aX,
float aY,
int32_t aButton,
int32_t aClickCount,
int32_t aModifiers,
bool aIgnoreRootScrollFrame)
--- a/dom/base/nsFrameLoader.h
+++ b/dom/base/nsFrameLoader.h
@@ -213,19 +213,16 @@ public:
* Applies a new set of sandbox flags. These are merged with the sandbox
* flags from our owning content's owning document with a logical OR, this
* ensures that we can only add restrictions and never remove them.
*/
void ApplySandboxFlags(uint32_t sandboxFlags);
void GetURL(nsString& aURL);
- void ActivateUpdateHitRegion();
- void DeactivateUpdateHitRegion();
-
// Properly retrieves documentSize of any subdocument type.
nsresult GetWindowDimensions(nsIntRect& aRect);
virtual nsIMessageSender* GetProcessMessageManager() const override;
// public because a callback needs these.
RefPtr<nsFrameMessageManager> mMessageManager;
nsCOMPtr<nsIInProcessContentFrameMessageManager> mChildMessageManager;
--- a/dom/base/nsGkAtomList.h
+++ b/dom/base/nsGkAtomList.h
@@ -623,17 +623,16 @@ GK_ATOM(mousedown, "mousedown")
GK_ATOM(mousemove, "mousemove")
GK_ATOM(mouseout, "mouseout")
GK_ATOM(mouseover, "mouseover")
GK_ATOM(mousethrough, "mousethrough")
GK_ATOM(mouseup, "mouseup")
GK_ATOM(mozaudiochannel, "mozaudiochannel")
GK_ATOM(mozfullscreenchange, "mozfullscreenchange")
GK_ATOM(mozfullscreenerror, "mozfullscreenerror")
-GK_ATOM(mozpasspointerevents, "mozpasspointerevents")
GK_ATOM(mozpointerlockchange, "mozpointerlockchange")
GK_ATOM(mozpointerlockerror, "mozpointerlockerror")
GK_ATOM(mozprivatebrowsing, "mozprivatebrowsing")
GK_ATOM(moz_opaque, "moz-opaque")
GK_ATOM(moz_action_hint, "mozactionhint")
GK_ATOM(x_moz_errormessage, "x-moz-errormessage")
GK_ATOM(msthemecompatible, "msthemecompatible")
GK_ATOM(multicol, "multicol")
--- a/dom/ipc/PBrowser.ipdl
+++ b/dom/ipc/PBrowser.ipdl
@@ -741,23 +741,16 @@ child:
/**
* Sent by the chrome process when it no longer wants this remote
* <browser>. The child side cleans up in response, then
* finalizing its death by sending back __delete__() to the
* parent.
*/
async Destroy();
-
- /**
- * Tell the child side if it has to update it's touchable region
- * to the parent.
- */
- async SetUpdateHitRegion(bool aEnabled);
-
/**
* Update the child side docShell active (resource use) state.
*
* @param aIsActive
* Whether to activate or deactivate the docshell.
* @param aPreserveLayers
* Whether layer trees should be preserved for inactive docshells.
* @param aLayerObserverEpoch
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -530,17 +530,16 @@ TabChild::TabChild(nsIContentChild* aMan
, mChromeFlags(aChromeFlags)
, mActiveSuppressDisplayport(0)
, mLayersId(0)
, mAppPackageFileDescriptorRecved(false)
, mDidFakeShow(false)
, mNotified(false)
, mTriedBrowserInit(false)
, mOrientation(eScreenOrientation_PortraitPrimary)
- , mUpdateHitRegion(false)
, mIgnoreKeyPressEvent(false)
, mHasValidInnerSize(false)
, mDestroyed(false)
, mUniqueId(aTabId)
, mDPI(0)
, mRounding(0)
, mDefaultScale(0)
, mIsTransparent(false)
@@ -2642,38 +2641,16 @@ TabChild::RecvDestroy()
// that were just generated to have a chance to run.
nsCOMPtr<nsIRunnable> deleteRunnable = new DelayedDeleteRunnable(this);
MOZ_ALWAYS_SUCCEEDS(NS_DispatchToCurrentThread(deleteRunnable));
return true;
}
bool
-TabChild::RecvSetUpdateHitRegion(const bool& aEnabled)
-{
- mUpdateHitRegion = aEnabled;
-
- // We need to trigger a repaint of the child frame to ensure that it
- // recomputes and sends its region.
- if (!mUpdateHitRegion) {
- return true;
- }
-
- nsCOMPtr<nsIDocument> document(GetDocument());
- NS_ENSURE_TRUE(document, true);
- nsCOMPtr<nsIPresShell> presShell = document->GetShell();
- NS_ENSURE_TRUE(presShell, true);
- RefPtr<nsPresContext> presContext = presShell->GetPresContext();
- NS_ENSURE_TRUE(presContext, true);
- presContext->InvalidatePaintedLayers();
-
- return true;
-}
-
-bool
TabChild::RecvSetDocShellIsActive(const bool& aIsActive,
const bool& aPreserveLayers,
const uint64_t& aLayerObserverEpoch)
{
// Since SetDocShellIsActive requests come in from both the hang monitor
// channel and the PContent channel, we have an ordering problem. This code
// ensures that we respect the order in which the requests were made and
// ignore stale requests.
@@ -3008,22 +2985,16 @@ TabChild::MakeHidden()
// round-trip from CompositorBridgeChild to CompositorBridgeParent.
compositor->RecvClearCachedResources(mLayersId);
if (mPuppetWidget) {
mPuppetWidget->Show(false);
}
}
-void
-TabChild::UpdateHitRegion(const nsRegion& aRegion)
-{
- mRemoteFrame->SendUpdateHitRegion(aRegion);
-}
-
NS_IMETHODIMP
TabChild::GetMessageManager(nsIContentFrameMessageManager** aResult)
{
if (mTabChildGlobal) {
NS_ADDREF(*aResult = mTabChildGlobal);
return NS_OK;
}
*aResult = nullptr;
--- a/dom/ipc/TabChild.h
+++ b/dom/ipc/TabChild.h
@@ -513,20 +513,16 @@ public:
nsICachedFileDescriptorListener* aCallback);
void CancelCachedFileDescriptorCallback(
const nsAString& aPath,
nsICachedFileDescriptorListener* aCallback);
nsIContentChild* Manager() const { return mManager; }
- bool GetUpdateHitRegion() const { return mUpdateHitRegion; }
-
- void UpdateHitRegion(const nsRegion& aRegion);
-
static inline TabChild*
GetFrom(nsIDocShell* aDocShell)
{
if (!aDocShell) {
return nullptr;
}
nsCOMPtr<nsITabChild> tc = aDocShell->GetTabChild();
@@ -662,18 +658,16 @@ protected:
virtual ~TabChild();
virtual PRenderFrameChild* AllocPRenderFrameChild() override;
virtual bool DeallocPRenderFrameChild(PRenderFrameChild* aFrame) override;
virtual bool RecvDestroy() override;
- virtual bool RecvSetUpdateHitRegion(const bool& aEnabled) override;
-
virtual bool RecvSetDocShellIsActive(const bool& aIsActive,
const bool& aIsHidden,
const uint64_t& aLayerObserverEpoch) override;
virtual bool RecvNavigateByKey(const bool& aForward,
const bool& aForDocumentNavigation) override;
virtual bool RecvRequestNotifyAfterRemotePaint() override;
@@ -755,17 +749,16 @@ private:
// At present only 1 of these is really expected.
AutoTArray<nsAutoPtr<CachedFileDescriptorInfo>, 1>
mCachedFileDescriptorInfos;
nscolor mLastBackgroundColor;
bool mDidFakeShow;
bool mNotified;
bool mTriedBrowserInit;
ScreenOrientationInternal mOrientation;
- bool mUpdateHitRegion;
bool mIgnoreKeyPressEvent;
RefPtr<APZEventState> mAPZEventState;
SetAllowedTouchBehaviorCallback mSetAllowedTouchBehaviorCallback;
bool mHasValidInnerSize;
bool mDestroyed;
// Position of client area relative to the outer window
LayoutDeviceIntPoint mClientOffset;
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -2018,20 +2018,16 @@ GetMouseThrough(const nsIFrame* aFrame)
frame = nsBox::GetParentXULBox(frame);
}
return false;
}
static bool
IsFrameReceivingPointerEvents(nsIFrame* aFrame)
{
- nsSubDocumentFrame* frame = do_QueryFrame(aFrame);
- if (frame && frame->PassPointerEventsToChildren()) {
- return true;
- }
return NS_STYLE_POINTER_EVENTS_NONE !=
aFrame->StyleUserInterface()->GetEffectivePointerEvents(aFrame);
}
// A list of frames, and their z depth. Used for sorting
// the results of hit testing.
struct FramesWithDepth
{
@@ -3671,17 +3667,17 @@ nsDisplayEventReceiver::HitTest(nsDispla
void
nsDisplayLayerEventRegions::AddFrame(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame)
{
NS_ASSERTION(aBuilder->FindReferenceFrameFor(aFrame) == aBuilder->FindReferenceFrameFor(mFrame),
"Reference frame mismatch");
if (aBuilder->IsInsidePointerEventsNoneDoc()) {
// Somewhere up the parent document chain is a subdocument with pointer-
- // events:none set on it (and without a mozpasspointerevents).
+ // events:none set on it.
return;
}
if (!aFrame->GetParent()) {
MOZ_ASSERT(aFrame->GetType() == nsGkAtoms::viewportFrame);
// Viewport frames are never event targets, other frames, like canvas frames,
// are the event targets for any regions viewport frames may cover.
return;
}
--- a/layout/base/nsDisplayList.h
+++ b/layout/base/nsDisplayList.h
@@ -514,17 +514,17 @@ public:
/**
* Get the caret associated with the current presshell.
*/
nsCaret* GetCaret();
/**
* Notify the display list builder that we're entering a presshell.
* aReferenceFrame should be a frame in the new presshell.
* aPointerEventsNoneDoc should be set to true if the frame generating this
- * document is pointer-events:none without mozpasspointerevents.
+ * document is pointer-events:none.
*/
void EnterPresShell(nsIFrame* aReferenceFrame,
bool aPointerEventsNoneDoc = false);
/**
* For print-preview documents, we sometimes need to build display items for
* the same frames multiple times in the same presentation, with different
* clipping. Between each such batch of items, call
* ResetMarkedFramesForDisplayList to make sure that the results of
@@ -1171,17 +1171,17 @@ private:
struct PresShellState {
nsIPresShell* mPresShell;
nsIFrame* mCaretFrame;
nsRect mCaretRect;
uint32_t mFirstFrameMarkedForDisplay;
bool mIsBackgroundOnly;
// This is a per-document flag turning off event handling for all content
// in the document, and is set when we enter a subdocument for a pointer-
- // events:none frame that doesn't have mozpasspointerevents set.
+ // events:none frame.
bool mInsidePointerEventsNoneDoc;
};
PresShellState* CurrentPresShellState() {
NS_ASSERTION(mPresShellStates.Length() > 0,
"Someone forgot to enter a presshell");
return &mPresShellStates[mPresShellStates.Length() - 1];
}
--- a/layout/base/nsPresShell.cpp
+++ b/layout/base/nsPresShell.cpp
@@ -6217,57 +6217,16 @@ public:
mShell->GetPresContext()->NotifyDidPaintForSubtree(mFlags);
}
private:
PresShell* mShell;
uint32_t mFlags;
};
-class AutoUpdateHitRegion
-{
-public:
- AutoUpdateHitRegion(PresShell* aShell, nsIFrame* aFrame)
- : mShell(aShell), mFrame(aFrame)
- {
- }
- ~AutoUpdateHitRegion()
- {
- if (!XRE_IsContentProcess() ||
- !mFrame || !mShell) {
- return;
- }
- TabChild* tabChild = TabChild::GetFrom(mShell);
- if (!tabChild || !tabChild->GetUpdateHitRegion()) {
- return;
- }
- nsRegion region;
- nsDisplayListBuilder builder(mFrame,
- nsDisplayListBuilderMode::EVENT_DELIVERY,
- /* aBuildCert= */ false);
- nsDisplayList list;
- AutoTArray<nsIFrame*, 100> outFrames;
- nsDisplayItem::HitTestState hitTestState;
- builder.EnterPresShell(mFrame);
- nsRect bounds = mShell->GetPresContext()->GetVisibleArea();
- mFrame->BuildDisplayListForStackingContext(&builder, bounds, &list);
- builder.LeavePresShell(mFrame);
- list.HitTest(&builder, bounds, &hitTestState, &outFrames);
- list.DeleteAll();
- for (int32_t i = outFrames.Length() - 1; i >= 0; --i) {
- region.Or(region, nsLayoutUtils::TransformFrameRectToAncestor(
- outFrames[i], nsRect(nsPoint(0, 0), outFrames[i]->GetSize()), mFrame));
- }
- tabChild->UpdateHitRegion(region);
- }
-private:
- PresShell* mShell;
- nsIFrame* mFrame;
-};
-
void
PresShell::RecordShadowStyleChange(ShadowRoot* aShadowRoot)
{
mChangedScopeStyleRoots.AppendElement(aShadowRoot->GetHost()->AsElement());
}
void
PresShell::Paint(nsView* aViewToPaint,
@@ -6292,17 +6251,16 @@ PresShell::Paint(nsView* aViewToP
nsIFrame* frame = aViewToPaint->GetFrame();
LayerManager* layerManager =
aViewToPaint->GetWidget()->GetLayerManager();
NS_ASSERTION(layerManager, "Must be in paint event");
bool shouldInvalidate = layerManager->NeedsWidgetInvalidation();
nsAutoNotifyDidPaint notifyDidPaint(this, aFlags);
- AutoUpdateHitRegion updateHitRegion(this, frame);
// Whether or not we should set first paint when painting is
// suppressed is debatable. For now we'll do it because
// B2G relies on first paint to configure the viewport and
// we only want to do that when we have real content to paint.
// See Bug 798245
if (mIsFirstPaint && !mPaintingSuppressed) {
layerManager->SetIsFirstPaint();
--- a/layout/base/tests/chrome/chrome.ini
+++ b/layout/base/tests/chrome/chrome.ini
@@ -6,18 +6,16 @@ support-files =
bug495648.rdf
bug551434_childframe.html
chrome_content_integration_window.xul
chrome_over_plugin_window.xul
default_background_window.xul
dialog_with_positioning_window.xul
no_clip_iframe_subdoc.html
no_clip_iframe_window.xul
- passpointerevents_window.html
- passpointerevents_dynamically_window.html
printpreview_bug396024_helper.xul
printpreview_bug482976_helper.xul
printpreview_helper.xul
file_bug1018265.xul
[test_bug396367-1.html]
[test_bug396367-2.html]
[test_bug420499.xul]
@@ -52,20 +50,16 @@ skip-if = buildapp == 'b2g'
tags = openwindow
skip-if = buildapp == 'b2g'
[test_fixed_bg_scrolling_repaints.html]
skip-if = buildapp == 'b2g'
[test_leaf_layers_partition_browser_window.xul]
skip-if = (!debug) || (toolkit == "cocoa") || (os == "linux") || (buildapp == 'b2g') # Disabled on Mac and Linux because of Bug 992311
[test_no_clip_iframe.xul]
skip-if = buildapp == 'b2g'
-[test_passpointerevents.html]
-skip-if = buildapp == 'b2g'
-[test_passpointerevents_dynamic.html]
-skip-if = buildapp == 'b2g'
[test_prerendered_transforms.html]
skip-if = buildapp == 'b2g'
[test_printpreview.xul]
skip-if = buildapp == 'b2g' || (os == "linux" && bits == 32) # Disabled on Linux32 for bug 1278957
[test_printpreview_bug396024.xul]
skip-if = buildapp == 'b2g'
[test_printpreview_bug482976.xul]
skip-if = buildapp == 'b2g'
deleted file mode 100644
--- a/layout/base/tests/chrome/passpointerevents_dynamically_window.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>Test that mozpasspointerevents works after setting it dynamically</title>
-</head>
-<body onload="startTest()">
-<iframe id="f" style="border:none; width:200px; height:200px; pointer-events:none"
- src="data:text/html,<html style='pointer-events:none'><div style='margin:100px; width:100px; height:100px; background:yellow; pointer-events:auto'>">
-</iframe>
-
-<script type="application/javascript">
-var SimpleTest = window.opener.SimpleTest;
-var is = window.opener.is;
-
-function startTest() {
- var f = document.getElementById("f");
- f.setAttribute("mozpasspointerevents", true);
- var fRect = f.getBoundingClientRect();
- var e1 = document.elementFromPoint(fRect.left + 10, fRect.top + 10);
- is(e1, document.body, "check point in transparent region of the iframe");
- var e2 = document.elementFromPoint(fRect.left + 110, fRect.top + 110);
- is(e2, f, "check point in opaque region of the iframe");
- window.close();
- SimpleTest.finish();
-}
-</script>
-</body>
-</html>
deleted file mode 100644
--- a/layout/base/tests/chrome/passpointerevents_window.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>Test that mozpasspointerevents works</title>
-</head>
-<body onload="startTest()">
-<iframe id="f" style="border:none; width:200px; height:200px; pointer-events:none" mozpasspointerevents
- src="data:text/html,<html style='pointer-events:none'><div style='margin:100px; width:100px; height:100px; background:yellow; pointer-events:auto'>">
-</iframe>
-
-<script type="application/javascript">
-var SimpleTest = window.opener.SimpleTest;
-var is = window.opener.is;
-
-function startTest() {
- var f = document.getElementById("f");
- var fRect = f.getBoundingClientRect();
- var e1 = document.elementFromPoint(fRect.left + 10, fRect.top + 10);
- is(e1, document.body, "check point in transparent region of the iframe");
- var e2 = document.elementFromPoint(fRect.left + 110, fRect.top + 110);
- is(e2, f, "check point in opaque region of the iframe");
- window.close();
- SimpleTest.finish();
-}
-</script>
-</body>
-</html>
deleted file mode 100644
--- a/layout/base/tests/chrome/test_passpointerevents.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>Test that mozpasspointerevents works</title>
- <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
- <script type="application/javascript" src="chrome://mochikit/content/chrome-harness.js"></script>
- <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
-</head>
-<body>
-
-<pre id="test">
-<script type="application/javascript">
-SimpleTest.waitForExplicitFinish();
-
-var root = getRootDirectory(window.location.href);
-window.openDialog(root + "passpointerevents_window.html", "passpointerevents",
- "chrome,width=400,height=400");
-</script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/layout/base/tests/chrome/test_passpointerevents_dynamic.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>Test that mozpasspointerevents works after setting it dynamically</title>
- <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
- <script type="application/javascript" src="chrome://mochikit/content/chrome-harness.js"></script>
- <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
-</head>
-<body>
-
-<pre id="test">
-<script type="application/javascript">
-SimpleTest.waitForExplicitFinish();
-
-var root = getRootDirectory(window.location.href);
-window.openDialog(root + "passpointerevents_dynamically_window.html",
- "passpointerevents", "chrome,width=400,height=400");
-</script>
-</pre>
-</body>
-</html>
--- a/layout/base/tests/mochitest.ini
+++ b/layout/base/tests/mochitest.ini
@@ -239,17 +239,16 @@ skip-if = buildapp == 'mulet' || buildap
[test_bug646757.html]
[test_bug718809.html]
[test_bug725426.html]
[test_bug731777.html]
[test_bug761572.html]
[test_bug770106.html]
[test_remote_frame.html]
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
-[test_remote_passpointerevents.html]
[test_bug842853.html]
[test_bug842853-2.html]
[test_bug849219.html]
[test_bug851485.html]
[test_bug851445.html]
support-files = bug851445_helper.html
[test_bug970964.html]
support-files = bug970964_inner.html
deleted file mode 100644
--- a/layout/base/tests/test_remote_passpointerevents.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
- <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
- </head>
- <body>
- <script type="application/javascript;version=1.7">
- "use strict";
-
- SimpleTest.waitForExplicitFinish();
-
- function checkPointerEvents() {
- let iframe = this;
- let fRect = iframe.getBoundingClientRect();
- let e1 = document.elementFromPoint(fRect.left + 10, fRect.top + 10);
- let e2 = document.elementFromPoint(fRect.left + 110, fRect.top + 110);
- if (e1 === document.body && e2 === iframe) {
- is(e1, document.body, "check point in transparent region of the iframe");
- is(e2, iframe, "check point in opaque region of the iframe");
- SimpleTest.finish();
- }
- else {
- SimpleTest.executeSoon(checkPointerEvents.bind(iframe));
- }
- }
-
- function runTest() {
- let iframe = document.createElement("iframe");
- SpecialPowers.wrap(iframe).setAttribute('mozbrowser', 'true');
- SpecialPowers.wrap(iframe).setAttribute('mozpasspointerevents', 'true');
- SpecialPowers.wrap(iframe).setAttribute('remote', 'true');
- iframe.style = "border:none; width:400px; height:400px; pointer-events:none";
- iframe.src = "data:text/html,<html style='pointer-events:none'><div style='margin:100px; width:100px; height:100px; background:yellow; pointer-events:auto'>";
-
- document.body.appendChild(iframe);
-
- SimpleTest.executeSoon(checkPointerEvents.bind(iframe));
- }
- addEventListener("load", function() {
- SpecialPowers.addPermission("browser", true, document);
- SpecialPowers.addPermission("embed-apps", true, document);
- SpecialPowers.pushPrefEnv({
- "set": [
- ["dom.ipc.browser_frames.oop_by_default", true],
- ["dom.mozBrowserFramesEnabled", true]
- ]
- }, runTest);
- });
- </script>
- </body>
-</html>
--- a/layout/generic/nsSubDocumentFrame.cpp
+++ b/layout/generic/nsSubDocumentFrame.cpp
@@ -302,41 +302,16 @@ nsSubDocumentFrame::GetSubdocumentSize()
docSizeAppUnits = destRect.Size();
}
return ScreenIntSize(presContext->AppUnitsToDevPixels(docSizeAppUnits.width),
presContext->AppUnitsToDevPixels(docSizeAppUnits.height));
}
}
-bool
-nsSubDocumentFrame::PassPointerEventsToChildren()
-{
- // Limit use of mozpasspointerevents to documents with embedded:apps/chrome
- // permission, because this could be used by the parent document to discover
- // which parts of the subdocument are transparent to events (if subdocument
- // uses pointer-events:none on its root element, which is admittedly
- // unlikely)
- if (mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::mozpasspointerevents)) {
- if (PresContext()->IsChrome()) {
- return true;
- }
-
- nsCOMPtr<nsIPermissionManager> permMgr =
- services::GetPermissionManager();
- if (permMgr) {
- uint32_t permission = nsIPermissionManager::DENY_ACTION;
- permMgr->TestPermissionFromPrincipal(GetContent()->NodePrincipal(),
- "embed-apps", &permission);
- return permission == nsIPermissionManager::ALLOW_ACTION;
- }
- }
- return false;
-}
-
static void
WrapBackgroundColorInOwnLayer(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame,
nsDisplayList* aList)
{
nsDisplayList tempItems;
nsDisplayItem* item;
while ((item = aList->RemoveBottom()) != nullptr) {
@@ -375,32 +350,24 @@ nsSubDocumentFrame::BuildDisplayList(nsD
// 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);
}
- // We only care about mozpasspointerevents if we're doing hit-testing
- // related things.
- bool passPointerEventsToChildren =
- (aBuilder->IsForEventDelivery() || aBuilder->IsBuildingLayerEventRegions())
- ? PassPointerEventsToChildren() : false;
-
- // If mozpasspointerevents is set, then we should allow subdocument content
- // to handle events even if we're pointer-events:none.
- if (aBuilder->IsForEventDelivery() && pointerEventsNone && !passPointerEventsToChildren) {
+ if (aBuilder->IsForEventDelivery() && pointerEventsNone) {
return;
}
// 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
// hit-testing or event regions.
- bool needToDescend = aBuilder->GetDescendIntoSubdocuments() || passPointerEventsToChildren;
+ bool needToDescend = aBuilder->GetDescendIntoSubdocuments();
if (!mInnerView || !needToDescend) {
return;
}
if (rfp) {
rfp->BuildDisplayList(aBuilder, this, aDirtyRect, aLists);
return;
}
@@ -443,18 +410,17 @@ nsSubDocumentFrame::BuildDisplayList(nsD
ignoreViewportScrolling = presShell->IgnoringViewportScrolling();
if (ignoreViewportScrolling) {
savedIgnoreScrollFrame = aBuilder->GetIgnoreScrollFrame();
aBuilder->SetIgnoreScrollFrame(rootScrollFrame);
}
}
- aBuilder->EnterPresShell(subdocRootFrame,
- pointerEventsNone && !passPointerEventsToChildren);
+ aBuilder->EnterPresShell(subdocRootFrame, pointerEventsNone);
} else {
dirty = aDirtyRect;
}
DisplayListClipState::AutoSaveRestore clipState(aBuilder);
if (ShouldClipSubdocument()) {
clipState.ClipContainingBlockDescendantsToContentBox(aBuilder, this);
}
@@ -908,26 +874,16 @@ nsSubDocumentFrame::AttributeChanged(int
// Retrieve the attributes
CSSIntSize margins = GetMarginAttributes();
// Notify the frameloader
RefPtr<nsFrameLoader> frameloader = FrameLoader();
if (frameloader)
frameloader->MarginsChanged(margins.width, margins.height);
}
- else if (aAttribute == nsGkAtoms::mozpasspointerevents) {
- RefPtr<nsFrameLoader> frameloader = FrameLoader();
- if (frameloader) {
- if (aModType == nsIDOMMutationEvent::ADDITION) {
- frameloader->ActivateUpdateHitRegion();
- } else if (aModType == nsIDOMMutationEvent::REMOVAL) {
- frameloader->DeactivateUpdateHitRegion();
- }
- }
- }
return NS_OK;
}
nsIFrame*
NS_NewSubDocumentFrame(nsIPresShell* aPresShell, nsStyleContext* aContext)
{
return new (aPresShell) nsSubDocumentFrame(aContext);
--- a/layout/ipc/PRenderFrame.ipdl
+++ b/layout/ipc/PRenderFrame.ipdl
@@ -25,17 +25,15 @@ namespace layout {
*/
sync protocol PRenderFrame
{
manager PBrowser;
parent:
async NotifyCompositorTransaction();
- async UpdateHitRegion(nsRegion aRegion);
-
sync TakeFocusForClickFromTap();
async __delete__();
};
} // namespace layout
} // namespace mozilla
--- a/layout/ipc/RenderFrameParent.cpp
+++ b/layout/ipc/RenderFrameParent.cpp
@@ -236,23 +236,16 @@ RenderFrameParent::ActorDestroy(ActorDes
bool
RenderFrameParent::RecvNotifyCompositorTransaction()
{
TriggerRepaint();
return true;
}
-bool
-RenderFrameParent::RecvUpdateHitRegion(const nsRegion& aRegion)
-{
- mTouchRegion = aRegion;
- return true;
-}
-
void
RenderFrameParent::TriggerRepaint()
{
nsIFrame* docFrame = mFrameLoader->GetPrimaryFrameOfOwningContent();
if (!docFrame) {
// Bad, but nothing we can do about it (XXX/cjones: or is there?
// maybe bug 589337?). When the new frame is created, we'll
// probably still be the current render frame and will get to draw
@@ -283,22 +276,16 @@ RenderFrameParent::BuildDisplayList(nsDi
nsPoint offset = aBuilder->ToReferenceFrame(aFrame);
nsRect bounds = aFrame->EnsureInnerView()->GetBounds() + offset;
clipState.ClipContentDescendants(bounds);
aLists.Content()->AppendToTop(
new (aBuilder) nsDisplayRemote(aBuilder, aFrame, this));
}
-bool
-RenderFrameParent::HitTest(const nsRect& aRect)
-{
- return mTouchRegion.Contains(aRect);
-}
-
void
RenderFrameParent::GetTextureFactoryIdentifier(TextureFactoryIdentifier* aTextureFactoryIdentifier)
{
RefPtr<LayerManager> lm = mFrameLoader ? GetFrom(mFrameLoader) : nullptr;
// Perhaps the document containing this frame currently has no presentation?
if (lm && lm->AsClientLayerManager()) {
*aTextureFactoryIdentifier = lm->AsClientLayerManager()->GetTextureFactoryIdentifier();
} else {
@@ -356,17 +343,16 @@ nsDisplayRemote::nsDisplayRemote(nsDispl
nsSubDocumentFrame* aFrame,
RenderFrameParent* aRemoteFrame)
: nsDisplayItem(aBuilder, aFrame)
, mRemoteFrame(aRemoteFrame)
, mEventRegionsOverride(EventRegionsOverride::NoOverride)
{
if (aBuilder->IsBuildingLayerEventRegions()) {
bool frameIsPointerEventsNone =
- !aFrame->PassPointerEventsToChildren() &&
aFrame->StyleUserInterface()->GetEffectivePointerEvents(aFrame) ==
NS_STYLE_POINTER_EVENTS_NONE;
if (aBuilder->IsInsidePointerEventsNoneDoc() || frameIsPointerEventsNone) {
mEventRegionsOverride |= EventRegionsOverride::ForceEmptyHitRegion;
}
if (nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(aFrame->PresContext()->PresShell())) {
mEventRegionsOverride |= EventRegionsOverride::ForceDispatchToContent;
}
@@ -382,18 +368,8 @@ nsDisplayRemote::BuildLayer(nsDisplayLis
nsIntRect visibleRect = GetVisibleRect().ToNearestPixels(appUnitsPerDevPixel);
visibleRect += aContainerParameters.mOffset;
RefPtr<Layer> layer = mRemoteFrame->BuildLayer(aBuilder, mFrame, aManager, visibleRect, this, aContainerParameters);
if (layer && layer->AsContainerLayer()) {
layer->AsContainerLayer()->SetEventRegionsOverride(mEventRegionsOverride);
}
return layer.forget();
}
-
-void
-nsDisplayRemote::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
- HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames)
-{
- if (mRemoteFrame->HitTest(aRect)) {
- aOutFrames->AppendElement(mFrame);
- }
-}
-
--- a/layout/ipc/RenderFrameParent.h
+++ b/layout/ipc/RenderFrameParent.h
@@ -86,18 +86,16 @@ public:
void EnsureLayersConnected();
protected:
void ActorDestroy(ActorDestroyReason why) override;
virtual bool RecvNotifyCompositorTransaction() override;
- virtual bool RecvUpdateHitRegion(const nsRegion& aRegion) override;
-
virtual bool RecvTakeFocusForClickFromTap() override;
private:
void TriggerRepaint();
void DispatchEventForPanZoomController(const InputEvent& aEvent);
uint64_t GetLayerTreeId() const;
@@ -120,18 +118,16 @@ private:
// Prefer the extra bit of state to null'ing out mFrameLoader in
// Destroy() so that less code needs to be special-cased for after
// Destroy().
//
// It's possible for mFrameLoader==null and
// mFrameLoaderDestroyed==false.
bool mFrameLoaderDestroyed;
- nsRegion mTouchRegion;
-
bool mAsyncPanZoomEnabled;
bool mInitted;
};
} // namespace layout
} // namespace mozilla
/**
@@ -151,19 +147,16 @@ public:
LayerManager* aManager,
const ContainerLayerParameters& aParameters) override
{ return mozilla::LAYER_ACTIVE_FORCE; }
virtual already_AddRefed<Layer>
BuildLayer(nsDisplayListBuilder* aBuilder, LayerManager* aManager,
const ContainerLayerParameters& aContainerParameters) override;
- void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
- HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames) override;
-
NS_DISPLAY_DECL_NAME("Remote", TYPE_REMOTE)
private:
RenderFrameParent* mRemoteFrame;
mozilla::layers::EventRegionsOverride mEventRegionsOverride;
};