browser/metro/base/content/contenthandlers/PluginHelper.js

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
     3  * You can obtain one at http://mozilla.org/MPL/2.0/. */
     4 "use strict";
     6 dump("### PluginHelper.js loaded\n");
     8 /**
     9  * Handle events generated by plugin click-to-play code.
    10  *
    11  * This "PluginBindingAttached" fires when a "pluginProblem" XBL binding is
    12  * created.  This binding overlays plugin content when the plugin is missing,
    13  * blocked, click-to-play, or replaced by a "preview" extension plugin like
    14  * Shumway or PDF.js.
    15  */
    16 var PluginHelper = {
    17   init: function () {
    18     addEventListener("PluginBindingAttached", this, true, true);
    19   },
    21   handleEvent: function handleEvent(aEvent) {
    22     switch (aEvent.type) {
    23       case "PluginBindingAttached":
    24         this.handlePluginBindingAttached(aEvent);
    25         break;
    26     }
    27   },
    29   getPluginMimeType: function (plugin) {
    30     var tagMimetype = plugin.actualType;
    32     if (tagMimetype == "") {
    33       tagMimetype = plugin.type;
    34     }
    35     return tagMimetype;
    36   },
    38   handlePluginBindingAttached: function (aEvent) {
    39     let plugin = aEvent.target;
    40     let doc = plugin.ownerDocument;
    41     let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
    42     if (!overlay || overlay._bindingHandled) {
    43       return;
    44     }
    45     overlay._bindingHandled = true;
    47     let eventType = PluginHelper._getBindingType(plugin);
    48     if (!eventType) {
    49       return;
    50     }
    52     switch  (eventType) {
    53       case "PluginPlayPreview": {
    54         // Load the "preview" handler (an extension plugin like Shumway or PDF.js).
    55         let previewContent = doc.getAnonymousElementByAttribute(plugin, "class", "previewPluginContent");
    56         let pluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
    57         let mimeType = PluginHelper.getPluginMimeType(plugin);
    58         let playPreviewInfo = pluginHost.getPlayPreviewInfo(mimeType);
    60         let iframe = previewContent.getElementsByClassName("previewPluginContentFrame")[0];
    61         if (!iframe) {
    62           // lazy initialization of the iframe
    63           iframe = doc.createElementNS("http://www.w3.org/1999/xhtml", "iframe");
    64           iframe.className = "previewPluginContentFrame";
    65           previewContent.appendChild(iframe);
    66         }
    67         iframe.src = playPreviewInfo.redirectURL;
    68         break;
    69       }
    71       case "PluginNotFound": {
    72         // TODO: Display a message about missing plugins (bug 936907)
    73         break;
    74       }
    75     }
    76   },
    78   // Helper to get the binding handler type from a plugin object
    79   _getBindingType: function(plugin) {
    80     if (!(plugin instanceof Ci.nsIObjectLoadingContent))
    81       return null;
    83     switch (plugin.pluginFallbackType) {
    84       case Ci.nsIObjectLoadingContent.PLUGIN_UNSUPPORTED:
    85         return "PluginNotFound";
    86       case Ci.nsIObjectLoadingContent.PLUGIN_PLAY_PREVIEW:
    87         return "PluginPlayPreview";
    88       default:
    89         // Metro Firefox does not yet support other fallback types.
    90         return null;
    91     }
    92   },
    93 };
    95 PluginHelper.init();

mercurial