[web-animations] Add Animatable, AnimationEffect, KeyframeEffect and Animation interface
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Jun 2016 17:32:48 +0000 (17:32 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Jun 2016 17:32:48 +0000 (17:32 +0000)
https://bugs.webkit.org/show_bug.cgi?id=156096

Patch by Rawinder Singh <rawinder.singh-webkit@cisra.canon.com.au> on 2016-06-08
Reviewed by Dean Jackson.

Adds:
Source/JavaScriptCore:

- Animatable interface and implementation of getAnimations in Element
- Interface and implementation for Document getAnimations method.
- AnimationEffect interface and class stub.
- KeyframeEffect interface and constructor implementation.
- 'Animation' interface, constructor and query methods for effect and timeline.
- Remove runtime condition on Web animation interfaces (compile time flag is specified).

* runtime/CommonIdentifiers.h:

Source/WebCore:

- Animatable interface and implementation of getAnimations in Element
- Interface and implementation for Document getAnimations method.
- AnimationEffect interface and class stub.
- KeyframeEffect interface and constructor implementation.
- 'Animation' interface, constructor and query methods for effect and timeline.
- Remove runtime condition on Web animation interfaces (compile time flag is specified).

Test: webanimations/Document.html

* CMakeLists.txt:
* DerivedSources.make:
* PlatformGTK.cmake:
* WebCore.xcodeproj/project.pbxproj:
* animation/Animatable.idl: Copied from Source/WebCore/animation/DocumentAnimation.idl.
* animation/AnimationEffect.cpp: Copied from Source/WebCore/animation/AnimationTimeline.cpp.
(WebCore::AnimationEffect::AnimationEffect):
(WebCore::AnimationEffect::~AnimationEffect):
(WebCore::AnimationEffect::setAnimation):
(WebCore::AnimationEffect::isCurrent):
(WebCore::AnimationEffect::isInEffect):
* animation/AnimationEffect.h: Copied from Source/WebCore/animation/DocumentTimeline.cpp.
* animation/AnimationEffect.idl: Copied from Source/WebCore/animation/AnimationTimeline.idl.
* animation/AnimationTimeline.cpp:
(WebCore::AnimationTimeline::destroy):
(WebCore::AnimationTimeline::attachAnimation):
(WebCore::AnimationTimeline::detachAnimation):
* animation/AnimationTimeline.h:
* animation/AnimationTimeline.idl:
* animation/DocumentAnimation.cpp:
(WebCore::DocumentAnimation::timeline):
(WebCore::DocumentAnimation::getAnimations):
(WebCore::DocumentAnimation::addAnimation):
(WebCore::DocumentAnimation::removeAnimation):
* animation/DocumentAnimation.h:
(WebCore::DocumentAnimation::getAnimations):
* animation/DocumentAnimation.idl:
* animation/DocumentTimeline.cpp:
(WebCore::DocumentTimeline::create):
(WebCore::DocumentTimeline::DocumentTimeline):
(WebCore::DocumentTimeline::attach):
(WebCore::DocumentTimeline::detach):
* animation/DocumentTimeline.h:
* animation/DocumentTimeline.idl:
* animation/KeyframeEffect.cpp: Copied from Source/WebCore/animation/DocumentTimeline.cpp.
(WebCore::KeyframeEffect::create):
(WebCore::KeyframeEffect::KeyframeEffect):
(WebCore::KeyframeEffect::~KeyframeEffect):
* animation/KeyframeEffect.h: Copied from Source/WebCore/animation/DocumentTimeline.h.
* animation/KeyframeEffect.idl: Copied from Source/WebCore/animation/AnimationTimeline.idl.
* animation/WebAnimation.cpp: Copied from Source/WebCore/animation/DocumentAnimation.cpp.
(WebCore::WebAnimation::create):
(WebCore::WebAnimation::WebAnimation):
(WebCore::WebAnimation::~WebAnimation):
* animation/WebAnimation.h: Copied from Source/WebCore/animation/DocumentAnimation.h.
* animation/WebAnimation.idl: Copied from Source/WebCore/animation/DocumentTimeline.idl.
* bindings/scripts/CodeGeneratorGObject.pm:
* dom/Element.cpp:
(WebCore::Element::getAnimations):
* dom/Element.h:
* dom/Element.idl:

Source/WebKit/mac:

- Setup interface for enabling runtime flag for Web animations through preferences.

* WebView/WebPreferenceKeysPrivate.h:
* WebView/WebPreferences.mm:
(+[WebPreferences initialize]):
(-[WebPreferences webAnimationsEnabled]):
(-[WebPreferences setWebAnimationsEnabled:]):
* WebView/WebPreferencesPrivate.h:
* WebView/WebView.mm:
(-[WebView _preferencesChanged:]):

LayoutTests:

- Animatable interface and implementation of getAnimations in Element
- Interface and implementation for Document getAnimations method.
- AnimationEffect interface and class stub.
- KeyframeEffect interface and constructor implementation.
- 'Animation' interface, constructor and query methods for effect and timeline.
- Remove runtime condition on Web animation interfaces (compile time flag is specified).

* platform/gtk/js/dom/global-constructors-attributes-expected.txt:
* platform/mac-yosemite/js/dom/global-constructors-attributes-expected.txt:
* webanimations/Document-expected.txt: Added.
* webanimations/Document.html: Added.
* webanimations/script-tests/Document.js: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@201810 268f45cc-cd09-0410-ab3c-d52691b4dbfc

41 files changed:
LayoutTests/ChangeLog
LayoutTests/platform/gtk/js/dom/global-constructors-attributes-expected.txt
LayoutTests/platform/mac-yosemite/js/dom/global-constructors-attributes-expected.txt
LayoutTests/webanimations/Document-expected.txt [new file with mode: 0644]
LayoutTests/webanimations/Document.html [new file with mode: 0644]
LayoutTests/webanimations/script-tests/Document.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/CommonIdentifiers.h
Source/WebCore/CMakeLists.txt
Source/WebCore/ChangeLog
Source/WebCore/DerivedSources.make
Source/WebCore/PlatformGTK.cmake
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/animation/Animatable.idl [new file with mode: 0644]
Source/WebCore/animation/AnimationEffect.cpp [new file with mode: 0644]
Source/WebCore/animation/AnimationEffect.h [new file with mode: 0644]
Source/WebCore/animation/AnimationEffect.idl [new file with mode: 0644]
Source/WebCore/animation/AnimationTimeline.cpp
Source/WebCore/animation/AnimationTimeline.h
Source/WebCore/animation/AnimationTimeline.idl
Source/WebCore/animation/DocumentAnimation.cpp
Source/WebCore/animation/DocumentAnimation.h
Source/WebCore/animation/DocumentAnimation.idl
Source/WebCore/animation/DocumentTimeline.cpp
Source/WebCore/animation/DocumentTimeline.h
Source/WebCore/animation/DocumentTimeline.idl
Source/WebCore/animation/KeyframeEffect.cpp [new file with mode: 0644]
Source/WebCore/animation/KeyframeEffect.h [new file with mode: 0644]
Source/WebCore/animation/KeyframeEffect.idl [new file with mode: 0644]
Source/WebCore/animation/WebAnimation.cpp [new file with mode: 0644]
Source/WebCore/animation/WebAnimation.h [new file with mode: 0644]
Source/WebCore/animation/WebAnimation.idl [new file with mode: 0644]
Source/WebCore/bindings/scripts/CodeGeneratorGObject.pm
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/Element.h
Source/WebCore/dom/Element.idl
Source/WebKit/mac/ChangeLog
Source/WebKit/mac/WebView/WebPreferenceKeysPrivate.h
Source/WebKit/mac/WebView/WebPreferences.mm
Source/WebKit/mac/WebView/WebPreferencesPrivate.h
Source/WebKit/mac/WebView/WebView.mm

index eceab39..cd55920 100644 (file)
@@ -1,3 +1,24 @@
+2016-06-08  Rawinder Singh  <rawinder.singh-webkit@cisra.canon.com.au>
+
+        [web-animations] Add Animatable, AnimationEffect, KeyframeEffect and Animation interface
+        https://bugs.webkit.org/show_bug.cgi?id=156096
+
+        Reviewed by Dean Jackson.
+
+        Adds:
+        - Animatable interface and implementation of getAnimations in Element
+        - Interface and implementation for Document getAnimations method.
+        - AnimationEffect interface and class stub.
+        - KeyframeEffect interface and constructor implementation.
+        - 'Animation' interface, constructor and query methods for effect and timeline.
+        - Remove runtime condition on Web animation interfaces (compile time flag is specified).
+
+        * platform/gtk/js/dom/global-constructors-attributes-expected.txt:
+        * platform/mac-yosemite/js/dom/global-constructors-attributes-expected.txt:
+        * webanimations/Document-expected.txt: Added.
+        * webanimations/Document.html: Added.
+        * webanimations/script-tests/Document.js: Added.
+
 2016-06-08  Chris Dumez  <cdumez@apple.com>
 
         self.hasOwnProperty() does not work inside Web workers
index bf9681e..727497f 100644 (file)
@@ -8,16 +8,41 @@ PASS Object.getOwnPropertyDescriptor(global, 'AnalyserNode').hasOwnProperty('get
 PASS Object.getOwnPropertyDescriptor(global, 'AnalyserNode').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'AnalyserNode').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'AnalyserNode').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Animation').value is Animation
+PASS Object.getOwnPropertyDescriptor(global, 'Animation').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Animation').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Animation').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Animation').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationEffectReadOnly').value is AnimationEffectReadOnly
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationEffectReadOnly').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationEffectReadOnly').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationEffectReadOnly').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationEffectReadOnly').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'AnimationEvent').value is AnimationEvent
 PASS Object.getOwnPropertyDescriptor(global, 'AnimationEvent').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'AnimationEvent').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'AnimationEvent').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'AnimationEvent').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationTimeline').value is AnimationTimeline
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationTimeline').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationTimeline').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationTimeline').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationTimeline').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'ApplicationCache').value is ApplicationCache
 PASS Object.getOwnPropertyDescriptor(global, 'ApplicationCache').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'ApplicationCache').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'ApplicationCache').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'ApplicationCache').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Array').value is Array
+PASS Object.getOwnPropertyDescriptor(global, 'Array').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Array').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Array').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Array').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'ArrayBuffer').value is ArrayBuffer
+PASS Object.getOwnPropertyDescriptor(global, 'ArrayBuffer').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'ArrayBuffer').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'ArrayBuffer').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'ArrayBuffer').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'Attr').value is Attr
 PASS Object.getOwnPropertyDescriptor(global, 'Attr').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Attr').hasOwnProperty('set') is false
@@ -63,11 +88,16 @@ PASS Object.getOwnPropertyDescriptor(global, 'AudioProcessingEvent').hasOwnPrope
 PASS Object.getOwnPropertyDescriptor(global, 'AudioProcessingEvent').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'AudioProcessingEvent').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'AudioProcessingEvent').configurable is true
-PASS Object.getOwnPropertyDescriptor(global, 'AudioStreamTrack').value is AudioStreamTrack
-PASS Object.getOwnPropertyDescriptor(global, 'AudioStreamTrack').hasOwnProperty('get') is false
-PASS Object.getOwnPropertyDescriptor(global, 'AudioStreamTrack').hasOwnProperty('set') is false
-PASS Object.getOwnPropertyDescriptor(global, 'AudioStreamTrack').enumerable is false
-PASS Object.getOwnPropertyDescriptor(global, 'AudioStreamTrack').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'AudioTrack').value is AudioTrack
+PASS Object.getOwnPropertyDescriptor(global, 'AudioTrack').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AudioTrack').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AudioTrack').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'AudioTrack').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'AudioTrackList').value is AudioTrackList
+PASS Object.getOwnPropertyDescriptor(global, 'AudioTrackList').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AudioTrackList').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AudioTrackList').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'AudioTrackList').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'BarProp').value is BarProp
 PASS Object.getOwnPropertyDescriptor(global, 'BarProp').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'BarProp').hasOwnProperty('set') is false
@@ -93,6 +123,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'Blob').hasOwnProperty('get') is fa
 PASS Object.getOwnPropertyDescriptor(global, 'Blob').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Blob').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'Blob').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Boolean').value is Boolean
+PASS Object.getOwnPropertyDescriptor(global, 'Boolean').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Boolean').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Boolean').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Boolean').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'ByteLengthQueuingStrategy').value is ByteLengthQueuingStrategy
 PASS Object.getOwnPropertyDescriptor(global, 'ByteLengthQueuingStrategy').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'ByteLengthQueuingStrategy').hasOwnProperty('set') is false
@@ -298,16 +333,26 @@ PASS Object.getOwnPropertyDescriptor(global, 'DOMTokenList').hasOwnProperty('get
 PASS Object.getOwnPropertyDescriptor(global, 'DOMTokenList').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'DOMTokenList').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'DOMTokenList').configurable is true
-PASS Object.getOwnPropertyDescriptor(global, 'DataCue').value is DataCue
-PASS Object.getOwnPropertyDescriptor(global, 'DataCue').hasOwnProperty('get') is false
-PASS Object.getOwnPropertyDescriptor(global, 'DataCue').hasOwnProperty('set') is false
-PASS Object.getOwnPropertyDescriptor(global, 'DataCue').enumerable is false
-PASS Object.getOwnPropertyDescriptor(global, 'DataCue').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').value is DataTransfer
 PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataView').value is DataView
+PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataView').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataView').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Database').value is Database
+PASS Object.getOwnPropertyDescriptor(global, 'Database').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Database').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Database').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Database').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Date').value is Date
+PASS Object.getOwnPropertyDescriptor(global, 'Date').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Date').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Date').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Date').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'DelayNode').value is DelayNode
 PASS Object.getOwnPropertyDescriptor(global, 'DelayNode').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'DelayNode').hasOwnProperty('set') is false
@@ -323,6 +368,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'DocumentFragment').hasOwnProperty(
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentFragment').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentFragment').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentFragment').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DocumentTimeline').value is DocumentTimeline
+PASS Object.getOwnPropertyDescriptor(global, 'DocumentTimeline').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DocumentTimeline').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DocumentTimeline').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DocumentTimeline').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentType').value is DocumentType
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentType').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentType').hasOwnProperty('set') is false
@@ -338,11 +388,21 @@ PASS Object.getOwnPropertyDescriptor(global, 'Element').hasOwnProperty('get') is
 PASS Object.getOwnPropertyDescriptor(global, 'Element').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Element').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'Element').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Error').value is Error
+PASS Object.getOwnPropertyDescriptor(global, 'Error').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Error').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Error').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Error').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'ErrorEvent').value is ErrorEvent
 PASS Object.getOwnPropertyDescriptor(global, 'ErrorEvent').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'ErrorEvent').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'ErrorEvent').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'ErrorEvent').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'EvalError').value is EvalError
+PASS Object.getOwnPropertyDescriptor(global, 'EvalError').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'EvalError').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'EvalError').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'EvalError').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'Event').value is Event
 PASS Object.getOwnPropertyDescriptor(global, 'Event').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Event').hasOwnProperty('set') is false
@@ -378,6 +438,16 @@ PASS Object.getOwnPropertyDescriptor(global, 'FileReader').hasOwnProperty('get')
 PASS Object.getOwnPropertyDescriptor(global, 'FileReader').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'FileReader').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'FileReader').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Float32Array').value is Float32Array
+PASS Object.getOwnPropertyDescriptor(global, 'Float32Array').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Float32Array').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Float32Array').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Float32Array').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Float64Array').value is Float64Array
+PASS Object.getOwnPropertyDescriptor(global, 'Float64Array').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Float64Array').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Float64Array').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Float64Array').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'FocusEvent').value is FocusEvent
 PASS Object.getOwnPropertyDescriptor(global, 'FocusEvent').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'FocusEvent').hasOwnProperty('set') is false
@@ -398,6 +468,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'FormData').hasOwnProperty('get') i
 PASS Object.getOwnPropertyDescriptor(global, 'FormData').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'FormData').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'FormData').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Function').value is Function
+PASS Object.getOwnPropertyDescriptor(global, 'Function').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Function').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Function').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Function').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'GainNode').value is GainNode
 PASS Object.getOwnPropertyDescriptor(global, 'GainNode').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'GainNode').hasOwnProperty('set') is false
@@ -663,6 +738,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'HTMLParamElement').hasOwnProperty(
 PASS Object.getOwnPropertyDescriptor(global, 'HTMLParamElement').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'HTMLParamElement').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'HTMLParamElement').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'HTMLPictureElement').value is HTMLPictureElement
+PASS Object.getOwnPropertyDescriptor(global, 'HTMLPictureElement').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'HTMLPictureElement').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'HTMLPictureElement').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'HTMLPictureElement').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'HTMLPreElement').value is HTMLPreElement
 PASS Object.getOwnPropertyDescriptor(global, 'HTMLPreElement').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'HTMLPreElement').hasOwnProperty('set') is false
@@ -808,16 +888,41 @@ PASS Object.getOwnPropertyDescriptor(global, 'ImageData').hasOwnProperty('get')
 PASS Object.getOwnPropertyDescriptor(global, 'ImageData').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'ImageData').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'ImageData').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Int16Array').value is Int16Array
+PASS Object.getOwnPropertyDescriptor(global, 'Int16Array').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Int16Array').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Int16Array').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Int16Array').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Int32Array').value is Int32Array
+PASS Object.getOwnPropertyDescriptor(global, 'Int32Array').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Int32Array').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Int32Array').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Int32Array').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Int8Array').value is Int8Array
+PASS Object.getOwnPropertyDescriptor(global, 'Int8Array').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Int8Array').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Int8Array').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Int8Array').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'KeyboardEvent').value is KeyboardEvent
 PASS Object.getOwnPropertyDescriptor(global, 'KeyboardEvent').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'KeyboardEvent').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'KeyboardEvent').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'KeyboardEvent').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'KeyframeEffect').value is KeyframeEffect
+PASS Object.getOwnPropertyDescriptor(global, 'KeyframeEffect').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'KeyframeEffect').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'KeyframeEffect').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'KeyframeEffect').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'Location').value is Location
 PASS Object.getOwnPropertyDescriptor(global, 'Location').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Location').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Location').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'Location').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Map').value is Map
+PASS Object.getOwnPropertyDescriptor(global, 'Map').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Map').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Map').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Map').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'MediaController').value is MediaController
 PASS Object.getOwnPropertyDescriptor(global, 'MediaController').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'MediaController').hasOwnProperty('set') is false
@@ -843,6 +948,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'MediaSource').hasOwnProperty('get'
 PASS Object.getOwnPropertyDescriptor(global, 'MediaSource').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'MediaSource').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'MediaSource').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'MediaStream').value is MediaStream
+PASS Object.getOwnPropertyDescriptor(global, 'MediaStream').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'MediaStream').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'MediaStream').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'MediaStream').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'MediaStreamAudioDestinationNode').value is MediaStreamAudioDestinationNode
 PASS Object.getOwnPropertyDescriptor(global, 'MediaStreamAudioDestinationNode').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'MediaStreamAudioDestinationNode').hasOwnProperty('set') is false
@@ -943,6 +1053,21 @@ PASS Object.getOwnPropertyDescriptor(global, 'NodeList').hasOwnProperty('get') i
 PASS Object.getOwnPropertyDescriptor(global, 'NodeList').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'NodeList').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'NodeList').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Notification').value is Notification
+PASS Object.getOwnPropertyDescriptor(global, 'Notification').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Notification').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Notification').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Notification').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Number').value is Number
+PASS Object.getOwnPropertyDescriptor(global, 'Number').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Number').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Number').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Number').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Object').value is Object
+PASS Object.getOwnPropertyDescriptor(global, 'Object').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Object').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Object').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Object').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'OfflineAudioCompletionEvent').value is OfflineAudioCompletionEvent
 PASS Object.getOwnPropertyDescriptor(global, 'OfflineAudioCompletionEvent').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'OfflineAudioCompletionEvent').hasOwnProperty('set') is false
@@ -978,11 +1103,6 @@ PASS Object.getOwnPropertyDescriptor(global, 'Performance').hasOwnProperty('get'
 PASS Object.getOwnPropertyDescriptor(global, 'Performance').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Performance').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'Performance').configurable is true
-PASS Object.getOwnPropertyDescriptor(global, 'PerformanceEntry').value is PerformanceEntry
-PASS Object.getOwnPropertyDescriptor(global, 'PerformanceEntry').hasOwnProperty('get') is false
-PASS Object.getOwnPropertyDescriptor(global, 'PerformanceEntry').hasOwnProperty('set') is false
-PASS Object.getOwnPropertyDescriptor(global, 'PerformanceEntry').enumerable is false
-PASS Object.getOwnPropertyDescriptor(global, 'PerformanceEntry').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'PerformanceMark').value is PerformanceMark
 PASS Object.getOwnPropertyDescriptor(global, 'PerformanceMark').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'PerformanceMark').hasOwnProperty('set') is false
@@ -998,11 +1118,6 @@ PASS Object.getOwnPropertyDescriptor(global, 'PerformanceNavigation').hasOwnProp
 PASS Object.getOwnPropertyDescriptor(global, 'PerformanceNavigation').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'PerformanceNavigation').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'PerformanceNavigation').configurable is true
-PASS Object.getOwnPropertyDescriptor(global, 'PerformanceResourceTiming').value is PerformanceResourceTiming
-PASS Object.getOwnPropertyDescriptor(global, 'PerformanceResourceTiming').hasOwnProperty('get') is false
-PASS Object.getOwnPropertyDescriptor(global, 'PerformanceResourceTiming').hasOwnProperty('set') is false
-PASS Object.getOwnPropertyDescriptor(global, 'PerformanceResourceTiming').enumerable is false
-PASS Object.getOwnPropertyDescriptor(global, 'PerformanceResourceTiming').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'PerformanceTiming').value is PerformanceTiming
 PASS Object.getOwnPropertyDescriptor(global, 'PerformanceTiming').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'PerformanceTiming').hasOwnProperty('set') is false
@@ -1038,6 +1153,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'ProgressEvent').hasOwnProperty('ge
 PASS Object.getOwnPropertyDescriptor(global, 'ProgressEvent').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'ProgressEvent').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'ProgressEvent').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Promise').value is Promise
+PASS Object.getOwnPropertyDescriptor(global, 'Promise').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Promise').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Promise').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Promise').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'RGBColor').value is RGBColor
 PASS Object.getOwnPropertyDescriptor(global, 'RGBColor').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'RGBColor').hasOwnProperty('set') is false
@@ -1078,6 +1198,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'Range').hasOwnProperty('get') is f
 PASS Object.getOwnPropertyDescriptor(global, 'Range').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Range').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'Range').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'RangeError').value is RangeError
+PASS Object.getOwnPropertyDescriptor(global, 'RangeError').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'RangeError').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'RangeError').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'RangeError').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'ReadableStream').value is ReadableStream
 PASS Object.getOwnPropertyDescriptor(global, 'ReadableStream').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'ReadableStream').hasOwnProperty('set') is false
@@ -1088,6 +1213,16 @@ PASS Object.getOwnPropertyDescriptor(global, 'Rect').hasOwnProperty('get') is fa
 PASS Object.getOwnPropertyDescriptor(global, 'Rect').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Rect').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'Rect').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'ReferenceError').value is ReferenceError
