mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 647518 part 1. Make requestAnimationFrame return handles for animation frame requests. r=roc
This commit is contained in:
parent
27ae7a604d
commit
83bd6bb9a4
@ -1529,7 +1529,8 @@ public:
|
||||
*/
|
||||
virtual Element* LookupImageElement(const nsAString& aElementId) = 0;
|
||||
|
||||
void ScheduleFrameRequestCallback(nsIFrameRequestCallback* aCallback);
|
||||
nsresult ScheduleFrameRequestCallback(nsIFrameRequestCallback* aCallback,
|
||||
PRInt32 *aHandle);
|
||||
|
||||
typedef nsTArray< nsCOMPtr<nsIFrameRequestCallback> > FrameRequestCallbackList;
|
||||
/**
|
||||
@ -1810,13 +1811,33 @@ protected:
|
||||
*/
|
||||
PRUint32 mExternalScriptsBeingEvaluated;
|
||||
|
||||
/**
|
||||
* The current frame request callback handle
|
||||
*/
|
||||
PRInt32 mFrameRequestCallbackCounter;
|
||||
|
||||
// Weak reference to mScriptGlobalObject QI:d to nsPIDOMWindow,
|
||||
// updated on every set of mSecriptGlobalObject.
|
||||
nsPIDOMWindow *mWindow;
|
||||
|
||||
nsCOMPtr<nsIDocumentEncoder> mCachedEncoder;
|
||||
|
||||
FrameRequestCallbackList mFrameRequestCallbacks;
|
||||
struct FrameRequest {
|
||||
FrameRequest(nsIFrameRequestCallback* aCallback,
|
||||
PRInt32 aHandle) :
|
||||
mCallback(aCallback),
|
||||
mHandle(aHandle)
|
||||
{}
|
||||
|
||||
// Conversion operator so that we can append these to a
|
||||
// FrameRequestCallbackList
|
||||
operator nsIFrameRequestCallback* const () const { return mCallback; }
|
||||
|
||||
nsCOMPtr<nsIFrameRequestCallback> mCallback;
|
||||
PRInt32 mHandle;
|
||||
};
|
||||
|
||||
nsTArray<FrameRequest> mFrameRequestCallbacks;
|
||||
|
||||
// This object allows us to evict ourself from the back/forward cache. The
|
||||
// pointer is non-null iff we're currently in the bfcache.
|
||||
|
@ -8041,15 +8041,27 @@ nsIDocument::CreateStaticClone(nsISupports* aCloneContainer)
|
||||
return clonedDoc.forget();
|
||||
}
|
||||
|
||||
void
|
||||
nsIDocument::ScheduleFrameRequestCallback(nsIFrameRequestCallback* aCallback)
|
||||
nsresult
|
||||
nsIDocument::ScheduleFrameRequestCallback(nsIFrameRequestCallback* aCallback,
|
||||
PRInt32 *aHandle)
|
||||
{
|
||||
if (mFrameRequestCallbackCounter == PR_INT32_MAX) {
|
||||
// Can't increment without overflowing; bail out
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
}
|
||||
PRInt32 newHandle = ++mFrameRequestCallbackCounter;
|
||||
|
||||
bool alreadyRegistered = !mFrameRequestCallbacks.IsEmpty();
|
||||
if (mFrameRequestCallbacks.AppendElement(aCallback) &&
|
||||
!alreadyRegistered && mPresShell && IsEventHandlingEnabled()) {
|
||||
FrameRequest *request =
|
||||
mFrameRequestCallbacks.AppendElement(FrameRequest(aCallback, newHandle));
|
||||
NS_ASSERTION(request, "This is supposed to be infallible!");
|
||||
if (!alreadyRegistered && mPresShell && IsEventHandlingEnabled()) {
|
||||
mPresShell->GetPresContext()->RefreshDriver()->
|
||||
ScheduleFrameRequestCallbacks(this);
|
||||
}
|
||||
|
||||
*aHandle = newHandle;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
@ -511,6 +511,7 @@ _TEST_FILES2 = \
|
||||
file_html_in_xhr2.html \
|
||||
file_html_in_xhr3.html \
|
||||
file_html_in_xhr.sjs \
|
||||
test_bug647518.html \
|
||||
test_bug664916.html \
|
||||
test_bug666604.html \
|
||||
test_bug675121.html \
|
||||
|
27
content/base/test/test_bug647518.html
Normal file
27
content/base/test/test_bug647518.html
Normal file
@ -0,0 +1,27 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=647518
|
||||
-->
|
||||
<head>
|
||||
<title>Test for Bug 647518</title>
|
||||
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.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=647518">Mozilla Bug 647518</a>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none">
|
||||
|
||||
</div>
|
||||
<pre id="test">
|
||||
<script type="application/javascript">
|
||||
|
||||
/** Test for Bug 647518 **/
|
||||
var handle1 = window.mozRequestAnimationFrame(function() {});
|
||||
ok(handle1 > 0, "Should get back a nonzero handle");
|
||||
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
@ -3874,9 +3874,10 @@ nsGlobalWindow::GetMozPaintCount(PRUint64* aResult)
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsGlobalWindow::MozRequestAnimationFrame(nsIFrameRequestCallback* aCallback)
|
||||
nsGlobalWindow::MozRequestAnimationFrame(nsIFrameRequestCallback* aCallback,
|
||||
PRInt32 *aHandle)
|
||||
{
|
||||
FORWARD_TO_INNER(MozRequestAnimationFrame, (aCallback),
|
||||
FORWARD_TO_INNER(MozRequestAnimationFrame, (aCallback, aHandle),
|
||||
NS_ERROR_NOT_INITIALIZED);
|
||||
|
||||
if (!mDoc) {
|
||||
@ -3887,8 +3888,7 @@ nsGlobalWindow::MozRequestAnimationFrame(nsIFrameRequestCallback* aCallback)
|
||||
return NS_ERROR_XPC_BAD_CONVERT_JS;
|
||||
}
|
||||
|
||||
mDoc->ScheduleFrameRequestCallback(aCallback);
|
||||
return NS_OK;
|
||||
return mDoc->ScheduleFrameRequestCallback(aCallback, aHandle);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -70,7 +70,7 @@ interface nsIDOMMozURLProperty : nsISupports
|
||||
* @see <http://www.whatwg.org/html/#window>
|
||||
*/
|
||||
|
||||
[scriptable, uuid(8f577294-d572-4473-94b1-d2c5a74a2a74)]
|
||||
[scriptable, uuid(57b7ed24-c340-4994-a023-56ba578b78ab)]
|
||||
interface nsIDOMWindow : nsISupports
|
||||
{
|
||||
// the current browsing context
|
||||
@ -417,7 +417,7 @@ interface nsIDOMWindow : nsISupports
|
||||
*
|
||||
* @see <http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/RequestAnimationFrame/Overview.html>
|
||||
*/
|
||||
void
|
||||
long
|
||||
mozRequestAnimationFrame(in nsIFrameRequestCallback aCallback);
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user