Changeset 237243 in webkit


Ignore:
Timestamp:
Oct 17, 2018 7:47:00 PM (6 years ago)
Author:
commit-queue@webkit.org
Message:

Parse paint() and store paint callbacks for CSS Painting API
https://bugs.webkit.org/show_bug.cgi?id=190657

Patch by Justin Michaud <Justin Michaud> on 2018-10-17
Reviewed by Dean Jackson.

Source/WebCore:

Implement support for parsing paint() images in css, and store CSS paint callback objects in the paint definition map.

  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • bindings/js/JSCSSPaintWorkletGlobalScopeCustom.cpp:

(WebCore::JSCSSPaintWorkletGlobalScope::visitAdditionalChildren):
(WebCore::JSCSSPaintWorkletGlobalScope::registerPaint):

  • css/CSSImageGeneratorValue.cpp:

(WebCore::CSSImageGeneratorValue::image):
(WebCore::CSSImageGeneratorValue::isFixedSize const):
(WebCore::CSSImageGeneratorValue::fixedSize):
(WebCore::CSSImageGeneratorValue::isPending const):
(WebCore::CSSImageGeneratorValue::knownToBeOpaque const):
(WebCore::CSSImageGeneratorValue::loadSubimages):

  • css/CSSPaintImageValue.cpp: Added.

(WebCore::CSSPaintImageValue::customCSSText const):

  • css/CSSPaintImageValue.h: Added.
  • css/CSSPaintWorkletGlobalScope.h:
  • css/CSSPaintWorkletGlobalScope.idl:
  • css/CSSValue.cpp:

(WebCore::CSSValue::equals const):
(WebCore::CSSValue::cssText const):
(WebCore::CSSValue::destroy):

  • css/CSSValue.h:

(WebCore::CSSValue::isPaintImageValue const):

  • css/CSSValueKeywords.in:
  • css/parser/CSSPropertyParserHelpers.cpp:

(WebCore::CSSPropertyParserHelpers::consumeCustomPaint):
(WebCore::CSSPropertyParserHelpers::consumeGeneratedImage):
(WebCore::CSSPropertyParserHelpers::isGeneratedImage):

  • platform/mediastream/mac/RealtimeVideoUtilities.h:

LayoutTests:

  • fast/css-custom-paint/basic-expected.txt:
  • fast/css-custom-paint/basic.html:
Location:
trunk
Files:
2 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r237239 r237243  
     12018-10-17  Justin Michaud  <justin_michaud@apple.com>
     2
     3        Parse paint() and store paint callbacks for CSS Painting API
     4        https://bugs.webkit.org/show_bug.cgi?id=190657
     5
     6        Reviewed by Dean Jackson.
     7
     8        * fast/css-custom-paint/basic-expected.txt:
     9        * fast/css-custom-paint/basic.html:
     10
    1112018-10-17  Justin Fan  <justin_fan@apple.com>
    212
  • trunk/LayoutTests/fast/css-custom-paint/basic-expected.txt

    r237192 r237243  
    66PASS test that registerPaint runs with predefined class
    77PASS test that registerPaint accepts only a string and a class constructor
     8PASS test that test div has paint() value
    89
  • trunk/LayoutTests/fast/css-custom-paint/basic.html

    r237192 r237243  
    55<script src="../../resources/testharness.js"></script>
    66<script src="../../resources/testharnessreport.js"></script>
     7
     8<style>
     9  #paint {
     10    background-image: paint(my-paint);
     11    width: 50px;
     12    height: 50px;
     13  }
     14</style>
     15
     16<div id="paint"></div>
     17
    718<script>
    819test(function() {
     
    5263}, 'test that registerPaint accepts only a string and a class constructor');
    5364
     65test(function() {
     66  assert_equals(getComputedStyle(paint).getPropertyValue("background-image"), "paint(my-paint)");
     67}, 'test that test div has paint() value');
     68
    5469</script>
  • trunk/Source/WebCore/ChangeLog

    r237240 r237243  
     12018-10-17  Justin Michaud  <justin_michaud@apple.com>
     2
     3        Parse paint() and store paint callbacks for CSS Painting API
     4        https://bugs.webkit.org/show_bug.cgi?id=190657
     5
     6        Reviewed by Dean Jackson.
     7
     8        Implement support for parsing paint() images in css, and store CSS paint callback objects in the paint definition map.
     9
     10        * Sources.txt:
     11        * WebCore.xcodeproj/project.pbxproj:
     12        * bindings/js/JSCSSPaintWorkletGlobalScopeCustom.cpp:
     13        (WebCore::JSCSSPaintWorkletGlobalScope::visitAdditionalChildren):
     14        (WebCore::JSCSSPaintWorkletGlobalScope::registerPaint):
     15        * css/CSSImageGeneratorValue.cpp:
     16        (WebCore::CSSImageGeneratorValue::image):
     17        (WebCore::CSSImageGeneratorValue::isFixedSize const):
     18        (WebCore::CSSImageGeneratorValue::fixedSize):
     19        (WebCore::CSSImageGeneratorValue::isPending const):
     20        (WebCore::CSSImageGeneratorValue::knownToBeOpaque const):
     21        (WebCore::CSSImageGeneratorValue::loadSubimages):
     22        * css/CSSPaintImageValue.cpp: Added.
     23        (WebCore::CSSPaintImageValue::customCSSText const):
     24        * css/CSSPaintImageValue.h: Added.
     25        * css/CSSPaintWorkletGlobalScope.h:
     26        * css/CSSPaintWorkletGlobalScope.idl:
     27        * css/CSSValue.cpp:
     28        (WebCore::CSSValue::equals const):
     29        (WebCore::CSSValue::cssText const):
     30        (WebCore::CSSValue::destroy):
     31        * css/CSSValue.h:
     32        (WebCore::CSSValue::isPaintImageValue const):
     33        * css/CSSValueKeywords.in:
     34        * css/parser/CSSPropertyParserHelpers.cpp:
     35        (WebCore::CSSPropertyParserHelpers::consumeCustomPaint):
     36        (WebCore::CSSPropertyParserHelpers::consumeGeneratedImage):
     37        (WebCore::CSSPropertyParserHelpers::isGeneratedImage):
     38        * platform/mediastream/mac/RealtimeVideoUtilities.h:
     39
    1402018-10-17  Eric Carlson  <eric.carlson@apple.com>
    241
  • trunk/Source/WebCore/Sources.txt

    r237239 r237243  
    610610css/CSSNamespaceRule.cpp
    611611css/CSSPageRule.cpp
     612css/CSSPaintImageValue.cpp
    612613css/CSSPaintWorkletGlobalScope.cpp
    613614css/CSSPendingSubstitutionValue.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r237239 r237243  
    13511351                4B6B5CBD21640EFF00603817 /* DOMCSSPaintWorklet.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6B5CB82163EC0700603817 /* DOMCSSPaintWorklet.h */; settings = {ATTRIBUTES = (Private, ); }; };
    13521352                4B6B5CC02164386400603817 /* CSSPaintWorkletGlobalScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6B5CBF2164386400603817 /* CSSPaintWorkletGlobalScope.h */; };
     1353                4B6E87692176D69200420E5E /* CSSPaintImageValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6E87682176D69200420E5E /* CSSPaintImageValue.h */; };
    13531354                4B6FA6F40C39E48C00087011 /* SmartReplace.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6FA6F20C39E48C00087011 /* SmartReplace.h */; settings = {ATTRIBUTES = (Private, ); }; };
    13541355                4BAE95B10B2FA9CE00AED8A0 /* EditorDeleteAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BAE95B00B2FA9CE00AED8A0 /* EditorDeleteAction.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    78897890                4B6B5CC1216439CF00603817 /* CSSPaintWorkletGlobalScope.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CSSPaintWorkletGlobalScope.cpp; sourceTree = "<group>"; };
    78907891                4B6B5CC321643A8E00603817 /* CSSPaintWorkletGlobalScope.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = CSSPaintWorkletGlobalScope.idl; sourceTree = "<group>"; };
     7892                4B6E87682176D69200420E5E /* CSSPaintImageValue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSSPaintImageValue.h; sourceTree = "<group>"; };
     7893                4B6E876B2176D8A100420E5E /* CSSPaintImageValue.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CSSPaintImageValue.cpp; sourceTree = "<group>"; };
    78917894                4B6FA6F20C39E48C00087011 /* SmartReplace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmartReplace.h; sourceTree = "<group>"; };
    78927895                4B6FA6F60C39E4A100087011 /* SmartReplaceCF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SmartReplaceCF.cpp; sourceTree = "<group>"; };
     
    2599125994                                4B5BDD9A21658A1500DD4262 /* CSSPaintCallback.h */,
    2599225995                                4B5BDD99216588E500DD4262 /* CSSPaintCallback.idl */,
     25996                                4B6E876B2176D8A100420E5E /* CSSPaintImageValue.cpp */,
     25997                                4B6E87682176D69200420E5E /* CSSPaintImageValue.h */,
    2599325998                                4B6B5CC1216439CF00603817 /* CSSPaintWorkletGlobalScope.cpp */,
    2599425999                                4B6B5CBF2164386400603817 /* CSSPaintWorkletGlobalScope.h */,
     
    2799327998                                A80E6D000A1989CA007FB8C5 /* CSSPageRule.h in Headers */,
    2799427999                                4B5BDD9B21658A1500DD4262 /* CSSPaintCallback.h in Headers */,
     28000                                4B6E87692176D69200420E5E /* CSSPaintImageValue.h in Headers */,
    2799528001                                4B6B5CC02164386400603817 /* CSSPaintWorkletGlobalScope.h in Headers */,
    2799628002                                946D372E1D6CB2940077084F /* CSSParser.h in Headers */,
  • trunk/Source/WebCore/bindings/js/JSCSSPaintWorkletGlobalScopeCustom.cpp

    r237192 r237243  
    4343    throwException(&state, scope, createDOMException(&state, InvalidModificationError, message));
    4444    return jsUndefined();
     45}
     46
     47void JSCSSPaintWorkletGlobalScope::visitAdditionalChildren(JSC::SlotVisitor& visitor)
     48{
     49    for (auto& registered : wrapped().paintDefinitionMap().values())
     50        registered->paintCallback->visitJSFunction(visitor);
    4551}
    4652
     
    116122    RETURN_IF_EXCEPTION(scope, JSValue());
    117123
    118     auto paintDefinition = std::unique_ptr<PaintDefinition>(new PaintDefinition { name });
     124    auto paintDefinition = std::unique_ptr<PaintDefinition>(new PaintDefinition { name, paint.releaseNonNull(), inputProperties, inputArguments });
    119125    paintDefinitionMap.add(name, WTFMove(paintDefinition));
    120126
    121127    // FIXME: construct documentDefinition (step 22).
    122 
    123     // FIXME: This is for testing only.
    124     paint->handleEvent();
    125     RETURN_IF_EXCEPTION(scope, JSValue());
    126 
    127     UNUSED_PARAM(inputProperties);
    128     UNUSED_PARAM(inputArguments);
    129128
    130129    return jsUndefined();
  • trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp

    r231105 r237243  
    151151    case ConicGradientClass:
    152152        return downcast<CSSConicGradientValue>(*this).image(renderer, size);
     153#if ENABLE(CSS_PAINTING_API)
     154    case PaintImageClass:
     155        return nullptr;
     156#endif
    153157    default:
    154158        ASSERT_NOT_REACHED();
     
    174178    case ConicGradientClass:
    175179        return downcast<CSSConicGradientValue>(*this).isFixedSize();
     180#if ENABLE(CSS_PAINTING_API)
     181    case PaintImageClass:
     182        return false;
     183#endif
    176184    default:
    177185        ASSERT_NOT_REACHED();
     
    195203    case ConicGradientClass:
    196204        return downcast<CSSConicGradientValue>(*this).fixedSize(renderer);
     205#if ENABLE(CSS_PAINTING_API)
     206    case PaintImageClass:
     207        return FloatSize();
     208#endif
    197209    default:
    198210        ASSERT_NOT_REACHED();
     
    218230    case ConicGradientClass:
    219231        return downcast<CSSConicGradientValue>(*this).isPending();
     232#if ENABLE(CSS_PAINTING_API)
     233    case PaintImageClass:
     234        return false;
     235#endif
    220236    default:
    221237        ASSERT_NOT_REACHED();
     
    241257    case ConicGradientClass:
    242258        return downcast<CSSConicGradientValue>(*this).knownToBeOpaque(renderer);
     259#if ENABLE(CSS_PAINTING_API)
     260    case PaintImageClass:
     261        return false;
     262#endif
    243263    default:
    244264        ASSERT_NOT_REACHED();
     
    268288        downcast<CSSConicGradientValue>(*this).loadSubimages(cachedResourceLoader, options);
    269289        break;
     290#if ENABLE(CSS_PAINTING_API)
     291    case PaintImageClass:
     292        break;
     293#endif
    270294    default:
    271295        ASSERT_NOT_REACHED();
  • trunk/Source/WebCore/css/CSSPaintWorkletGlobalScope.h

    r237192 r237243  
    2828#if ENABLE(CSS_PAINTING_API)
    2929
     30#include "CSSPaintCallback.h"
    3031#include "ExceptionOr.h"
    3132#include <wtf/HashMap.h>
     
    5051    struct PaintDefinition {
    5152        const AtomicString name;
     53        const Ref<CSSPaintCallback> paintCallback;
     54        const Vector<String> inputProperties;
     55        const Vector<String> inputArguments;
    5256    };
    5357
  • trunk/Source/WebCore/css/CSSPaintWorkletGlobalScope.idl

    r237192 r237243  
    2828    Conditional=CSS_PAINTING_API,
    2929    ImplementationLacksVTable,
     30    JSCustomMarkFunction,
    3031    JSGenerateToNativeObject
    3132] interface CSSPaintWorkletGlobalScope {
  • trunk/Source/WebCore/css/CSSValue.cpp

    r236998 r237243  
    5353#include "CSSLineBoxContainValue.h"
    5454#include "CSSNamedImageValue.h"
     55#include "CSSPaintImageValue.h"
    5556#include "CSSPendingSubstitutionValue.h"
    5657#include "CSSPrimitiveValue.h"
     
    152153        case FilterImageClass:
    153154            return compareCSSValues<CSSFilterImageValue>(*this, other);
     155#if ENABLE(CSS_PAINTING_API)
     156        case PaintImageClass:
     157            return compareCSSValues<CSSPaintImageValue>(*this, other);
     158#endif
    154159        case FontClass:
    155160            return compareCSSValues<CSSFontValue>(*this, other);
     
    248253    case FilterImageClass:
    249254        return downcast<CSSFilterImageValue>(*this).customCSSText();
     255#if ENABLE(CSS_PAINTING_API)
     256    case PaintImageClass:
     257        return downcast<CSSPaintImageValue>(*this).customCSSText();
     258#endif
    250259    case FontClass:
    251260        return downcast<CSSFontValue>(*this).customCSSText();
     
    433442        delete downcast<CSSFilterImageValue>(this);
    434443        return;
     444#if ENABLE(CSS_PAINTING_API)
     445    case PaintImageClass:
     446        delete downcast<CSSPaintImageValue>(this);
     447        return;
     448#endif
    435449    case CSSContentDistributionClass:
    436450        delete downcast<CSSContentDistributionValue>(this);
  • trunk/Source/WebCore/css/CSSValue.h

    r236998 r237243  
    107107    bool isCalcValue() const {return m_classType == CalculationClass; }
    108108    bool isFilterImageValue() const { return m_classType == FilterImageClass; }
     109#if ENABLE(CSS_PAINTING_API)
     110    bool isPaintImageValue() const { return m_classType == PaintImageClass; }
     111#endif
    109112    bool isContentDistributionValue() const { return m_classType == CSSContentDistributionClass; }
    110113    bool isGridAutoRepeatValue() const { return m_classType == GridAutoRepeatClass; }
     
    143146        // Image generator classes.
    144147        CanvasClass,
     148#if ENABLE(CSS_PAINTING_API)
     149        PaintImageClass,
     150#endif
    145151        NamedImageClass,
    146152        CrossfadeClass,
  • trunk/Source/WebCore/css/CSSValueKeywords.in

    r237156 r237243  
    12021202-webkit-filter
    12031203dashboard-region
     1204#if defined(ENABLE_CSS_PAINTING_API) && ENABLE_CSS_PAINTING_API
     1205paint
     1206#endif
    12041207
    12051208// deprecated gradients
  • trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp

    r236155 r237243  
    3939#include "CSSImageValue.h"
    4040#include "CSSNamedImageValue.h"
     41#include "CSSPaintImageValue.h"
    4142#include "CSSParserIdioms.h"
    4243#include "CSSValuePool.h"
     
    12811282    return CSSFilterImageValue::create(imageValue.releaseNonNull(), filterValue.releaseNonNull());
    12821283}
     1284
     1285#if ENABLE(CSS_PAINTING_API)
     1286static RefPtr<CSSValue> consumeCustomPaint(CSSParserTokenRange& args)
     1287{
     1288    if (!RuntimeEnabledFeatures::sharedFeatures().cssPaintingAPIEnabled())
     1289        return nullptr;
     1290    if (args.peek().type() != IdentToken)
     1291        return nullptr;
     1292    auto name = args.consumeIncludingWhitespace().value().toString();
     1293
     1294    // FIXME: should parse arguments.
     1295    while (!args.atEnd())
     1296        args.consume();
     1297
     1298    return CSSPaintImageValue::create(name);
     1299}
     1300#endif
    12831301
    12841302static RefPtr<CSSValue> consumeGeneratedImage(CSSParserTokenRange& range, CSSParserContext context)
     
    13181336    else if (id == CSSValueWebkitFilter || id == CSSValueFilter)
    13191337        result = consumeFilterImage(args, context);
     1338#if ENABLE(CSS_PAINTING_API)
     1339    else if (id == CSSValuePaint)
     1340        result = consumeCustomPaint(args);
     1341#endif
    13201342    if (!result || !args.atEnd())
    13211343        return nullptr;
     
    13721394        || id == CSSValueWebkitNamedImage
    13731395        || id == CSSValueWebkitFilter
     1396#if ENABLE(CSS_PAINTING_API)
     1397        || id == CSSValuePaint
     1398#endif
    13741399        || id == CSSValueFilter;
    13751400}
  • trunk/Source/WebCore/platform/mediastream/mac/RealtimeVideoUtilities.h

    r236339 r237243  
    2424 */
    2525
     26#pragma once
     27
    2628#include <CoreVideo/CoreVideo.h>
    2729
Note: See TracChangeset for help on using the changeset viewer.