+PASS Object.getOwnPropertyDescriptor(global, 'ReferenceError').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'ReferenceError').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'ReferenceError').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'ReferenceError').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'RegExp').value is RegExp
+PASS Object.getOwnPropertyDescriptor(global, 'RegExp').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'RegExp').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'RegExp').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'RegExp').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'Request').value is Request
 PASS Object.getOwnPropertyDescriptor(global, 'Request').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Request').hasOwnProperty('set') is false
@@ -1098,11 +1233,31 @@ PASS Object.getOwnPropertyDescriptor(global, 'Response').hasOwnProperty('get') i
 PASS Object.getOwnPropertyDescriptor(global, 'Response').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Response').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'Response').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'SQLError').value is SQLError
+PASS Object.getOwnPropertyDescriptor(global, 'SQLError').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLError').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLError').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLError').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'SQLException').value is SQLException
 PASS Object.getOwnPropertyDescriptor(global, 'SQLException').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'SQLException').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'SQLException').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'SQLException').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'SQLResultSet').value is SQLResultSet
+PASS Object.getOwnPropertyDescriptor(global, 'SQLResultSet').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLResultSet').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLResultSet').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLResultSet').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'SQLResultSetRowList').value is SQLResultSetRowList
+PASS Object.getOwnPropertyDescriptor(global, 'SQLResultSetRowList').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLResultSetRowList').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLResultSetRowList').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLResultSetRowList').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'SQLTransaction').value is SQLTransaction
+PASS Object.getOwnPropertyDescriptor(global, 'SQLTransaction').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLTransaction').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLTransaction').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'SQLTransaction').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'SVGAElement').value is SVGAElement
 PASS Object.getOwnPropertyDescriptor(global, 'SVGAElement').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'SVGAElement').hasOwnProperty('set') is false
@@ -1828,6 +1983,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'Selection').hasOwnProperty('get')
 PASS Object.getOwnPropertyDescriptor(global, 'Selection').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Selection').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'Selection').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Set').value is Set
+PASS Object.getOwnPropertyDescriptor(global, 'Set').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Set').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Set').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Set').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'Storage').value is Storage
 PASS Object.getOwnPropertyDescriptor(global, 'Storage').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Storage').hasOwnProperty('set') is false
@@ -1838,6 +1998,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'StorageEvent').hasOwnProperty('get
 PASS Object.getOwnPropertyDescriptor(global, 'StorageEvent').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'StorageEvent').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'StorageEvent').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'String').value is String
+PASS Object.getOwnPropertyDescriptor(global, 'String').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'String').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'String').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'String').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'StyleSheet').value is StyleSheet
 PASS Object.getOwnPropertyDescriptor(global, 'StyleSheet').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'StyleSheet').hasOwnProperty('set') is false
@@ -1848,6 +2013,16 @@ PASS Object.getOwnPropertyDescriptor(global, 'StyleSheetList').hasOwnProperty('g
 PASS Object.getOwnPropertyDescriptor(global, 'StyleSheetList').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'StyleSheetList').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'StyleSheetList').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Symbol').value is Symbol
+PASS Object.getOwnPropertyDescriptor(global, 'Symbol').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Symbol').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Symbol').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Symbol').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'SyntaxError').value is SyntaxError
+PASS Object.getOwnPropertyDescriptor(global, 'SyntaxError').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'SyntaxError').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'SyntaxError').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'SyntaxError').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'Text').value is Text
 PASS Object.getOwnPropertyDescriptor(global, 'Text').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Text').hasOwnProperty('set') is false
@@ -1918,36 +2093,96 @@ PASS Object.getOwnPropertyDescriptor(global, 'TreeWalker').hasOwnProperty('get')
 PASS Object.getOwnPropertyDescriptor(global, 'TreeWalker').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'TreeWalker').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'TreeWalker').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'TypeError').value is TypeError
+PASS Object.getOwnPropertyDescriptor(global, 'TypeError').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'TypeError').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'TypeError').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'TypeError').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'UIEvent').value is UIEvent
 PASS Object.getOwnPropertyDescriptor(global, 'UIEvent').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'UIEvent').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'UIEvent').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'UIEvent').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'URIError').value is URIError
+PASS Object.getOwnPropertyDescriptor(global, 'URIError').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'URIError').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'URIError').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'URIError').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'URL').value is URL
 PASS Object.getOwnPropertyDescriptor(global, 'URL').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'URL').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'URL').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'URL').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Uint16Array').value is Uint16Array
+PASS Object.getOwnPropertyDescriptor(global, 'Uint16Array').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint16Array').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint16Array').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint16Array').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Uint32Array').value is Uint32Array
+PASS Object.getOwnPropertyDescriptor(global, 'Uint32Array').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint32Array').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint32Array').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint32Array').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Uint8Array').value is Uint8Array
+PASS Object.getOwnPropertyDescriptor(global, 'Uint8Array').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint8Array').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint8Array').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint8Array').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Uint8ClampedArray').value is Uint8ClampedArray
+PASS Object.getOwnPropertyDescriptor(global, 'Uint8ClampedArray').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint8ClampedArray').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint8ClampedArray').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Uint8ClampedArray').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'UserMessageHandler').value is UserMessageHandler
+PASS Object.getOwnPropertyDescriptor(global, 'UserMessageHandler').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'UserMessageHandler').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'UserMessageHandler').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'UserMessageHandler').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'UserMessageHandlersNamespace').value is UserMessageHandlersNamespace
+PASS Object.getOwnPropertyDescriptor(global, 'UserMessageHandlersNamespace').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'UserMessageHandlersNamespace').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'UserMessageHandlersNamespace').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'UserMessageHandlersNamespace').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'VTTCue').value is VTTCue
 PASS Object.getOwnPropertyDescriptor(global, 'VTTCue').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'VTTCue').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'VTTCue').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'VTTCue').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'VTTRegion').value is VTTRegion
+PASS Object.getOwnPropertyDescriptor(global, 'VTTRegion').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'VTTRegion').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'VTTRegion').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'VTTRegion').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'ValidityState').value is ValidityState
 PASS Object.getOwnPropertyDescriptor(global, 'ValidityState').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'ValidityState').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'ValidityState').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'ValidityState').configurable is true
-PASS Object.getOwnPropertyDescriptor(global, 'VideoStreamTrack').value is VideoStreamTrack
-PASS Object.getOwnPropertyDescriptor(global, 'VideoStreamTrack').hasOwnProperty('get') is false
-PASS Object.getOwnPropertyDescriptor(global, 'VideoStreamTrack').hasOwnProperty('set') is false
-PASS Object.getOwnPropertyDescriptor(global, 'VideoStreamTrack').enumerable is false
-PASS Object.getOwnPropertyDescriptor(global, 'VideoStreamTrack').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'VideoTrack').value is VideoTrack
+PASS Object.getOwnPropertyDescriptor(global, 'VideoTrack').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'VideoTrack').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'VideoTrack').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'VideoTrack').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'VideoTrackList').value is VideoTrackList
+PASS Object.getOwnPropertyDescriptor(global, 'VideoTrackList').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'VideoTrackList').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'VideoTrackList').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'VideoTrackList').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'WaveShaperNode').value is WaveShaperNode
 PASS Object.getOwnPropertyDescriptor(global, 'WaveShaperNode').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WaveShaperNode').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WaveShaperNode').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'WaveShaperNode').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'WeakMap').value is WeakMap
+PASS Object.getOwnPropertyDescriptor(global, 'WeakMap').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WeakMap').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WeakMap').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'WeakMap').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'WeakSet').value is WeakSet
+PASS Object.getOwnPropertyDescriptor(global, 'WeakSet').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WeakSet').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WeakSet').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'WeakSet').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLActiveInfo').value is WebGLActiveInfo
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLActiveInfo').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLActiveInfo').hasOwnProperty('set') is false
@@ -1973,6 +2208,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'WebGLProgram').hasOwnProperty('get
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLProgram').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLProgram').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLProgram').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLQuery').value is WebGLQuery
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLQuery').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLQuery').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLQuery').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLQuery').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLRenderbuffer').value is WebGLRenderbuffer
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLRenderbuffer').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLRenderbuffer').hasOwnProperty('set') is false
@@ -1983,6 +2223,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'WebGLRenderingContext').hasOwnProp
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLRenderingContext').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLRenderingContext').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLRenderingContext').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLSampler').value is WebGLSampler
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLSampler').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLSampler').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLSampler').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLSampler').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLShader').value is WebGLShader
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLShader').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLShader').hasOwnProperty('set') is false
@@ -1993,11 +2238,21 @@ PASS Object.getOwnPropertyDescriptor(global, 'WebGLShaderPrecisionFormat').hasOw
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLShaderPrecisionFormat').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLShaderPrecisionFormat').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLShaderPrecisionFormat').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLSync').value is WebGLSync
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLSync').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLSync').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLSync').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLSync').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLTexture').value is WebGLTexture
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLTexture').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLTexture').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLTexture').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLTexture').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLTransformFeedback').value is WebGLTransformFeedback
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLTransformFeedback').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLTransformFeedback').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLTransformFeedback').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebGLTransformFeedback').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLUniformLocation').value is WebGLUniformLocation
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLUniformLocation').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebGLUniformLocation').hasOwnProperty('set') is false
@@ -2008,6 +2263,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'WebKitAnimationEvent').hasOwnPrope
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitAnimationEvent').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitAnimationEvent').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitAnimationEvent').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSFilterValue').value is WebKitCSSFilterValue
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSFilterValue').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSFilterValue').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSFilterValue').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSFilterValue').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSMatrix').value is WebKitCSSMatrix
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSMatrix').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSMatrix').hasOwnProperty('set') is false
@@ -2023,11 +2283,21 @@ PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSTransformValue').hasOwnPr
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSTransformValue').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSTransformValue').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitCSSTransformValue').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitDataCue').value is WebKitDataCue
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitDataCue').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitDataCue').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitDataCue').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitDataCue').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitMutationObserver').value is WebKitMutationObserver
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitMutationObserver').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitMutationObserver').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitMutationObserver').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitMutationObserver').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitNamespace').value is WebKitNamespace
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitNamespace').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitNamespace').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitNamespace').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'WebKitNamespace').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitPoint').value is WebKitPoint
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitPoint').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'WebKitPoint').hasOwnProperty('set') is false
@@ -2128,11 +2398,6 @@ PASS Object.getOwnPropertyDescriptor(global, 'webkitAudioPannerNode').hasOwnProp
 PASS Object.getOwnPropertyDescriptor(global, 'webkitAudioPannerNode').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'webkitAudioPannerNode').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'webkitAudioPannerNode').configurable is true
-PASS Object.getOwnPropertyDescriptor(global, 'webkitMediaStream').value is webkitMediaStream
-PASS Object.getOwnPropertyDescriptor(global, 'webkitMediaStream').hasOwnProperty('get') is false
-PASS Object.getOwnPropertyDescriptor(global, 'webkitMediaStream').hasOwnProperty('set') is false
-PASS Object.getOwnPropertyDescriptor(global, 'webkitMediaStream').enumerable is false
-PASS Object.getOwnPropertyDescriptor(global, 'webkitMediaStream').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'webkitOfflineAudioContext').value is webkitOfflineAudioContext
 PASS Object.getOwnPropertyDescriptor(global, 'webkitOfflineAudioContext').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'webkitOfflineAudioContext').hasOwnProperty('set') is false
index 1f884c6..5b01b7d 100644 (file)
@@ -8,11 +8,26 @@ PASS Object.getOwnPropertyDescriptor(global, 'AnalyserNode').hasOwnProperty('get
 PASS Object.getOwnPropertyDescriptor(global, 'AnalyserNode').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'AnalyserNode').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'AnalyserNode').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'Animation').value is Animation
