2011-01-06 James Robinson <jamesr@chromium.org>
authorjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Jan 2011 19:07:25 +0000 (19:07 +0000)
committerjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Jan 2011 19:07:25 +0000 (19:07 +0000)
        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: https://svn.webkit.org/repository/webkit/trunk@75169 268f45cc-cd09-0410-ab3c-d52691b4dbfc

37 files changed:
LayoutTests/ChangeLog
LayoutTests/animations/animation-time-expected.txt [new file with mode: 0644]
LayoutTests/animations/animation-time.html [new file with mode: 0644]
LayoutTests/animations/script-tests/animation-time.js [new file with mode: 0644]
Tools/ChangeLog
Tools/DumpRenderTree/chromium/WebViewHost.cpp
WebCore/Android.mk
WebCore/CMakeLists.txt
WebCore/ChangeLog
WebCore/GNUmakefile.am
WebCore/WebCore.exp.in
WebCore/WebCore.gypi
WebCore/WebCore.pro
WebCore/WebCore.vcproj/WebCore.vcproj
WebCore/WebCore.xcodeproj/project.pbxproj
WebCore/page/DOMWindow.cpp
WebCore/page/DOMWindow.h
WebCore/page/DOMWindow.idl
WebCore/page/Frame.cpp
WebCore/page/Frame.h
WebCore/page/Page.cpp
WebCore/page/Page.h
WebCore/page/animation/AnimationController.cpp
WebCore/page/animation/AnimationTimeController.cpp [new file with mode: 0644]
WebCore/page/animation/AnimationTimeController.h [new file with mode: 0644]
WebKit/chromium/ChangeLog
WebKit/chromium/public/WebWidget.h
WebKit/chromium/src/WebPopupMenuImpl.cpp
WebKit/chromium/src/WebPopupMenuImpl.h
WebKit/chromium/src/WebViewImpl.cpp
WebKit/chromium/src/WebViewImpl.h
WebKit/mac/WebView/WebHTMLView.mm
WebKit/mac/WebView/WebView.mm
WebKit2/ChangeLog
WebKit2/WebProcess/WebPage/ChunkedUpdateDrawingArea.cpp
WebKit2/WebProcess/WebPage/WebPage.cpp
WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm

index af37e61..0ad6f0c 100644 (file)
@@ -1,3 +1,16 @@
+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.
diff --git a/LayoutTests/animations/animation-time-expected.txt b/LayoutTests/animations/animation-time-expected.txt
new file mode 100644 (file)
index 0000000..86c2353
--- /dev/null
@@ -0,0 +1,12 @@
+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
+
diff --git a/LayoutTests/animations/animation-time.html b/LayoutTests/animations/animation-time.html
new file mode 100644 (file)
index 0000000..0cf6950
--- /dev/null
@@ -0,0 +1,27 @@
+<!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>
diff --git a/LayoutTests/animations/script-tests/animation-time.js b/LayoutTests/animations/script-tests/animation-time.js
new file mode 100644 (file)
index 0000000..4fcf312
--- /dev/null
@@ -0,0 +1,28 @@
+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;
index 9ec4148..b1c397c 100644 (file)
@@ -1,3 +1,15 @@
+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.
index 849312c..bbc32fc 100644 (file)
@@ -1482,6 +1482,7 @@ void WebViewHost::paintInvalidatedRegion()
         paintRect(rect);
     }
     ASSERT(m_paintRect.isEmpty());
+    webWidget()->clearCurrentAnimationTime();
 }
 
 PlatformCanvas* WebViewHost::canvas()
index 20db667..530e6a1 100644 (file)
@@ -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 \
index 0be0bb8..5515f0e 100644 (file)
@@ -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
index 7658e56..d96839d 100644 (file)
@@ -1,3 +1,48 @@
+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.
index f01088e..06d7fc5 100644 (file)
@@ -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 \
index e4462f3..aac7dde 100644 (file)
@@ -519,6 +519,7 @@ __ZN7WebCore22contextMenuItemTagBoldEv
 __ZN7WebCore22counterValueForElementEPNS_7ElementE
 __ZN7WebCore22createFragmentFromTextEPNS_5RangeERKN3WTF6StringE
 __ZN7WebCore22externalRepresentationEPNS_5FrameEj
