Commit c0dca2a1 authored by jamesr@google.com's avatar jamesr@google.com

2011-01-06 James Robinson <jamesr@chromium.org>

        Reviewed by Simon Fraser.

        Implement mozilla's animationTime property
        https://bugs.webkit.org/show_bug.cgi?id=51952

        Tests for window.webkitAnimationTime.

        * animations/animation-time-expected.txt: Added.
        * animations/animation-time.html: Added.
        * animations/script-tests/animation-time.js: Added.
2011-01-06  James Robinson  <jamesr@chromium.org>

        Reviewed by Simon Fraser.

        Implement mozilla's animationTime property
        https://bugs.webkit.org/show_bug.cgi?id=51952

        Chromium DRT support for webkitAnimationTime.

        * DumpRenderTree/chromium/WebViewHost.cpp:
        (WebViewHost::paintInvalidatedRegion):
2011-01-06  James Robinson  <jamesr@chromium.org>

        Reviewed by Simon Fraser.

        Implement mozilla's animationTime property
        https://bugs.webkit.org/show_bug.cgi?id=51952

        Implements mozilla's animationTime property as described here:
        https://developer.mozilla.org/en/DOM/window.mozAnimationStartTime
        and http://hacks.mozilla.org/2010/08/more-efficient-javascript-animations-with-mozrequestanimationframe/
        The property is called webkitAnimationTime as calling it the 'Start' time is not very informative.
        This property exposes a notion of a 'current' time to use for declarative animations and allows
        scripts to synchronize imperative animations with declarative ones if they choose to.  Once queried
        this time is saved and used for all declarative animation updates until the embedder paints/composites
        the next frame and clears it, or 15ms elapse (in case the embedder isn't producing frames, for example
        if the page is in a background tab).

        This patch also ensures that all declarative animations started in the same script execution block
        are synchronized even if some time elapses while script is running.

        Test: fast/animation/animation-time.html

        * WebCore.gypi:
        * page/DOMWindow.cpp:
        (WebCore::DOMWindow::webkitAnimationTime):
        * page/DOMWindow.h:
        * page/DOMWindow.idl:
        * page/Frame.cpp:
        (WebCore::Frame::currentAnimationTime):
        * page/Frame.h:
        * page/Page.cpp:
        (WebCore::Page::Page):
        * page/Page.h:
        (WebCore::Page::animationTime):
        * page/animation/AnimationController.cpp:
        (WebCore::AnimationControllerPrivate::beginAnimationUpdateTime):
        * page/animation/AnimationTimeController.cpp: Added.
        (WebCore::AnimationTimeController::AnimationTimeController):
        (WebCore::AnimationTimeController::~AnimationTimeController):
        (WebCore::AnimationTimeController::currentAnimationTime):
        (WebCore::AnimationTimeController::clearCurrentAnimationTime):
        (WebCore::AnimationTimeController::clearCurrentAnimationTimeTimerFired):
        * page/animation/AnimationTimeController.h: Added.
        (WebCore::AnimationTimeController::create):
2011-01-06  James Robinson  <jamesr@chromium.org>

        Reviewed by Simon Fraser.

        Implement mozilla's animationTime property
        https://bugs.webkit.org/show_bug.cgi?id=51952

        WebKit API support for webkitAnimationTime.

        * public/WebWidget.h:
        * src/WebPopupMenuImpl.cpp:
        (WebKit::WebPopupMenuImpl::clearCurrentAnimationTime):
        * src/WebPopupMenuImpl.h:
        * src/WebViewImpl.cpp:
        (WebKit::WebViewImpl::clearCurrentAnimationTime):
        * src/WebViewImpl.h:
