Merge mozilla-central to autoland. a=merge CLOSED TREE

This commit is contained in:
Csoregi Natalia 2018-02-04 12:17:18 +02:00
Родитель 60879568da 0517a94d02
Коммит 7763e2ec84
9 изменённых файлов: 137 добавлений и 29 удалений

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

@ -5,6 +5,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "DocumentOrShadowRoot.h"
#include "mozilla/EventStateManager.h"
#include "mozilla/dom/StyleSheetList.h"
#include "nsDocument.h"
#include "nsFocusManager.h"
@ -130,5 +131,20 @@ DocumentOrShadowRoot::GetRetargetedFocusedElement()
return nullptr;
}
Element*
DocumentOrShadowRoot::GetPointerLockElement()
{
nsCOMPtr<Element> pointerLockedElement =
do_QueryReferent(EventStateManager::sPointerLockedElement);
if (!pointerLockedElement) {
return nullptr;
}
nsIContent* retargetedPointerLockedElement = Retarget(pointerLockedElement);
return
retargetedPointerLockedElement && retargetedPointerLockedElement->IsElement() ?
retargetedPointerLockedElement->AsElement() : nullptr;
}
}
}

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

@ -113,6 +113,7 @@ public:
~DocumentOrShadowRoot() = default;
Element* GetPointerLockElement();
protected:
nsIContent* Retarget(nsIContent* aContent) const;

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

