Skip to content
  • graouts@apple.com's avatar
    Manage the presentation of the snapshotted plug-in using JavaScript · 3828a6ec
    graouts@apple.com authored
    https://bugs.webkit.org/show_bug.cgi?id=115548
    
    Reviewed by Dean Jackson.
    
    Source/WebCore:
    
    * Resources/plugIns.js:
    (createOverlay):
    Implement the createOverlay(shadowRoot, titleText, subtitleText) method
    that is called from WebCore (HTMLPlugInImageElement::didAddUserAgentShadowRoot)
    to allow the injected script to customize the shadow root for a snapshotted
    plug-in. This is a default implementation, clients are expected to customize
    this by providing their own JS file with enhanced behavior.
    
    * css/CSSDefaultStyleSheets.cpp:
    (WebCore::CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement):
    Since we no longer have a default shadow tree generated in C++, it makes little
    sense for clients to extend the default snapshotted plug-in stylesheet, so we
    only insert it if no custom one is provided by the chrome client.
    
    * css/plugIns.css:
    Better styling of the default snapshotted plug-in overlay look by using CSS
    flex boxes. Also using more explicit selector as an optimization.
    
    * dom/Document.cpp:
    (WebCore::Document::ensurePlugInsInjectedScript):
    Expose a new method to allow HTMLPlugInImageElement instances to ensure that
    the JavaScript code required to customize the snapshotted plug-in's shadow root
    is indeed injected in the current document. The actual injection would only
    happen once per document so all snapshotted plug-ins share the same scripting
    context.
    
    * dom/Document.h:
    Expose the new ensurePlugInsInjectedScript method and the m_hasInjectedPlugInsScript
    property used to ensure injection happens only once per document.
    
    * html/HTMLPlugInImageElement.cpp:
    (WebCore::titleText):
    (WebCore::subtitleText):
    Store the localized strings for each mime-type in a static hash map as it can be
    costly to retrieve them each time from the client. It is expected the chrome client
    will want to provide localized strings taking into account the snapshotted plug-in's
    mime-type, so we're adding this as a parameter.
    (WebCore::HTMLPlugInImageElement::checkSnapshotStatus):
    Dispatch a "resize" event to the shadow root to notify the injected script that the
    snapshotted plug-in's metrics have changed and to allow the overlay to update itself
    as a result.
    (WebCore::HTMLPlugInImageElement::didAddUserAgentShadowRoot):
    Remove all the DOM generation code in favor of an approach where we create a shared
    DOM scripting world in which we inject JavaScript code that will perform the same
    task but will additionally be provided by the client in order to provide a completely
    custom overlay for the snapshotted plug-in. The sole contract is for the JavaScript
    to implement a createOverlay(shadowRoot, titleText, subtitleText) method.
    (WebCore::HTMLPlugInImageElement::partOfSnapshotOverlay):
    Renamed method to be generic to the overlay as opposed to text labels and use the
    element with CSS class name "snapshot-overlay" as the comparison node.
    
    * html/HTMLPlugInImageElement.h:
    (HTMLPlugInImageElement):
    Removing a couple of unused members since we no longer generate the shadow DOM from C++
    and rename the partOfSnapshotLabel method to partOfSnapshotOverlay.
    
    * page/ChromeClient.h:
    (WebCore::ChromeClient::plugInStartLabelTitle):
    (WebCore::ChromeClient::plugInStartLabelSubtitle):
    (WebCore::ChromeClient::plugInExtraScript):
    Pass in the mime-type to plugInStartLabelTitle and plugInStartLabelSubtitle and expose
    a new plugInExtraScript method to allow the chrome client to provide a custom JS file
    for the management of the shadow root.
    
    * rendering/RenderSnapshottedPlugIn.cpp:
    (WebCore::RenderSnapshottedPlugIn::handleEvent):
    Update the terminology from "label" to "overlay" per the changes made in HTMLPlugInImageElement.
    
    Source/WebKit2:
    
    Expose a new plugInExtraScript method to support the injection of
    a JS file from the chrome client to customize the rendering of a
    snapshotted plug-in's shadow tree. Additionally, it is expected
    the chrome client will want to provide localized strings taking
    into account the snapshotted plug-in's mime-type, so we're adding
    this as a parameter to both plugInStartLabelTitle and
    plugInStartLabelSubtitle methods.
    
    * WebProcess/InjectedBundle/API/c/WKBundlePage.h:
    * WebProcess/InjectedBundle/InjectedBundlePageUIClient.cpp:
    (WebKit::InjectedBundlePageUIClient::plugInStartLabelTitle):
    (WebKit::InjectedBundlePageUIClient::plugInStartLabelSubtitle):
    (WebKit::InjectedBundlePageUIClient::plugInExtraScript):
    * WebProcess/InjectedBundle/InjectedBundlePageUIClient.h:
    (InjectedBundlePageUIClient):
    * WebProcess/WebCoreSupport/WebChromeClient.cpp:
    (WebKit::WebChromeClient::plugInStartLabelTitle):
    (WebKit::WebChromeClient::plugInStartLabelSubtitle):
    (WebKit::WebChromeClient::plugInExtraScript):
    * WebProcess/WebCoreSupport/WebChromeClient.h:
    (WebChromeClient):
    
    Tools:
    
    Take into account the new plugInExtraScript method added to support
    the injection of a JS file from the chrome client to customize the
    rendering of a snapshotted plug-in's shadow tree.
    
    * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
    (WTR::InjectedBundlePage::InjectedBundlePage):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@149586 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    3828a6ec