]> git.parisson.com Git - pdf.js.git/commitdiff
Compatibility hacks for IE, Opera, Safari
authornotmasteryet <async.processingjs@yahoo.com>
Fri, 1 Jul 2011 21:59:20 +0000 (16:59 -0500)
committernotmasteryet <async.processingjs@yahoo.com>
Fri, 1 Jul 2011 21:59:20 +0000 (16:59 -0500)
compatibility.js [new file with mode: 0644]
fonts.js
viewer.html
worker/client.js

diff --git a/compatibility.js b/compatibility.js
new file mode 100644 (file)
index 0000000..8b7f63b
--- /dev/null
@@ -0,0 +1,140 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+// Checking if the typed arrays are supported
+(function() {
+  if (typeof Uint8Array !== "undefined")
+    return;
+
+  function subarray(start, end) {
+    return this.slice(start, end);
+  }
+
+  function set_(array, offset) {
+    if (arguments.length < 2) offset = 0;
+    for (var i = 0, n = array.length; i < n; ++i, ++offset)
+      this[offset] = array[i] & 0xFF;
+  }
+
+  function TypedArray(arg1) {
+    var result;
+    if (typeof arg1 === "number") {
+       result = new Array(arg1);
+       for (var i = 0; i < arg1; ++i)
+         result[i] = 0;
+    } else
+       result = arg1.slice(0);
+    result.subarray = subarray;
+    result.buffer = result;
+    result.byteLength = result.length;
+    result.set = set_;
+    if (typeof arg1 === "object" && arg1.buffer)
+      result.buffer = arg1.buffer;
+
+    return result;
+  }
+
+  window.Uint8Array = TypedArray;
+  
+  // we don't need support for set, byteLength for 32-bit array
+  // so we can use the TypedArray as well 
+  window.Uint32Array = TypedArray;
+  window.Int32Array = TypedArray;
+})();
+
+// Object.create() ?
+(function() {
+  if (typeof Object.create !== "undefined")
+    return;
+
+  Object.create = function(proto) {
+    var constructor = function() {};
+    constructor.prototype = proto;
+    return new constructor();
+  };
+})();
+
+// Object.defineProperty() ?
+(function() {
+  if (typeof Object.defineProperty !== "undefined")
+    return;
+
+  Object.defineProperty = function(obj, name, def) {
+    delete obj[name];
+    if ("get" in def)
+      obj.__defineGetter__(name, def["get"]);
+    if ("set" in def)
+      obj.__defineSetter__(name, def["set"]);
+    if ("value" in def) {
+      obj.__defineSetter__(name, function(value) {
+        this.__defineGetter__(name, function() {
+          return value;
+        });
+        return value;
+      });
+      obj[name] = def.value;
+    }
+  };
+})();
+
+// No XMLHttpRequest.response ?
+(function() {
+  var xhrPrototype = XMLHttpRequest.prototype;
+  if ("response" in xhrPrototype ||
+      "mozResponseArrayBuffer" in xhrPrototype || 
+      "mozResponse" in xhrPrototype ||
+      "responseArrayBuffer" in xhrPrototype)
+    return;
+  // IE ?
+  if (typeof VBArray !== "undefined") {
+    Object.defineProperty(xhrPrototype, "response", {
+      get: function() {
+        return new Uint8Array( new VBArray(this.responseBody).toArray() );
+      }
+    });
+    return;
+  }
+
+  // other browsers
+  function responseTypeSetter() {
+    // will be only called to set "arraybuffer"
+    this.overrideMimeType("text/plain; charset=x-user-defined");
+  }
+  if (typeof xhrPrototype.overrideMimeType === "function") {
+    Object.defineProperty(xhrPrototype, "responseType", { set: responseTypeSetter });
+  }
+  function responseGetter() {
+    var text = this.responseText;
+    var i, n = text.length;
+    var result = new Uint8Array(n);
+    for (i = 0; i < n; ++i)
+      result[i] = text.charCodeAt(i) & 0xFF;
+    return result;
+  }
+  Object.defineProperty(xhrPrototype, "response", { get: responseGetter });
+})();
+
+// window.btoa (base64 encode function) ?
+(function() {
+  if ("btoa" in window)
+    return;
+
+  var digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+
+  window.btoa = function(chars) {
+    var buffer = "";
+    var i, n;
+    for (i = 0, n = chars.length; i < n; i += 3) {
+      var b1 = chars.charCodeAt(i) & 0xFF;
+      var b2 = chars.charCodeAt(i + 1) & 0xFF;
+      var b3 = chars.charCodeAt(i + 2) & 0xFF;
+      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
+      var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
+      var d4 = i + 2 < n ? (b3 & 0x3F) : 64;
+      buffer += digits.charAt(d1) + digits.charAt(d2) + digits.charAt(d3) + digits.charAt(d4);
+    }
+    return buffer;
+  }; 
+})();
+
+
index 9782fc9a1ceaeb791db79c0b408d9af008793a64..3db99daf3c714819be86a3dde48f78a4108cdfca 100644 (file)
--- a/fonts.js
+++ b/fonts.js
@@ -1057,7 +1057,7 @@ var Font = (function () {
       var url = "url(data:" + this.mimetype + ";base64," + window.btoa(data) + ");";
       var rule = "@font-face { font-family:'" + fontName + "';src:" + url + "}";
       var styleSheet = document.styleSheets[0];
-      styleSheet.insertRule(rule, styleSheet.length);
+      styleSheet.insertRule(rule, styleSheet.cssRules.length);
     }
   };
 
index c600547f05405886ea6439a2fe80c1d0aae283b4..e73357d438f5fcb4020e0aea5de9b4e1985f94aa 100644 (file)
@@ -1,8 +1,10 @@
+<!DOCTYPE html>
 <html>
     <head>
         <title>Simple pdf.js page viewer</title>
         <link rel="stylesheet" href="viewer.css"></link>
 
+        <!-- <script type="text/javascript" src="compatibility.js"></script> -->
         <script type="text/javascript" src="viewer.js"></script>
         <script type="text/javascript" src="pdf.js"></script>
         <script type="text/javascript" src="utils/fonts_utils.js"></script>
index fd98b857e25837187dbf52c73fd1343d18095994..359c69ff487893bccc216e51756a7b567a47b8df 100644 (file)
@@ -285,7 +285,7 @@ function WorkerPDFDoc(canvas) {
       var url = "url(data:" + data.mimetype + ";base64," + base64 + ");";
       var rule = "@font-face { font-family:'" + data.fontName + "';src:" + url + "}";
       var styleSheet = document.styleSheets[0];
-      styleSheet.insertRule(rule, styleSheet.length);
+      styleSheet.insertRule(rule, styleSheet.cssRules.length);
 
       // Just adding the font-face to the DOM doesn't make it load. It
       // seems it's loaded once Gecko notices it's used. Therefore,