fune/browser/extensions/pdfjs/components/PdfStreamConverter.js
Dave Townsend d99dd4f5dd Bug 740795 part A - file moves for pdf.js not being shipped as an extension, r=bsmedberg
--HG--
rename : browser/app/profile/extensions/uriloader@pdf.js/LICENSE => browser/extensions/pdfjs/LICENSE
rename : browser/app/profile/extensions/uriloader@pdf.js/README.mozilla => browser/extensions/pdfjs/README.mozilla
rename : browser/app/profile/extensions/uriloader@pdf.js/bootstrap.js => browser/extensions/pdfjs/bootstrap.js
rename : browser/app/profile/extensions/uriloader@pdf.js/components/PdfStreamConverter.js => browser/extensions/pdfjs/components/PdfStreamConverter.js
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/debugger.js => browser/extensions/pdfjs/content/web/debugger.js
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/bookmark.svg => browser/extensions/pdfjs/content/web/images/bookmark.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/check.svg => browser/extensions/pdfjs/content/web/images/check.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/comment.svg => browser/extensions/pdfjs/content/web/images/comment.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/document-print.svg => browser/extensions/pdfjs/content/web/images/document-print.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/download.svg => browser/extensions/pdfjs/content/web/images/download.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/go-down.svg => browser/extensions/pdfjs/content/web/images/go-down.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/go-up.svg => browser/extensions/pdfjs/content/web/images/go-up.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/loading-icon.gif => browser/extensions/pdfjs/content/web/images/loading-icon.gif
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/nav-outline.svg => browser/extensions/pdfjs/content/web/images/nav-outline.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/nav-thumbs.svg => browser/extensions/pdfjs/content/web/images/nav-thumbs.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/pin-down.svg => browser/extensions/pdfjs/content/web/images/pin-down.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/pin-up.svg => browser/extensions/pdfjs/content/web/images/pin-up.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/zoom-in.svg => browser/extensions/pdfjs/content/web/images/zoom-in.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/images/zoom-out.svg => browser/extensions/pdfjs/content/web/images/zoom-out.svg
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/viewer-snippet-firefox-extension.html => browser/extensions/pdfjs/content/web/viewer-snippet-firefox-extension.html
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/viewer.css => browser/extensions/pdfjs/content/web/viewer.css
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/viewer.html => browser/extensions/pdfjs/content/web/viewer.html
rename : browser/app/profile/extensions/uriloader@pdf.js/content/web/viewer.js => browser/extensions/pdfjs/content/web/viewer.js
rename : browser/app/profile/extensions/uriloader@pdf.js/extension-files => browser/extensions/pdfjs/extension-files
rename : browser/app/profile/extensions/uriloader@pdf.js/icon.png => browser/extensions/pdfjs/icon.png
rename : browser/app/profile/extensions/uriloader@pdf.js/icon64.png => browser/extensions/pdfjs/icon64.png
rename : browser/app/profile/extensions/uriloader@pdf.js/install.rdf.in => browser/extensions/pdfjs/install.rdf.in
rename : browser/app/profile/extensions/uriloader@pdf.js/test/Makefile.in => browser/extensions/pdfjs/test/Makefile.in
rename : browser/app/profile/extensions/uriloader@pdf.js/test/browser_pdfjs_main.js => browser/extensions/pdfjs/test/browser_pdfjs_main.js
rename : browser/app/profile/extensions/uriloader@pdf.js/test/file_pdfjs_test.pdf => browser/extensions/pdfjs/test/file_pdfjs_test.pdf
extra : rebase_source : c23010d45ed5b5295f0de773084a156a3bf6caec
2012-05-18 12:42:01 -04:00

193 lines
6.4 KiB
JavaScript

