diff --git a/web/compatibility.js b/web/compatibility.js
index 4b7119c63..cb2941042 100644
--- a/web/compatibility.js
+++ b/web/compatibility.js
@@ -124,24 +124,63 @@
   };
 })();
 
+// No readAsArrayBuffer ?
+(function checkFileReaderReadAsArrayBuffer() {
+  if (typeof FileReader === 'undefined')
+    return; // FileReader is not implemented
+  var frPrototype = FileReader.prototype;
+  // Older versions of Firefox might not have readAsArrayBuffer
+  if ('readAsArrayBuffer' in frPrototype)
+    return; // readAsArrayBuffer is implemented
+  Object.defineProperty(frPrototype, 'readAsArrayBuffer', {
+    value: function fileReaderReadAsArrayBuffer(blob) {
+      var fileReader = new FileReader();
+      var originalReader = this;
+      fileReader.onload = function fileReaderOnload(evt) {
+        var data = evt.target.result;
+        var buffer = new ArrayBuffer(data.length);
+        var uint8Array = new Uint8Array(buffer);
+
+        for (var i = 0, ii = data.length; i < ii; i++)
+          uint8Array[i] = data.charCodeAt(i);
+
+        Object.defineProperty(originalReader, 'result', {
+          value: buffer,
+          enumerable: true,
+          writable: false,
+          configurable: true
+        });
+
+        var event = document.createEvent('HTMLEvents');
+        event.initEvent('load', false, false);
+        originalReader.dispatchEvent(event);
+      };
+      fileReader.readAsBinaryString(blob);
+    }
+  });
+})();
+
 // No XMLHttpRequest.response ?
 (function checkXMLHttpRequestResponseCompatibility() {
   var xhrPrototype = XMLHttpRequest.prototype;
+  if (!('overrideMimeType' in xhrPrototype)) {
+    // IE10 might have response, but not overrideMimeType
+    Object.defineProperty(xhrPrototype, 'overrideMimeType', {
+      value: function xmlHttpRequestOverrideMimeType(mimeType) {}
+    });
+  }
   if ('response' in xhrPrototype ||
       'mozResponseArrayBuffer' in xhrPrototype ||
       'mozResponse' in xhrPrototype ||
       'responseArrayBuffer' in xhrPrototype)
     return;
-  // IE ?
+  // IE9 ?
   if (typeof VBArray !== 'undefined') {
     Object.defineProperty(xhrPrototype, 'response', {
       get: function xmlHttpRequestResponseGet() {
         return new Uint8Array(new VBArray(this.responseBody).toArray());
       }
     });
-    Object.defineProperty(xhrPrototype, 'overrideMimeType', {
-      value: function xmlHttpRequestOverrideMimeType(mimeType) {}
-    });
     return;
   }
 
diff --git a/web/viewer.js b/web/viewer.js
index 1e6bf8a12..7276d2cbd 100644
--- a/web/viewer.js
+++ b/web/viewer.js
@@ -1942,20 +1942,13 @@ window.addEventListener('change', function webViewerChange(evt) {
   // Read the local file into a Uint8Array.
   var fileReader = new FileReader();
   fileReader.onload = function webViewerChangeFileReaderOnload(evt) {
-    var data = evt.target.result;
-    var buffer = new ArrayBuffer(data.length);
+    var buffer = evt.target.result;
     var uint8Array = new Uint8Array(buffer);
-
-    for (var i = 0; i < data.length; i++)
-      uint8Array[i] = data.charCodeAt(i);
-
     PDFView.open(uint8Array, 0);
   };
 
-  // Read as a binary string since "readAsArrayBuffer" is not yet
-  // implemented in Firefox.
   var file = files[0];
-  fileReader.readAsBinaryString(file);
+  fileReader.readAsArrayBuffer(file);
   document.title = file.name;
 
   // URL does not reflect proper document location - hiding some icons.