⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 236818 in webkit


Ignore:
Timestamp:
Oct 3, 2018, 5:50:46 PM (8 years ago)
Author:
jer.noble@apple.com
Message:

Add a quirk to disable Modern EME for sites which are broken with it enabled
https://bugs.webkit.org/show_bug.cgi?id=190051

Reviewed by Daniel Bates.

Add a new class, parallel to Settings, to track quirk behavior. Extend the bindings
generator to support a DisabledByQuirk attribute, and set this attribute for all
the Modern EME types. Check whether the quirk is set inside HTMLMediaElement in
addition to the existing Setting.

  • Modules/encryptedmedia/MediaKeyMessageEvent.idl:
  • Modules/encryptedmedia/MediaKeySession.idl:
  • Modules/encryptedmedia/MediaKeyStatusMap.idl:
  • Modules/encryptedmedia/MediaKeySystemAccess.idl:
  • Modules/encryptedmedia/MediaKeys.idl:
  • Modules/encryptedmedia/NavigatorEME.idl:
  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • bindings/scripts/CodeGenerator.pm:

(WK_ucfirst):

  • bindings/scripts/CodeGeneratorJS.pm:

(NeedsRuntimeCheck):
(GenerateRuntimeEnableConditionalString):

  • bindings/scripts/IDLAttributes.json:
  • bindings/scripts/preprocess-idls.pl:

(GenerateConstructorAttributes):

  • dom/Document.cpp:

(WebCore::Document::Document):

  • dom/Document.h:

(WebCore::Document::quirks const):

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::mediaPlayerKeyNeeded):
(WebCore::HTMLMediaElement::mediaPlayerInitializationDataEncountered):

  • html/HTMLMediaElement.idl:
  • page/Quirks.cpp: Added.

(Quirks::Quirks):
(Quirks::disableEncryptedMediaAPIQuirk const):

  • page/Quirks.h: Added.