@ -11640,7 +11640,7 @@ GetPointerLockError(Element* aElement, Element* aCurrentLock,
return "PointerLockDeniedInUse";
}
if (!aElement->IsInUncomposedDoc()) {
if (!aElement->IsInComposedDoc()) {
return "PointerLockDeniedNotInDocument";
}
@ -11691,11 +11691,11 @@ ChangePointerLockedElement(Element* aElement, nsIDocument* aDocument,
MOZ_ASSERT(aDocument);
MOZ_ASSERT(aElement != aPointerLockedElement);
if (aPointerLockedElement) {
MOZ_ASSERT(aPointerLockedElement->GetUncomposedDoc() == aDocument);
MOZ_ASSERT(aPointerLockedElement->GetComposedDoc() == aDocument);
aPointerLockedElement->ClearPointerLock();
}
if (aElement) {
MOZ_ASSERT(aElement->GetUncomposedDoc() == aDocument);
MOZ_ASSERT(aElement->GetComposedDoc() == aDocument);
aElement->SetPointerLock();
EventStateManager::sPointerLockedElement = do_GetWeakReference(aElement);
EventStateManager::sPointerLockedDoc = do_GetWeakReference(aDocument);
@ -11719,9 +11719,9 @@ PointerLockRequest::Run()
nsCOMPtr<nsIDocument> doc = do_QueryReferent(mDocument);
nsDocument* d = static_cast<nsDocument*>(doc.get());
const char* error = nullptr;
if (!e || !d || !e->GetUncomposedDoc()) {
if (!e || !d || !e->GetComposedDoc()) {
error = "PointerLockDeniedNotInDocument";
} else if (e->GetUncomposedDoc() != d) {
} else if (e->GetComposedDoc() != d) {
error = "PointerLockDeniedMovedDocument";
}
if (!error) {
@ -11872,25 +11872,6 @@ nsIDocument::UnlockPointer(nsIDocument* aDoc)
nsDocument::UnlockPointer(aDoc);
}
Element*
nsIDocument::GetPointerLockElement()
{
nsCOMPtr<Element> pointerLockedElement =
do_QueryReferent(EventStateManager::sPointerLockedElement);
if (!pointerLockedElement) {
return nullptr;
}
// Make sure pointer locked element is in the same document.
nsCOMPtr<nsIDocument> pointerLockedDoc =
do_QueryReferent(EventStateManager::sPointerLockedDoc);
if (pointerLockedDoc != this) {
return nullptr;
}
return pointerLockedElement;
}
void
nsDocument::UpdateVisibilityState()
{

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

@ -2932,7 +2932,6 @@ public:
return !!GetFullscreenElement();
}
void ExitFullscreen();
Element* GetPointerLockElement();
void ExitPointerLock()
{
UnlockPointer(this);

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

@ -0,0 +1,110 @@
<!DOCTYPE HTML>
<html>
<!--https://bugzilla.mozilla.org/show_bug.cgi?id=633602-->
<head>
<title>Bug 633602</title>
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js">
</script>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js">
</script>
<script type="application/javascript" src="pointerlock_utils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=633602">
Mozilla Bug 633602
</a>
<div id="host"></div>
<pre id="test">
<script type="text/javascript">
/*
* Test for Bug 1430303
* Make sure DOM API is correct.
*/
SimpleTest.waitForExplicitFinish();
var div,
host,
hasRequestPointerLock = false,
pointerLockChangeEventFired = false,
pointerUnlocked = false,
pointerLocked = false,
hasExitPointerLock = false,
pointerLockElement = false,
hasMovementX = false,
hasMovementY = false;
gotContextMenuEvent = false;
function runTests () {
ok(hasRequestPointerLock, "Element should have requestPointerLock.");
ok(pointerLockChangeEventFired, "pointerlockchange event should fire.");
ok(pointerUnlocked, "Should be able to unlock pointer locked element.");
ok(pointerLocked, "Requested element should be able to lock.");
ok(hasExitPointerLock, "Document should have exitPointerLock");
ok(pointerLockElement, "Document should keep track of correct pointer locked element");
ok(hasMovementX, "Mouse Event should have movementX.");
ok(hasMovementY, "Mouse Event should have movementY.");
ok(!gotContextMenuEvent, "Shouldn't have got a contextmenu event.");
}
function mouseMoveHandler(e) {
info("Got mousemove");
document.removeEventListener("mousemove", mouseMoveHandler);
hasMovementX = "movementX" in e;
hasMovementY = "movementY" in e;
hasExitPointerLock = "exitPointerLock" in document;
document.exitPointerLock();
}
document.addEventListener("pointerlockchange", function (e) {
pointerLockChangeEventFired = true;
if (document.pointerLockElement) {
info("Got pointerlockchange for entering");
pointerLocked = true;
pointerLockElement = document.pointerLockElement === host;
is(host.shadowRoot.firstChild, host.shadowRoot.pointerLockElement,
"ShadowRoot's pointerLockElement shouldn't be retargeted.");
window.addEventListener("contextmenu",
function() { gotContextMenuEvent = true; },
true);
synthesizeMouse(document.body, 4, 4,
{ type: "contextmenu", button: 2 },
window);
document.addEventListener("mousemove", mouseMoveHandler);
synthesizeMouseAtCenter(host, {type: "mousemove"}, window);
} else {
info("Got pointerlockchange for exiting");
pointerUnlocked = true;
addFullscreenChangeContinuation("exit", function() {
info("Got fullscreenchange for exiting");
runTests();
SimpleTest.finish();
});
document.exitFullscreen();
}
});
function start() {
host = document.getElementById("host");
var sr = host.attachShadow({mode: "open"});
sr.innerHTML = "<div><div>";
div = sr.firstChild;
info("Requesting fullscreen on parent");
addFullscreenChangeContinuation("enter", function() {
info("Got fullscreenchange for entering");
hasRequestPointerLock = "requestPointerLock" in div;
div.requestPointerLock();
});
host.requestFullscreen();
}
</script>
</pre>
</body>
</html>

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

@ -9,6 +9,7 @@ tags = fullscreen
support-files =
pointerlock_utils.js
file_pointerlock-api.html
file_pointerlock-api-with-shadow.html
file_pointerlockerror.html
file_escapeKey.html
file_withoutDOM.html

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

@ -33,7 +33,8 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=633602
["full-screen-api.unprefix.enabled", true],
["full-screen-api.allow-trusted-requests-only", false],
["full-screen-api.transition-duration.enter", "0 0"],
["full-screen-api.transition-duration.leave", "0 0"]
["full-screen-api.transition-duration.leave", "0 0"],
["dom.webcomponents.shadowdom.enabled", true]
]}, nextTest);
// Run the tests which go full-screen in new window, as Mochitests
@ -49,6 +50,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=633602
"file_movementXY.html",
"file_nestedFullScreen.html",
"file_pointerlock-api.html",
"file_pointerlock-api-with-shadow.html",
"file_pointerlockerror.html",
"file_pointerLockPref.html",
"file_removedFromDOM.html",

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

@ -262,7 +262,6 @@ partial interface Document {
// https://w3c.github.io/pointerlock/#extensions-to-the-document-interface
// https://w3c.github.io/pointerlock/#extensions-to-the-documentorshadowroot-mixin
partial interface Document {
readonly attribute Element? pointerLockElement;
void exitPointerLock();
// Event handlers

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

@ -22,8 +22,7 @@ interface DocumentOrShadowRoot {
readonly attribute Element? activeElement;
readonly attribute StyleSheetList styleSheets;
// Not implemented yet: bug 1430303.
// readonly attribute Element? pointerLockElement;
readonly attribute Element? pointerLockElement;
// Not implemented yet: bug 1430305.
// readonly attribute Element? fullscreenElement;
};