+PASS Object.getOwnPropertyDescriptor(global, 'Animation').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Animation').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'Animation').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'Animation').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationEffectReadOnly').value is AnimationEffectReadOnly
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationEffectReadOnly').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationEffectReadOnly').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationEffectReadOnly').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationEffectReadOnly').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'AnimationEvent').value is AnimationEvent
 PASS Object.getOwnPropertyDescriptor(global, 'AnimationEvent').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'AnimationEvent').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'AnimationEvent').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'AnimationEvent').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationTimeline').value is AnimationTimeline
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationTimeline').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationTimeline').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationTimeline').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'AnimationTimeline').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'ApplicationCache').value is ApplicationCache
 PASS Object.getOwnPropertyDescriptor(global, 'ApplicationCache').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'ApplicationCache').hasOwnProperty('set') is false
@@ -353,6 +368,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'DocumentFragment').hasOwnProperty(
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentFragment').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentFragment').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentFragment').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DocumentTimeline').value is DocumentTimeline
+PASS Object.getOwnPropertyDescriptor(global, 'DocumentTimeline').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DocumentTimeline').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DocumentTimeline').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DocumentTimeline').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentType').value is DocumentType
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentType').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'DocumentType').hasOwnProperty('set') is false
@@ -898,6 +918,11 @@ PASS Object.getOwnPropertyDescriptor(global, 'KeyboardEvent').hasOwnProperty('ge
 PASS Object.getOwnPropertyDescriptor(global, 'KeyboardEvent').hasOwnProperty('set') is false
 PASS Object.getOwnPropertyDescriptor(global, 'KeyboardEvent').enumerable is false
 PASS Object.getOwnPropertyDescriptor(global, 'KeyboardEvent').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'KeyframeEffect').value is KeyframeEffect
+PASS Object.getOwnPropertyDescriptor(global, 'KeyframeEffect').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'KeyframeEffect').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'KeyframeEffect').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'KeyframeEffect').configurable is true
 PASS Object.getOwnPropertyDescriptor(global, 'Location').value is Location
 PASS Object.getOwnPropertyDescriptor(global, 'Location').hasOwnProperty('get') is false
 PASS Object.getOwnPropertyDescriptor(global, 'Location').hasOwnProperty('set') is false
diff --git a/LayoutTests/webanimations/Document-expected.txt b/LayoutTests/webanimations/Document-expected.txt
new file mode 100644 (file)
index 0000000..2b006f9
--- /dev/null
@@ -0,0 +1,20 @@
+Web Animation API: Document interface extension test.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS document.timeline is not null
+PASS document.timeline is document.timeline
+PASS document.timeline is not iframe.contentDocument.timeline
+PASS document.getAnimations().length is 0
+PASS target.getAnimations().length is 0
+PASS iframe.contentDocument.getAnimations().length is 0
+PASS animation is not null
+PASS document.getAnimations().length is 1
+PASS target.getAnimations().length is 1
+PASS iframe.contentDocument.getAnimations().length is 0
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/webanimations/Document.html b/LayoutTests/webanimations/Document.html
new file mode 100644 (file)
index 0000000..9283857
--- /dev/null
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<div id="target"></div>
+<iframe src="data:text/html;charset=utf-8," width="10" height="10" id="iframe"></iframe>
+<script src="script-tests/Document.js"></script>
+<script src="../resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/webanimations/script-tests/Document.js b/LayoutTests/webanimations/script-tests/Document.js
new file mode 100644 (file)
index 0000000..81df4b3
--- /dev/null
@@ -0,0 +1,38 @@
+description("Web Animation API: Document interface extension test.");
+
+// Enable Web Animations API.
+if (window.testRunner)
+    window.testRunner.overridePreference("WebKitWebAnimationsEnabled", "1");
+
+var iframe = document.getElementById("iframe");
+var target = document.getElementById("target");
+
+// Check document.timeline.
+shouldNotBe("document.timeline", "null");
+
+// Returns same object each time.
+shouldBe("document.timeline", "document.timeline");
+
+// Different object for each document.
+shouldNotBe("document.timeline", "iframe.contentDocument.timeline");
+
+// All getAnimations calls should be empty.
+shouldBe("document.getAnimations().length", "0");
+shouldBe("target.getAnimations().length", "0");
+shouldBe("iframe.contentDocument.getAnimations().length", "0");
+
+// Check created animation.
+var effect = new KeyframeEffect(target);
+var animation = new Animation(effect, document.timeline);
+shouldNotBe("animation", "null");
+
+// Check getAnimations for timeline and target.
+shouldBe("document.getAnimations().length", "1");
+shouldBe("target.getAnimations().length", "1");
+
+// Check getAnimations for iframe.
+shouldBe("iframe.contentDocument.getAnimations().length", "0");
+
+debug("");
+
+successfullyParsed = true;
index bba5cf8..0ca1cb2 100644 (file)
@@ -1,3 +1,20 @@
+2016-06-08  Rawinder Singh  <rawinder.singh-webkit@cisra.canon.com.au>
+
+        [web-animations] Add Animatable, AnimationEffect, KeyframeEffect and Animation interface
+        https://bugs.webkit.org/show_bug.cgi?id=156096
+
+        Reviewed by Dean Jackson.
+
+        Adds:
+        - Animatable interface and implementation of getAnimations in Element
+        - Interface and implementation for Document getAnimations method.
+        - AnimationEffect interface and class stub.
+        - KeyframeEffect interface and constructor implementation.
+        - 'Animation' interface, constructor and query methods for effect and timeline.
+        - Remove runtime condition on Web animation interfaces (compile time flag is specified).
+
+        * runtime/CommonIdentifiers.h:
+
 2016-06-08  Chris Dumez  <cdumez@apple.com>
 
         self.hasOwnProperty() does not work inside Web workers
index 7a85edc..662802a 100644 (file)
@@ -28,6 +28,8 @@
 // MarkedArgumentBuffer of property names, passed to a macro so we can do set them up various
 // ways without repeating the list.
 #define JSC_COMMON_IDENTIFIERS_EACH_PROPERTY_NAME(macro) \
+    macro(Animation) \
+    macro(AnimationEffectReadOnly) \
     macro(AnimationTimeline) \
     macro(Array) \
     macro(ArrayBuffer) \
     macro(isWatchpoint) \
     macro(jettisonReason) \
     macro(join) \
+    macro(KeyframeEffect) \
     macro(lastIndex) \
     macro(length) \
     macro(line) \
index 61ab4de..34ce19a 100644 (file)
@@ -3016,15 +3016,22 @@ list(APPEND WebCore_CSS_VALUE_KEYWORDS
 
 if (ENABLE_WEB_ANIMATIONS)
     list(APPEND WebCore_IDL_FILES
+        "animation/Animatable.idl"
+        "animation/AnimationEffect.idl"
         "animation/AnimationTimeline.idl"
         "animation/DocumentAnimation.idl"
         "animation/DocumentTimeline.idl"
+        "animation/KeyframeEffect.idl"
+        "animation/WebAnimation.idl"
     )
 
     list(APPEND WebCore_SOURCES
+        "animation/AnimationEffect.cpp"
         "animation/AnimationTimeline.cpp"
         "animation/DocumentAnimation.cpp"
         "animation/DocumentTimeline.cpp"
+        "animation/KeyframeEffect.cpp"
+        "animation/WebAnimation.cpp"
     )
 endif ()
 
index 614f3d7..5e4f78c 100644 (file)
@@ -1,3 +1,72 @@
+2016-06-08  Rawinder Singh  <rawinder.singh-webkit@cisra.canon.com.au>
+
+        [web-animations] Add Animatable, AnimationEffect, KeyframeEffect and Animation interface
+        https://bugs.webkit.org/show_bug.cgi?id=156096
+
+        Reviewed by Dean Jackson.
+
+        Adds:
+        - Animatable interface and implementation of getAnimations in Element
+        - Interface and implementation for Document getAnimations method.
+        - AnimationEffect interface and class stub.
+        - KeyframeEffect interface and constructor implementation.
+        - 'Animation' interface, constructor and query methods for effect and timeline.
+        - Remove runtime condition on Web animation interfaces (compile time flag is specified).
+
+        Test: webanimations/Document.html
+
+        * CMakeLists.txt:
+        * DerivedSources.make:
+        * PlatformGTK.cmake:
+        * WebCore.xcodeproj/project.pbxproj:
+        * animation/Animatable.idl: Copied from Source/WebCore/animation/DocumentAnimation.idl.
+        * animation/AnimationEffect.cpp: Copied from Source/WebCore/animation/AnimationTimeline.cpp.
+        (WebCore::AnimationEffect::AnimationEffect):
+        (WebCore::AnimationEffect::~AnimationEffect):
+        (WebCore::AnimationEffect::setAnimation):
+        (WebCore::AnimationEffect::isCurrent):
+        (WebCore::AnimationEffect::isInEffect):
+        * animation/AnimationEffect.h: Copied from Source/WebCore/animation/DocumentTimeline.cpp.
+        * animation/AnimationEffect.idl: Copied from Source/WebCore/animation/AnimationTimeline.idl.
+        * animation/AnimationTimeline.cpp:
+        (WebCore::AnimationTimeline::destroy):
+        (WebCore::AnimationTimeline::attachAnimation):
+        (WebCore::AnimationTimeline::detachAnimation):
+        * animation/AnimationTimeline.h:
+        * animation/AnimationTimeline.idl:
+        * animation/DocumentAnimation.cpp:
+        (WebCore::DocumentAnimation::timeline):
+        (WebCore::DocumentAnimation::getAnimations):
+        (WebCore::DocumentAnimation::addAnimation):
+        (WebCore::DocumentAnimation::removeAnimation):
+        * animation/DocumentAnimation.h:
+        (WebCore::DocumentAnimation::getAnimations):
+        * animation/DocumentAnimation.idl:
+        * animation/DocumentTimeline.cpp:
+        (WebCore::DocumentTimeline::create):
+        (WebCore::DocumentTimeline::DocumentTimeline):
+        (WebCore::DocumentTimeline::attach):
+        (WebCore::DocumentTimeline::detach):
+        * animation/DocumentTimeline.h:
+        * animation/DocumentTimeline.idl:
+        * animation/KeyframeEffect.cpp: Copied from Source/WebCore/animation/DocumentTimeline.cpp.
+        (WebCore::KeyframeEffect::create):
+        (WebCore::KeyframeEffect::KeyframeEffect):
+        (WebCore::KeyframeEffect::~KeyframeEffect):
+        * animation/KeyframeEffect.h: Copied from Source/WebCore/animation/DocumentTimeline.h.
+        * animation/KeyframeEffect.idl: Copied from Source/WebCore/animation/AnimationTimeline.idl.
+        * animation/WebAnimation.cpp: Copied from Source/WebCore/animation/DocumentAnimation.cpp.
+        (WebCore::WebAnimation::create):
+        (WebCore::WebAnimation::WebAnimation):
+        (WebCore::WebAnimation::~WebAnimation):
+        * animation/WebAnimation.h: Copied from Source/WebCore/animation/DocumentAnimation.h.
+        * animation/WebAnimation.idl: Copied from Source/WebCore/animation/DocumentTimeline.idl.
+        * bindings/scripts/CodeGeneratorGObject.pm:
+        * dom/Element.cpp:
+        (WebCore::Element::getAnimations):
+        * dom/Element.h:
+        * dom/Element.idl:
+
 2016-06-08  Chris Dumez  <cdumez@apple.com>
 
         self.hasOwnProperty() does not work inside Web workers
index 287126c..844fcb6 100644 (file)
@@ -223,9 +223,13 @@ NON_SVG_BINDING_IDLS = \
     $(WebCore)/Modules/webdatabase/SQLTransactionErrorCallback.idl \
     $(WebCore)/Modules/websockets/CloseEvent.idl \
     $(WebCore)/Modules/websockets/WebSocket.idl \
+    $(WebCore)/animation/Animatable.idl \
+    $(WebCore)/animation/AnimationEffect.idl \
     $(WebCore)/animation/AnimationTimeline.idl \
     $(WebCore)/animation/DocumentAnimation.idl \
     $(WebCore)/animation/DocumentTimeline.idl \
+    $(WebCore)/animation/KeyframeEffect.idl \
+    $(WebCore)/animation/WebAnimation.idl \
     $(WebCore)/crypto/CryptoKey.idl \
     $(WebCore)/crypto/CryptoKeyPair.idl \
     $(WebCore)/crypto/SubtleCrypto.idl \
index d71ceee..90d3a8f 100644 (file)
@@ -592,9 +592,13 @@ list(APPEND GObjectDOMBindingsUnstable_IDL_FILES
 
 if (ENABLE_WEB_ANIMATIONS)
     list(APPEND GObjectDOMBindingsUnstable_IDL_FILES
+        animation/Animatable.idl
+        animation/AnimationEffect.idl
         animation/AnimationTimeline.idl
         animation/DocumentAnimation.idl
         animation/DocumentTimeline.idl
+        animation/KeyframeEffect.idl
+        animation/WebAnimation.idl
     )
 endif ()
 
index f2f6370..10dd8f4 100644 (file)
                0FFD4D6018651FA300512F6E /* AsyncScrollingCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FFD4D5E18651FA300512F6E /* AsyncScrollingCoordinator.cpp */; };
                0FFD4D6118651FA300512F6E /* AsyncScrollingCoordinator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FFD4D5F18651FA300512F6E /* AsyncScrollingCoordinator.h */; settings = {ATTRIBUTES = (Private, ); }; };
                10FB084B14E15C7E00A3DB98 /* PublicURLManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 10FB084A14E15C7E00A3DB98 /* PublicURLManager.h */; };
