Commit fddf321e authored by bajones@chromium.org's avatar bajones@chromium.org

WebGL: Return both unprefixed and prefixed supported names from getSupportedExtensions

WebGL spec requires that getExtension "Returns an object if, and only if,
name is an ASCII case-insensitive match [HTML] for one of the names
returned from getSupportedExtensions; otherwise, returns null." Respect
this requirement by always returning both unprefixed and prefixed names
from getSupportedExtensions in case they are supported by getExtension.

Functionality that is common to both getExtension and
getSupportedExtensions is refactored to separate helper functions so that
maintaining this becomes easier.

BUG=354454
TEST=WebGL conformance tests
R=bajones@chromium.org, kbr@chromium.org

Review URL: https://codereview.chromium.org/205903004

git-svn-id: svn://svn.chromium.org/blink/trunk@170071 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 80ae22dd
......@@ -128,8 +128,8 @@ void WebGLRenderingContext::registerContextExtensions()
registerExtension<OESTextureHalfFloat>(m_oesTextureHalfFloat);
registerExtension<OESTextureHalfFloatLinear>(m_oesTextureHalfFloatLinear);
registerExtension<OESVertexArrayObject>(m_oesVertexArrayObject);
registerExtension<WebGLCompressedTextureATC>(m_webglCompressedTextureATC, PrefixedExtension, webkitPrefix);
registerExtension<WebGLCompressedTexturePVRTC>(m_webglCompressedTexturePVRTC, PrefixedExtension, webkitPrefix);
registerExtension<WebGLCompressedTextureATC>(m_webglCompressedTextureATC, EnabledDraftExtension, webkitPrefix);
registerExtension<WebGLCompressedTexturePVRTC>(m_webglCompressedTexturePVRTC, EnabledDraftExtension, webkitPrefix);
registerExtension<WebGLCompressedTextureS3TC>(m_webglCompressedTextureS3TC, ApprovedExtension, bothPrefixes);
registerExtension<WebGLDepthTexture>(m_webglDepthTexture, ApprovedExtension, bothPrefixes);
registerExtension<WebGLDrawBuffers>(m_webglDrawBuffers);
......
......@@ -2098,13 +2098,17 @@ GLenum WebGLRenderingContextBase::getError()
return m_context->getError();
}
bool WebGLRenderingContextBase::ExtensionTracker::matchesNameWithPrefixes(const String& name) const
const char* const* WebGLRenderingContextBase::ExtensionTracker::prefixes() const
{
static const char* const unprefixed[] = { "", 0, };
return m_prefixes ? m_prefixes : unprefixed;
}
const char* const* prefixes = m_prefixes ? m_prefixes : unprefixed;
for (; *prefixes; ++prefixes) {
String prefixedName = String(*prefixes) + extensionName();
bool WebGLRenderingContextBase::ExtensionTracker::matchesNameWithPrefixes(const String& name) const
{
const char* const* prefixSet = prefixes();
for (; *prefixSet; ++prefixSet) {
String prefixedName = String(*prefixSet) + extensionName();
if (equalIgnoringCase(prefixedName, name)) {
return true;
}
......@@ -2112,6 +2116,20 @@ bool WebGLRenderingContextBase::ExtensionTracker::matchesNameWithPrefixes(const
return false;
}
bool WebGLRenderingContextBase::extensionSupportedAndAllowed(const ExtensionTracker* tracker)
{
if (tracker->webglDebugRendererInfo() && !allowWebGLDebugRendererInfo())
return false;
if (tracker->privileged() && !allowPrivilegedExtensions())
return false;
if (tracker->draft() && !RuntimeEnabledFeatures::webGLDraftExtensionsEnabled())
return false;
if (!tracker->supported(this))
return false;
return true;
}
PassRefPtr<WebGLExtension> WebGLRenderingContextBase::getExtension(const String& name)
{
if (isContextLost())
......@@ -2120,13 +2138,7 @@ PassRefPtr<WebGLExtension> WebGLRenderingContextBase::getExtension(const String&
for (size_t i = 0; i < m_extensions.size(); ++i) {
ExtensionTracker* tracker = m_extensions[i];
if (tracker->matchesNameWithPrefixes(name)) {
if (tracker->webglDebugRendererInfo() && !allowWebGLDebugRendererInfo())
return nullptr;
if (tracker->privileged() && !allowPrivilegedExtensions())
return nullptr;
if (tracker->draft() && !RuntimeEnabledFeatures::webGLDraftExtensionsEnabled())
return nullptr;
if (!tracker->supported(this))
if (!extensionSupportedAndAllowed(tracker))
return nullptr;
RefPtr<WebGLExtension> extension = tracker->getExtension(this);
......@@ -2579,14 +2591,13 @@ Vector<String> WebGLRenderingContextBase::getSupportedExtensions()
for (size_t i = 0; i < m_extensions.size(); ++i) {
ExtensionTracker* tracker = m_extensions[i];
if (tracker->webglDebugRendererInfo() && !allowWebGLDebugRendererInfo())
continue;
if (tracker->privileged() && !allowPrivilegedExtensions())
continue;
if (tracker->draft() && !RuntimeEnabledFeatures::webGLDraftExtensionsEnabled())
continue;
if (tracker->supported(this))
result.append(String(tracker->prefixed() ? "WEBKIT_" : "") + tracker->extensionName());
if (extensionSupportedAndAllowed(tracker)) {
const char* const* prefixes = tracker->prefixes();
for (; *prefixes; ++prefixes) {
String prefixedName = String(*prefixes) + tracker->extensionName();
result.append(prefixedName);
}
}
}
return result;
......
......@@ -532,10 +532,13 @@ protected:
OwnPtr<Extensions3DUtil> m_extensionsUtil;
enum ExtensionFlags {
ApprovedExtension = 0x00,
DraftExtension = 0x01,
PrivilegedExtension = 0x02,
PrefixedExtension = 0x04,
ApprovedExtension = 0x00,
// Extension that is behind the draft extensions runtime flag:
DraftExtension = 0x01,
PrivilegedExtension = 0x02,
// Extension that is still in draft state, but has been selectively enabled by default under a prefix. Do not use
// this for enabling new draft extensions; use the DraftExtension flag instead, and do not use vendor prefixes:
EnabledDraftExtension = 0x04,
WebGLDebugRendererInfoExtension = 0x08,
};
......@@ -544,7 +547,6 @@ protected:
ExtensionTracker(ExtensionFlags flags, const char* const* prefixes)
: m_privileged(flags & PrivilegedExtension)
, m_draft(flags & DraftExtension)
, m_prefixed(flags & PrefixedExtension)
, m_webglDebugRendererInfo(flags & WebGLDebugRendererInfoExtension)
, m_prefixes(prefixes)
{
......@@ -554,11 +556,6 @@ protected:
{
}
bool prefixed() const
{
return m_prefixed;
}
bool privileged() const
{
return m_privileged;
......@@ -574,6 +571,7 @@ protected:
return m_webglDebugRendererInfo;
}
const char* const* prefixes() const;
bool matchesNameWithPrefixes(const String&) const;
virtual PassRefPtr<WebGLExtension> getExtension(WebGLRenderingContextBase*) = 0;
......@@ -584,7 +582,6 @@ protected:
private:
bool m_privileged;
bool m_draft;
bool m_prefixed;
bool m_webglDebugRendererInfo;
const char* const* m_prefixes;
};
......@@ -652,6 +649,8 @@ protected:
m_extensions.append(new TypedExtensionTracker<T>(extensionPtr, flags, prefixes));
}
bool extensionSupportedAndAllowed(const ExtensionTracker*);
inline bool extensionEnabled(WebGLExtensionName name)
{
return m_extensionEnabled[name];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment