pdf.js/extensions/firefox/components/pdfContentHandler.js

95 lines
3.1 KiB
JavaScript
Raw Normal View History

2011-09-28 04:15:06 +09:00
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
'use strict';
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
const Cu = Components.utils;
2011-09-28 04:15:06 +09:00
const PDF_CONTENT_TYPE = 'application/pdf';
2011-09-28 04:15:06 +09:00
Cu.import('resource://gre/modules/XPCOMUtils.jsm');
Cu.import('resource://gre/modules/Services.jsm');
function log(aMsg) {
2011-09-28 04:15:06 +09:00
let msg = 'pdfContentHandler.js: ' + (aMsg.join ? aMsg.join('') : aMsg);
Cc['@mozilla.org/consoleservice;1'].getService(Ci.nsIConsoleService)
.logStringMessage(msg);
2011-09-28 04:15:06 +09:00
dump(msg + '\n');
}
const NS_ERROR_WONT_HANDLE_CONTENT = 0x805d0001;
function pdfContentHandler() {
2012-01-24 10:52:53 +09:00
}
pdfContentHandler.prototype = {
// properties required for XPCOM registration:
classID: Components.ID('{2278dfd0-b75c-11e0-8257-1ba3d93c9f1a}'),
classDescription: 'pdf.js Component',
contractID: '@mozilla.org/streamconv;1?from=application/pdf&to=*/*',
2012-01-24 10:52:53 +09:00
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
2012-01-24 10:52:53 +09:00
convert: function(aFromStream, aFromType, aToType, aCtxt) {
return aFromStream;
},
// nsIStreamConverter::asyncConvertData
2012-01-24 10:52:53 +09:00
asyncConvertData: function(aFromType, aToType, aListener, aCtxt) {
// Store the listener passed to us
this.listener = aListener;
},
// nsIStreamListener::onDataAvailable
2012-01-24 10:52:53 +09:00
onDataAvailable: function(aRequest, aContext, aInputStream, aOffset, aCount) {
// Do nothing since all the data loading is handled by the viewer.
2012-01-24 10:52:53 +09:00
log('SANITY CHECK: onDataAvailable SHOULD NOT BE CALLED!');
},
// nsIRequestObserver::onStartRequest
2012-01-24 10:52:53 +09:00
onStartRequest: function(aRequest, aContext) {
// Setup the request so we can use it below.
aRequest.QueryInterface(Ci.nsIChannel);
// Create a new channel that is viewer loaded as a resource.
2012-01-24 10:52:53 +09:00
var ioService = Cc['@mozilla.org/network/io-service;1']
.getService(Ci.nsIIOService);
var channel = ioService.newChannel(
'resource://pdf.js/web/viewer.html', null, null);
// Keep the URL the same so the browser sees it as the same.
channel.originalURI = aRequest.originalURI;
channel.asyncOpen(this.listener, aContext);
// Cancel the request so the viewer can handle it.
aRequest.cancel(Cr.NS_BINDING_ABORTED);
},
// nsIRequestObserver::onStopRequest
2012-01-24 10:52:53 +09:00
onStopRequest: function(aRequest, aContext, aStatusCode) {
// Do nothing.
return;
}
};
var NSGetFactory = XPCOMUtils.generateNSGetFactory([pdfContentHandler]);