+               120DE3ED1C86CA3E00B6D4DD /* WebAnimation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 120DE3EA1C80161C00B6D4DD /* WebAnimation.cpp */; };
+               120DE3F11C86CCC600B6D4DD /* AnimationEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 120DE3EE1C86CCBD00B6D4DD /* AnimationEffect.cpp */; };
+               120DE3F81C87C5A800B6D4DD /* JSWebAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 120DE3F51C87C58E00B6D4DD /* JSWebAnimation.h */; };
+               120DE3F91C87C5AB00B6D4DD /* JSWebAnimation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 120DE3F41C87C58E00B6D4DD /* JSWebAnimation.cpp */; };
+               120DE3FD1C87E18400B6D4DD /* JSAnimationEffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 120DE3FC1C87E17900B6D4DD /* JSAnimationEffect.h */; };
+               120DE3FE1C87E18800B6D4DD /* JSAnimationEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 120DE3FB1C87E17900B6D4DD /* JSAnimationEffect.cpp */; };
                1221E0471BFC3D2C006A1A00 /* DocumentAnimation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1221E0411BFC3D2C006A1A00 /* DocumentAnimation.cpp */; };
                1221E0481BFC3D2C006A1A00 /* DocumentAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1221E0421BFC3D2C006A1A00 /* DocumentAnimation.h */; };
                1221E04A1BFC3D2C006A1A00 /* DocumentTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1221E0441BFC3D2C006A1A00 /* DocumentTimeline.cpp */; };
                1221E06C1C03D224006A1A00 /* JSAnimationTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1221E06A1C03D224006A1A00 /* JSAnimationTimeline.cpp */; };
                1221E06D1C03D224006A1A00 /* JSAnimationTimeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 1221E06B1C03D224006A1A00 /* JSAnimationTimeline.h */; };
                1221E0731C03E4C2006A1A00 /* JSAnimationTimelineCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1221E0721C03E4C2006A1A00 /* JSAnimationTimelineCustom.cpp */; };