2011-01-06  James Robinson  <jamesr@chromium.org>

        Reviewed by Simon Fraser.

        Implement mozilla's animationTime property
        https://bugs.webkit.org/show_bug.cgi?id=51952

        Tells the page to clear the current animation time after producing a frame.

        * WebProcess/WebPage/WebPage.cpp:
        (WebKit::WebPage::drawRect):
        * WebProcess/WebPage/ChunkedUpdateDrawingArea.cpp:
        (WebKit::ChunkedUpdateDrawingArea::display):
        (WebKit::ChunkedUpdateDrawingArea::setSize):
        * WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm:
        (WebKit::LayerBackedDrawingArea::syncCompositingLayers):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@75169 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent c8367559
2011-01-06 James Robinson <jamesr@chromium.org>
Reviewed by Simon Fraser.
Implement mozilla's animationTime property
https://bugs.webkit.org/show_bug.cgi?id=51952
Tests for window.webkitAnimationTime.
* animations/animation-time-expected.txt: Added.
* animations/animation-time.html: Added.
* animations/script-tests/animation-time.js: Added.
2011-01-06 Abhishek Arya <inferno@chromium.org>
Reviewed by Simon Fraser.
......
Tests that window.webkitAnimationTime remains the same during a script run and that all animations started within a script run are synchronized
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS startAnimationTime is defined.
PASS startAnimationTime is endAnimationTime
PASS window.getComputedStyle(div1).left is window.getComputedStyle(div2).left
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="../fast/js/resources/js-test-style.css">
<script src="../fast/js/resources/js-test-pre.js"></script>
<style>
.d {
position:absolute;
left:0px;
}
.d.animated {
left:100px;
-webkit-transition: left 0.1s linear;
-moz-transition: left 0.1s linear;
}
</style>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<div class="d" id="div1"></div>
<div class="d" id="div2"></div>
<script src="script-tests/animation-time.js"></script>
<script src="../fast/js/resources/js-test-post.js"></script>
</body>
</html>
description("Tests that window.webkitAnimationTime remains the same during a script run and that all animations started within a script run are synchronized");
window.jsTestIsAsync = true;
var div1 = document.getElementById("div1");
var div2 = document.getElementById("div2");
div1.classList.add("animated");
document.body.offsetTop; // Force a style recalc to start the first animation.
var startAnimationTime = window.webkitAnimationTime;
shouldBeDefined('startAnimationTime');
var startTime = Date.now();
while (Date.now() - startTime < 10) {}
var endAnimationTime = window.webkitAnimationTime;
// Test that the webkitAnimationTime value hasn't changed out from under us.
shouldBe('startAnimationTime', 'endAnimationTime');
// Start a second declarative animation ~10ms after the first one. They should be in sync.
div2.classList.add("animated");
window.setTimeout(function() {
shouldBe('window.getComputedStyle(div1).left', 'window.getComputedStyle(div2).left');
finishJSTest();
}, 50);
var successfullyParsed = true;
2011-01-06 James Robinson <jamesr@chromium.org>
Reviewed by Simon Fraser.
Implement mozilla's animationTime property
https://bugs.webkit.org/show_bug.cgi?id=51952
Chromium DRT support for webkitAnimationTime.
* DumpRenderTree/chromium/WebViewHost.cpp:
(WebViewHost::paintInvalidatedRegion):
2011-01-06 Julie Parent <jparent@chromium.org>
Reviewed by Tony Chang.
......@@ -1482,6 +1482,7 @@ void WebViewHost::paintInvalidatedRegion()
paintRect(rect);
}
ASSERT(m_paintRect.isEmpty());
webWidget()->clearCurrentAnimationTime();
}
PlatformCanvas* WebViewHost::canvas()
......
......@@ -446,6 +446,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
\
page/animation/AnimationBase.cpp \
page/animation/AnimationController.cpp \
page/animation/AnimationTimeController.cpp \
page/animation/CompositeAnimation.cpp \
page/animation/ImplicitAnimation.cpp \
page/animation/KeyframeAnimation.cpp \
......
......@@ -1278,6 +1278,7 @@ SET(WebCore_SOURCES
page/animation/AnimationBase.cpp
page/animation/AnimationController.cpp
page/animation/AnimationTimeController.cpp
page/animation/CompositeAnimation.cpp
page/animation/ImplicitAnimation.cpp
page/animation/KeyframeAnimation.cpp
......
2011-01-06 James Robinson <jamesr@chromium.org>
Reviewed by Simon Fraser.
Implement mozilla's animationTime property
https://bugs.webkit.org/show_bug.cgi?id=51952
Implements mozilla's animationTime property as described here:
https://developer.mozilla.org/en/DOM/window.mozAnimationStartTime
and http://hacks.mozilla.org/2010/08/more-efficient-javascript-animations-with-mozrequestanimationframe/
The property is called webkitAnimationTime as calling it the 'Start' time is not very informative.
This property exposes a notion of a 'current' time to use for declarative animations and allows
scripts to synchronize imperative animations with declarative ones if they choose to. Once queried
this time is saved and used for all declarative animation updates until the embedder paints/composites
the next frame and clears it, or 15ms elapse (in case the embedder isn't producing frames, for example
if the page is in a background tab).
This patch also ensures that all declarative animations started in the same script execution block
are synchronized even if some time elapses while script is running.
Test: fast/animation/animation-time.html
* WebCore.gypi:
* page/DOMWindow.cpp:
(WebCore::DOMWindow::webkitAnimationTime):
* page/DOMWindow.h:
* page/DOMWindow.idl:
* page/Frame.cpp:
(WebCore::Frame::currentAnimationTime):
* page/Frame.h:
* page/Page.cpp:
(WebCore::Page::Page):
* page/Page.h:
(WebCore::Page::animationTime):
* page/animation/AnimationController.cpp:
(WebCore::AnimationControllerPrivate::beginAnimationUpdateTime):
* page/animation/AnimationTimeController.cpp: Added.
(WebCore::AnimationTimeController::AnimationTimeController):
(WebCore::AnimationTimeController::~AnimationTimeController):
(WebCore::AnimationTimeController::currentAnimationTime):
(WebCore::AnimationTimeController::clearCurrentAnimationTime):
(WebCore::AnimationTimeController::clearCurrentAnimationTimeTimerFired):
* page/animation/AnimationTimeController.h: Added.
(WebCore::AnimationTimeController::create):
2011-01-06 Abhishek Arya <inferno@chromium.org>
Reviewed by Simon Fraser.
......
......@@ -2143,6 +2143,8 @@ webcore_sources += \
WebCore/page/animation/AnimationController.cpp \
WebCore/page/animation/AnimationController.h \
WebCore/page/animation/AnimationControllerPrivate.h \
WebCore/page/animation/AnimationTimeController.cpp \
WebCore/page/animation/AnimationTimeController.h \
WebCore/page/animation/CompositeAnimation.cpp \
WebCore/page/animation/CompositeAnimation.h \
WebCore/page/animation/ImplicitAnimation.cpp \
......
......@@ -519,6 +519,7 @@ __ZN7WebCore22contextMenuItemTagBoldEv
__ZN7WebCore22counterValueForElementEPNS_7ElementE
__ZN7WebCore22createFragmentFromTextEPNS_5RangeERKN3WTF6StringE
__ZN7WebCore22externalRepresentationEPNS_5FrameEj
__ZN7WebCore23AnimationTimeController25clearCurrentAnimationTimeEv
__ZN7WebCore23AuthenticationChallengeC1ERKNS_15ProtectionSpaceERKNS_10CredentialEjRKNS_16ResourceResponseERKNS_13ResourceErrorE
__ZN7WebCore23ReplaceSelectionCommandC1EPNS_8DocumentEN3WTF10PassRefPtrINS_16DocumentFragmentEEEbbbbbNS_10EditActionE
__ZN7WebCore23createFragmentFromNodesEPNS_8DocumentERKN3WTF6VectorIPNS_4NodeELm0EEE
......
......@@ -2220,6 +2220,8 @@
'page/animation/AnimationController.cpp',
'page/animation/AnimationController.h',
'page/animation/AnimationControllerPrivate.h',
'page/animation/AnimationTimeController.cpp',
'page/animation/AnimationTimeController.h',
'page/animation/CompositeAnimation.cpp',
'page/animation/CompositeAnimation.h',
'page/animation/ImplicitAnimation.cpp',
......
......@@ -1113,6 +1113,7 @@ SOURCES += \
notifications/NotificationCenter.cpp \
page/animation/AnimationBase.cpp \
page/animation/AnimationController.cpp \
page/animation/AnimationTimeController.cpp \
page/animation/CompositeAnimation.cpp \
page/animation/ImplicitAnimation.cpp \
page/animation/KeyframeAnimation.cpp \
......
......@@ -24241,6 +24241,14 @@
RelativePath="..\page\animation\AnimationControllerPrivate.h"
>
</File>
<File
RelativePath="..\page\animation\AnimationTimeController.cpp"
>
</File>
<File
RelativePath="..\page\animation\AnimationTimeController.h"
>
</File>
<File
RelativePath="..\page\BarInfo.cpp"
>
......@@ -910,6 +910,8 @@
37FD4298118368460093C029 /* TreeDepthLimit.h in Headers */ = {isa = PBXBuildFile; fileRef = 37FD4297118368460093C029 /* TreeDepthLimit.h */; };
3888F6EE128C9889000CA8E0 /* InspectorFileSystemAgent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3888F6EC128C9889000CA8E0 /* InspectorFileSystemAgent.cpp */; };
3888F6EF128C9889000CA8E0 /* InspectorFileSystemAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 3888F6ED128C9889000CA8E0 /* InspectorFileSystemAgent.h */; };
38DF1B3512D5284200F0477E /* AnimationTimeController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38DF1B3312D5284200F0477E /* AnimationTimeController.cpp */; };
38DF1B3612D5284200F0477E /* AnimationTimeController.h in Headers */ = {isa = PBXBuildFile; fileRef = 38DF1B3412D5284200F0477E /* AnimationTimeController.h */; settings = {ATTRIBUTES = (Private, ); }; };
3AC648B2129E146500C3EB25 /* EditingBoundary.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AC648B1129E146500C3EB25 /* EditingBoundary.h */; settings = {ATTRIBUTES = (Private, ); }; };
41002CCD0F66EDEF009E660D /* ScriptFunctionCall.h in Headers */ = {isa = PBXBuildFile; fileRef = 41002CCB0F66EDEF009E660D /* ScriptFunctionCall.h */; };
41002CCE0F66EDEF009E660D /* ScriptFunctionCall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41002CCC0F66EDEF009E660D /* ScriptFunctionCall.cpp */; };
......@@ -7228,6 +7230,8 @@
37FD4297118368460093C029 /* TreeDepthLimit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeDepthLimit.h; sourceTree = "<group>"; };
3888F6EC128C9889000CA8E0 /* InspectorFileSystemAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorFileSystemAgent.cpp; sourceTree = "<group>"; };
3888F6ED128C9889000CA8E0 /* InspectorFileSystemAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorFileSystemAgent.h; sourceTree = "<group>"; };
38DF1B3312D5284200F0477E /* AnimationTimeController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AnimationTimeController.cpp; path = animation/AnimationTimeController.cpp; sourceTree = "<group>"; };
38DF1B3412D5284200F0477E /* AnimationTimeController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AnimationTimeController.h; path = animation/AnimationTimeController.h; sourceTree = "<group>"; };
3AC648B1129E146500C3EB25 /* EditingBoundary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditingBoundary.h; sourceTree = "<group>"; };
41002CCB0F66EDEF009E660D /* ScriptFunctionCall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptFunctionCall.h; sourceTree = "<group>"; };
41002CCC0F66EDEF009E660D /* ScriptFunctionCall.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptFunctionCall.cpp; sourceTree = "<group>"; };
......@@ -13023,6 +13027,8 @@
316FE1090E6E1DA700BF6088 /* AnimationController.cpp */,
316FE10A0E6E1DA700BF6088 /* AnimationController.h */,
0F15DA890F3AAEE70000CE47 /* AnimationControllerPrivate.h */,
38DF1B3312D5284200F0477E /* AnimationTimeController.cpp */,
38DF1B3412D5284200F0477E /* AnimationTimeController.h */,
316FE10B0E6E1DA700BF6088 /* CompositeAnimation.cpp */,
316FE10C0E6E1DA700BF6088 /* CompositeAnimation.h */,
316FE10D0E6E1DA700BF6088 /* ImplicitAnimation.cpp */,
......@@ -19310,6 +19316,7 @@
316FE1120E6E1DA700BF6088 /* AnimationBase.h in Headers */,
316FE1140E6E1DA700BF6088 /* AnimationController.h in Headers */,
0F15DA8A0F3AAEE70000CE47 /* AnimationControllerPrivate.h in Headers */,
38DF1B3612D5284200F0477E /* AnimationTimeController.h in Headers */,
49E912AD0EFAC906009D0CAF /* AnimationList.h in Headers */,
93309DD7099E64920056E581 /* AppendNodeCommand.h in Headers */,
1A8F6BBD0DB55CDC001DB794 /* ApplicationCache.h in Headers */,
......@@ -22595,6 +22602,7 @@
49E912AA0EFAC906009D0CAF /* Animation.cpp in Sources */,
316FE1110E6E1DA700BF6088 /* AnimationBase.cpp in Sources */,
316FE1130E6E1DA700BF6088 /* AnimationController.cpp in Sources */,
38DF1B3512D5284200F0477E /* AnimationTimeController.cpp in Sources */,
49E912AC0EFAC906009D0CAF /* AnimationList.cpp in Sources */,
93309DD6099E64920056E581 /* AppendNodeCommand.cpp in Sources */,
1A8F6BBC0DB55CDC001DB794 /* ApplicationCache.cpp in Sources */,
......@@ -1464,6 +1464,13 @@ void DOMWindow::clearInterval(int timeoutId)
DOMTimer::removeById(context, timeoutId);
}
DOMTimeStamp DOMWindow::webkitAnimationTime()
{
if (Frame* f = frame())
return convertSecondsToDOMTimeStamp(f->currentAnimationTime());
return convertSecondsToDOMTimeStamp(currentTime());
}
bool DOMWindow::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
{
if (!EventTarget::addEventListener(eventType, listener, useCapture))
......
......@@ -27,6 +27,7 @@
#ifndef DOMWindow_h
#define DOMWindow_h
#include "DOMTimeStamp.h"
#include "KURL.h"
#include "MessagePort.h"
#include "SecurityOrigin.h"
......@@ -237,6 +238,9 @@ namespace WebCore {
int setInterval(PassOwnPtr<ScheduledAction>, int timeout, ExceptionCode&);
void clearInterval(int timeoutId);
// WebKit animation extensions
DOMTimeStamp webkitAnimationTime();
// Events
// EventTarget API
virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
......
......@@ -236,6 +236,9 @@ module window {
// [Custom] long setInterval(in DOMString code, in long timeout);
void clearInterval(in long handle);
// WebKit animation extensions
readonly attribute DOMTimeStamp webkitAnimationTime;
// Base64
DOMString atob(in [ConvertNullToNullString] DOMString string)
raises(DOMException);
......
......@@ -29,6 +29,7 @@
#include "config.h"
#include "Frame.h"
#include "AnimationTimeController.h"
#include "ApplyStyleCommand.h"
#include "CSSComputedStyleDeclaration.h"
#include "CSSMutableStyleDeclaration.h"
......@@ -83,6 +84,7 @@
#include "markup.h"
#include "npruntime_impl.h"
#include "visible_units.h"
#include <wtf/CurrentTime.h>
#include <wtf/RefCountedLeakCounter.h>
#include <wtf/StdLibExtras.h>
......@@ -752,6 +754,14 @@ void Frame::transferChildFrameToNewDocument()
}
}
double Frame::currentAnimationTime()
{
if (Page* p = page())
return p->animationTime()->currentAnimationTime();
return currentTime();
}
String Frame::documentTypeString() const
{
if (DocumentType* doctype = document()->doctype())
......
......@@ -107,6 +107,8 @@ namespace WebCore {
void transferChildFrameToNewDocument();
double currentAnimationTime();
// ======== All public functions below this point are candidates to move out of Frame into another class. ========
bool isDisconnected() const;
......
......@@ -20,6 +20,7 @@
#include "config.h"
#include "Page.h"
#include "AnimationTimeController.h"
#include "BackForwardController.h"
#include "BackForwardList.h"
#include "Base64.h"
......@@ -156,6 +157,7 @@ Page::Page(const PageClients& pageClients)
, m_settings(adoptPtr(new Settings(this)))
, m_progress(adoptPtr(new ProgressTracker))
, m_backForwardController(adoptPtr(new BackForwardController(this, pageClients.backForwardClient)))
, m_animationTimeController(AnimationTimeController::create())
, m_theme(RenderTheme::themeForPage(this))
, m_editorClient(pageClients.editorClient)
, m_frameCount(0)
......
......@@ -39,6 +39,7 @@ namespace JSC {
namespace WebCore {
class AnimationTimeController;
class BackForwardController;
class BackForwardList;
class Chrome;
......@@ -182,6 +183,7 @@ namespace WebCore {
Settings* settings() const { return m_settings.get(); }
ProgressTracker* progress() const { return m_progress.get(); }
BackForwardController* backForward() const { return m_backForwardController.get(); }
AnimationTimeController* animationTime() const { return m_animationTimeController.get(); }
enum ViewMode {
ViewModeInvalid,
......@@ -327,6 +329,7 @@ namespace WebCore {
OwnPtr<ProgressTracker> m_progress;
OwnPtr<BackForwardController> m_backForwardController;
OwnPtr<AnimationTimeController> m_animationTimeController;
RefPtr<Frame> m_mainFrame;
RefPtr<HistoryItem> m_globalHistoryItem;
......@@ -380,6 +383,8 @@ namespace WebCore {
NotificationPresenter* m_notificationPresenter;
#endif
double m_currentAnimationTime;
ViewMode m_viewMode;
ViewportArguments m_viewportArguments;
......
......@@ -316,7 +316,7 @@ bool AnimationControllerPrivate::pauseTransitionAtTime(RenderObject* renderer, c
double AnimationControllerPrivate::beginAnimationUpdateTime()
{
if (m_beginAnimationUpdateTime == cBeginAnimationUpdateTimeNotSet)
m_beginAnimationUpdateTime = currentTime();
m_beginAnimationUpdateTime = m_frame->currentAnimationTime();
return m_beginAnimationUpdateTime;
}
......
/*
* Copyright (C) 2011, Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "AnimationTimeController.h"
#include <wtf/CurrentTime.h>
static const double cCurrentAnimationTimeNotSet = -1;
namespace WebCore {
AnimationTimeController::AnimationTimeController()
: m_currentAnimationTime(cCurrentAnimationTimeNotSet)
, m_clearCurrentAnimationTimeTimer(this, &AnimationTimeController::clearCurrentAnimationTimeTimerFired)
{
}
AnimationTimeController::~AnimationTimeController()
{
}
double AnimationTimeController::currentAnimationTime()
{
if (m_currentAnimationTime == cCurrentAnimationTimeNotSet) {
m_currentAnimationTime = currentTime();
// Clear out the animation time after 15ms if it hasn't been already.
m_clearCurrentAnimationTimeTimer.startOneShot(0.015);
}
return m_currentAnimationTime;
}
void AnimationTimeController::clearCurrentAnimationTime()
{
m_currentAnimationTime = cCurrentAnimationTimeNotSet;
if (m_clearCurrentAnimationTimeTimer.isActive())
m_clearCurrentAnimationTimeTimer.stop();
}
void AnimationTimeController::clearCurrentAnimationTimeTimerFired(Timer<AnimationTimeController>*)
{
clearCurrentAnimationTime();
}
}
/*
* Copyright (C) 2011, Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef AnimationTimeController_h
#define AnimationTimeController_h
#include "Timer.h"
#include <wtf/PassOwnPtr.h>
namespace WebCore {
class AnimationTimeController : public Noncopyable {
public:
static PassOwnPtr<AnimationTimeController> create()
{
return adoptPtr(new AnimationTimeController);
}
~AnimationTimeController();
double currentAnimationTime();
void clearCurrentAnimationTime();
private:
AnimationTimeController();
void clearCurrentAnimationTimeTimerFired(Timer<AnimationTimeController>*);
double m_currentAnimationTime;
Timer<AnimationTimeController> m_clearCurrentAnimationTimeTimer;
};
}
#endif // AnimationTimeController_h
2011-01-06 James Robinson <jamesr@chromium.org>
Reviewed by Simon Fraser.
Implement mozilla's animationTime property
https://bugs.webkit.org/show_bug.cgi?id=51952
WebKit API support for webkitAnimationTime.
* public/WebWidget.h:
* src/WebPopupMenuImpl.cpp:
(WebKit::WebPopupMenuImpl::clearCurrentAnimationTime):
* src/WebPopupMenuImpl.h:
* src/WebViewImpl.cpp:
(WebKit::WebViewImpl::clearCurrentAnimationTime):
* src/WebViewImpl.h:
2010-12-29 John Abd-El-Malek <jam@chromium.org>
Reviewed by Darin Fisher.
......@@ -56,6 +56,10 @@ public:
// Called to resize the WebWidget.
virtual void resize(const WebSize&) = 0;
// Called to indicate that this widget has been rendered and the widget
// no longer needs to store the animation time.
virtual void clearCurrentAnimationTime() = 0;
// Called to layout the WebWidget. This MUST be called before Paint,
// and it may result in calls to WebWidgetClient::didInvalidateRect.
virtual void layout() = 0;
......
......@@ -151,6 +151,10 @@ void WebPopupMenuImpl::resize(const WebSize& newSize)
}
}
void WebPopupMenuImpl::clearCurrentAnimationTime()
{
}
void WebPopupMenuImpl::layout()
{
}
......
......@@ -61,6 +61,7 @@ public:
virtual void close();
virtual WebSize size() { return m_size; }
virtual void resize(const WebSize&);
virtual void clearCurrentAnimationTime();
virtual void layout();
virtual void paint(WebCanvas* canvas, const WebRect& rect);
virtual void themeChanged();
......
......@@ -31,6 +31,7 @@
#include "config.h"
#include "WebViewImpl.h"
#include "AnimationTimeController.h"
#include "AutoFillPopupMenuClient.h"
#include "AXObjectCache.h"
#include "BackForwardListImpl.h"
......@@ -977,6 +978,13 @@ void WebViewImpl::resize(const WebSize& newSize)
#endif
}
void WebViewImpl::clearCurrentAnimationTime()
{
WebFrameImpl* webframe = mainFrameImpl();
if (webframe)
webframe->frame()->page()->animationTime()->clearCurrentAnimationTime();
}
void WebViewImpl::layout()
{
WebFrameImpl* webframe = mainFrameImpl();
......
......@@ -92,6 +92,7 @@ public:
virtual void close();
virtual WebSize size() { return m_size; }
virtual void resize(const WebSize&);
virtual void clearCurrentAnimationTime();
virtual void layout();
virtual void paint(WebCanvas*, const WebRect&);
virtual void themeChanged();
......
......@@ -75,6 +75,7 @@
#import "WebViewInternal.h"
#import <AppKit/NSAccessibility.h>
#import <ApplicationServices/ApplicationServices.h>
#import <WebCore/AnimationTimeController.h>
#import <WebCore/CSSMutableStyleDeclaration.h>
#import <WebCore/CachedImage.h>
#import <WebCore/CachedResourceClient.h>
......@@ -3505,6 +3506,10 @@ static void setMenuTargets(NSMenu* menu)
}
#endif