+__ZN7WebCore23AnimationTimeController25clearCurrentAnimationTimeEv
 __ZN7WebCore23AuthenticationChallengeC1ERKNS_15ProtectionSpaceERKNS_10CredentialEjRKNS_16ResourceResponseERKNS_13ResourceErrorE
 __ZN7WebCore23ReplaceSelectionCommandC1EPNS_8DocumentEN3WTF10PassRefPtrINS_16DocumentFragmentEEEbbbbbNS_10EditActionE
 __ZN7WebCore23createFragmentFromNodesEPNS_8DocumentERKN3WTF6VectorIPNS_4NodeELm0EEE
index 6a519fb..14f39d6 100644 (file)
             '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',
index 96298e3..68723bb 100644 (file)
@@ -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 \
index e808cb9..a7ac692 100755 (executable)
                                >
                        </File>
                        <File
+                               RelativePath="..\page\animation\AnimationTimeController.cpp"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\page\animation\AnimationTimeController.h"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\page\BarInfo.cpp"
                                >
                        </File>
index 41c2532..0c53e09 100644 (file)
                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 */; };
                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>"; };
                                316FE1090E6E1DA700BF6088 /* AnimationController.cpp */,
                                316FE10A0E6E1DA700BF6088 /* AnimationController.h */,
                                0F15DA890F3AAEE70000CE47 /* AnimationControllerPrivate.h */,
+                               38DF1B3312D5284200F0477E /* AnimationTimeController.cpp */,
+                               38DF1B3412D5284200F0477E /* AnimationTimeController.h */,
                                316FE10B0E6E1DA700BF6088 /* CompositeAnimation.cpp */,
                                316FE10C0E6E1DA700BF6088 /* CompositeAnimation.h */,
                                316FE10D0E6E1DA700BF6088 /* ImplicitAnimation.cpp */,
                                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 */,
                                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 */,
index 3497f13..0ab8912 100644 (file)
@@ -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))
index 1c84f3c..4f68ed3 100644 (file)
@@ -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);
index f3aa7ba..3718108 100644 (file)
@@ -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);
index 85523c6..5c5ad37 100644 (file)
@@ -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())
index 1cdfa81..892a5ea 100644 (file)
@@ -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;
index a78cfb7..b2c0241 100644 (file)
@@ -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)
index 7413bb6..2a057c3 100644 (file)
@@ -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;
index e1281dd..a4e0063 100644 (file)
@@ -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;
 }
 
diff --git a/WebCore/page/animation/AnimationTimeController.cpp b/WebCore/page/animation/AnimationTimeController.cpp
new file mode 100644 (file)
index 0000000..a0f2b33
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * 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();
+}
+
+}
diff --git a/WebCore/page/animation/AnimationTimeController.h b/WebCore/page/animation/AnimationTimeController.h
new file mode 100644 (file)
index 0000000..647fff2
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * 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
index 69a3070..7d512b0 100644 (file)
@@ -1,3 +1,20 @@
+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.
index ccad134..676d303 100644 (file)
@@ -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;
index 63ebed8..d25b0f1 100644 (file)
@@ -151,6 +151,10 @@ void WebPopupMenuImpl::resize(const WebSize& newSize)
     }
 }
 
+void WebPopupMenuImpl::clearCurrentAnimationTime()
+{
+}
+
 void WebPopupMenuImpl::layout()
 {
 }
index b8ef7ba..2817101 100644 (file)
@@ -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();
index e47c89e..54e72b3 100644 (file)
@@ -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();
index cc25c84..f5b5df3 100644 (file)
@@ -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();
index 093f3db..8083fce 100644 (file)
@@ -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
 
+    Frame* frame = [webView _mainCoreFrame];
+    if (frame && frame->page())
+        frame->page()->animationTime()->clearCurrentAnimationTime();
+
     if (webView)
         CallUIDelegate(webView, @selector(webView:didDrawFrame:), [self _frame]);
 }
