Skip to content
Snippets Groups Projects
data-handler.js 1.9 KiB
Newer Older
Thomas Rientjes's avatar
Thomas Rientjes committed
/**
 * Data Handler
 * Belongs to Decentraleyes.
 *
 * @author      Thomas Rientjes
 * @since       2014-05-30
 * @license     MPL 2.0
 *
 * 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/.
 */

'use strict';

/**
 * Imports
 */

var {Cc, Ci} = require('chrome');
Thomas Rientjes's avatar
Thomas Rientjes committed
var self = require('sdk/self');

var ioService = Cc['@mozilla.org/network/io-service;1']
    .getService(Ci.nsIIOService);

/**
 * Absolute resource file paths.
 * @var {object} files
 */
var files = require('./files');
Thomas Rientjes's avatar
Thomas Rientjes committed

Thomas Rientjes's avatar
Thomas Rientjes committed
/**
 * Constants
 */

const DELIVERY_NOTICE = `/**\n * Local delivery by Decentraleyes (${self.version}).\n */\n\n`;
Thomas Rientjes's avatar
Thomas Rientjes committed

/**
 * Variables
 */

var resourceData = self.data;

Thomas Rientjes's avatar
Thomas Rientjes committed
/**
 * Public Methods
 */

function getRedirectionURI (targetPath, characterSet, type) {
Thomas Rientjes's avatar
Thomas Rientjes committed

    var data, dataURI, redirectionURI;
Thomas Rientjes's avatar
Thomas Rientjes committed

Thomas Rientjes's avatar
Thomas Rientjes committed
    data = _loadResource(targetPath);
    dataURI = _buildDataURI(type, characterSet, data);
    redirectionURI = ioService.newURI(dataURI, null, null);
Thomas Rientjes's avatar
Thomas Rientjes committed

    return redirectionURI;
Thomas Rientjes's avatar
Thomas Rientjes committed
}

/**
 * Exports
 */

exports.getRedirectionURI = getRedirectionURI;

/**
 * Private Methods
 */

function _loadResource (targetPath) {
Thomas Rientjes's avatar
Thomas Rientjes committed

    // Find the result inside a static path index.
Thomas Rientjes's avatar
Thomas Rientjes committed
    if (!files[targetPath]) {
        throw new Error('The requested resource is missing.');
Thomas Rientjes's avatar
Thomas Rientjes committed

    // Attempt to load resource contents.
    return resourceData.load(targetPath);
Thomas Rientjes's avatar
Thomas Rientjes committed
}

function _buildDataURI (type, characterSet, data) {
Thomas Rientjes's avatar
Thomas Rientjes committed
    var addNotice, dataURI;
Thomas Rientjes's avatar
Thomas Rientjes committed

    addNotice = require('sdk/simple-prefs').prefs.addNotice;
    dataURI = `data:${type};charset=${characterSet},`;
Thomas Rientjes's avatar
Thomas Rientjes committed

    // Remove the syntax invalidation character.
    data = data.substring(1);

    if (addNotice) {
        dataURI += encodeURIComponent(DELIVERY_NOTICE + data);
    } else {
        dataURI += encodeURIComponent(data);
Thomas Rientjes's avatar
Thomas Rientjes committed

    return dataURI;
Thomas Rientjes's avatar
Thomas Rientjes committed
}