From dc12d33f4df41d3947970a85b6a0b3e780276696 Mon Sep 17 00:00:00 2001
From: Yury Delendik <ydelendik@mozilla.com>
Date: Mon, 18 Mar 2013 16:12:24 -0500
Subject: [PATCH] Adding PlayPreview API support to pdf.js/mozilla-central

---
 extensions/firefox/content/PdfJs.jsm | 27 +++++++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/extensions/firefox/content/PdfJs.jsm b/extensions/firefox/content/PdfJs.jsm
index 786b4790c..54cbf5812 100644
--- a/extensions/firefox/content/PdfJs.jsm
+++ b/extensions/firefox/content/PdfJs.jsm
@@ -33,11 +33,15 @@ const PDF_CONTENT_TYPE = 'application/pdf';
 Cu.import('resource://gre/modules/XPCOMUtils.jsm');
 Cu.import('resource://gre/modules/Services.jsm');
 Cu.import('resource://pdf.js.components/PdfStreamConverter.js');
+Cu.import('resource://pdf.js.components/PdfRedirector.js');
 
 let Svc = {};
 XPCOMUtils.defineLazyServiceGetter(Svc, 'mime',
                                    '@mozilla.org/mime;1',
                                    'nsIMIMEService');
+XPCOMUtils.defineLazyServiceGetter(Svc, 'pluginHost',
+                                   '@mozilla.org/plugin/host;1',
+                                   'nsIPluginHost');
 
 function getBoolPref(aPref, aDefaultValue) {
   try {
@@ -55,8 +59,10 @@ function getIntPref(aPref, aDefaultValue) {
   }
 }
 
-// Register/unregister a constructor as a component.
-let Factory = {
+// Factory that registers/unregisters a constructor as a component.
+function Factory() {}
+
+Factory.prototype = {
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory]),
   _targetConstructor: null,
 
@@ -193,7 +199,14 @@ let PdfJs = {
     if (this._registered)
       return;
 
-    Factory.register(PdfStreamConverter);
+    this._pdfStreamConverterFactory = new Factory();
+    this._pdfStreamConverterFactory.register(PdfStreamConverter);
+
+    this._pdfRedirectorFactory = new Factory();
+    this._pdfRedirectorFactory.register(PdfRedirector);
+    Svc.pluginHost.registerPlayPreviewMimeType('application/pdf', true,
+      'data:application/x-moz-playpreview-pdfjs;,');
+
     this._registered = true;
   },
 
@@ -201,7 +214,13 @@ let PdfJs = {
     if (!this._registered)
       return;
 
-    Factory.unregister();
+    this._pdfStreamConverterFactory.unregister();
+    delete this._pdfStreamConverterFactory;
+
+    this._pdfRedirectorFactory.unregister;
+    delete this._pdfRedirectorFactory;
+    Svc.pluginHost.unregisterPlayPreviewMimeType('application/pdf');
+
     this._registered = false;
   }
 };