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

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: rebase + remove WillBe types. 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 3509486acdcc5c825fc6d711b6085462ab25477a..03503342e5afa6bc554bc70e952b9c018eca54cb 100644
--- a/third_party/WebKit/Source/modules/csspaint/PaintWorkletGlobalScope.cpp
+++ b/third_party/WebKit/Source/modules/csspaint/PaintWorkletGlobalScope.cpp
@@ -4,8 +4,12 @@
#include "modules/csspaint/PaintWorkletGlobalScope.h"
+#include "bindings/core/v8/ScopedPersistent.h"
+#include "bindings/core/v8/V8BindingMacros.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 +31,91 @@ 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::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 (!v8Call(constructor->Get(context, v8String(isolate, "inputProperties")), inputPropertiesValue))
+ 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 (!v8Call(constructor->Get(context, v8String(isolate, "prototype")), prototypeValue))
+ 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 (!v8Call(prototype->Get(context, v8String(isolate, "paint")), paintValue))
+ 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);
+
+ RawPtr<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)
+{
+ visitor->trace(m_paintDefinitions);
+ WorkletGlobalScope::trace(visitor);
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698