+               12A253DB1C8FF7DC00C22295 /* KeyframeEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12A253D81C8FF7CC00C22295 /* KeyframeEffect.cpp */; };
+               12A253E01C8FFF6600C22295 /* JSKeyframeEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12A253DE1C8FFF5700C22295 /* JSKeyframeEffect.cpp */; };
+               12A253E11C8FFF6600C22295 /* JSKeyframeEffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 12A253DF1C8FFF5700C22295 /* JSKeyframeEffect.h */; };
+               12A253E21C8FFF6600C22295 /* JSAnimatable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12A253DC1C8FFF4200C22295 /* JSAnimatable.cpp */; };
+               12A253E31C8FFF6600C22295 /* JSAnimatable.h in Headers */ = {isa = PBXBuildFile; fileRef = 12A253DD1C8FFF4200C22295 /* JSAnimatable.h */; };
                1400D7A817136EA70077CE05 /* ScriptWrappableInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 1400D7A717136EA70077CE05 /* ScriptWrappableInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
                1402645E0AFDC19B005919E2 /* LoggingMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1402645D0AFDC19B005919E2 /* LoggingMac.mm */; };
                1403B99709EB13AF00797C7F /* DOMWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 1403B99509EB13AF00797C7F /* DOMWindow.h */; settings = {ATTRIBUTES = (Private, ); }; };
                0FFD4D5E18651FA300512F6E /* AsyncScrollingCoordinator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AsyncScrollingCoordinator.cpp; sourceTree = "<group>"; };
                0FFD4D5F18651FA300512F6E /* AsyncScrollingCoordinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncScrollingCoordinator.h; sourceTree = "<group>"; };
                10FB084A14E15C7E00A3DB98 /* PublicURLManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PublicURLManager.h; sourceTree = "<group>"; };
+               120DE3EA1C80161C00B6D4DD /* WebAnimation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebAnimation.cpp; sourceTree = "<group>"; };
+               120DE3EB1C80161C00B6D4DD /* WebAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebAnimation.h; sourceTree = "<group>"; };
+               120DE3EC1C80161C00B6D4DD /* WebAnimation.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebAnimation.idl; sourceTree = "<group>"; };
+               120DE3EE1C86CCBD00B6D4DD /* AnimationEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AnimationEffect.cpp; sourceTree = "<group>"; };
+               120DE3EF1C86CCBD00B6D4DD /* AnimationEffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnimationEffect.h; sourceTree = "<group>"; };
+               120DE3F41C87C58E00B6D4DD /* JSWebAnimation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebAnimation.cpp; sourceTree = "<group>"; };
+               120DE3F51C87C58E00B6D4DD /* JSWebAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebAnimation.h; sourceTree = "<group>"; };
+               120DE3FA1C87D1F100B6D4DD /* AnimationEffect.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AnimationEffect.idl; sourceTree = "<group>"; };
+               120DE3FB1C87E17900B6D4DD /* JSAnimationEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAnimationEffect.cpp; sourceTree = "<group>"; };
+               120DE3FC1C87E17900B6D4DD /* JSAnimationEffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAnimationEffect.h; sourceTree = "<group>"; };
+               120DE4011C8E997A00B6D4DD /* Animatable.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Animatable.idl; sourceTree = "<group>"; };
                1221E0411BFC3D2C006A1A00 /* DocumentAnimation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DocumentAnimation.cpp; sourceTree = "<group>"; };
                1221E0421BFC3D2C006A1A00 /* DocumentAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocumentAnimation.h; sourceTree = "<group>"; };
                1221E0431BFC3D2C006A1A00 /* DocumentAnimation.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DocumentAnimation.idl; sourceTree = "<group>"; };
                1221E06A1C03D224006A1A00 /* JSAnimationTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAnimationTimeline.cpp; sourceTree = "<group>"; };
                1221E06B1C03D224006A1A00 /* JSAnimationTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAnimationTimeline.h; sourceTree = "<group>"; };
                1221E0721C03E4C2006A1A00 /* JSAnimationTimelineCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAnimationTimelineCustom.cpp; sourceTree = "<group>"; };
+               12A253D81C8FF7CC00C22295 /* KeyframeEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KeyframeEffect.cpp; sourceTree = "<group>"; };
+               12A253D91C8FF7CC00C22295 /* KeyframeEffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyframeEffect.h; sourceTree = "<group>"; };
+               12A253DA1C8FF7CC00C22295 /* KeyframeEffect.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = KeyframeEffect.idl; sourceTree = "<group>"; };
+               12A253DC1C8FFF4200C22295 /* JSAnimatable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAnimatable.cpp; sourceTree = "<group>"; };
+               12A253DD1C8FFF4200C22295 /* JSAnimatable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAnimatable.h; sourceTree = "<group>"; };
+               12A253DE1C8FFF5700C22295 /* JSKeyframeEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSKeyframeEffect.cpp; sourceTree = "<group>"; };
+               12A253DF1C8FFF5700C22295 /* JSKeyframeEffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSKeyframeEffect.h; sourceTree = "<group>"; };
                1400D7A717136EA70077CE05 /* ScriptWrappableInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptWrappableInlines.h; sourceTree = "<group>"; };
                1402645D0AFDC19B005919E2 /* LoggingMac.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = LoggingMac.mm; sourceTree = "<group>"; };
                1403B90C09EB124500797C7F /* DOMWindow.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DOMWindow.idl; sourceTree = "<group>"; };
                1221E0401BFC3CF2006A1A00 /* animation */ = {
                        isa = PBXGroup;
                        children = (
+                               120DE4011C8E997A00B6D4DD /* Animatable.idl */,
+                               120DE3EE1C86CCBD00B6D4DD /* AnimationEffect.cpp */,
+                               120DE3EF1C86CCBD00B6D4DD /* AnimationEffect.h */,
+                               120DE3FA1C87D1F100B6D4DD /* AnimationEffect.idl */,
                                1221E0611C02D623006A1A00 /* AnimationTimeline.cpp */,
                                1221E0621C02D623006A1A00 /* AnimationTimeline.h */,
                                1221E0651C02D636006A1A00 /* AnimationTimeline.idl */,
                                1221E0441BFC3D2C006A1A00 /* DocumentTimeline.cpp */,
                                1221E0451BFC3D2C006A1A00 /* DocumentTimeline.h */,
                                1221E0461BFC3D2C006A1A00 /* DocumentTimeline.idl */,
+                               12A253D81C8FF7CC00C22295 /* KeyframeEffect.cpp */,
+                               12A253D91C8FF7CC00C22295 /* KeyframeEffect.h */,
+                               12A253DA1C8FF7CC00C22295 /* KeyframeEffect.idl */,
+                               120DE3EA1C80161C00B6D4DD /* WebAnimation.cpp */,
+                               120DE3EB1C80161C00B6D4DD /* WebAnimation.h */,
+                               120DE3EC1C80161C00B6D4DD /* WebAnimation.idl */,
                        );
                        path = animation;
                        sourceTree = "<group>";
                1221E0581C02B409006A1A00 /* Animation */ = {
                        isa = PBXGroup;
                        children = (
+                               12A253DE1C8FFF5700C22295 /* JSKeyframeEffect.cpp */,
+                               12A253DF1C8FFF5700C22295 /* JSKeyframeEffect.h */,
+                               12A253DC1C8FFF4200C22295 /* JSAnimatable.cpp */,
+                               12A253DD1C8FFF4200C22295 /* JSAnimatable.h */,
+                               120DE3FB1C87E17900B6D4DD /* JSAnimationEffect.cpp */,
+                               120DE3FC1C87E17900B6D4DD /* JSAnimationEffect.h */,
+                               120DE3F41C87C58E00B6D4DD /* JSWebAnimation.cpp */,
+                               120DE3F51C87C58E00B6D4DD /* JSWebAnimation.h */,
                                1221E06A1C03D224006A1A00 /* JSAnimationTimeline.cpp */,
                                1221E06B1C03D224006A1A00 /* JSAnimationTimeline.h */,
                                1221E0591C02B444006A1A00 /* JSDocumentAnimation.cpp */,
                                5FA904CA178E61F5004C8A2D /* CertificateInfo.h in Headers */,
                                A10D7FEC1C2676D100C6C115 /* CFNetworkConnectionCacheSPI.h in Headers */,
                                CE12525B1A1C018200864480 /* CFNetworkSPI.h in Headers */,
+                               120DE3FD1C87E18400B6D4DD /* JSAnimationEffect.h in Headers */,
                                E1A8E56717552B2A007488E7 /* CFURLExtras.h in Headers */,
                                FE36FD1516C7826500F887C1 /* ChangeVersionData.h in Headers */,
                                97BC69DD1505F076001B74AC /* ChangeVersionWrapper.h in Headers */,
                                26F0C8A01A2EC3BE002794F8 /* ContentExtensionsBackend.h in Headers */,
                                262391361A648CEE007251A3 /* ContentExtensionsDebugging.h in Headers */,
                                51FB67DC1AE6B82F00D06C5A /* ContentExtensionStyleSheet.h in Headers */,
+                               120DE3F81C87C5A800B6D4DD /* JSWebAnimation.h in Headers */,
                                A149786F1ABAF33800CEF7E4 /* ContentFilter.h in Headers */,
                                A14090FD1AA51E480091191A /* ContentFilterUnblockHandler.h in Headers */,
                                97C471DC12F925BD0086354B /* ContentSecurityPolicy.h in Headers */,
                                E19DA29C18189ADD00088BC8 /* CryptoAlgorithmHmacKeyParams.h in Headers */,
                                E1C6571F1816E50300256CDD /* CryptoAlgorithmHmacParams.h in Headers */,
                                E1C657251816E69D00256CDD /* CryptoAlgorithmIdentifier.h in Headers */,
+                               12A253E11C8FFF6600C22295 /* JSKeyframeEffect.h in Headers */,
                                E1C657271816F9FE00256CDD /* CryptoAlgorithmParameters.h in Headers */,
                                E1FF8F6D180DB5BE00132674 /* CryptoAlgorithmRegistry.h in Headers */,
                                E1FE136B183FE1AB00892F13 /* CryptoAlgorithmRSA_OAEP.h in Headers */,
                                B27535720B053814002CE64F /* IntPoint.h in Headers */,
                                E462A4A1113E71BE004A4220 /* IntPointHash.h in Headers */,
                                B27535740B053814002CE64F /* IntRect.h in Headers */,
+                               12A253E31C8FFF6600C22295 /* JSAnimatable.h in Headers */,
                                A2B9217316C5CC420041DCD9 /* IntRectExtent.h in Headers */,
                                E134F5AB12EE343F004EC58D /* IntRectHash.h in Headers */,
                                B27535750B053814002CE64F /* IntSize.h in Headers */,
                                A7C9ABF81357A3BF00F5503F /* DetailsMarkerControl.cpp in Sources */,
                                A1ED778C1BE3294000DC1791 /* Device.cpp in Sources */,
                                CCC2B51515F613060048CDD6 /* DeviceController.cpp in Sources */,
+                               120DE3F11C86CCC600B6D4DD /* AnimationEffect.cpp in Sources */,
                                31EAF97F121435A400E7C1BF /* DeviceMotionClientIOS.mm in Sources */,
                                31FB1A58120A5D0600DC02A0 /* DeviceMotionController.cpp in Sources */,
                                31FB1A5A120A5D0600DC02A0 /* DeviceMotionData.cpp in Sources */,
                                2D46F04E17B96FBD005647F0 /* IntPoint.cpp in Sources */,
                                B27535600B053814002CE64F /* IntPointCG.cpp in Sources */,
                                B275357C0B053814002CE64F /* IntPointMac.mm in Sources */,
+                               120DE3FE1C87E18800B6D4DD /* JSAnimationEffect.cpp in Sources */,
                                B27535730B053814002CE64F /* IntRect.cpp in Sources */,
                                B27535610B053814002CE64F /* IntRectCG.cpp in Sources */,
                                B275357D0B053814002CE64F /* IntRectMac.mm in Sources */,
                                1AE2ABA60A1CE90500B42B25 /* JSHTMLParagraphElement.cpp in Sources */,
                                1AE2ABA80A1CE90500B42B25 /* JSHTMLParamElement.cpp in Sources */,
                                BC3D85BB1C0E2E7700D3B610 /* JSHTMLPictureElement.cpp in Sources */,
+                               12A253E21C8FFF6600C22295 /* JSAnimatable.cpp in Sources */,
                                1AE2ABAA0A1CE90500B42B25 /* JSHTMLPreElement.cpp in Sources */,
                                A4226E5A1163D667008B8397 /* JSHTMLProgressElement.cpp in Sources */,
                                1AE2AEC70A1D297B00B42B25 /* JSHTMLQuoteElement.cpp in Sources */,
                                BCE0139A0C0BEF180043860A /* JSStyleSheet.cpp in Sources */,
                                BC98A27D0C0C9950004BEBF7 /* JSStyleSheetCustom.cpp in Sources */,
                                A84EBD840CB8C97700079609 /* JSStyleSheetList.cpp in Sources */,
+                               120DE3F91C87C5AB00B6D4DD /* JSWebAnimation.cpp in Sources */,
                                A84EBD780CB8C89200079609 /* JSStyleSheetListCustom.cpp in Sources */,
                                E1FF8F64180745D800132674 /* JSSubtleCrypto.cpp in Sources */,
                                E1FF8F681807460800132674 /* JSSubtleCryptoCustom.cpp in Sources */,
                                BC60DB490D2A3D1E00B9918F /* JSXPathException.cpp in Sources */,
                                1A762C750A074F2600989F5B /* JSXPathExpression.cpp in Sources */,
                                1A762C770A074F2600989F5B /* JSXPathNSResolver.cpp in Sources */,
+                               12A253DB1C8FF7DC00C22295 /* KeyframeEffect.cpp in Sources */,
                                1A762C790A074F2600989F5B /* JSXPathResult.cpp in Sources */,
                                A1C7FAA2133A5D3500D6732D /* JSXPathResultCustom.cpp in Sources */,
                                BCEFE1EA0DCA5F6400739219 /* JSXSLTProcessor.cpp in Sources */,
                                656D37330ADBA5DE00A4554D /* LoaderNSURLExtras.mm in Sources */,
                                7EE6846812D26E3800E79415 /* LoaderRunLoopCF.cpp in Sources */,
                                51ABF64D16392E2800132A7A /* LoaderStrategy.cpp in Sources */,
+                               12A253E01C8FFF6600C22295 /* JSKeyframeEffect.cpp in Sources */,
                                06E81EEC0AB5DA9700C87837 /* LocalCurrentGraphicsContext.mm in Sources */,
                                F5973DE115CFB2030027F804 /* LocaleMac.mm in Sources */,
                                7633A72713D8B33A008501B6 /* LocaleToScriptMappingDefault.cpp in Sources */,
                                073794E119EE2D1B00E5A045 /* MediaConstraintsMock.cpp in Sources */,
                                417253AA1354BBBC00360F2A /* MediaControlElements.cpp in Sources */,
                                DEBCCDD516646EB200A452E1 /* MediaControlElementTypes.cpp in Sources */,
+                               120DE3ED1C86CA3E00B6D4DD /* WebAnimation.cpp in Sources */,
                                CD27F6E7145770D30078207D /* MediaController.cpp in Sources */,
                                5E5E2B131CFC3E70000C0D85 /* RTCRtpTransceiver.cpp in Sources */,
                                1F3C3BEA135CAF3C00B8C1AC /* MediaControls.cpp in Sources */,
diff --git a/Source/WebCore/animation/Animatable.idl b/Source/WebCore/animation/Animatable.idl
new file mode 100644 (file)
index 0000000..ba84916
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) Canon Inc. 2016
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted, provided that the following conditions
+ * are required to be 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.
+ * 3. Neither the name of Canon Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "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 CANON INC. AND ITS 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.
+ */
+
+[
+    Conditional=WEB_ANIMATIONS,
+    NoInterfaceObject
+] interface Animatable {
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
+    // FIXME: Incomplete interface (implement animate).
+    sequence<WebAnimation> getAnimations();
+#endif
+}; 
diff --git a/Source/WebCore/animation/AnimationEffect.cpp b/Source/WebCore/animation/AnimationEffect.cpp
new file mode 100644 (file)
index 0000000..a16e48e
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) Canon Inc. 2016
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted, provided that the following conditions
+ * are required to be 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.
+ * 3. Neither the name of Canon Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "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 CANON INC. AND ITS 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 "AnimationEffect.h"
+
+#if ENABLE(WEB_ANIMATIONS)
+
+#include "WebAnimation.h"
+
+namespace WebCore {
+
+AnimationEffect::AnimationEffect()
+{
+}
+
+AnimationEffect::~AnimationEffect()
+{
+}
+
+void AnimationEffect::setAnimation(WebAnimation* animation)
+{
+    m_animation = animation ? animation->createWeakPtr() : WeakPtr<WebAnimation>();
+}
+
+bool AnimationEffect::isCurrent() const
+{
+    // FIXME: Calculate whether animation is current according to spec.
+    return true;
+}
+
+bool AnimationEffect::isInEffect() const
+{
+    // FIXME: Calculate whether animation is in effect according to spec.
+    return false;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_ANIMATIONS)
diff --git a/Source/WebCore/animation/AnimationEffect.h b/Source/WebCore/animation/AnimationEffect.h
new file mode 100644 (file)
index 0000000..9e9947c
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) Canon Inc. 2016
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted, provided that the following conditions
+ * are required to be 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.
+ * 3. Neither the name of Canon Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "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 CANON INC. AND ITS 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.
+ */
+
+#pragma once
+
+#if ENABLE(WEB_ANIMATIONS)
+
+#include "WebAnimation.h"
+#include <wtf/RefCounted.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+class AnimationEffect : public RefCounted<AnimationEffect> {
+public:
+    AnimationEffect();
+    virtual ~AnimationEffect();
+
+    void setAnimation(WebAnimation*);
+
+    bool isCurrent() const;
+    bool isInEffect() const;
+
+private:
+    WeakPtr<WebAnimation> m_animation;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_ANIMATIONS)
diff --git a/Source/WebCore/animation/AnimationEffect.idl b/Source/WebCore/animation/AnimationEffect.idl
new file mode 100644 (file)
index 0000000..b10c623
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) Canon Inc. 2016
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted, provided that the following conditions
+ * are required to be 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.
+ * 3. Neither the name of Canon Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "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 CANON INC. AND ITS 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.
+ */
+
+[
+    Conditional=WEB_ANIMATIONS,
+    InterfaceName=AnimationEffectReadOnly,
+    SkipVTableValidation
+] interface AnimationEffect {
+    // FIXME: Stub only at the moment.
+};
index 85df89e..d9164be 100644 (file)
@@ -54,7 +54,26 @@ void AnimationTimeline::destroy()
     }
     
     ASSERT_NOT_REACHED();
-    return;
+}
+
+void AnimationTimeline::attachAnimation(WebAnimation& animation)
+{
+    if (classType() == DocumentTimelineClass) {
+        downcast<DocumentTimeline>(*this).attach(animation);
+        return;
+    }
+
+    ASSERT_NOT_REACHED();
+}
+
+void AnimationTimeline::detachAnimation(WebAnimation& animation)
+{
+    if (classType() == DocumentTimelineClass) {
+        downcast<DocumentTimeline>(*this).detach(animation);
+        return;
+    }
+    
+    ASSERT_NOT_REACHED();
 }
 
 } // namespace WebCore
index 10193a7..b47a2dc 100644 (file)
@@ -26,8 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef AnimationTimeline_h
-#define AnimationTimeline_h
+#pragma once
 
 #if ENABLE(WEB_ANIMATIONS)
 