/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
'use strict';
var EXPORTED_SYMBOLS = ['PdfStreamConverter'];
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
const Cu = Components.utils;
const PDFJS_EVENT_ID = 'pdf.js.message';
const PDF_CONTENT_TYPE = 'application/pdf';
const EXT_PREFIX = 'extensions.uriloader@pdf.js';
const MAX_DATABASE_LENGTH = 4096;
Cu.import('resource://gre/modules/XPCOMUtils.jsm');
Cu.import('resource://gre/modules/Services.jsm');
let application = Cc['@mozilla.org/fuel/application;1']
.getService(Ci.fuelIApplication);
let privateBrowsing = Cc['@mozilla.org/privatebrowsing;1']
.getService(Ci.nsIPrivateBrowsingService);
let inPrivateBrowswing = privateBrowsing.privateBrowsingEnabled;
function log(aMsg) {
if (!application.prefs.getValue(EXT_PREFIX + '.pdfBugEnabled', false))
return;
let msg = 'PdfStreamConverter.js: ' + (aMsg.join ? aMsg.join('') : aMsg);
Services.console.logStringMessage(msg);
dump(msg + '\n');
}
function getDOMWindow(aChannel) {
var requestor = aChannel.notificationCallbacks;
var win = requestor.getInterface(Components.interfaces.nsIDOMWindow);
return win;
}
// All the priviledged actions.
function ChromeActions() {
this.inPrivateBrowswing = privateBrowsing.privateBrowsingEnabled;
}
ChromeActions.prototype = {
download: function(data) {
Services.wm.getMostRecentWindow('navigator:browser').saveURL(data);
},
setDatabase: function(data) {
if (this.inPrivateBrowswing)
return;
// Protect against something sending tons of data to setDatabase.
if (data.length > MAX_DATABASE_LENGTH)
return;
application.prefs.setValue(EXT_PREFIX + '.database', data);
},
getDatabase: function() {
if (this.inPrivateBrowswing)
return '{}';
return application.prefs.getValue(EXT_PREFIX + '.database', '{}');
},
pdfBugEnabled: function() {
return application.prefs.getValue(EXT_PREFIX + '.pdfBugEnabled', false);
}
};
// Event listener to trigger chrome privedged code.
function RequestListener(actions) {
this.actions = actions;
}
// Receive an event and synchronously responds.
RequestListener.prototype.receive = function(event) {
var message = event.target;
var action = message.getUserData('action');
var data = message.getUserData('data');
var actions = this.actions;
if (!(action in actions)) {
log('Unknown action: ' + action);
return;
}
var response = actions[action].call(this.actions, data);
message.setUserData('response', response, null);
};
function PdfStreamConverter() {
}
PdfStreamConverter.prototype = {
// properties required for XPCOM registration:
classID: Components.ID('{6457a96b-2d68-439a-bcfa-44465fbcdbb1}'),
classDescription: 'pdf.js Component',
contractID: '@mozilla.org/streamconv;1?from=application/pdf&to=*/*',
QueryInterface: XPCOMUtils.generateQI([
Ci.nsISupports,
Ci.nsIStreamConverter,
Ci.nsIStreamListener,
Ci.nsIRequestObserver
]),
/*
* This component works as such:
* 1. asyncConvertData stores the listener
* 2. onStartRequest creates a new channel, streams the viewer and cancels
* the request so pdf.js can do the request
* Since the request is cancelled onDataAvailable should not be called. The
* onStopRequest does nothing. The convert function just returns the stream,
* it's just the synchronous version of asyncConvertData.
*/
// nsIStreamConverter::convert
convert: function(aFromStream, aFromType, aToType, aCtxt) {
throw Cr.NS_ERROR_NOT_IMPLEMENTED;
},
// nsIStreamConverter::asyncConvertData
asyncConvertData: function(aFromType, aToType, aListener, aCtxt) {
// Ignoring HTTP POST requests -- pdf.js has to repeat the request.
var skipConversion = false;
try {
var request = aCtxt;
request.QueryInterface(Ci.nsIHttpChannel);
skipConversion = (request.requestMethod !== 'GET');
} catch (e) {
// Non-HTTP request... continue normally.
}
if (skipConversion)
throw Cr.NS_ERROR_NOT_IMPLEMENTED;
// Store the listener passed to us
this.listener = aListener;
},
// nsIStreamListener::onDataAvailable
onDataAvailable: function(aRequest, aContext, aInputStream, aOffset, aCount) {
// Do nothing since all the data loading is handled by the viewer.
log('SANITY CHECK: onDataAvailable SHOULD NOT BE CALLED!');
},
// nsIRequestObserver::onStartRequest
onStartRequest: function(aRequest, aContext) {
// Setup the request so we can use it below.
aRequest.QueryInterface(Ci.nsIChannel);
// Cancel the request so the viewer can handle it.
aRequest.cancel(Cr.NS_BINDING_ABORTED);
// Create a new channel that is viewer loaded as a resource.
var ioService = Services.io;
var channel = ioService.newChannel(
'resource://pdf.js/web/viewer.html', null, null);
var listener = this.listener;
// Proxy all the request observer calls, when it gets to onStopRequest
// we can get the dom window.
var proxy = {
onStartRequest: function() {
listener.onStartRequest.apply(listener, arguments);
},
onDataAvailable: function() {
listener.onDataAvailable.apply(listener, arguments);
},
onStopRequest: function() {
var domWindow = getDOMWindow(channel);
// Double check the url is still the correct one.
if (domWindow.document.documentURIObject.equals(aRequest.URI)) {
let requestListener = new RequestListener(new ChromeActions);
domWindow.addEventListener(PDFJS_EVENT_ID, function(event) {
requestListener.receive(event);
}, false, true);
}
listener.onStopRequest.apply(listener, arguments);
}
};
// Keep the URL the same so the browser sees it as the same.
channel.originalURI = aRequest.URI;
channel.asyncOpen(proxy, aContext);
},
// nsIRequestObserver::onStopRequest
onStopRequest: function(aRequest, aContext, aStatusCode) {
// Do nothing.
}
};
var NSGetFactory = XPCOMUtils.generateNSGetFactory([PdfStreamConverter]);