Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(466)

Unified Diff: third_party/WebKit/Source/modules/csspaint/PaintWorkletGlobalScope.cpp

Issue 1839913002: Implement PaintWorkletGlobalScope#registerPaint() for the CSS Paint API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix win build. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/csspaint/PaintWorkletGlobalScope.cpp
diff --git a/third_party/WebKit/Source/modules/csspaint/PaintWorkletGlobalScope.cpp b/third_party/WebKit/Source/modules/csspaint/PaintWorkletGlobalScope.cpp
index ec5f583315f21d4b9b1c2d6de82d3f185336f81b..85c4f63a12e708ed226e28f9502f1043e58e3d43 100644
--- a/third_party/WebKit/Source/modules/csspaint/PaintWorkletGlobalScope.cpp
+++ b/third_party/WebKit/Source/modules/csspaint/PaintWorkletGlobalScope.cpp
@@ -4,8 +4,11 @@
#include "modules/csspaint/PaintWorkletGlobalScope.h"
+#include "bindings/core/v8/ScopedPersistent.h"
#include "bindings/core/v8/WorkerOrWorkletScriptController.h"
+#include "core/dom/ExceptionCode.h"
#include "core/inspector/MainThreadDebugger.h"
+#include "modules/csspaint/CSSPaintDefinition.h"
namespace blink {
@@ -27,4 +30,101 @@ PaintWorkletGlobalScope::~PaintWorkletGlobalScope()
{
}
+void PaintWorkletGlobalScope::dispose()
+{
+ // Explicitly clear the paint defininitions to break a reference cycle
+ // between them and this global scope.
+ m_paintDefinitions.clear();
+
+ WorkletGlobalScope::dispose();
+}
+
+void PaintWorkletGlobalScope::registerPaint(const String& name, const ScriptValue& ctorValue, ExceptionState& exceptionState)
+{
+ if (m_paintDefinitions.contains(name)) {
+ exceptionState.throwDOMException(NotSupportedError, "A class with name:'" + name + "' is already registered.");
+ return;
+ }
+
+ if (name.isEmpty()) {
+ exceptionState.throwTypeError("The empty string is not a valid name.");
+ return;
+ }
+
+ v8::Isolate* isolate = scriptController()->getScriptState()->isolate();
+
+ v8::TryCatch block(isolate);
haraken 2016/04/01 00:16:06 I don't think you need this TryCatch block.
ikilpatrick 2016/04/01 03:08:43 Done.
+ v8::Local<v8::Context> context = scriptController()->context();
+
+ ASSERT(ctorValue.v8Value()->IsFunction());
+ v8::Local<v8::Function> constructor = v8::Local<v8::Function>::Cast(ctorValue.v8Value());
+
+ v8::Local<v8::Value> inputPropertiesValue;
+ if (!constructor->Get(context, v8String(isolate, "inputProperties")).ToLocal(&inputPropertiesValue)) {
haraken 2016/04/01 00:16:06 Would you use v8Call macros in V8BindingMacros.h?
ikilpatrick 2016/04/01 03:08:43 Get can also fail if the developer does something
+ exceptionState.rethrowV8Exception(block.Exception());
+ return;
+ }
+
+ if (!isUndefinedOrNull(inputPropertiesValue)) {
+ toImplArray<Vector<String>>(inputPropertiesValue, 0, isolate, exceptionState);
+
+ if (exceptionState.hadException())
+ return;
+
+ // TODO(ikilpatrick): Hook up invalidation based on these inputProperties.
+ }
+
+ v8::Local<v8::Value> prototypeValue;
+ if (!constructor->Get(context, v8String(isolate, "prototype")).ToLocal(&prototypeValue)) {
+ exceptionState.rethrowV8Exception(block.Exception());
+ return;
+ }
+
+ if (isUndefinedOrNull(prototypeValue)) {
+ exceptionState.throwTypeError("The 'prototype' object on the class does not exist.");
+ return;
+ }
+
+ if (!prototypeValue->IsObject()) {
+ exceptionState.throwTypeError("The 'prototype' property on the class is not an object.");
+ return;
+ }
+
+ v8::Local<v8::Object> prototype = v8::Local<v8::Object>::Cast(prototypeValue);
+
+ v8::Local<v8::Value> paintValue;
+ if (!prototype->Get(context, v8String(isolate, "paint")).ToLocal(&paintValue)) {
+ exceptionState.rethrowV8Exception(block.Exception());
+ return;
+ }
+
+ if (isUndefinedOrNull(paintValue)) {
+ exceptionState.throwTypeError("The 'paint' function on the prototype does not exist.");
+ return;
+ }
+
+ if (!paintValue->IsFunction()) {
+ exceptionState.throwTypeError("The 'paint' property on the prototype is not a function.");
+ return;
+ }
+
+ v8::Local<v8::Function> paint = v8::Local<v8::Function>::Cast(paintValue);
+
+ RefPtrWillBeRawPtr<CSSPaintDefinition> definition = CSSPaintDefinition::create(scriptController()->getScriptState(), constructor, paint);
+ m_paintDefinitions.set(name, definition);
+}
+
+CSSPaintDefinition* PaintWorkletGlobalScope::findDefinition(const String& name)
+{
+ return m_paintDefinitions.get(name);
+}
+
+DEFINE_TRACE(PaintWorkletGlobalScope)
+{
+#if ENABLE(OILPAN)
+ visitor->trace(m_paintDefinitions);
+#endif
+ WorkletGlobalScope::trace(visitor);
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698