Changeset 151298 in webkit


Ignore:
Timestamp:
Jun 6, 2013 4:33:50 PM (11 years ago)
Author:
commit-queue@webkit.org
Message:

Expose HTMLCanvasElement supportsContext
https://bugs.webkit.org/show_bug.cgi?id=70117

Patch by Ruth Fong <ruth_fong@apple.com> on 2013-06-06
Reviewed by Darin Adler.

Source/WebCore:

Adds the supportsContext function for <canvas> elements as speced here:
http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-canvas-supportscontext

Test: fast/canvas/webgl/canvas-supports-context.html

  • bindings/js/JSHTMLCanvasElementCustom.cpp:

(WebCore::get3DContextAttributes): Added.
Refactored function from JSHTMLCanvasElement::getContext that parses attributes.
(WebCore::JSHTMLCanvasElement::getContext): Updated to use refactored function.
(WebCore::JSHTMLCanvasElement::supportsContext): Added.
Exposes JS function supportsContext.

  • html/HTMLCanvasElement.cpp:

(WebCore::HTMLCanvasElement::getContext): Updated to use refactored functions.
(WebCore::HTMLCanvasElement::supportsContext): Added.
Implements supportsContext function based on contextId parameter (i.e. '2d').

  • html/HTMLCanvasElement.h: Added refactored functions from HTMLCanvasElement::getContext.
  • html/HTMLCanvasElement.idl:

LayoutTests:

  • fast/canvas/webgl/canvas-supports-context-expected.txt: Added.
  • fast/canvas/webgl/canvas-supports-context.html: Added.

tests the supportsContext function for <canvas> elements, ensures that
supportsContext's implementation is consistent with that of getContext,
and tests that supportsContext and getContext behave appropriately when
malformed attributes are passed in.

  • fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-expected.txt: Updated.
  • fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias.html: Updated.