index 96ea7d0..1d368e4 100644 (file)
 #import <JavaScriptCore/JSValueRef.h>
 #import <WebCore/AbstractDatabase.h>
 #import <WebCore/ApplicationCacheStorage.h>
+#import <WebCore/AnimationTimeController.h>
 #import <WebCore/BackForwardListImpl.h>
 #import <WebCore/MemoryCache.h>
 #import <WebCore/ColorMac.h>
@@ -5957,6 +5958,10 @@ static void layerSyncRunLoopObserverCallBack(CFRunLoopObserverRef, CFRunLoopActi
         // so that the layers draw with up-to-date layout. 
         [webView _viewWillDrawInternal];
     }
+
+    Frame* frame = [webView _mainCoreFrame];
+    if (frame && frame->page())
+        frame->page()->animationTime()->clearCurrentAnimationTime();
 }
 
 - (void)_scheduleCompositingLayerSync
index 65c0212..7268236 100644 (file)
@@ -1,3 +1,20 @@
+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):
+
 2011-01-06  Darin Adler  <darin@apple.com>
 
         Redo the half-done rename from the last check-in.
index 1cce5d0..53a1f25 100644 (file)
@@ -32,6 +32,8 @@
 #include "WebCoreArgumentCoders.h"
 #include "WebPage.h"
 #include "WebProcess.h"
+#include <WebCore/AnimationTimeController.h>
+#include <WebCore/Page.h>
 
 using namespace WebCore;
 
@@ -90,6 +92,8 @@ void ChunkedUpdateDrawingArea::display()
     paintIntoUpdateChunk(&updateChunk);
 
     WebProcess::shared().connection()->send(DrawingAreaProxyLegacyMessage::Update, m_webPage->pageID(), CoreIPC::In(updateChunk));
+    
+    m_webPage->corePage()->animationTime()->clearCurrentAnimationTime();
 
     m_isWaitingForUpdate = true;
     m_displayTimer.stop();
@@ -143,6 +147,7 @@ void ChunkedUpdateDrawingArea::setSize(const IntSize& viewSize)
     m_displayTimer.stop();
 
     WebProcess::shared().connection()->send(DrawingAreaProxyLegacyMessage::DidSetSize, m_webPage->pageID(), CoreIPC::In(updateChunk));
+    m_webPage->corePage()->animationTime()->clearCurrentAnimationTime();
 }
 
 void ChunkedUpdateDrawingArea::suspendPainting()
index c9cebcf..29a708d 100644 (file)
@@ -59,6 +59,7 @@
 #include "WebProcessProxyMessageKinds.h"
 #include "WebProcessProxyMessages.h"
 #include <WebCore/AbstractDatabase.h>
+#include <WebCore/AnimationTimeController.h>
 #include <WebCore/ArchiveResource.h>
 #include <WebCore/Chrome.h>
 #include <WebCore/ContextMenuController.h>
@@ -515,6 +516,8 @@ void WebPage::drawRect(GraphicsContext& graphicsContext, const IntRect& rect)
         m_pageOverlay->drawRect(graphicsContext, rect);
         graphicsContext.restore();
     }
+    
+    m_page->animationTime()->clearCurrentAnimationTime();
 }
 
 double WebPage::textZoomFactor() const
index f8b7e71..e30a69a 100644 (file)
@@ -31,6 +31,7 @@
 #include "WebKitSystemInterface.h"
 #include "WebPage.h"
 #include "WebProcess.h"
+#include <WebCore/AnimationTimeController.h>
 #include <WebCore/Frame.h>
 #include <WebCore/FrameView.h>
 #include <WebCore/GraphicsLayer.h>
@@ -121,6 +122,8 @@ void LayerBackedDrawingArea::syncCompositingLayers()
     if (!didSync) {
     
     }
+
+    m_webPage->corePage()->animationTime()->clearCurrentAnimationTime();
 }
 
 void LayerBackedDrawingArea::setUpUpdateLayoutRunLoopObserver()