Index: Source/core/wawwa/AnimatableElement.cpp |
diff --git a/Source/core/wawwa/AnimatableElement.cpp b/Source/core/wawwa/AnimatableElement.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a1a2c4c58424d63422e6c14ef83831dc01ddf454 |
--- /dev/null |
+++ b/Source/core/wawwa/AnimatableElement.cpp |
@@ -0,0 +1,120 @@ |
+/* |
+ * Copyright (C) 2014 Google Inc. All rights reserved. |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions are |
+ * met: |
+ * |
+ * * Redistributions of source code must retain the above copyright |
+ * notice, this list of conditions and the following disclaimer. |
+ * * 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. |
+ * * Neither the name of Google 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT |
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES{ |
+ |
+ } LOSS OF USE, |
+ * DATA, OR PROFITS{ |
+ |
+ } OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ */ |
+ |
+#include "config.h" |
+#include "core/wawwa/AnimatableElement.h" |
+ |
+namespace blink { |
+ |
+AnimatableElement::AnimatableElement(String inputID) |
+ : m_id(inputID) |
+{ |
+} |
+ |
+PassRefPtrWillBeRawPtr<AnimatableElement> AnimatableElement::create(String inputID) |
+{ |
+ return adoptRef(new AnimatableElement(inputID)); |
+} |
+ |
+AnimatableElement * AnimatableElement::clone() |
+{ |
+ return new AnimatableElement(m_id); |
+} |
+ |
+PassRefPtrWillBeRawPtr<MockAnimationPlayer> AnimatableElement::animate(const Vector<Dictionary>& keyframeDictionaryVector, const Dictionary& timingInputDictionary, PassRefPtr<DedicatedWorkerGlobalScope> workerGlobalScope, ExceptionState& es) |
+{ |
+ String temp = m_id.isolatedCopy(); |
+ String action = "animate_element"; |
+ action = action.isolatedCopy(); |
+ if (!temp.isSafeToSendToAnotherThread() || !action.isSafeToSendToAnotherThread()) { |
+ exit(42); |
shans
2014/08/25 11:53:58
ASSERT(temp.isSafeToSendToAnotherThread() && actio
|
+ } |
+ Document* doc = static_cast<Document*>(workerGlobalScope->thread()->workerObjectProxy().context()); |
+ Page* page = doc->page(); |
+ |
+ Timing ti = TimingInput::convert(timingInputDictionary); |
+ |
+ Vector<ProxyKeyframe> holdVector; |
+ |
+ ProxyKeyframe keyframe; |
+ double lastOffset = 0; |
+ for (size_t i = 0; i < keyframeDictionaryVector.size(); i++) { |
+ ScriptValue scriptValue; |
+ bool frameHasOffset = DictionaryHelper::get(keyframeDictionaryVector[i], "offset", scriptValue) && !scriptValue.isNull(); |
+ if (frameHasOffset) { |
+ double offset; |
+ DictionaryHelper::get(keyframeDictionaryVector[i], "offset", offset); |
+ if (std::isnan(offset)) { |
+ es.throwDOMException(InvalidModificationError, "Non numeric offset provided"); |
+ } |
+ if (offset < 0 || offset > 1) { |
+ es.throwDOMException(InvalidModificationError, "Offsets provided outside the range [0, 1]"); |
+ return nullptr; |
+ } |
+ if (offset < lastOffset) { |
+ es.throwDOMException(InvalidModificationError, "Keyframes with specified offsets are not sorted"); |
+ return nullptr; |
+ } |
+ lastOffset = offset; |
+ keyframe.offset = offset; |
+ } |
+ keyframe.offset = 2; |
+ String compositeString; |
+ DictionaryHelper::get(keyframeDictionaryVector[i], "composite", compositeString); |
+ if (compositeString == "add") |
+ keyframe.composite = compositeString; |
+ String timingFunctionString; |
+ if (DictionaryHelper::get(keyframeDictionaryVector[i], "easing", timingFunctionString)) { |
+ if (RefPtrWillBeRawPtr<CSSValue> timingFunctionValue = BisonCSSParser::parseAnimationTimingFunctionValue(timingFunctionString)) |
+ keyframe.easing = timingFunctionString; |
+ } |
+ |
+ Vector<String> holdProperties; |
+ holdProperties.clear(); |
+ keyframe.pairs.clear(); |
+ keyframeDictionaryVector[i].getOwnPropertyNames(holdProperties); |
+ for (size_t j = 0; j < holdProperties.size(); j++) { |
+ String property = holdProperties[j]; |
+ String value; |
+ DictionaryHelper::get(keyframeDictionaryVector[i], property, value); |
+ ProxyPairs pair1 = {property, value}; |
+ keyframe.pairs.append(pair1); |
+ } |
+ holdVector.append(keyframe); |
+ } |
+ workerGlobalScope->thread()->workerObjectProxy().postTaskToMainExecutionContext(createCrossThreadTask(&ListOfElements::execute, AllowCrossThreadAccess(page->m_listOfElements.get()), action, temp, holdVector, ti)); |
shans
2014/08/25 11:53:58
This could be split onto a few lines for better re
|
+ return adoptRef(new MockAnimationPlayer(m_id, workerGlobalScope, holdVector, ti)); |
+} |
+ |
+} // namespace blink |