Location:
trunk/Source/WebCore
Files:
2 added
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r236809 r236818  
     12018-10-03  Jer Noble  <jer.noble@apple.com>
     2
     3        Add a quirk to disable Modern EME for sites which are broken with it enabled
     4        https://bugs.webkit.org/show_bug.cgi?id=190051
     5
     6        Reviewed by Daniel Bates.
     7
     8        Add a new class, parallel to Settings, to track quirk behavior. Extend the bindings
     9        generator to support a DisabledByQuirk attribute, and set this attribute for all
     10        the Modern EME types. Check whether the quirk is set inside HTMLMediaElement in
     11        addition to the existing Setting.
     12
     13        * Modules/encryptedmedia/MediaKeyMessageEvent.idl:
     14        * Modules/encryptedmedia/MediaKeySession.idl:
     15        * Modules/encryptedmedia/MediaKeyStatusMap.idl:
     16        * Modules/encryptedmedia/MediaKeySystemAccess.idl:
     17        * Modules/encryptedmedia/MediaKeys.idl:
     18        * Modules/encryptedmedia/NavigatorEME.idl:
     19        * Sources.txt:
     20        * WebCore.xcodeproj/project.pbxproj:
     21        * bindings/scripts/CodeGenerator.pm:
     22        (WK_ucfirst):
     23        * bindings/scripts/CodeGeneratorJS.pm:
     24        (NeedsRuntimeCheck):
     25        (GenerateRuntimeEnableConditionalString):
     26        * bindings/scripts/IDLAttributes.json:
     27        * bindings/scripts/preprocess-idls.pl:
     28        (GenerateConstructorAttributes):
     29        * dom/Document.cpp:
     30        (WebCore::Document::Document):
     31        * dom/Document.h:
     32        (WebCore::Document::quirks const):
     33        * html/HTMLMediaElement.cpp:
     34        (WebCore::HTMLMediaElement::mediaPlayerKeyNeeded):
     35        (WebCore::HTMLMediaElement::mediaPlayerInitializationDataEncountered):
     36        * html/HTMLMediaElement.idl:
     37        * page/Quirks.cpp: Added.
     38        (Quirks::Quirks):
     39        (Quirks::disableEncryptedMediaAPIQuirk const):
     40        * page/Quirks.h: Added.
     41
    1422018-10-03  Antoine Quint  <graouts@apple.com>
    243
  • trunk/Source/WebCore/Modules/encryptedmedia/MediaKeyMessageEvent.idl

    r208939 r236818  
    4242    Conditional=ENCRYPTED_MEDIA,
    4343    Constructor(DOMString type, MediaKeyMessageEventInit eventInitDict),
    44     EnabledAtRuntime=EncryptedMediaAPI
     44    EnabledAtRuntime=EncryptedMediaAPI,
     45    DisabledByQuirk=hasBrokenEncryptedMediaAPISupport,
    4546] interface MediaKeyMessageEvent : Event {
    4647    readonly attribute MediaKeyMessageType messageType;
  • trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.idl

    r220433 r236818  
    2929[
    3030    Conditional=ENCRYPTED_MEDIA,
    31     EnabledAtRuntime=EncryptedMediaAPI
     31    EnabledAtRuntime=EncryptedMediaAPI,
     32    DisabledByQuirk=hasBrokenEncryptedMediaAPISupport,
    3233] interface MediaKeySession : EventTarget {
    3334    readonly attribute DOMString sessionId;
  • trunk/Source/WebCore/Modules/encryptedmedia/MediaKeyStatusMap.idl

    r212107 r236818  
    3939[
    4040    Conditional=ENCRYPTED_MEDIA,
    41     EnabledAtRuntime=EncryptedMediaAPI
     41    EnabledAtRuntime=EncryptedMediaAPI,
     42    DisabledByQuirk=hasBrokenEncryptedMediaAPISupport,
    4243] interface MediaKeyStatusMap {
    4344    iterable<BufferSource, MediaKeyStatus>;
  • trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySystemAccess.idl

    r209964 r236818  
    3030    Conditional=ENCRYPTED_MEDIA,
    3131    EnabledAtRuntime=EncryptedMediaAPI,
     32    DisabledByQuirk=hasBrokenEncryptedMediaAPISupport,
    3233    ImplementationLacksVTable,
    3334] interface MediaKeySystemAccess {
  • trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.idl

    r210552 r236818  
    3030    Conditional=ENCRYPTED_MEDIA,
    3131    EnabledAtRuntime=EncryptedMediaAPI,
     32    DisabledByQuirk=hasBrokenEncryptedMediaAPISupport,
    3233    ImplementationLacksVTable,
    3334] interface MediaKeys {
  • trunk/Source/WebCore/Modules/encryptedmedia/NavigatorEME.idl

    r209964 r236818  
    2929[
    3030    Conditional=ENCRYPTED_MEDIA,
    31     EnabledAtRuntime=EncryptedMediaAPI
     31    EnabledAtRuntime=EncryptedMediaAPI,
     32    DisabledByQuirk=hasBrokenEncryptedMediaAPISupport,
    3233] partial interface Navigator {
    3334    [CallWith=Document] Promise<MediaKeySystemAccess> requestMediaKeySystemAccess(DOMString keySystem, sequence<MediaKeySystemConfiguration> supportedConfiguration);
  • trunk/Source/WebCore/Sources.txt

    r236750 r236818  
    14211421page/PrintContext.cpp
    14221422page/ProcessWarming.cpp
     1423page/Quirks.cpp
    14231424page/RemoteDOMWindow.cpp
    14241425page/RemoteFrame.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r236773 r236818  
    1334413344                CD94A5DA1F71CBB000F525C5 /* CDMClearKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDMClearKey.h; sourceTree = "<group>"; };
    1334513345                CD94A5DB1F71CBB000F525C5 /* CDMClearKey.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CDMClearKey.cpp; sourceTree = "<group>"; };
     13346                CD9A87F9215D6CF3006F17B5 /* Quirks.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Quirks.cpp; sourceTree = "<group>"; };
     13347                CD9A87FB215D6CF3006F17B5 /* Quirks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Quirks.h; sourceTree = "<group>"; };
    1334613348                CD9D375A215163E40049657B /* CDMInstanceSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CDMInstanceSession.h; sourceTree = "<group>"; };
    1334713349                CD9D82731C7AE535006FF066 /* TextureCacheCV.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TextureCacheCV.mm; sourceTree = "<group>"; };
     
    1953519537                                E42050162141901B0066EF3B /* ProcessWarming.cpp */,
    1953619538                                E42050142141901A0066EF3B /* ProcessWarming.h */,
     19539                                CD9A87F9215D6CF3006F17B5 /* Quirks.cpp */,
     19540                                CD9A87FB215D6CF3006F17B5 /* Quirks.h */,
    1953719541                                46B9518D207D632A00A7D2DD /* RemoteDOMWindow.cpp */,
    1953819542                                46B9518E207D632A00A7D2DD /* RemoteDOMWindow.h */,
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm

    r236769 r236818  
    17061706        || $context->extendedAttributes->{EnabledForWorld}
    17071707        || $context->extendedAttributes->{EnabledBySetting}
     1708        || $context->extendedAttributes->{DisabledByQuirk}
    17081709        || $context->extendedAttributes->{SecureContext}
    17091710        || $context->extendedAttributes->{ContextHasServiceWorkerScheme};
     
    37193720        foreach my $flag (@flags) {
    37203721            push(@conjuncts, "downcast<Document>(jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext())->settings()." . ToMethodName($flag) . "Enabled()");
     3722        }
     3723    }
     3724
     3725    if ($context->extendedAttributes->{DisabledByQuirk}) {
     3726        assert("Must specify value for DisabledByQuirk.") if $context->extendedAttributes->{DisabledByQuirk} eq "VALUE_IS_MISSING";
     3727
     3728        AddToImplIncludes("Document.h");
     3729        AddToImplIncludes("Quirks.h");
     3730
     3731        assert("DisabledByQuirk can only be used by interfaces only exposed to the Window") if $interface->extendedAttributes->{Exposed} && $interface->extendedAttributes->{Exposed} ne "Window";
     3732
     3733        my @flags = split(/&/, $context->extendedAttributes->{DisabledByQuirk});
     3734        foreach my $flag (@flags) {
     3735            push(@conjuncts, "!downcast<Document>(jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext())->quirks()." . ToMethodName($flag) . "Quirk()");
    37213736        }
    37223737    }
  • trunk/Source/WebCore/bindings/scripts/IDLAttributes.json

    r236623 r236818  
    182182            "values": ["*"]
    183183        },
     184        "DisabledByQuirk": {
     185            "contextsAllowed": ["interface", "dictionary", "enum", "attribute", "operation", "constant"],
     186            "values": ["*"]
     187        },
    184188        "EnabledForWorld": {
    185189            "contextsAllowed": ["attribute", "operation"],
  • trunk/Source/WebCore/bindings/scripts/preprocess-idls.pl

    r226395 r236818  
    259259      next unless ($attributeName eq "Conditional" || $attributeName eq "EnabledAtRuntime" || $attributeName eq "EnabledForWorld"
    260260        || $attributeName eq "EnabledBySetting" || $attributeName eq "SecureContext" || $attributeName eq "PrivateIdentifier"
    261         || $attributeName eq "PublicIdentifier");
     261        || $attributeName eq "PublicIdentifier" || $attributeName eq "DisabledByQuirk");
    262262      my $extendedAttribute = $attributeName;
    263263      $extendedAttribute .= "=" . $extendedAttributes->{$attributeName} unless $extendedAttributes->{$attributeName} eq "VALUE_IS_MISSING";
  • trunk/Source/WebCore/dom/Document.cpp

    r236762 r236818  
    151151#include "ProcessingInstruction.h"
    152152#include "PublicSuffix.h"
     153#include "Quirks.h"
    153154#include "RealtimeMediaSourceCenter.h"
    154155#include "RenderChildIterator.h"
     
    490491#endif
    491492    , m_settings(frame ? Ref<Settings>(frame->settings()) : Settings::create(nullptr))
     493    , m_quirks(makeUniqueRef<Quirks>(*this))
    492494    , m_cachedResourceLoader(m_frame ? Ref<CachedResourceLoader>(m_frame->loader().activeDocumentLoader()->cachedResourceLoader()) : CachedResourceLoader::create(nullptr))
    493495    , m_domTreeVersion(++s_globalTreeVersion)
  • trunk/Source/WebCore/dom/Document.h

    r236730 r236818  
    6464#include <wtf/Logger.h>
    6565#include <wtf/ObjectIdentifier.h>
     66#include <wtf/UniqueRef.h>
    6667#include <wtf/WeakPtr.h>
    6768#include <wtf/text/AtomicStringHash.h>
     
    156157class ProcessingInstruction;
    157158class QualifiedName;
     159class Quirks;
    158160class Range;
    159161class RenderFullScreen;
     
    566568    Settings& mutableSettings() { return m_settings.get(); }
    567569
     570    const Quirks& quirks() const { return m_quirks; }
     571
    568572    float deviceScaleFactor() const;
    569573
     
    16291633    const Ref<Settings> m_settings;
    16301634
     1635    UniqueRef<Quirks> m_quirks;
     1636
    16311637    std::unique_ptr<StyleResolver> m_userAgentShadowTreeStyleResolver;
    16321638
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r236762 r236818  
    7474#include "ProgressTracker.h"
    7575#include "PublicSuffix.h"
     76#include "Quirks.h"
    7677#include "RenderLayerCompositor.h"
    7778#include "RenderTheme.h"
     
    26282629        // Only fire an error if ENCRYPTED_MEDIA is not enabled, to give clients of the
    26292630        // "encrypted" event a chance to handle it without resulting in a synthetic error.
    2630         && !RuntimeEnabledFeatures::sharedFeatures().encryptedMediaAPIEnabled()
     2631        && (!RuntimeEnabledFeatures::sharedFeatures().encryptedMediaAPIEnabled() || document().quirks().hasBrokenEncryptedMediaAPISupportQuirk())
    26312632#endif
    26322633        ) {
     
    27642765void HTMLMediaElement::mediaPlayerInitializationDataEncountered(const String& initDataType, RefPtr<ArrayBuffer>&& initData)
    27652766{
    2766     if (!RuntimeEnabledFeatures::sharedFeatures().encryptedMediaAPIEnabled())
     2767    if (!RuntimeEnabledFeatures::sharedFeatures().encryptedMediaAPIEnabled() || document().quirks().hasBrokenEncryptedMediaAPISupportQuirk())
    27672768        return;
    27682769
  • trunk/Source/WebCore/html/HTMLMediaElement.idl

    r234312 r236818  
    105105    [Conditional=LEGACY_ENCRYPTED_MEDIA, EnabledAtRuntime=LegacyEncryptedMediaAPI] readonly attribute WebKitMediaKeys webkitKeys;
    106106    [Conditional=LEGACY_ENCRYPTED_MEDIA, EnabledAtRuntime=LegacyEncryptedMediaAPI] void webkitSetMediaKeys(WebKitMediaKeys? mediaKeys);
    107     [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI] readonly attribute MediaKeys mediaKeys;
    108     [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI] attribute EventHandler onencrypted;
    109     [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI] attribute EventHandler onwaitingforkey;
    110     [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI] Promise<void> setMediaKeys(MediaKeys? mediaKeys);
     107    [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI, DisabledByQuirk=hasBrokenEncryptedMediaAPISupport] readonly attribute MediaKeys mediaKeys;
     108    [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI, DisabledByQuirk=hasBrokenEncryptedMediaAPISupport] attribute EventHandler onencrypted;
     109    [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI, DisabledByQuirk=hasBrokenEncryptedMediaAPISupport] attribute EventHandler onwaitingforkey;
     110    [Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI, DisabledByQuirk=hasBrokenEncryptedMediaAPISupport] Promise<void> setMediaKeys(MediaKeys? mediaKeys);
    111111
    112112    [Conditional=VIDEO_TRACK, MayThrowException] TextTrack addTextTrack(DOMString kind, optional DOMString label = "", optional DOMString language = "");
  • trunk/Source/WebCore/html/MediaEncryptedEvent.idl

    r208939 r236818  
    3535    Conditional=ENCRYPTED_MEDIA,
    3636    Constructor(DOMString type, optional MediaEncryptedEventInit eventInitDict),
    37     EnabledAtRuntime=EncryptedMediaAPI
     37    EnabledAtRuntime=EncryptedMediaAPI,
     38    DisabledByQuirk=hasBrokenEncryptedMediaAPISupport,
    3839] interface MediaEncryptedEvent : Event {
    3940    readonly attribute DOMString initDataType;
  • trunk/Source/WebCore/page/csp/ContentSecurityPolicySource.cpp

    r233036 r236818  
    3030#include "ContentSecurityPolicy.h"
    3131#include "SecurityOriginData.h"
     32#include "TextEncoding.h"
    3233#include "URL.h"
    3334
Note: See TracChangeset for help on using the changeset viewer.