diff -r 000000000000 -r 6474c204b198 toolkit/components/thumbnails/PageThumbsProtocol.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolkit/components/thumbnails/PageThumbsProtocol.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,112 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * PageThumbsProtocol.js + * + * This file implements the moz-page-thumb:// protocol and the corresponding + * channel delivering cached thumbnails. + * + * URL structure: + * + * moz-page-thumb://thumbnail?url=http%3A%2F%2Fwww.mozilla.org%2F + * + * This URL requests an image for 'http://www.mozilla.org/'. + */ + +"use strict"; + +const Cu = Components.utils; +const Cc = Components.classes; +const Cr = Components.results; +const Ci = Components.interfaces; + +Cu.import("resource://gre/modules/PageThumbs.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "Services", + "resource://gre/modules/Services.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "FileUtils", + "resource://gre/modules/FileUtils.jsm"); + +/** + * Implements the thumbnail protocol handler responsible for moz-page-thumb: URIs. + */ +function Protocol() { +} + +Protocol.prototype = { + /** + * The scheme used by this protocol. + */ + get scheme() PageThumbs.scheme, + + /** + * The default port for this protocol (we don't support ports). + */ + get defaultPort() -1, + + /** + * The flags specific to this protocol implementation. + */ + get protocolFlags() { + return Ci.nsIProtocolHandler.URI_DANGEROUS_TO_LOAD | + Ci.nsIProtocolHandler.URI_NORELATIVE | + Ci.nsIProtocolHandler.URI_NOAUTH; + }, + + /** + * Creates a new URI object that is suitable for loading by this protocol. + * @param aSpec The URI string in UTF8 encoding. + * @param aOriginCharset The charset of the document from which the URI originated. + * @return The newly created URI. + */ + newURI: function Proto_newURI(aSpec, aOriginCharset) { + let uri = Cc["@mozilla.org/network/simple-uri;1"].createInstance(Ci.nsIURI); + uri.spec = aSpec; + return uri; + }, + + /** + * Constructs a new channel from the given URI for this protocol handler. + * @param aURI The URI for which to construct a channel. + * @return The newly created channel. + */ + newChannel: function Proto_newChannel(aURI) { + let {url} = parseURI(aURI); + let file = PageThumbsStorage.getFilePathForURL(url); + let fileuri = Services.io.newFileURI(new FileUtils.File(file)); + return Services.io.newChannelFromURI(fileuri); + }, + + /** + * Decides whether to allow a blacklisted port. + * @return Always false, we'll never allow ports. + */ + allowPort: function () false, + + classID: Components.ID("{5a4ae9b5-f475-48ae-9dce-0b4c1d347884}"), + QueryInterface: XPCOMUtils.generateQI([Ci.nsIProtocolHandler]) +}; + +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([Protocol]); + +/** + * Parses a given URI and extracts all parameters relevant to this protocol. + * @param aURI The URI to parse. + * @return The parsed parameters. + */ +function parseURI(aURI) { + let {scheme, staticHost} = PageThumbs; + let re = new RegExp("^" + scheme + "://" + staticHost + ".*?\\?"); + let query = aURI.spec.replace(re, ""); + let params = {}; + + query.split("&").forEach(function (aParam) { + let [key, value] = aParam.split("=").map(decodeURIComponent); + params[key.toLowerCase()] = value; + }); + + return params; +}