Now also tests default values for context attributes (i.e. when attributes aren't explicitly set).

Location:
trunk
Files:
2 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r151296 r151298  
     12013-06-06  Ruth Fong  <ruth_fong@apple.com>
     2
     3        Expose HTMLCanvasElement supportsContext
     4        https://bugs.webkit.org/show_bug.cgi?id=70117
     5
     6        Reviewed by Darin Adler.
     7
     8        * fast/canvas/webgl/canvas-supports-context-expected.txt: Added.
     9        * fast/canvas/webgl/canvas-supports-context.html: Added.
     10        tests the supportsContext function for <canvas> elements, ensures that
     11        supportsContext's implementation is consistent with that of getContext,
     12        and tests that supportsContext and getContext behave appropriately when
     13        malformed attributes are passed in.
     14        * fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-expected.txt: Updated.
     15        * fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias.html: Updated.
     16        Now also tests default values for context attributes (i.e. when attributes aren't explicitly set).
     17
    1182013-06-06  Brent Fulgham  <bfulgham@apple.com>
    219
  • trunk/LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-expected.txt

    r120401 r151298  
    3131Testing depth = true
    3232PASS getError was expected value: NO_ERROR : should be no errors
    33 PASS gl = getWebGL(1, 1, { stencil: false, antialias: false }, [ 0, 0, 0, 1 ], 1, 0) is non-null.
     33PASS gl = getWebGL(1, 1, { depth: true, stencil: false, antialias: false }, [ 0, 0, 0, 1 ], 1, 0) is non-null.
    3434PASS gl.getParameter(gl.DEPTH_BITS) >= 16 is true
    3535PASS gl.getParameter(gl.RED_BITS) >= 8 is true
     
    109109PASS contextAttribs = gl.getContextAttributes() is non-null.
    110110PASS pixel[0] != 255 && pixel[0] != 0 is contextAttribs.antialias
     111Testing default values for attributes
     112Testing default alpha = true
     113PASS getError was expected value: NO_ERROR : should be no errors
     114PASS gl = getWebGL(1, 1, { depth: false, stencil: false, antialias: false }, [ 0, 0, 0, 0 ], 1, 0) is non-null.
     115PASS gl.getParameter(gl.ALPHA_BITS) >= 8 is true
     116PASS gl.getParameter(gl.RED_BITS) >= 8 is true
     117PASS gl.getParameter(gl.GREEN_BITS) >= 8 is true
     118PASS gl.getParameter(gl.BLUE_BITS) >= 8 is true
     119PASS gl.getParameter(gl.DEPTH_BITS) == 0 is true
     120PASS gl.getParameter(gl.STENCIL_BITS) == 0 is true
     121PASS contextAttribs = gl.getContextAttributes() is non-null.
     122PASS contextAttribs.alpha == true is true
     123PASS pixel is correctColor
     124PASS Math.abs(pixel[0] - 127) <= 1 && Math.abs(pixel[1] - 127) <= 1 && Math.abs(pixel[2] - 127) <= 1 && Math.abs(pixel[3] - 127) <= 1 is true
     125Testing default depth = true
     126PASS getError was expected value: NO_ERROR : should be no errors
     127PASS gl = getWebGL(1, 1, { stencil: false, antialias: false }, [ 0, 0, 0, 1 ], 1, 0) is non-null.
     128PASS gl.getParameter(gl.DEPTH_BITS) >= 16 is true
     129PASS gl.getParameter(gl.RED_BITS) >= 8 is true
     130PASS gl.getParameter(gl.GREEN_BITS) >= 8 is true
     131PASS gl.getParameter(gl.BLUE_BITS) >= 8 is true
     132PASS gl.getParameter(gl.ALPHA_BITS) >= 8 is true
     133PASS contextAttribs = gl.getContextAttributes() is non-null.
     134PASS pixel is correctColor
     135PASS pixel is [0, 0, 0, 255]
     136Testing default stencil = false and default depth = true
     137PASS getError was expected value: NO_ERROR : should be no errors
     138PASS gl = getWebGL(1, 1, { antialias: false }, [ 0, 0, 0, 1 ], 1, 0) is non-null.
     139PASS gl.getParameter(gl.RED_BITS) >= 8 is true
     140PASS gl.getParameter(gl.GREEN_BITS) >= 8 is true
     141PASS gl.getParameter(gl.BLUE_BITS) >= 8 is true
     142PASS gl.getParameter(gl.ALPHA_BITS) >= 8 is true
     143PASS gl.getParameter(gl.DEPTH_BITS) >= 16 is true
     144PASS gl.getParameter(gl.STENCIL_BITS) == 0 is true
     145PASS contextAttribs = gl.getContextAttributes() is non-null.
     146PASS pixel is correctColor
     147PASS pixel is [0, 0, 0, 255]
     148Testing default antialias = true
     149PASS getError was expected value: NO_ERROR : should be no errors
     150PASS gl = getWebGL(2, 2, { depth: false, stencil: false, alpha: false }, [ 0, 0, 0, 1 ], 1, 0) is non-null.
     151PASS contextAttribs = gl.getContextAttributes() is non-null.
     152PASS pixel[0] != 255 && pixel[0] != 0 is contextAttribs.antialias
    111153PASS successfullyParsed is true
    112154
  • trunk/LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias.html

    r140851 r151298  
    134134}
    135135
    136 function testAlpha(alpha)
    137 {
    138     debug("Testing alpha = " + alpha);
    139     if (alpha) {
    140         shouldBeNonNull("gl = getWebGL(1, 1, { alpha: true, depth: false, stencil: false, antialias: false }, [ 0, 0, 0, 0 ], 1, 0)");
     136function testAlpha(alpha, is_default_test)
     137{
     138    if (is_default_test) {
     139        debug("Testing default alpha = true");
     140        alpha = true;
     141
     142        shouldBeNonNull("gl = getWebGL(1, 1, { depth: false, stencil: false, antialias: false }, [ 0, 0, 0, 0 ], 1, 0)");
    141143        shouldBeTrue("gl.getParameter(gl.ALPHA_BITS) >= 8");
    142144    } else {
    143         shouldBeNonNull("gl = getWebGL(1, 1, { alpha: false, depth: false, stencil: false, antialias: false }, [ 0, 0, 0, 0 ], 1, 0)");
    144         shouldBeTrue("gl.getParameter(gl.ALPHA_BITS) == 0");
    145     }
     145        debug("Testing alpha = " + alpha);
     146
     147        if (alpha) {
     148            shouldBeNonNull("gl = getWebGL(1, 1, { alpha: true, depth: false, stencil: false, antialias: false }, [ 0, 0, 0, 0 ], 1, 0)");
     149            shouldBeTrue("gl.getParameter(gl.ALPHA_BITS) >= 8");
     150        } else {
     151            shouldBeNonNull("gl = getWebGL(1, 1, { alpha: false, depth: false, stencil: false, antialias: false }, [ 0, 0, 0, 0 ], 1, 0)");
     152            shouldBeTrue("gl.getParameter(gl.ALPHA_BITS) == 0");
     153        }
     154    }
     155
    146156    shouldBeTrue("gl.getParameter(gl.RED_BITS) >= 8");
    147157    shouldBeTrue("gl.getParameter(gl.GREEN_BITS) >= 8");
     
    176186}
    177187
    178 function testDepth(depth)
    179 {
    180     debug("Testing depth = " + depth);
    181     if (depth) {
     188function testDepth(depth, is_default_test)
     189{
     190    if (is_default_test) {
     191        debug("Testing default depth = true");
     192        depth = true;
    182193        shouldBeNonNull("gl = getWebGL(1, 1, { stencil: false, antialias: false }, [ 0, 0, 0, 1 ], 1, 0)");
    183194        shouldBeTrue("gl.getParameter(gl.DEPTH_BITS) >= 16");
    184195    } else {
    185         shouldBeNonNull("gl = getWebGL(1, 1, { depth: false, stencil: false, antialias: false }, [ 0, 0, 0, 1 ], 1, 0)");
    186         shouldBeTrue("gl.getParameter(gl.DEPTH_BITS) == 0");
     196        debug("Testing depth = " + depth);
     197        if (depth) {
     198            shouldBeNonNull("gl = getWebGL(1, 1, { depth: true, stencil: false, antialias: false }, [ 0, 0, 0, 1 ], 1, 0)");
     199            shouldBeTrue("gl.getParameter(gl.DEPTH_BITS) >= 16");
     200        } else {
     201            shouldBeNonNull("gl = getWebGL(1, 1, { depth: false, stencil: false, antialias: false }, [ 0, 0, 0, 1 ], 1, 0)");
     202            shouldBeTrue("gl.getParameter(gl.DEPTH_BITS) == 0");
     203        }
    187204    }
    188205    shouldBeTrue("gl.getParameter(gl.RED_BITS) >= 8");
     
    231248}
    232249
    233 function testStencilAndDepth(stencil, depth)
    234 {
    235     debug("Testing stencil = " + stencil + ", depth = " + depth);
    236     var creationString =
    237         "gl = getWebGL(1, 1, { depth: " + depth + ", stencil: " + stencil + ", antialias: false }, [ 0, 0, 0, 1 ], 1, 0)";
    238     shouldBeNonNull(creationString);
     250function testStencilAndDepth(stencil, depth, is_default_test)
     251{
     252    if (is_default_test) {
     253        debug("Testing default stencil = false and default depth = true");
     254        stencil = false;
     255        depth = true;
     256        var creationString =
     257            "gl = getWebGL(1, 1, { antialias: false }, [ 0, 0, 0, 1 ], 1, 0)";
     258        shouldBeNonNull(creationString);
     259    } else {
     260        debug("Testing stencil = " + stencil + ", depth = " + depth);
     261        var creationString =
     262            "gl = getWebGL(1, 1, { depth: " + depth + ", stencil: " + stencil + ", antialias: false }, [ 0, 0, 0, 1 ], 1, 0)";
     263        shouldBeNonNull(creationString);
     264    }
    239265
    240266    shouldBeTrue("gl.getParameter(gl.RED_BITS) >= 8");
     
    305331}
    306332
    307 function testAntialias(antialias)
    308 {
    309     debug("Testing antialias = " + antialias);
    310     if (antialias)
    311         shouldBeNonNull("gl = getWebGL(2, 2, { depth: false, stencil: false, alpha: false, antialias: true }, [ 0, 0, 0, 1 ], 1, 0)");
    312     else
    313         shouldBeNonNull("gl = getWebGL(2, 2, { depth: false, stencil: false, alpha: false, antialias: false }, [ 0, 0, 0, 1 ], 1, 0)");
     333function testAntialias(antialias, is_default_test)
     334{
     335    if (is_default_test) {
     336        debug("Testing default antialias = true");
     337        antialias = true;
     338        shouldBeNonNull("gl = getWebGL(2, 2, { depth: false, stencil: false, alpha: false }, [ 0, 0, 0, 1 ], 1, 0)");
     339    } else {
     340        debug("Testing antialias = " + antialias);
     341        if (antialias)
     342            shouldBeNonNull("gl = getWebGL(2, 2, { depth: false, stencil: false, alpha: false, antialias: true }, [ 0, 0, 0, 1 ], 1, 0)");
     343        else
     344            shouldBeNonNull("gl = getWebGL(2, 2, { depth: false, stencil: false, alpha: false, antialias: false }, [ 0, 0, 0, 1 ], 1, 0)");
     345    }
    314346    shouldBeNonNull("contextAttribs = gl.getContextAttributes()");
    315347
     
    327359}
    328360
     361function runDefaultTests(run_default_tests)
     362{
     363    if (run_default_tests) {
     364        debug("Testing default values for attributes");
     365        testAlpha(true, run_default_tests);
     366        testDepth(true, run_default_tests);
     367        testStencilAndDepth(true, true, run_default_tests);
     368        testAntialias(true, run_default_tests);
     369    } else {
     370        testAlpha(true, run_default_tests);
     371        testAlpha(false, run_default_tests);
     372        testDepth(true, run_default_tests);
     373        testDepth(false, run_default_tests);
     374        testStencilAndDepth(true, false, run_default_tests);
     375        testStencilAndDepth(false, false, run_default_tests);
     376        testStencilAndDepth(true, true, run_default_tests);
     377        testStencilAndDepth(false, true, run_default_tests);
     378        testAntialias(true, run_default_tests);
     379        testAntialias(false, run_default_tests);
     380    }
     381}
     382
    329383function runTest()
    330384{
    331 
    332     testAlpha(true);
    333     testAlpha(false);
    334     testDepth(true);
    335     testDepth(false);
    336     testStencilAndDepth(true, false);
    337     testStencilAndDepth(false, false);
    338     testStencilAndDepth(true, true);
    339     testStencilAndDepth(false, true);
    340     testAntialias(true);
    341     testAntialias(false);
    342 
     385    runDefaultTests(false);
     386    runDefaultTests(true);
    343387    finishTest();
    344388}
  • trunk/Source/WebCore/ChangeLog

    r151295 r151298  
     12013-06-06  Ruth Fong  <ruth_fong@apple.com>
     2
     3        Expose HTMLCanvasElement supportsContext
     4        https://bugs.webkit.org/show_bug.cgi?id=70117
     5
     6        Reviewed by Darin Adler.
     7
     8        Adds the supportsContext function for <canvas> elements as speced here:
     9        http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-canvas-supportscontext
     10
     11        Test: fast/canvas/webgl/canvas-supports-context.html
     12
     13        * bindings/js/JSHTMLCanvasElementCustom.cpp:
     14        (WebCore::get3DContextAttributes): Added.
     15        Refactored function from JSHTMLCanvasElement::getContext that parses attributes.
     16        (WebCore::JSHTMLCanvasElement::getContext): Updated to use refactored function.
     17        (WebCore::JSHTMLCanvasElement::supportsContext): Added.
     18        Exposes JS function supportsContext.
     19        * html/HTMLCanvasElement.cpp:
     20        (WebCore::HTMLCanvasElement::getContext): Updated to use refactored functions.
     21        (WebCore::HTMLCanvasElement::supportsContext): Added.
     22        Implements supportsContext function based on contextId parameter (i.e. '2d').
     23        * html/HTMLCanvasElement.h: Added refactored functions from HTMLCanvasElement::getContext.
     24        * html/HTMLCanvasElement.idl:
     25
    1262013-06-06  Zoltan Horvath  <zoltan@webkit.org>
    227
  • trunk/Source/WebCore/bindings/js/JSHTMLCanvasElementCustom.cpp

    r130021 r151298  
    3434#include "ScriptObject.h"
    3535#if ENABLE(WEBGL)
     36#include "JSDictionary.h"
    3637#include "JSWebGLRenderingContext.h"
    3738#include "WebGLContextAttributes.h"
     
    4344namespace WebCore {
    4445
     46#if ENABLE(WEBGL)
     47static void get3DContextAttributes(ExecState* exec, RefPtr<CanvasContextAttributes>& attrs)
     48{
     49    JSValue initializerValue = exec->argument(1);
     50    if (initializerValue.isUndefinedOrNull())
     51        return;
     52   
     53    JSObject* initializerObject = initializerValue.toObject(exec);
     54    JSDictionary dictionary(exec, initializerObject);
     55   
     56    GraphicsContext3D::Attributes graphicsAttrs;
     57   
     58    dictionary.tryGetProperty("alpha", graphicsAttrs.alpha);
     59    dictionary.tryGetProperty("depth", graphicsAttrs.depth);
     60    dictionary.tryGetProperty("stencil", graphicsAttrs.stencil);
     61    dictionary.tryGetProperty("antialias", graphicsAttrs.antialias);
     62    dictionary.tryGetProperty("premultipliedAlpha", graphicsAttrs.premultipliedAlpha);
     63    dictionary.tryGetProperty("preserveDrawingBuffer", graphicsAttrs.preserveDrawingBuffer);
     64   
     65    attrs = WebGLContextAttributes::create(graphicsAttrs);
     66}
     67#endif
     68
    4569JSValue JSHTMLCanvasElement::getContext(ExecState* exec)
    4670{
    4771    HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(impl());
    4872    const String& contextId = exec->argument(0).toString(exec)->value(exec);
     73   
    4974    RefPtr<CanvasContextAttributes> attrs;
    5075#if ENABLE(WEBGL)
    51     if (contextId == "experimental-webgl" || contextId == "webkit-3d") {
    52         attrs = WebGLContextAttributes::create();
    53         WebGLContextAttributes* webGLAttrs = static_cast<WebGLContextAttributes*>(attrs.get());
    54         if (exec->argumentCount() > 1 && exec->argument(1).isObject()) {
    55             JSObject* jsAttrs = exec->argument(1).getObject();
    56             Identifier alpha(exec, "alpha");
    57             if (jsAttrs->hasProperty(exec, alpha))
    58                 webGLAttrs->setAlpha(jsAttrs->get(exec, alpha).toBoolean(exec));
    59             Identifier depth(exec, "depth");
    60             if (jsAttrs->hasProperty(exec, depth))
    61                 webGLAttrs->setDepth(jsAttrs->get(exec, depth).toBoolean(exec));
    62             Identifier stencil(exec, "stencil");
    63             if (jsAttrs->hasProperty(exec, stencil))
    64                 webGLAttrs->setStencil(jsAttrs->get(exec, stencil).toBoolean(exec));
    65             Identifier antialias(exec, "antialias");
    66             if (jsAttrs->hasProperty(exec, antialias))
    67                 webGLAttrs->setAntialias(jsAttrs->get(exec, antialias).toBoolean(exec));
    68             Identifier premultipliedAlpha(exec, "premultipliedAlpha");
    69             if (jsAttrs->hasProperty(exec, premultipliedAlpha))
    70                 webGLAttrs->setPremultipliedAlpha(jsAttrs->get(exec, premultipliedAlpha).toBoolean(exec));
    71             Identifier preserveDrawingBuffer(exec, "preserveDrawingBuffer");
    72             if (jsAttrs->hasProperty(exec, preserveDrawingBuffer))
    73                 webGLAttrs->setPreserveDrawingBuffer(jsAttrs->get(exec, preserveDrawingBuffer).toBoolean(exec));
    74         }
     76    if (HTMLCanvasElement::is3dType(contextId)) {
     77        get3DContextAttributes(exec, attrs);
     78        if (exec->hadException())
     79            return jsUndefined();
    7580    }
    7681#endif
     82   
    7783    CanvasRenderingContext* context = canvas->getContext(contextId, attrs.get());
    7884    if (!context)
     
    9298    }
    9399    return jsValue;
     100}
     101
     102JSValue JSHTMLCanvasElement::supportsContext(ExecState* exec)
     103{
     104    HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(impl());
     105    if (!exec->argumentCount())
     106        return jsBoolean(false);
     107    const String& contextId = exec->argument(0).toString(exec)->value(exec);
     108    if (exec->hadException())
     109        return jsUndefined();
     110   
     111    RefPtr<CanvasContextAttributes> attrs;
     112#if ENABLE(WEBGL)
     113    if (HTMLCanvasElement::is3dType(contextId)) {
     114        get3DContextAttributes(exec, attrs);
     115        if (exec->hadException())
     116            return jsUndefined();
     117    }
     118#endif
     119   
     120    return jsBoolean(canvas->supportsContext(contextId, attrs.get()));
    94121}
    95122
  • trunk/Source/WebCore/html/HTMLCanvasElement.cpp

    r151282 r151298  
    180180    // context with any other type string will destroy any existing context.
    181181   
    182     // FIXME - The code depends on the context not going away once created, to prevent JS from
     182    // FIXME: The code depends on the context not going away once created, to prevent JS from
    183183    // seeing a dangling pointer. So for now we will disallow the context from being changed
    184     // once it is created.
    185     if (type == "2d") {
     184    // once it is created. https://bugs.webkit.org/show_bug.cgi?id=117095
     185    if (is2dType(type)) {
    186186        if (m_context && !m_context->is2d())
    187187            return 0;
     
    202202#if ENABLE(WEBGL)
    203203    if (shouldEnableWebGL(document()->settings())) {
    204         // Accept the legacy "webkit-3d" name as well as the provisional "experimental-webgl" name.
    205         bool is3dContext = (type == "webkit-3d") || (type == "experimental-webgl");
    206 
    207         if (is3dContext) {
     204
     205        if (is3dType(type)) {
    208206            if (m_context && !m_context->is3d())
    209207                return 0;
     
    223221    return 0;
    224222}
     223   
     224bool HTMLCanvasElement::supportsContext(const String& type, CanvasContextAttributes*)
     225{
     226    // FIXME: Provide implementation that accounts for attributes. Bugzilla bug 117093
     227    // https://bugs.webkit.org/show_bug.cgi?id=117093
     228
     229    // FIXME: The code depends on the context not going away once created (as getContext
     230    // is implemented under this assumption) https://bugs.webkit.org/show_bug.cgi?id=117095
     231    if (is2dType(type))
     232        return !m_context || m_context->is2d();
     233
     234#if ENABLE(WEBGL)
     235    if (shouldEnableWebGL(document()->settings())) {
     236        if (is3dType(type))
     237            return !m_context || m_context->is3d();
     238    }
     239#endif
     240    return false;
     241}
     242
     243bool HTMLCanvasElement::is2dType(const String& type)
     244{
     245    return type == "2d";
     246}
     247
     248#if ENABLE(WEBGL)
     249bool HTMLCanvasElement::is3dType(const String& type)
     250{
     251    // Accept the legacy "webkit-3d" name as well as the provisional "experimental-webgl" name.
     252    return type == "webkit-3d" || type == "experimental-webgl";
     253}
     254#endif
    225255
    226256void HTMLCanvasElement::didDraw(const FloatRect& rect)
  • trunk/Source/WebCore/html/HTMLCanvasElement.h

    r151282 r151298  
    9393
    9494    CanvasRenderingContext* getContext(const String&, CanvasContextAttributes* attributes = 0);
     95    bool supportsContext(const String&, CanvasContextAttributes* = 0);
     96    static bool is2dType(const String&);
     97#if ENABLE(WEBGL)
     98    static bool is3dType(const String&);
     99#endif
    95100
    96101    static String toEncodingMimeType(const String& mimeType);
  • trunk/Source/WebCore/html/HTMLCanvasElement.idl

    r149368 r151298  
    3939    // The custom binding is needed to handle context creation attributes.
    4040    [Custom] any getContext([Default=Undefined] optional DOMString contextId);
     41    [Custom] any supportsContext([Default=Undefined] optional DOMString contextId);
    4142#endif
    4243#endif
Note: See TracChangeset for help on using the changeset viewer.