@@ -37,6 +36,8 @@
 
 namespace WebCore {
 
+class WebAnimation;
+
 class AnimationTimeline : public RefCounted<AnimationTimeline> {
 public:
     // Override RefCounted's deref() to ensure operator delete is called on
@@ -49,6 +50,9 @@ public:
     
     bool isDocumentTimeline() const { return m_classType == DocumentTimelineClass; }
 
+    void attachAnimation(WebAnimation&);
+    void detachAnimation(WebAnimation&);
+
 protected:
     enum ClassType {
         DocumentTimelineClass
@@ -75,5 +79,3 @@ static bool isType(const WebCore::AnimationTimeline& value) { return value.predi
 SPECIALIZE_TYPE_TRAITS_END()
 
 #endif // ENABLE(WEB_ANIMATIONS)
-
-#endif // AnimationTimeline_h
index 21f40da..9a661bc 100644 (file)
  */
 
 [
-    EnabledAtRuntime=WebAnimations,
     Conditional=WEB_ANIMATIONS,
     CustomToJSObject,
     ObjCPolymorphic,
     ImplementationLacksVTable
 ] interface AnimationTimeline {
-    // FIX: Only a stub at the moment.
+    // FIXME: Only a stub at the moment.
 };
 
index 3826647..7e20c2e 100644 (file)
@@ -48,7 +48,7 @@ DocumentTimeline* DocumentAnimation::timeline(Document& document)
 {
     auto* documentAnimation = DocumentAnimation::from(&document);
     if (!documentAnimation->m_defaultTimeline)
-        documentAnimation->m_defaultTimeline = DocumentTimeline::create(0.0);
+        documentAnimation->m_defaultTimeline = DocumentTimeline::create(document, 0.0);
     return documentAnimation->m_defaultTimeline.get();
 }
 
@@ -68,6 +68,46 @@ DocumentAnimation* DocumentAnimation::from(Document* document)
     return supplement;
 }
 
+WebAnimationVector DocumentAnimation::getAnimations(std::function<bool(const AnimationEffect&)> effect_test) const
+{
+    WebAnimationVector animations;
+
+    auto sortBasedOnPriority = [](const RefPtr<WebAnimation>& a, const RefPtr<WebAnimation>& b)
+    {
+        // FIXME: Sort using the composite order as described in the spec.
+        UNUSED_PARAM(a);
+        UNUSED_PARAM(b);
+        return true;
+    };
+
+    for (auto& animation : m_animations.values()) {
+        if (animation && animation->effect()) {
+            const AnimationEffect& effect = *animation->effect();
+            if ((effect.isCurrent() || effect.isInEffect()) && effect_test(effect))
+                animations.append(animation.get());
+        }
+    }
+    std::sort(animations.begin(), animations.end(), sortBasedOnPriority);
+
+    return animations;
+}
+
+void DocumentAnimation::addAnimation(WebAnimation& animation)
+{
+    ASSERT(!m_animations.contains(&animation));
+    m_animations.add(&animation, animation.createWeakPtr());
+}
+
+void DocumentAnimation::removeAnimation(WebAnimation& animation)
+{
+    m_animations.remove(&animation);
+}
+
+WebAnimationVector DocumentAnimation::getAnimations(Document& document)
+{
+    return DocumentAnimation::from(&document)->getAnimations();
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(WEB_ANIMATIONS)
index f3cb2e8..27e6c3d 100644 (file)
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef DocumentAnimation_h
-#define DocumentAnimation_h
+#pragma once
 
 #if ENABLE(WEB_ANIMATIONS)
 
+#include "AnimationEffect.h"
 #include "Supplementable.h"
+#include "WebAnimation.h"
+#include <wtf/HashMap.h>
+#include <wtf/WeakPtr.h>
 
 namespace WebCore {
 
@@ -45,15 +48,21 @@ public:
 
     static DocumentAnimation* from(Document*);
     static DocumentTimeline* timeline(Document&);
+    static WebAnimationVector getAnimations(Document&);
+
+    WebAnimationVector getAnimations(std::function<bool(const AnimationEffect&)> = [](const AnimationEffect&) { return true; }) const;
+
+    void addAnimation(WebAnimation&);
+    void removeAnimation(WebAnimation&);
 
 private:
     static const char* supplementName();
 
     RefPtr<DocumentTimeline> m_defaultTimeline;
+
+    HashMap<WebAnimation*, WeakPtr<WebAnimation>> m_animations;
 };
 
 } // namespace WebCore
 
 #endif // ENABLE(WEB_ANIMATIONS)
-
-#endif // DocumentAnimation_h
index 4e9c18d..2eed764 100644 (file)
  */
 
 [
-    EnabledAtRuntime=WebAnimations,
     Conditional=WEB_ANIMATIONS
 ] partial interface Document {
 #if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
     readonly attribute DocumentTimeline timeline;
+    sequence<WebAnimation> getAnimations();
 #endif
 }; 
index d3aeda9..dcdbcd5 100644 (file)
 
 #if ENABLE(WEB_ANIMATIONS)
 
+#include "Document.h"
+#include "DocumentAnimation.h"
+#include "WebAnimation.h"
+
 namespace WebCore {
 
-Ref<DocumentTimeline> DocumentTimeline::create(double originTime)
+Ref<DocumentTimeline> DocumentTimeline::create(Document& context, double originTime)
 {
-    return adoptRef(*new DocumentTimeline(originTime));
+    return adoptRef(*new DocumentTimeline(context, originTime));
 }
 
-DocumentTimeline::DocumentTimeline(double originTime)
+DocumentTimeline::DocumentTimeline(Document& context, double originTime)
     : AnimationTimeline(DocumentTimelineClass)
+    , m_document(context.createWeakPtr())
     , m_originTime(originTime)
 {
     UNUSED_PARAM(m_originTime);
@@ -49,6 +54,31 @@ DocumentTimeline::~DocumentTimeline()
 {
 }
 
+void DocumentTimeline::attach(WebAnimation& animation)
+{
+    ASSERT(animation.timeline() == this);
+    ASSERT(m_document);
+
+    if (!m_document)
+        return;
+
+    auto* document = DocumentAnimation::from(m_document.get());
+    if (document)
+        document->addAnimation(animation);
+}
+
+void DocumentTimeline::detach(WebAnimation& animation)
+{
+    ASSERT(m_document);
+
+    if (!m_document)
+        return;
+
+    auto* document = DocumentAnimation::from(m_document.get());
+    if (document)
+        document->removeAnimation(animation);
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(WEB_ANIMATIONS)
index 91dd4bc..ed472c0 100644 (file)
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef DocumentTimeline_h
-#define DocumentTimeline_h
+#pragma once
 
 #if ENABLE(WEB_ANIMATIONS)
 
 #include "AnimationTimeline.h"
+#include <wtf/WeakPtr.h>
 
 namespace WebCore {
 
+class Document;
+
 class DocumentTimeline final : public AnimationTimeline {
 public:
-    static Ref<DocumentTimeline> create(double);
+    static Ref<DocumentTimeline> create(Document&, double);
     ~DocumentTimeline();
 
+    void attach(WebAnimation&);
+    void detach(WebAnimation&);
+
 protected:
-    DocumentTimeline(double);
+    DocumentTimeline(Document&, double);
     
 private:
+    WeakPtr<Document> m_document;
     double m_originTime;
 };
 
@@ -52,5 +58,3 @@ private:
 SPECIALIZE_TYPE_TRAITS_ANIMATION_TIMELINE(DocumentTimeline, isDocumentTimeline())
 
 #endif // ENABLE(WEB_ANIMATIONS)
-
-#endif // DocumentTimeline_h
index 6765015..b7a5a8a 100644 (file)
  */
 
 [
-    EnabledAtRuntime=WebAnimations,
     Conditional=WEB_ANIMATIONS,
     ImplementationLacksVTable,
-    // FIX: Should be DOMHighResTimeStamp rather than double (e.g. see Performance.now()).
-    Constructor(double originTime)
+    // FIXME: Should be DOMHighResTimeStamp rather than double (e.g. see Performance.now()).
+    Constructor(double originTime),
+    ConstructorCallWith=Document
 ] interface DocumentTimeline : AnimationTimeline {
 };
diff --git a/Source/WebCore/animation/KeyframeEffect.cpp b/Source/WebCore/animation/KeyframeEffect.cpp
new file mode 100644 (file)
index 0000000..e513ec1
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) Canon Inc. 2016
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted, provided that the following conditions
+ * are required to be 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.
+ * 3. Neither the name of Canon Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "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 CANON INC. AND ITS 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 "KeyframeEffect.h"
+
+#if ENABLE(WEB_ANIMATIONS)
+
+#include "Element.h"
+#include <wtf/Ref.h>
+
+namespace WebCore {
+
+RefPtr<KeyframeEffect> KeyframeEffect::create(Element* target)
+{
+    if (!target) {
+        // FIXME: Support null animation target.
+        return nullptr;
+    }
+
+    return adoptRef(new KeyframeEffect(target));
+}
+
+KeyframeEffect::KeyframeEffect(Element* target)
+    : m_target(target)
+{
+}
+
+KeyframeEffect::~KeyframeEffect()
+{
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_ANIMATIONS)
diff --git a/Source/WebCore/animation/KeyframeEffect.h b/Source/WebCore/animation/KeyframeEffect.h
new file mode 100644 (file)
index 0000000..975a75a
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) Canon Inc. 2016
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted, provided that the following conditions
+ * are required to be 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.
+ * 3. Neither the name of Canon Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "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 CANON INC. AND ITS 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.
+ */
+
+#pragma once
+
+#if ENABLE(WEB_ANIMATIONS)
+
+#include "AnimationEffect.h"
+
+namespace WebCore {
+
+class Element;
+
+class KeyframeEffect final : public AnimationEffect {
+public:
+    static RefPtr<KeyframeEffect> create(Element*);
+    ~KeyframeEffect() override;
+
+    Element* target() const { return m_target.get(); }
+
+private:
+    KeyframeEffect(Element*);
+
+    // FIXME: Ensure that there is no cyclic reference from Element to KeyframeEffect.
+    RefPtr<Element> m_target;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_ANIMATIONS)
diff --git a/Source/WebCore/animation/KeyframeEffect.idl b/Source/WebCore/animation/KeyframeEffect.idl
new file mode 100644 (file)
index 0000000..2d100b7
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) Canon Inc. 2016
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted, provided that the following conditions
+ * are required to be 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.
+ * 3. Neither the name of Canon Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "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 CANON INC. AND ITS 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.
+ */
+
+[
+    Conditional=WEB_ANIMATIONS,
+    // FIX: Constructor stub only at the moment (should accept PseudoElement target, frames and options).
+    Constructor([Default=Undefined] Element? target)
+    // FIX: Add interface for and inherit from KeyframeEffectReadOnly.
+] interface KeyframeEffect : AnimationEffect {
+    // FIX: Stub only at the moment.
+};
diff --git a/Source/WebCore/animation/WebAnimation.cpp b/Source/WebCore/animation/WebAnimation.cpp
new file mode 100644 (file)
index 0000000..e592e2f
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) Canon Inc. 2016
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted, provided that the following conditions
+ * are required to be 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.
+ * 3. Neither the name of Canon Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "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 CANON INC. AND ITS 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 "WebAnimation.h"
+
+#if ENABLE(WEB_ANIMATIONS)
+
+#include "AnimationEffect.h"
+#include "DocumentTimeline.h"
+#include <wtf/Ref.h>
+
+namespace WebCore {
+
+RefPtr<WebAnimation> WebAnimation::create(AnimationEffect* effect, AnimationTimeline* timeline)
+{
+    if (!effect) {
+        // FIXME: Support creating animations with null effect.
+        return nullptr;
+    }
+
+    if (!timeline) {
+        // FIXME: Support creating animations without a timeline.
+        return nullptr;
+    } 
+
+    if (!timeline->isDocumentTimeline()) {
+        // FIXME: Currently only support DocumentTimeline.
+        return nullptr;
+    } 
+
+    return adoptRef(new WebAnimation(effect, timeline));
+}
+
+WebAnimation::WebAnimation(AnimationEffect* effect, AnimationTimeline* timeline)
+    : m_effect(effect)
+    , m_timeline(timeline)
+    , m_weakPtrFactory(this)
+{
+    if (m_effect)
+        m_effect->setAnimation(this);
+
+    if (m_timeline)
+        m_timeline->attachAnimation(*this);
+}
+
+WebAnimation::~WebAnimation()
+{
+    if (m_effect)
+        m_effect->setAnimation(nullptr);
+
+    if (m_timeline)
+        m_timeline->detachAnimation(*this);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_ANIMATIONS)
diff --git a/Source/WebCore/animation/WebAnimation.h b/Source/WebCore/animation/WebAnimation.h
new file mode 100644 (file)
index 0000000..b0173b6
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) Canon Inc. 2016
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted, provided that the following conditions
+ * are required to be 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.
+ * 3. Neither the name of Canon Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "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 CANON INC. AND ITS 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.
+ */
+
+#pragma once
+
+#if ENABLE(WEB_ANIMATIONS)
+
+#include <wtf/RefCounted.h>
+#include <wtf/RefPtr.h>
+#include <wtf/Vector.h>
+#include <wtf/WeakPtr.h>
+
+namespace WebCore {
+
+class AnimationEffect;
+class AnimationTimeline;
+
+class WebAnimation final : public RefCounted<WebAnimation> {
+public:
+    static RefPtr<WebAnimation> create(AnimationEffect*, AnimationTimeline*);
+    ~WebAnimation();
+
+    AnimationEffect* effect() const { return m_effect.get(); }
+    AnimationTimeline* timeline() const { return m_timeline.get(); }
+
+    WeakPtr<WebAnimation> createWeakPtr() const { return m_weakPtrFactory.createWeakPtr(); }
+
+private:
+    WebAnimation(AnimationEffect*, AnimationTimeline*);
+
+    RefPtr<AnimationEffect> m_effect;
+    RefPtr<AnimationTimeline> m_timeline;
+    WeakPtrFactory<WebAnimation> m_weakPtrFactory;
+};
+
+typedef Vector<WebAnimation *> WebAnimationVector;
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_ANIMATIONS)
diff --git a/Source/WebCore/animation/WebAnimation.idl b/Source/WebCore/animation/WebAnimation.idl
new file mode 100644 (file)
index 0000000..4709fea
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) Canon Inc. 2016
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted, provided that the following conditions
+ * are required to be 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.
+ * 3. Neither the name of Canon Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "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 CANON INC. AND ITS 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.
+ */
+
+[
+    Conditional=WEB_ANIMATIONS,
+    InterfaceName=Animation,
+    ImplementationLacksVTable,
+    Constructor([Default=Undefined] AnimationEffect? effect, [Default=Undefined] AnimationTimeline? timeline)
+] interface WebAnimation { // FIXME: Inherit from EventTarget.
+    // FIXME: Incomplete interface.
+    readonly attribute AnimationEffect? effect;
+    readonly attribute AnimationTimeline? timeline;
+};
index 541cc78..7e02c2c 100644 (file)
@@ -47,7 +47,7 @@ my %baseTypeHash = ("Object" => 1, "Node" => 1, "NodeList" => 1, "NamedNodeMap"
                     "Event" => 1, "CSSRule" => 1, "CSSValue" => 1, "StyleSheet" => 1, "MediaList" => 1,
                     "Counter" => 1, "Rect" => 1, "RGBColor" => 1, "XPathExpression" => 1, "XPathResult" => 1,
                     "NodeIterator" => 1, "TreeWalker" => 1, "AbstractView" => 1, "Blob" => 1, "DOMTokenList" => 1,
-                    "HTMLCollection" => 1, "TextTrackCue" => 1, "AnimationTimeline" => 1);
+                    "HTMLCollection" => 1, "TextTrackCue" => 1, "AnimationTimeline" => 1, "AnimationEffect" => 1);
 
 # Only objects derived from Node are released by the DOM object cache and can be
 # transfer none. Ideally we could use GetBaseClass with the parent type to check
@@ -63,7 +63,7 @@ my %transferFullTypeHash = ("AudioTrack" => 1, "AudioTrackList" => 1, "BarProp"
     "DOMWindow" => 1, "DOMWindowCSS" => 1, "EventTarget" => 1,
     "File" => 1, "FileList" => 1, "Gamepad" => 1, "GamepadList" => 1,
     "Geolocation" => 1, "HTMLOptionsCollection" => 1, "History" => 1,
-    "KeyboardEvent" => 1, "MediaError" => 1, "MediaController" => 1,
+    "KeyboardEvent" => 1, "KeyframeEffect" => 1, "MediaError" => 1, "MediaController" => 1,
     "MouseEvent" => 1, "MediaQueryList" => 1, "Navigator" => 1, "NodeFilter" => 1,
     "Performance" => 1, "PerformanceEntry" => 1, "PerformanceEntryList" => 1, "PerformanceNavigation" => 1, "PerformanceTiming" => 1,
     "Range" => 1, "Screen" => 1, "SpeechSynthesis" => 1, "SpeechSynthesisVoice" => 1,
index 7d0d9eb..92b0c2e 100644 (file)
@@ -40,6 +40,7 @@
 #include "CustomElementDefinitions.h"
 #include "DOMTokenList.h"
 #include "Dictionary.h"
+#include "DocumentAnimation.h"
 #include "DocumentSharedObjectPool.h"
 #include "ElementIterator.h"
 #include "ElementRareData.h"
@@ -66,6 +67,7 @@
 #include "IdTargetObserverRegistry.h"
 #include "JSLazyEventListener.h"
 #include "KeyboardEvent.h"
+#include "KeyframeEffect.h"
 #include "LifecycleCallbackQueue.h"
 #include "MainFrame.h"
 #include "MutationObserverInterestGroup.h"
@@ -1382,6 +1384,21 @@ ElementStyle Element::resolveStyle(const RenderStyle* parentStyle)
     return styleResolver().styleForElement(*this, parentStyle);
 }
 
+#if ENABLE(WEB_ANIMATIONS)
+WebAnimationVector Element::getAnimations()
+{
+    auto checkTarget = [this](AnimationEffect const& effect)
+    {
+        return (static_cast<KeyframeEffect const&>(effect).target() == this);
+    };
+
+    auto* document = DocumentAnimation::from(&this->document());
+    if (document)
+        return document->getAnimations(checkTarget);
+    return WebAnimationVector();
+}
+#endif
+
 bool Element::hasDisplayContents() const
 {
     return hasRareData() && elementRareData()->hasDisplayContents();
index 7e0ddbf..2147324 100644 (file)
@@ -52,6 +52,7 @@ class PlatformWheelEvent;
 class PseudoElement;
 class RenderNamedFlowFragment;
 class RenderTreePosition;
+class WebAnimation;
 struct ElementStyle;
 
 enum SpellcheckAttributeState {
@@ -516,6 +517,10 @@ public:
     using ContainerNode::setAttributeEventListener;
     void setAttributeEventListener(const AtomicString& eventType, const QualifiedName& attributeName, const AtomicString& value);
 
+#if ENABLE(WEB_ANIMATIONS)
+    Vector<WebAnimation*> getAnimations();
+#endif
+
 protected:
     Element(const QualifiedName&, Document&, ConstructionType);
 
index 7c71738..7e0ee08 100644 (file)
@@ -240,6 +240,7 @@ dictionary ShadowRootInit {
     required ShadowRootMode mode;
 };
 
+Element implements Animatable;
 Element implements ChildNode;
 Element implements ParentNode;
 Element implements NonDocumentTypeChildNode;
index d1aebb2..39f0762 100644 (file)
@@ -1,3 +1,22 @@
+2016-06-08  Rawinder Singh  <rawinder.singh-webkit@cisra.canon.com.au>
+
+        [web-animations] Add Animatable, AnimationEffect, KeyframeEffect and Animation interface
+        https://bugs.webkit.org/show_bug.cgi?id=156096
+
+        Reviewed by Dean Jackson.
+
+        Adds:
+        - Setup interface for enabling runtime flag for Web animations through preferences.
+
+        * WebView/WebPreferenceKeysPrivate.h:
+        * WebView/WebPreferences.mm:
+        (+[WebPreferences initialize]):
+        (-[WebPreferences webAnimationsEnabled]):
+        (-[WebPreferences setWebAnimationsEnabled:]):
+        * WebView/WebPreferencesPrivate.h:
+        * WebView/WebView.mm:
+        (-[WebView _preferencesChanged:]):
+
 2016-06-07  David Kilzer  <ddkilzer@apple.com>
 
         [iOS WK1] Remove unused -_webkit_unescapedQueryValue and -_webkit_queryKeysAndValues NSString category methods
index cd186cd..8a36f3b 100644 (file)
@@ -52,6 +52,7 @@
 #define WebKitJavaEnabledPreferenceKey @"WebKitJavaEnabled"
 #define WebKitJavaScriptEnabledPreferenceKey @"WebKitJavaScriptEnabled"
 #define WebKitJavaScriptMarkupEnabledPreferenceKey @"WebKitJavaScriptMarkupEnabled"
+#define WebKitWebAnimationsEnabledPreferenceKey @"WebKitWebAnimationsEnabled"
 #define WebKitWebSecurityEnabledPreferenceKey @"WebKitWebSecurityEnabled"
 #define WebKitAllowUniversalAccessFromFileURLsPreferenceKey @"WebKitAllowUniversalAccessFromFileURLs"
 #define WebKitAllowFileAccessFromFileURLsPreferenceKey @"WebKitAllowFileAccessFromFileURLs"
index 2edb12f..762f878 100644 (file)
@@ -624,6 +624,9 @@ public:
 #if ENABLE(CSS_GRID_LAYOUT)
         [NSNumber numberWithBool:YES], WebKitCSSGridLayoutEnabledPreferenceKey,
 #endif
+#if ENABLE(WEB_ANIMATIONS)
+        [NSNumber numberWithBool:NO], WebKitWebAnimationsEnabledPreferenceKey,
+#endif
         nil];
 
 #if !PLATFORM(IOS)
@@ -2754,6 +2757,16 @@ static NSString *classIBCreatorID = nil;
     [self _setBoolValue:flag forKey:WebKitCSSGridLayoutEnabledPreferenceKey];
 }
 
+- (BOOL)webAnimationsEnabled
+{
+    return [self _boolValueForKey:WebKitWebAnimationsEnabledPreferenceKey];
+}
+
+- (void)setWebAnimationsEnabled:(BOOL)flag
+{
+    [self _setBoolValue:flag forKey:WebKitWebAnimationsEnabledPreferenceKey];
+}
+
 @end
 
 @implementation WebPreferences (WebInternal)
index 23994a6..e0eef5e 100644 (file)
@@ -490,6 +490,9 @@ extern NSString *WebPreferencesCacheModelChangedInternalNotification;
 - (void)setCSSGridLayoutEnabled:(BOOL)flag;
 - (BOOL)isCSSGridLayoutEnabled;
 
+- (void)setWebAnimationsEnabled:(BOOL)flag;
+- (BOOL)webAnimationsEnabled;
+
 @property (nonatomic) BOOL javaScriptMarkupEnabled;
 @property (nonatomic) BOOL mediaDataLoadsAutomatically;
 @property (nonatomic) BOOL attachmentElementEnabled;
index b014b6b..f3f03b5 100644 (file)
@@ -2512,6 +2512,10 @@ static bool needsSelfRetainWhileLoadingQuirk()
     RuntimeEnabledFeatures::sharedFeatures().setCSSGridLayoutEnabled([preferences isCSSGridLayoutEnabled]);
 #endif
 
+#if ENABLE(WEB_ANIMATIONS)
+    RuntimeEnabledFeatures::sharedFeatures().setWebAnimationsEnabled([preferences webAnimationsEnabled]);
+#endif
+
     NSTimeInterval timeout = [preferences incrementalRenderingSuppressionTimeoutInSeconds];
     if (timeout > 0)
         settings.setIncrementalRenderingSuppressionTimeoutInSeconds(timeout);