ソースを参照

PDF.js version 2.3.200 - See https://github.com/mozilla/pdf.js/releases/tag/v2.3.200

pdfjsbot 5 年 前
コミット
e9492b7a72
84 ファイル変更4001 行追加6989 行削除
  1. 1 1
      bower.json
  2. 417 337
      build/pdf.js
  3. 0 0
      build/pdf.js.map
  4. 0 0
      build/pdf.min.js
  5. 332 275
      build/pdf.worker.js
  6. 0 0
      build/pdf.worker.js.map
  7. 0 0
      build/pdf.worker.min.js
  8. 0 3962
      external/streams/streams-lib.js
  9. 0 627
      external/url/url-lib.js
  10. 407 328
      image_decoders/pdf.image_decoders.js
  11. 0 0
      image_decoders/pdf.image_decoders.js.map
  12. 0 0
      image_decoders/pdf.image_decoders.min.js
  13. 203 39
      lib/core/annotation.js
  14. 32 9
      lib/core/chunked_stream.js
  15. 48 22
      lib/core/core_utils.js
  16. 44 33
      lib/core/document.js
  17. 68 32
      lib/core/evaluator.js
  18. 2 2
      lib/core/fonts.js
  19. 1 0
      lib/core/glyphlist.js
  20. 1 1
      lib/core/image.js
  21. 23 6
      lib/core/jbig2.js
  22. 54 23
      lib/core/jpg.js
  23. 23 6
      lib/core/jpx.js
  24. 18 16
      lib/core/obj.js
  25. 17 14
      lib/core/operator_list.js
  26. 9 12
      lib/core/parser.js
  27. 22 7
      lib/core/pattern.js
  28. 4 4
      lib/core/pdf_manager.js
  29. 63 42
      lib/core/primitives.js
  30. 14 0
      lib/core/stream.js
  31. 9 1
      lib/core/type1_parser.js
  32. 17 56
      lib/core/worker.js
  33. 194 85
      lib/display/annotation_layer.js
  34. 314 196
      lib/display/api.js
  35. 6 1
      lib/display/canvas.js
  36. 1 1
      lib/display/content_disposition.js
  37. 48 18
      lib/display/display_utils.js
  38. 6 0
      lib/display/network_utils.js
  39. 22 5
      lib/display/pattern_helper.js
  40. 1 1
      lib/display/svg.js
  41. 62 53
      lib/display/text_layer.js
  42. 1 1
      lib/display/xml_parser.js
  43. 2 3
      lib/pdf.js
  44. 2 2
      lib/pdf.worker.js
  45. 23 19
      lib/shared/compatibility.js
  46. 163 196
      lib/shared/message_handler.js
  47. 1 1
      lib/shared/streams_polyfill.js
  48. 0 56
      lib/shared/url_polyfill.js
  49. 288 196
      lib/shared/util.js
  50. 687 93
      lib/test/unit/annotation_spec.js
  51. 72 27
      lib/test/unit/api_spec.js
  52. 1 1
      lib/test/unit/display_utils_spec.js
  53. 21 5
      lib/test/unit/evaluator_spec.js
  54. 3 1
      lib/test/unit/fetch_stream_spec.js
  55. 10 6
      lib/test/unit/message_handler_spec.js
  56. 3 1
      lib/test/unit/network_spec.js
  57. 14 0
      lib/test/unit/network_utils_spec.js
  58. 3 3
      lib/test/unit/node_stream_spec.js
  59. 2 2
      lib/test/unit/primitives_spec.js
  60. 1 1
      lib/test/unit/type1_parser_spec.js
  61. 1 1
      lib/test/unit/ui_utils_spec.js
  62. 10 10
      lib/test/unit/util_spec.js
  63. 47 35
      lib/web/app.js
  64. 4 4
      lib/web/app_options.js
  65. 36 12
      lib/web/base_viewer.js
  66. 1 3
      lib/web/chromecom.js
  67. 1 1
      lib/web/download_manager.js
  68. 7 4
      lib/web/firefox_print_service.js
  69. 10 5
      lib/web/firefoxcom.js
  70. 4 0
      lib/web/interfaces.js
  71. 1 1
      lib/web/pdf_document_properties.js
  72. 1 1
      lib/web/pdf_history.js
  73. 7 3
      lib/web/pdf_link_service.js
  74. 2 1
      lib/web/pdf_outline_viewer.js
  75. 12 16
      lib/web/pdf_page_view.js
  76. 3 5
      lib/web/pdf_print_service.js
  77. 3 0
      lib/web/pdf_sidebar.js
  78. 2 2
      lib/web/pdf_viewer.component.js
  79. 2 0
      lib/web/toolbar.js
  80. 1 1
      lib/web/ui_utils.js
  81. 1 1
      package.json
  82. 5 9
      web/pdf_viewer.css
  83. 60 45
      web/pdf_viewer.js
  84. 0 0
      web/pdf_viewer.js.map

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
   "name": "pdfjs-dist",
-  "version": "2.2.228",
+  "version": "2.3.200",
   "main": [
     "build/pdf.js",
     "build/pdf.worker.js"

ファイルの差分が大きいため隠しています
+ 417 - 337
build/pdf.js


ファイルの差分が大きいため隠しています
+ 0 - 0
build/pdf.js.map


ファイルの差分が大きいため隠しています
+ 0 - 0
build/pdf.min.js


ファイルの差分が大きいため隠しています
+ 332 - 275
build/pdf.worker.js


ファイルの差分が大きいため隠しています
+ 0 - 0
build/pdf.worker.js.map


ファイルの差分が大きいため隠しています
+ 0 - 0
build/pdf.worker.min.js


+ 0 - 3962
external/streams/streams-lib.js

@@ -1,3962 +0,0 @@
-/*
- * To the extent possible under law, the authors have dedicated all copyright
- * and related and neighboring rights to this software to the public
- * domain worldwide. This software is distributed without any warranty.
- *
- * You should have received a copy of the CC0 Public Domain Dedication along
- * with this software. If not, see https://creativecommons.org/publicdomain/zero/1.0/.
- */
-
-(function(e, a) { for(var i in a) e[i] = a[i]; }(exports, /******/ (function(modules) { // webpackBootstrap
-/******/  // The module cache
-/******/  var installedModules = {};
-/******/
-/******/  // The require function
-/******/  function __webpack_require__(moduleId) {
-/******/
-/******/    // Check if module is in cache
-/******/    if(installedModules[moduleId])
-/******/      return installedModules[moduleId].exports;
-/******/
-/******/    // Create a new module (and put it into the cache)
-/******/    var module = installedModules[moduleId] = {
-/******/      i: moduleId,
-/******/      l: false,
-/******/      exports: {}
-/******/    };
-/******/
-/******/    // Execute the module function
-/******/    modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/    // Flag the module as loaded
-/******/    module.l = true;
-/******/
-/******/    // Return the exports of the module
-/******/    return module.exports;
-/******/  }
-/******/
-/******/
-/******/  // expose the modules object (__webpack_modules__)
-/******/  __webpack_require__.m = modules;
-/******/
-/******/  // expose the module cache
-/******/  __webpack_require__.c = installedModules;
-/******/
-/******/  // identity function for calling harmony imports with the correct context
-/******/  __webpack_require__.i = function(value) { return value; };
-/******/
-/******/  // define getter function for harmony exports
-/******/  __webpack_require__.d = function(exports, name, getter) {
-/******/    if(!__webpack_require__.o(exports, name)) {
-/******/      Object.defineProperty(exports, name, {
-/******/        configurable: false,
-/******/        enumerable: true,
-/******/        get: getter
-/******/      });
-/******/    }
-/******/  };
-/******/
-/******/  // getDefaultExport function for compatibility with non-harmony modules
-/******/  __webpack_require__.n = function(module) {
-/******/    var getter = module && module.__esModule ?
-/******/      function getDefault() { return module['default']; } :
-/******/      function getModuleExports() { return module; };
-/******/    __webpack_require__.d(getter, 'a', getter);
-/******/    return getter;
-/******/  };
-/******/
-/******/  // Object.prototype.hasOwnProperty.call
-/******/  __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/  // __webpack_public_path__
-/******/  __webpack_require__.p = "";
-/******/
-/******/  // Load entry module and return exports
-/******/  return __webpack_require__(__webpack_require__.s = 7);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
-
-var _require = __webpack_require__(1),
-    assert = _require.assert;
-
-function IsPropertyKey(argument) {
-  return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';
-}
-
-exports.typeIsObject = function (x) {
-  return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';
-};
-
-exports.createDataProperty = function (o, p, v) {
-  assert(exports.typeIsObject(o));
-  Object.defineProperty(o, p, { value: v, writable: true, enumerable: true, configurable: true });
-};
-
-exports.createArrayFromList = function (elements) {
-  // We use arrays to represent lists, so this is basically a no-op.
-  // Do a slice though just in case we happen to depend on the unique-ness.
-  return elements.slice();
-};
-
-exports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {
-  new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);
-};
-
-exports.CreateIterResultObject = function (value, done) {
-  assert(typeof done === 'boolean');
-  var obj = {};
-  Object.defineProperty(obj, 'value', { value: value, enumerable: true, writable: true, configurable: true });
-  Object.defineProperty(obj, 'done', { value: done, enumerable: true, writable: true, configurable: true });
-  return obj;
-};
-
-exports.IsFiniteNonNegativeNumber = function (v) {
-  if (Number.isNaN(v)) {
-    return false;
-  }
-  if (v === Infinity) {
-    return false;
-  }
-  if (v < 0) {
-    return false;
-  }
-
-  return true;
-};
-
-function Call(F, V, args) {
-  if (typeof F !== 'function') {
-    throw new TypeError('Argument is not a function');
-  }
-
-  return Function.prototype.apply.call(F, V, args);
-}
-
-exports.InvokeOrNoop = function (O, P, args) {
-  assert(O !== undefined);
-  assert(IsPropertyKey(P));
-  assert(Array.isArray(args));
-
-  var method = O[P];
-  if (method === undefined) {
-    return undefined;
-  }
-
-  return Call(method, O, args);
-};
-
-exports.PromiseInvokeOrNoop = function (O, P, args) {
-  assert(O !== undefined);
-  assert(IsPropertyKey(P));
-  assert(Array.isArray(args));
-  try {
-    return Promise.resolve(exports.InvokeOrNoop(O, P, args));
-  } catch (returnValueE) {
-    return Promise.reject(returnValueE);
-  }
-};
-
-exports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {
-  assert(O !== undefined);
-  assert(IsPropertyKey(P));
-  assert(Array.isArray(args));
-  assert(Array.isArray(argsF));
-
-  var method = void 0;
-  try {
-    method = O[P];
-  } catch (methodE) {
-    return Promise.reject(methodE);
-  }
-
-  if (method === undefined) {
-    return F.apply(null, argsF);
-  }
-
-  try {
-    return Promise.resolve(Call(method, O, args));
-  } catch (e) {
-    return Promise.reject(e);
-  }
-};
-
-// Not implemented correctly
-exports.TransferArrayBuffer = function (O) {
-  return O.slice();
-};
-
-exports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {
-  highWaterMark = Number(highWaterMark);
-  if (Number.isNaN(highWaterMark) || highWaterMark < 0) {
-    throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');
-  }
-
-  return highWaterMark;
-};
-
-exports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {
-  if (size !== undefined && typeof size !== 'function') {
-    throw new TypeError('size property of a queuing strategy must be a function');
-  }
-
-  highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);
-
-  return { size: size, highWaterMark: highWaterMark };
-};
-
-/***/ }),
-/* 1 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-function rethrowAssertionErrorRejection(e) {
-  // Used throughout the reference implementation, as `.catch(rethrowAssertionErrorRejection)`, to ensure any errors
-  // get shown. There are places in the spec where we do promise transformations and purposefully ignore or don't
-  // expect any errors, but assertion errors are always problematic.
-  if (e && e.constructor === AssertionError) {
-    setTimeout(function () {
-      throw e;
-    }, 0);
-  }
-};
-
-function AssertionError(message) {
-  this.name = 'AssertionError';
-  this.message = message || '';
-  this.stack = new Error().stack;
-}
-AssertionError.prototype = Object.create(Error.prototype);
-AssertionError.prototype.constructor = AssertionError;
-
-function assert(value, message) {
-  if (!value) {
-    throw new AssertionError(message);
-  }
-}
-
-module.exports = {
-  rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,
-  AssertionError: AssertionError,
-  assert: assert
-};
-
-/***/ }),
-/* 2 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-var _require = __webpack_require__(0),
-    InvokeOrNoop = _require.InvokeOrNoop,
-    PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
-    ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
-    typeIsObject = _require.typeIsObject;
-
-var _require2 = __webpack_require__(1),
-    assert = _require2.assert,
-    rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;
-
-var _require3 = __webpack_require__(3),
-    DequeueValue = _require3.DequeueValue,
-    EnqueueValueWithSize = _require3.EnqueueValueWithSize,
-    PeekQueueValue = _require3.PeekQueueValue,
-    ResetQueue = _require3.ResetQueue;
-
-var WritableStream = function () {
-  function WritableStream() {
-    var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
-    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-        size = _ref.size,
-        _ref$highWaterMark = _ref.highWaterMark,
-        highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;
-
-    _classCallCheck(this, WritableStream);
-
-    this._state = 'writable';
-
-    // The error that will be reported by new method calls once the state becomes errored. Only set when [[state]] is
-    // 'erroring' or 'errored'. May be set to an undefined value.
-    this._storedError = undefined;
-
-    this._writer = undefined;
-
-    // Initialize to undefined first because the constructor of the controller checks this
-    // variable to validate the caller.
-    this._writableStreamController = undefined;
-
-    // This queue is placed here instead of the writer class in order to allow for passing a writer to the next data
-    // producer without waiting for the queued writes to finish.
-    this._writeRequests = [];
-
-    // Write requests are removed from _writeRequests when write() is called on the underlying sink. This prevents
-    // them from being erroneously rejected on error. If a write() call is in-flight, the request is stored here.
-    this._inFlightWriteRequest = undefined;
-
-    // The promise that was returned from writer.close(). Stored here because it may be fulfilled after the writer
-    // has been detached.
-    this._closeRequest = undefined;
-
-    // Close request is removed from _closeRequest when close() is called on the underlying sink. This prevents it
-    // from being erroneously rejected on error. If a close() call is in-flight, the request is stored here.
-    this._inFlightCloseRequest = undefined;
-
-    // The promise that was returned from writer.abort(). This may also be fulfilled after the writer has detached.
-    this._pendingAbortRequest = undefined;
-
-    // The backpressure signal set by the controller.
-    this._backpressure = false;
-
-    var type = underlyingSink.type;
-
-    if (type !== undefined) {
-      throw new RangeError('Invalid type is specified');
-    }
-
-    this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);
-    this._writableStreamController.__startSteps();
-  }
-
-  _createClass(WritableStream, [{
-    key: 'abort',
-    value: function abort(reason) {
-      if (IsWritableStream(this) === false) {
-        return Promise.reject(streamBrandCheckException('abort'));
-      }
-
-      if (IsWritableStreamLocked(this) === true) {
-        return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));
-      }
-
-      return WritableStreamAbort(this, reason);
-    }
-  }, {
-    key: 'getWriter',
-    value: function getWriter() {
-      if (IsWritableStream(this) === false) {
-        throw streamBrandCheckException('getWriter');
-      }
-
-      return AcquireWritableStreamDefaultWriter(this);
-    }
-  }, {
-    key: 'locked',
-    get: function get() {
-      if (IsWritableStream(this) === false) {
-        throw streamBrandCheckException('locked');
-      }
-
-      return IsWritableStreamLocked(this);
-    }
-  }]);
-
-  return WritableStream;
-}();
-
-module.exports = {
-  AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,
-  IsWritableStream: IsWritableStream,
-  IsWritableStreamLocked: IsWritableStreamLocked,
-  WritableStream: WritableStream,
-  WritableStreamAbort: WritableStreamAbort,
-  WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,
-  WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,
-  WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,
-  WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,
-  WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight
-};
-
-// Abstract operations for the WritableStream.
-
-function AcquireWritableStreamDefaultWriter(stream) {
-  return new WritableStreamDefaultWriter(stream);
-}
-
-function IsWritableStream(x) {
-  if (!typeIsObject(x)) {
-    return false;
-  }
-
-  if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {
-    return false;
-  }
-
-  return true;
-}
-
-function IsWritableStreamLocked(stream) {
-  assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');
-
-  if (stream._writer === undefined) {
-    return false;
-  }
-
-  return true;
-}
-
-function WritableStreamAbort(stream, reason) {
-  var state = stream._state;
-  if (state === 'closed') {
-    return Promise.resolve(undefined);
-  }
-  if (state === 'errored') {
-    return Promise.reject(stream._storedError);
-  }
-  var error = new TypeError('Requested to abort');
-  if (stream._pendingAbortRequest !== undefined) {
-    return Promise.reject(error);
-  }
-
-  assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');
-
-  var wasAlreadyErroring = false;
-  if (state === 'erroring') {
-    wasAlreadyErroring = true;
-    // reason will not be used, so don't keep a reference to it.
-    reason = undefined;
-  }
-
-  var promise = new Promise(function (resolve, reject) {
-    stream._pendingAbortRequest = {
-      _resolve: resolve,
-      _reject: reject,
-      _reason: reason,
-      _wasAlreadyErroring: wasAlreadyErroring
-    };
-  });
-
-  if (wasAlreadyErroring === false) {
-    WritableStreamStartErroring(stream, error);
-  }
-
-  return promise;
-}
-
-// WritableStream API exposed for controllers.
-
-function WritableStreamAddWriteRequest(stream) {
-  assert(IsWritableStreamLocked(stream) === true);
-  assert(stream._state === 'writable');
-
-  var promise = new Promise(function (resolve, reject) {
-    var writeRequest = {
-      _resolve: resolve,
-      _reject: reject
-    };
-
-    stream._writeRequests.push(writeRequest);
-  });
-
-  return promise;
-}
-
-function WritableStreamDealWithRejection(stream, error) {
-  var state = stream._state;
-
-  if (state === 'writable') {
-    WritableStreamStartErroring(stream, error);
-    return;
-  }
-
-  assert(state === 'erroring');
-  WritableStreamFinishErroring(stream);
-}
-
-function WritableStreamStartErroring(stream, reason) {
-  assert(stream._storedError === undefined, 'stream._storedError === undefined');
-  assert(stream._state === 'writable', 'state must be writable');
-
-  var controller = stream._writableStreamController;
-  assert(controller !== undefined, 'controller must not be undefined');
-
-  stream._state = 'erroring';
-  stream._storedError = reason;
-  var writer = stream._writer;
-  if (writer !== undefined) {
-    WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);
-  }
-
-  if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {
-    WritableStreamFinishErroring(stream);
-  }
-}
-
-function WritableStreamFinishErroring(stream) {
-  assert(stream._state === 'erroring', 'stream._state === erroring');
-  assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');
-  stream._state = 'errored';
-  stream._writableStreamController.__errorSteps();
-
-  var storedError = stream._storedError;
-  for (var i = 0; i < stream._writeRequests.length; i++) {
-    var writeRequest = stream._writeRequests[i];
-    writeRequest._reject(storedError);
-  }
-  stream._writeRequests = [];
-
-  if (stream._pendingAbortRequest === undefined) {
-    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
-    return;
-  }
-
-  var abortRequest = stream._pendingAbortRequest;
-  stream._pendingAbortRequest = undefined;
-
-  if (abortRequest._wasAlreadyErroring === true) {
-    abortRequest._reject(storedError);
-    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
-    return;
-  }
-
-  var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);
-  promise.then(function () {
-    abortRequest._resolve();
-    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
-  }, function (reason) {
-    abortRequest._reject(reason);
-    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
-  });
-}
-
-function WritableStreamFinishInFlightWrite(stream) {
-  assert(stream._inFlightWriteRequest !== undefined);
-  stream._inFlightWriteRequest._resolve(undefined);
-  stream._inFlightWriteRequest = undefined;
-}
-
-function WritableStreamFinishInFlightWriteWithError(stream, error) {
-  assert(stream._inFlightWriteRequest !== undefined);
-  stream._inFlightWriteRequest._reject(error);
-  stream._inFlightWriteRequest = undefined;
-
-  assert(stream._state === 'writable' || stream._state === 'erroring');
-
-  WritableStreamDealWithRejection(stream, error);
-}
-
-function WritableStreamFinishInFlightClose(stream) {
-  assert(stream._inFlightCloseRequest !== undefined);
-  stream._inFlightCloseRequest._resolve(undefined);
-  stream._inFlightCloseRequest = undefined;
-
-  var state = stream._state;
-
-  assert(state === 'writable' || state === 'erroring');
-
-  if (state === 'erroring') {
-    // The error was too late to do anything, so it is ignored.
-    stream._storedError = undefined;
-    if (stream._pendingAbortRequest !== undefined) {
-      stream._pendingAbortRequest._resolve();
-      stream._pendingAbortRequest = undefined;
-    }
-  }
-
-  stream._state = 'closed';
-
-  var writer = stream._writer;
-  if (writer !== undefined) {
-    defaultWriterClosedPromiseResolve(writer);
-  }
-
-  assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');
-  assert(stream._storedError === undefined, 'stream._storedError === undefined');
-}
-
-function WritableStreamFinishInFlightCloseWithError(stream, error) {
-  assert(stream._inFlightCloseRequest !== undefined);
-  stream._inFlightCloseRequest._reject(error);
-  stream._inFlightCloseRequest = undefined;
-
-  assert(stream._state === 'writable' || stream._state === 'erroring');
-
-  // Never execute sink abort() after sink close().
-  if (stream._pendingAbortRequest !== undefined) {
-    stream._pendingAbortRequest._reject(error);
-    stream._pendingAbortRequest = undefined;
-  }
-  WritableStreamDealWithRejection(stream, error);
-}
-
-// TODO(ricea): Fix alphabetical order.
-function WritableStreamCloseQueuedOrInFlight(stream) {
-  if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {
-    return false;
-  }
-
-  return true;
-}
-
-function WritableStreamHasOperationMarkedInFlight(stream) {
-  if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {
-    return false;
-  }
-
-  return true;
-}
-
-function WritableStreamMarkCloseRequestInFlight(stream) {
-  assert(stream._inFlightCloseRequest === undefined);
-  assert(stream._closeRequest !== undefined);
-  stream._inFlightCloseRequest = stream._closeRequest;
-  stream._closeRequest = undefined;
-}
-
-function WritableStreamMarkFirstWriteRequestInFlight(stream) {
-  assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');
-  assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');
-  stream._inFlightWriteRequest = stream._writeRequests.shift();
-}
-
-function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {
-  assert(stream._state === 'errored', '_stream_.[[state]] is `"errored"`');
-  if (stream._closeRequest !== undefined) {
-    assert(stream._inFlightCloseRequest === undefined);
-
-    stream._closeRequest._reject(stream._storedError);
-    stream._closeRequest = undefined;
-  }
-  var writer = stream._writer;
-  if (writer !== undefined) {
-    defaultWriterClosedPromiseReject(writer, stream._storedError);
-    writer._closedPromise.catch(function () {});
-  }
-}
-
-function WritableStreamUpdateBackpressure(stream, backpressure) {
-  assert(stream._state === 'writable');
-  assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
-
-  var writer = stream._writer;
-  if (writer !== undefined && backpressure !== stream._backpressure) {
-    if (backpressure === true) {
-      defaultWriterReadyPromiseReset(writer);
-    } else {
-      assert(backpressure === false);
-
-      defaultWriterReadyPromiseResolve(writer);
-    }
-  }
-
-  stream._backpressure = backpressure;
-}
-
-var WritableStreamDefaultWriter = function () {
-  function WritableStreamDefaultWriter(stream) {
-    _classCallCheck(this, WritableStreamDefaultWriter);
-
-    if (IsWritableStream(stream) === false) {
-      throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');
-    }
-    if (IsWritableStreamLocked(stream) === true) {
-      throw new TypeError('This stream has already been locked for exclusive writing by another writer');
-    }
-
-    this._ownerWritableStream = stream;
-    stream._writer = this;
-
-    var state = stream._state;
-
-    if (state === 'writable') {
-      if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {
-        defaultWriterReadyPromiseInitialize(this);
-      } else {
-        defaultWriterReadyPromiseInitializeAsResolved(this);
-      }
-
-      defaultWriterClosedPromiseInitialize(this);
-    } else if (state === 'erroring') {
-      defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);
-      this._readyPromise.catch(function () {});
-      defaultWriterClosedPromiseInitialize(this);
-    } else if (state === 'closed') {
-      defaultWriterReadyPromiseInitializeAsResolved(this);
-      defaultWriterClosedPromiseInitializeAsResolved(this);
-    } else {
-      assert(state === 'errored', 'state must be errored');
-
-      var storedError = stream._storedError;
-      defaultWriterReadyPromiseInitializeAsRejected(this, storedError);
-      this._readyPromise.catch(function () {});
-      defaultWriterClosedPromiseInitializeAsRejected(this, storedError);
-      this._closedPromise.catch(function () {});
-    }
-  }
-
-  _createClass(WritableStreamDefaultWriter, [{
-    key: 'abort',
-    value: function abort(reason) {
-      if (IsWritableStreamDefaultWriter(this) === false) {
-        return Promise.reject(defaultWriterBrandCheckException('abort'));
-      }
-
-      if (this._ownerWritableStream === undefined) {
-        return Promise.reject(defaultWriterLockException('abort'));
-      }
-
-      return WritableStreamDefaultWriterAbort(this, reason);
-    }
-  }, {
-    key: 'close',
-    value: function close() {
-      if (IsWritableStreamDefaultWriter(this) === false) {
-        return Promise.reject(defaultWriterBrandCheckException('close'));
-      }
-
-      var stream = this._ownerWritableStream;
-
-      if (stream === undefined) {
-        return Promise.reject(defaultWriterLockException('close'));
-      }
-
-      if (WritableStreamCloseQueuedOrInFlight(stream) === true) {
-        return Promise.reject(new TypeError('cannot close an already-closing stream'));
-      }
-
-      return WritableStreamDefaultWriterClose(this);
-    }
-  }, {
-    key: 'releaseLock',
-    value: function releaseLock() {
-      if (IsWritableStreamDefaultWriter(this) === false) {
-        throw defaultWriterBrandCheckException('releaseLock');
-      }
-
-      var stream = this._ownerWritableStream;
-
-      if (stream === undefined) {
-        return;
-      }
-
-      assert(stream._writer !== undefined);
-
-      WritableStreamDefaultWriterRelease(this);
-    }
-  }, {
-    key: 'write',
-    value: function write(chunk) {
-      if (IsWritableStreamDefaultWriter(this) === false) {
-        return Promise.reject(defaultWriterBrandCheckException('write'));
-      }
-
-      if (this._ownerWritableStream === undefined) {
-        return Promise.reject(defaultWriterLockException('write to'));
-      }
-
-      return WritableStreamDefaultWriterWrite(this, chunk);
-    }
-  }, {
-    key: 'closed',
-    get: function get() {
-      if (IsWritableStreamDefaultWriter(this) === false) {
-        return Promise.reject(defaultWriterBrandCheckException('closed'));
-      }
-
-      return this._closedPromise;
-    }
-  }, {
-    key: 'desiredSize',
-    get: function get() {
-      if (IsWritableStreamDefaultWriter(this) === false) {
-        throw defaultWriterBrandCheckException('desiredSize');
-      }
-
-      if (this._ownerWritableStream === undefined) {
-        throw defaultWriterLockException('desiredSize');
-      }
-
-      return WritableStreamDefaultWriterGetDesiredSize(this);
-    }
-  }, {
-    key: 'ready',
-    get: function get() {
-      if (IsWritableStreamDefaultWriter(this) === false) {
-        return Promise.reject(defaultWriterBrandCheckException('ready'));
-      }
-
-      return this._readyPromise;
-    }
-  }]);
-
-  return WritableStreamDefaultWriter;
-}();
-
-// Abstract operations for the WritableStreamDefaultWriter.
-
-function IsWritableStreamDefaultWriter(x) {
-  if (!typeIsObject(x)) {
-    return false;
-  }
-
-  if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {
-    return false;
-  }
-
-  return true;
-}
-
-// A client of WritableStreamDefaultWriter may use these functions directly to bypass state check.
-
-function WritableStreamDefaultWriterAbort(writer, reason) {
-  var stream = writer._ownerWritableStream;
-
-  assert(stream !== undefined);
-
-  return WritableStreamAbort(stream, reason);
-}
-
-function WritableStreamDefaultWriterClose(writer) {
-  var stream = writer._ownerWritableStream;
-
-  assert(stream !== undefined);
-
-  var state = stream._state;
-  if (state === 'closed' || state === 'errored') {
-    return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));
-  }
-
-  assert(state === 'writable' || state === 'erroring');
-  assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
-
-  var promise = new Promise(function (resolve, reject) {
-    var closeRequest = {
-      _resolve: resolve,
-      _reject: reject
-    };
-
-    stream._closeRequest = closeRequest;
-  });
-
-  if (stream._backpressure === true && state === 'writable') {
-    defaultWriterReadyPromiseResolve(writer);
-  }
-
-  WritableStreamDefaultControllerClose(stream._writableStreamController);
-
-  return promise;
-}
-
-function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {
-  var stream = writer._ownerWritableStream;
-
-  assert(stream !== undefined);
-
-  var state = stream._state;
-  if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
-    return Promise.resolve();
-  }
-
-  if (state === 'errored') {
-    return Promise.reject(stream._storedError);
-  }
-
-  assert(state === 'writable' || state === 'erroring');
-
-  return WritableStreamDefaultWriterClose(writer);
-}
-
-function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {
-  if (writer._closedPromiseState === 'pending') {
-    defaultWriterClosedPromiseReject(writer, error);
-  } else {
-    defaultWriterClosedPromiseResetToRejected(writer, error);
-  }
-  writer._closedPromise.catch(function () {});
-}
-
-function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {
-  if (writer._readyPromiseState === 'pending') {
-    defaultWriterReadyPromiseReject(writer, error);
-  } else {
-    defaultWriterReadyPromiseResetToRejected(writer, error);
-  }
-  writer._readyPromise.catch(function () {});
-}
-
-function WritableStreamDefaultWriterGetDesiredSize(writer) {
-  var stream = writer._ownerWritableStream;
-  var state = stream._state;
-
-  if (state === 'errored' || state === 'erroring') {
-    return null;
-  }
-
-  if (state === 'closed') {
-    return 0;
-  }
-
-  return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);
-}
-
-function WritableStreamDefaultWriterRelease(writer) {
-  var stream = writer._ownerWritableStream;
-  assert(stream !== undefined);
-  assert(stream._writer === writer);
-
-  var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\'s closedness');
-
-  WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);
-
-  // The state transitions to "errored" before the sink abort() method runs, but the writer.closed promise is not
-  // rejected until afterwards. This means that simply testing state will not work.
-  WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);
-
-  stream._writer = undefined;
-  writer._ownerWritableStream = undefined;
-}
-
-function WritableStreamDefaultWriterWrite(writer, chunk) {
-  var stream = writer._ownerWritableStream;
-
-  assert(stream !== undefined);
-
-  var controller = stream._writableStreamController;
-
-  var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);
-
-  if (stream !== writer._ownerWritableStream) {
-    return Promise.reject(defaultWriterLockException('write to'));
-  }
-
-  var state = stream._state;
-  if (state === 'errored') {
-    return Promise.reject(stream._storedError);
-  }
-  if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
-    return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));
-  }
-  if (state === 'erroring') {
-    return Promise.reject(stream._storedError);
-  }
-
-  assert(state === 'writable');
-
-  var promise = WritableStreamAddWriteRequest(stream);
-
-  WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);
-
-  return promise;
-}
-
-var WritableStreamDefaultController = function () {
-  function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {
-    _classCallCheck(this, WritableStreamDefaultController);
-
-    if (IsWritableStream(stream) === false) {
-      throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');
-    }
-
-    if (stream._writableStreamController !== undefined) {
-      throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');
-    }
-
-    this._controlledWritableStream = stream;
-
-    this._underlyingSink = underlyingSink;
-
-    // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.
-    this._queue = undefined;
-    this._queueTotalSize = undefined;
-    ResetQueue(this);
-
-    this._started = false;
-
-    var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
-    this._strategySize = normalizedStrategy.size;
-    this._strategyHWM = normalizedStrategy.highWaterMark;
-
-    var backpressure = WritableStreamDefaultControllerGetBackpressure(this);
-    WritableStreamUpdateBackpressure(stream, backpressure);
-  }
-
-  _createClass(WritableStreamDefaultController, [{
-    key: 'error',
-    value: function error(e) {
-      if (IsWritableStreamDefaultController(this) === false) {
-        throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');
-      }
-      var state = this._controlledWritableStream._state;
-      if (state !== 'writable') {
-        // The stream is closed, errored or will be soon. The sink can't do anything useful if it gets an error here, so
-        // just treat it as a no-op.
-        return;
-      }
-
-      WritableStreamDefaultControllerError(this, e);
-    }
-  }, {
-    key: '__abortSteps',
-    value: function __abortSteps(reason) {
-      return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);
-    }
-  }, {
-    key: '__errorSteps',
-    value: function __errorSteps() {
-      ResetQueue(this);
-    }
-  }, {
-    key: '__startSteps',
-    value: function __startSteps() {
-      var _this = this;
-
-      var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);
-      var stream = this._controlledWritableStream;
-
-      Promise.resolve(startResult).then(function () {
-        assert(stream._state === 'writable' || stream._state === 'erroring');
-        _this._started = true;
-        WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);
-      }, function (r) {
-        assert(stream._state === 'writable' || stream._state === 'erroring');
-        _this._started = true;
-        WritableStreamDealWithRejection(stream, r);
-      }).catch(rethrowAssertionErrorRejection);
-    }
-  }]);
-
-  return WritableStreamDefaultController;
-}();
-
-// Abstract operations implementing interface required by the WritableStream.
-
-function WritableStreamDefaultControllerClose(controller) {
-  EnqueueValueWithSize(controller, 'close', 0);
-  WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
-}
-
-function WritableStreamDefaultControllerGetChunkSize(controller, chunk) {
-  var strategySize = controller._strategySize;
-
-  if (strategySize === undefined) {
-    return 1;
-  }
-
-  try {
-    return strategySize(chunk);
-  } catch (chunkSizeE) {
-    WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
-    return 1;
-  }
-}
-
-function WritableStreamDefaultControllerGetDesiredSize(controller) {
-  return controller._strategyHWM - controller._queueTotalSize;
-}
-
-function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {
-  var writeRecord = { chunk: chunk };
-
-  try {
-    EnqueueValueWithSize(controller, writeRecord, chunkSize);
-  } catch (enqueueE) {
-    WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
-    return;
-  }
-
-  var stream = controller._controlledWritableStream;
-  if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {
-    var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
-    WritableStreamUpdateBackpressure(stream, backpressure);
-  }
-
-  WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
-}
-
-// Abstract operations for the WritableStreamDefaultController.
-
-function IsWritableStreamDefaultController(x) {
-  if (!typeIsObject(x)) {
-    return false;
-  }
-
-  if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {
-    return false;
-  }
-
-  return true;
-}
-
-function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {
-  var stream = controller._controlledWritableStream;
-
-  if (controller._started === false) {
-    return;
-  }
-
-  if (stream._inFlightWriteRequest !== undefined) {
-    return;
-  }
-
-  var state = stream._state;
-  if (state === 'closed' || state === 'errored') {
-    return;
-  }
-  if (state === 'erroring') {
-    WritableStreamFinishErroring(stream);
-    return;
-  }
-
-  if (controller._queue.length === 0) {
-    return;
-  }
-
-  var writeRecord = PeekQueueValue(controller);
-  if (writeRecord === 'close') {
-    WritableStreamDefaultControllerProcessClose(controller);
-  } else {
-    WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);
-  }
-}
-
-function WritableStreamDefaultControllerErrorIfNeeded(controller, error) {
-  if (controller._controlledWritableStream._state === 'writable') {
-    WritableStreamDefaultControllerError(controller, error);
-  }
-}
-
-function WritableStreamDefaultControllerProcessClose(controller) {
-  var stream = controller._controlledWritableStream;
-
-  WritableStreamMarkCloseRequestInFlight(stream);
-
-  DequeueValue(controller);
-  assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');
-
-  var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);
-  sinkClosePromise.then(function () {
-    WritableStreamFinishInFlightClose(stream);
-  }, function (reason) {
-    WritableStreamFinishInFlightCloseWithError(stream, reason);
-  }).catch(rethrowAssertionErrorRejection);
-}
-
-function WritableStreamDefaultControllerProcessWrite(controller, chunk) {
-  var stream = controller._controlledWritableStream;
-
-  WritableStreamMarkFirstWriteRequestInFlight(stream);
-
-  var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);
-  sinkWritePromise.then(function () {
-    WritableStreamFinishInFlightWrite(stream);
-
-    var state = stream._state;
-    assert(state === 'writable' || state === 'erroring');
-
-    DequeueValue(controller);
-
-    if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {
-      var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
-      WritableStreamUpdateBackpressure(stream, backpressure);
-    }
-
-    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
-  }, function (reason) {
-    WritableStreamFinishInFlightWriteWithError(stream, reason);
-  }).catch(rethrowAssertionErrorRejection);
-}
-
-function WritableStreamDefaultControllerGetBackpressure(controller) {
-  var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);
-  return desiredSize <= 0;
-}
-
-// A client of WritableStreamDefaultController may use these functions directly to bypass state check.
-
-function WritableStreamDefaultControllerError(controller, error) {
-  var stream = controller._controlledWritableStream;
-
-  assert(stream._state === 'writable');
-
-  WritableStreamStartErroring(stream, error);
-}
-
-// Helper functions for the WritableStream.
-
-function streamBrandCheckException(name) {
-  return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');
-}
-
-// Helper functions for the WritableStreamDefaultWriter.
-
-function defaultWriterBrandCheckException(name) {
-  return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');
-}
-
-function defaultWriterLockException(name) {
-  return new TypeError('Cannot ' + name + ' a stream using a released writer');
-}
-
-function defaultWriterClosedPromiseInitialize(writer) {
-  writer._closedPromise = new Promise(function (resolve, reject) {
-    writer._closedPromise_resolve = resolve;
-    writer._closedPromise_reject = reject;
-    writer._closedPromiseState = 'pending';
-  });
-}
-
-function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {
-  writer._closedPromise = Promise.reject(reason);
-  writer._closedPromise_resolve = undefined;
-  writer._closedPromise_reject = undefined;
-  writer._closedPromiseState = 'rejected';
-}
-
-function defaultWriterClosedPromiseInitializeAsResolved(writer) {
-  writer._closedPromise = Promise.resolve(undefined);
-  writer._closedPromise_resolve = undefined;
-  writer._closedPromise_reject = undefined;
-  writer._closedPromiseState = 'resolved';
-}
-
-function defaultWriterClosedPromiseReject(writer, reason) {
-  assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
-  assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
-  assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');
-
-  writer._closedPromise_reject(reason);
-  writer._closedPromise_resolve = undefined;
-  writer._closedPromise_reject = undefined;
-  writer._closedPromiseState = 'rejected';
-}
-
-function defaultWriterClosedPromiseResetToRejected(writer, reason) {
-  assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');
-  assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');
-  assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');
-
-  writer._closedPromise = Promise.reject(reason);
-  writer._closedPromiseState = 'rejected';
-}
-
-function defaultWriterClosedPromiseResolve(writer) {
-  assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
-  assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
-  assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');
-
-  writer._closedPromise_resolve(undefined);
-  writer._closedPromise_resolve = undefined;
-  writer._closedPromise_reject = undefined;
-  writer._closedPromiseState = 'resolved';
-}
-
-function defaultWriterReadyPromiseInitialize(writer) {
-  writer._readyPromise = new Promise(function (resolve, reject) {
-    writer._readyPromise_resolve = resolve;
-    writer._readyPromise_reject = reject;
-  });
-  writer._readyPromiseState = 'pending';
-}
-
-function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {
-  writer._readyPromise = Promise.reject(reason);
-  writer._readyPromise_resolve = undefined;
-  writer._readyPromise_reject = undefined;
-  writer._readyPromiseState = 'rejected';
-}
-
-function defaultWriterReadyPromiseInitializeAsResolved(writer) {
-  writer._readyPromise = Promise.resolve(undefined);
-  writer._readyPromise_resolve = undefined;
-  writer._readyPromise_reject = undefined;
-  writer._readyPromiseState = 'fulfilled';
-}
-
-function defaultWriterReadyPromiseReject(writer, reason) {
-  assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
-  assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');
-
-  writer._readyPromise_reject(reason);
-  writer._readyPromise_resolve = undefined;
-  writer._readyPromise_reject = undefined;
-  writer._readyPromiseState = 'rejected';
-}
-
-function defaultWriterReadyPromiseReset(writer) {
-  assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
-  assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
-
-  writer._readyPromise = new Promise(function (resolve, reject) {
-    writer._readyPromise_resolve = resolve;
-    writer._readyPromise_reject = reject;
-  });
-  writer._readyPromiseState = 'pending';
-}
-
-function defaultWriterReadyPromiseResetToRejected(writer, reason) {
-  assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
-  assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
-
-  writer._readyPromise = Promise.reject(reason);
-  writer._readyPromiseState = 'rejected';
-}
-
-function defaultWriterReadyPromiseResolve(writer) {
-  assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
-  assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');
-
-  writer._readyPromise_resolve(undefined);
-  writer._readyPromise_resolve = undefined;
-  writer._readyPromise_reject = undefined;
-  writer._readyPromiseState = 'fulfilled';
-}
-
-/***/ }),
-/* 3 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var _require = __webpack_require__(0),
-    IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;
-
-var _require2 = __webpack_require__(1),
-    assert = _require2.assert;
-
-exports.DequeueValue = function (container) {
-  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
-  assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');
-
-  var pair = container._queue.shift();
-  container._queueTotalSize -= pair.size;
-  if (container._queueTotalSize < 0) {
-    container._queueTotalSize = 0;
-  }
-
-  return pair.value;
-};
-
-exports.EnqueueValueWithSize = function (container, value, size) {
-  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');
-
-  size = Number(size);
-  if (!IsFiniteNonNegativeNumber(size)) {
-    throw new RangeError('Size must be a finite, non-NaN, non-negative number.');
-  }
-
-  container._queue.push({ value: value, size: size });
-  container._queueTotalSize += size;
-};
-
-exports.PeekQueueValue = function (container) {
-  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
-  assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');
-
-  var pair = container._queue[0];
-  return pair.value;
-};
-
-exports.ResetQueue = function (container) {
-  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');
-
-  container._queue = [];
-  container._queueTotalSize = 0;
-};
-
-/***/ }),
-/* 4 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-var _require = __webpack_require__(0),
-    ArrayBufferCopy = _require.ArrayBufferCopy,
-    CreateIterResultObject = _require.CreateIterResultObject,
-    IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,
-    InvokeOrNoop = _require.InvokeOrNoop,
-    PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
-    TransferArrayBuffer = _require.TransferArrayBuffer,
-    ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
-    ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;
-
-var _require2 = __webpack_require__(0),
-    createArrayFromList = _require2.createArrayFromList,
-    createDataProperty = _require2.createDataProperty,
-    typeIsObject = _require2.typeIsObject;
-
-var _require3 = __webpack_require__(1),
-    assert = _require3.assert,
-    rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;
-
-var _require4 = __webpack_require__(3),
-    DequeueValue = _require4.DequeueValue,
-    EnqueueValueWithSize = _require4.EnqueueValueWithSize,
-    ResetQueue = _require4.ResetQueue;
-
-var _require5 = __webpack_require__(2),
-    AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,
-    IsWritableStream = _require5.IsWritableStream,
-    IsWritableStreamLocked = _require5.IsWritableStreamLocked,
-    WritableStreamAbort = _require5.WritableStreamAbort,
-    WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,
-    WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,
-    WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,
-    WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;
-
-var ReadableStream = function () {
-  function ReadableStream() {
-    var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
-    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-        size = _ref.size,
-        highWaterMark = _ref.highWaterMark;
-
-    _classCallCheck(this, ReadableStream);
-
-    // Exposed to controllers.
-    this._state = 'readable';
-
-    this._reader = undefined;
-    this._storedError = undefined;
-
-    this._disturbed = false;
-
-    // Initialize to undefined first because the constructor of the controller checks this
-    // variable to validate the caller.
-    this._readableStreamController = undefined;
-    var type = underlyingSource.type;
-    var typeString = String(type);
-    if (typeString === 'bytes') {
-      if (highWaterMark === undefined) {
-        highWaterMark = 0;
-      }
-      this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);
-    } else if (type === undefined) {
-      if (highWaterMark === undefined) {
-        highWaterMark = 1;
-      }
-      this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);
-    } else {
-      throw new RangeError('Invalid type is specified');
-    }
-  }
-
-  _createClass(ReadableStream, [{
-    key: 'cancel',
-    value: function cancel(reason) {
-      if (IsReadableStream(this) === false) {
-        return Promise.reject(streamBrandCheckException('cancel'));
-      }
-
-      if (IsReadableStreamLocked(this) === true) {
-        return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));
-      }
-
-      return ReadableStreamCancel(this, reason);
-    }
-  }, {
-    key: 'getReader',
-    value: function getReader() {
-      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
-          mode = _ref2.mode;
-
-      if (IsReadableStream(this) === false) {
-        throw streamBrandCheckException('getReader');
-      }
-
-      if (mode === undefined) {
-        return AcquireReadableStreamDefaultReader(this);
-      }
-
-      mode = String(mode);
-
-      if (mode === 'byob') {
-        return AcquireReadableStreamBYOBReader(this);
-      }
-
-      throw new RangeError('Invalid mode is specified');
-    }
-  }, {
-    key: 'pipeThrough',
-    value: function pipeThrough(_ref3, options) {
-      var writable = _ref3.writable,
-          readable = _ref3.readable;
-
-      var promise = this.pipeTo(writable, options);
-
-      ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);
-
-      return readable;
-    }
-  }, {
-    key: 'pipeTo',
-    value: function pipeTo(dest) {
-      var _this = this;
-
-      var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-          preventClose = _ref4.preventClose,
-          preventAbort = _ref4.preventAbort,
-          preventCancel = _ref4.preventCancel;
-
-      if (IsReadableStream(this) === false) {
-        return Promise.reject(streamBrandCheckException('pipeTo'));
-      }
-      if (IsWritableStream(dest) === false) {
-        return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\'s first argument must be a WritableStream'));
-      }
-
-      preventClose = Boolean(preventClose);
-      preventAbort = Boolean(preventAbort);
-      preventCancel = Boolean(preventCancel);
-
-      if (IsReadableStreamLocked(this) === true) {
-        return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));
-      }
-      if (IsWritableStreamLocked(dest) === true) {
-        return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));
-      }
-
-      var reader = AcquireReadableStreamDefaultReader(this);
-      var writer = AcquireWritableStreamDefaultWriter(dest);
-
-      var shuttingDown = false;
-
-      // This is used to keep track of the spec's requirement that we wait for ongoing writes during shutdown.
-      var currentWrite = Promise.resolve();
-
-      return new Promise(function (resolve, reject) {
-        // Using reader and writer, read all chunks from this and write them to dest
-        // - Backpressure must be enforced
-        // - Shutdown must stop all activity
-        function pipeLoop() {
-          currentWrite = Promise.resolve();
-
-          if (shuttingDown === true) {
-            return Promise.resolve();
-          }
-
-          return writer._readyPromise.then(function () {
-            return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {
-              var value = _ref5.value,
-                  done = _ref5.done;
-
-              if (done === true) {
-                return;
-              }
-
-              currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});
-            });
-          }).then(pipeLoop);
-        }
-
-        // Errors must be propagated forward
-        isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {
-          if (preventAbort === false) {
-            shutdownWithAction(function () {
-              return WritableStreamAbort(dest, storedError);
-            }, true, storedError);
-          } else {
-            shutdown(true, storedError);
-          }
-        });
-
-        // Errors must be propagated backward
-        isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {
-          if (preventCancel === false) {
-            shutdownWithAction(function () {
-              return ReadableStreamCancel(_this, storedError);
-            }, true, storedError);
-          } else {
-            shutdown(true, storedError);
-          }
-        });
-
-        // Closing must be propagated forward
-        isOrBecomesClosed(_this, reader._closedPromise, function () {
-          if (preventClose === false) {
-            shutdownWithAction(function () {
-              return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);
-            });
-          } else {
-            shutdown();
-          }
-        });
-
-        // Closing must be propagated backward
-        if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {
-          var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');
-
-          if (preventCancel === false) {
-            shutdownWithAction(function () {
-              return ReadableStreamCancel(_this, destClosed);
-            }, true, destClosed);
-          } else {
-            shutdown(true, destClosed);
-          }
-        }
-
-        pipeLoop().catch(function (err) {
-          currentWrite = Promise.resolve();
-          rethrowAssertionErrorRejection(err);
-        });
-
-        function waitForWritesToFinish() {
-          // Another write may have started while we were waiting on this currentWrite, so we have to be sure to wait
-          // for that too.
-          var oldCurrentWrite = currentWrite;
-          return currentWrite.then(function () {
-            return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;
-          });
-        }
-
-        function isOrBecomesErrored(stream, promise, action) {
-          if (stream._state === 'errored') {
-            action(stream._storedError);
-          } else {
-            promise.catch(action).catch(rethrowAssertionErrorRejection);
-          }
-        }
-
-        function isOrBecomesClosed(stream, promise, action) {
-          if (stream._state === 'closed') {
-            action();
-          } else {
-            promise.then(action).catch(rethrowAssertionErrorRejection);
-          }
-        }
-
-        function shutdownWithAction(action, originalIsError, originalError) {
-          if (shuttingDown === true) {
-            return;
-          }
-          shuttingDown = true;
-
-          if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
-            waitForWritesToFinish().then(doTheRest);
-          } else {
-            doTheRest();
-          }
-
-          function doTheRest() {
-            action().then(function () {
-              return finalize(originalIsError, originalError);
-            }, function (newError) {
-              return finalize(true, newError);
-            }).catch(rethrowAssertionErrorRejection);
-          }
-        }
-
-        function shutdown(isError, error) {
-          if (shuttingDown === true) {
-            return;
-          }
-          shuttingDown = true;
-
-          if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
-            waitForWritesToFinish().then(function () {
-              return finalize(isError, error);
-            }).catch(rethrowAssertionErrorRejection);
-          } else {
-            finalize(isError, error);
-          }
-        }
-
-        function finalize(isError, error) {
-          WritableStreamDefaultWriterRelease(writer);
-          ReadableStreamReaderGenericRelease(reader);
-
-          if (isError) {
-            reject(error);
-          } else {
-            resolve(undefined);
-          }
-        }
-      });
-    }
-  }, {
-    key: 'tee',
-    value: function tee() {
-      if (IsReadableStream(this) === false) {
-        throw streamBrandCheckException('tee');
-      }
-
-      var branches = ReadableStreamTee(this, false);
-      return createArrayFromList(branches);
-    }
-  }, {
-    key: 'locked',
-    get: function get() {
-      if (IsReadableStream(this) === false) {
-        throw streamBrandCheckException('locked');
-      }
-
-      return IsReadableStreamLocked(this);
-    }
-  }]);
-
-  return ReadableStream;
-}();
-
-module.exports = {
-  ReadableStream: ReadableStream,
-  IsReadableStreamDisturbed: IsReadableStreamDisturbed,
-  ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,
-  ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,
-  ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,
-  ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize
-};
-
-// Abstract operations for the ReadableStream.
-
-function AcquireReadableStreamBYOBReader(stream) {
-  return new ReadableStreamBYOBReader(stream);
-}
-
-function AcquireReadableStreamDefaultReader(stream) {
-  return new ReadableStreamDefaultReader(stream);
-}
-
-function IsReadableStream(x) {
-  if (!typeIsObject(x)) {
-    return false;
-  }
-
-  if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {
-    return false;
-  }
-
-  return true;
-}
-
-function IsReadableStreamDisturbed(stream) {
-  assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');
-
-  return stream._disturbed;
-}
-
-function IsReadableStreamLocked(stream) {
-  assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');
-
-  if (stream._reader === undefined) {
-    return false;
-  }
-
-  return true;
-}
-
-function ReadableStreamTee(stream, cloneForBranch2) {
-  assert(IsReadableStream(stream) === true);
-  assert(typeof cloneForBranch2 === 'boolean');
-
-  var reader = AcquireReadableStreamDefaultReader(stream);
-
-  var teeState = {
-    closedOrErrored: false,
-    canceled1: false,
-    canceled2: false,
-    reason1: undefined,
-    reason2: undefined
-  };
-  teeState.promise = new Promise(function (resolve) {
-    teeState._resolve = resolve;
-  });
-
-  var pull = create_ReadableStreamTeePullFunction();
-  pull._reader = reader;
-  pull._teeState = teeState;
-  pull._cloneForBranch2 = cloneForBranch2;
-
-  var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();
-  cancel1._stream = stream;
-  cancel1._teeState = teeState;
-
-  var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();
-  cancel2._stream = stream;
-  cancel2._teeState = teeState;
-
-  var underlyingSource1 = Object.create(Object.prototype);
-  createDataProperty(underlyingSource1, 'pull', pull);
-  createDataProperty(underlyingSource1, 'cancel', cancel1);
-  var branch1Stream = new ReadableStream(underlyingSource1);
-
-  var underlyingSource2 = Object.create(Object.prototype);
-  createDataProperty(underlyingSource2, 'pull', pull);
-  createDataProperty(underlyingSource2, 'cancel', cancel2);
-  var branch2Stream = new ReadableStream(underlyingSource2);
-
-  pull._branch1 = branch1Stream._readableStreamController;
-  pull._branch2 = branch2Stream._readableStreamController;
-
-  reader._closedPromise.catch(function (r) {
-    if (teeState.closedOrErrored === true) {
-      return;
-    }
-
-    ReadableStreamDefaultControllerError(pull._branch1, r);
-    ReadableStreamDefaultControllerError(pull._branch2, r);
-    teeState.closedOrErrored = true;
-  });
-
-  return [branch1Stream, branch2Stream];
-}
-
-function create_ReadableStreamTeePullFunction() {
-  function f() {
-    var reader = f._reader,
-        branch1 = f._branch1,
-        branch2 = f._branch2,
-        teeState = f._teeState;
-
-
-    return ReadableStreamDefaultReaderRead(reader).then(function (result) {
-      assert(typeIsObject(result));
-      var value = result.value;
-      var done = result.done;
-      assert(typeof done === 'boolean');
-
-      if (done === true && teeState.closedOrErrored === false) {
-        if (teeState.canceled1 === false) {
-          ReadableStreamDefaultControllerClose(branch1);
-        }
-        if (teeState.canceled2 === false) {
-          ReadableStreamDefaultControllerClose(branch2);
-        }
-        teeState.closedOrErrored = true;
-      }
-
-      if (teeState.closedOrErrored === true) {
-        return;
-      }
-
-      var value1 = value;
-      var value2 = value;
-
-      // There is no way to access the cloning code right now in the reference implementation.
-      // If we add one then we'll need an implementation for serializable objects.
-      // if (teeState.canceled2 === false && cloneForBranch2 === true) {
-      //   value2 = StructuredDeserialize(StructuredSerialize(value2));
-      // }
-
-      if (teeState.canceled1 === false) {
-        ReadableStreamDefaultControllerEnqueue(branch1, value1);
-      }
-
-      if (teeState.canceled2 === false) {
-        ReadableStreamDefaultControllerEnqueue(branch2, value2);
-      }
-    });
-  }
-  return f;
-}
-
-function create_ReadableStreamTeeBranch1CancelFunction() {
-  function f(reason) {
-    var stream = f._stream,
-        teeState = f._teeState;
-
-
-    teeState.canceled1 = true;
-    teeState.reason1 = reason;
-    if (teeState.canceled2 === true) {
-      var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
-      var cancelResult = ReadableStreamCancel(stream, compositeReason);
-      teeState._resolve(cancelResult);
-    }
-    return teeState.promise;
-  }
-  return f;
-}
-
-function create_ReadableStreamTeeBranch2CancelFunction() {
-  function f(reason) {
-    var stream = f._stream,
-        teeState = f._teeState;
-
-
-    teeState.canceled2 = true;
-    teeState.reason2 = reason;
-    if (teeState.canceled1 === true) {
-      var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
-      var cancelResult = ReadableStreamCancel(stream, compositeReason);
-      teeState._resolve(cancelResult);
-    }
-    return teeState.promise;
-  }
-  return f;
-}
-
-// ReadableStream API exposed for controllers.
-
-function ReadableStreamAddReadIntoRequest(stream) {
-  assert(IsReadableStreamBYOBReader(stream._reader) === true);
-  assert(stream._state === 'readable' || stream._state === 'closed');
-
-  var promise = new Promise(function (resolve, reject) {
-    var readIntoRequest = {
-      _resolve: resolve,
-      _reject: reject
-    };
-
-    stream._reader._readIntoRequests.push(readIntoRequest);
-  });
-
-  return promise;
-}
-
-function ReadableStreamAddReadRequest(stream) {
-  assert(IsReadableStreamDefaultReader(stream._reader) === true);
-  assert(stream._state === 'readable');
-
-  var promise = new Promise(function (resolve, reject) {
-    var readRequest = {
-      _resolve: resolve,
-      _reject: reject
-    };
-
-    stream._reader._readRequests.push(readRequest);
-  });
-
-  return promise;
-}
-
-function ReadableStreamCancel(stream, reason) {
-  stream._disturbed = true;
-
-  if (stream._state === 'closed') {
-    return Promise.resolve(undefined);
-  }
-  if (stream._state === 'errored') {
-    return Promise.reject(stream._storedError);
-  }
-
-  ReadableStreamClose(stream);
-
-  var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);
-  return sourceCancelPromise.then(function () {
-    return undefined;
-  });
-}
-
-function ReadableStreamClose(stream) {
-  assert(stream._state === 'readable');
-
-  stream._state = 'closed';
-
-  var reader = stream._reader;
-
-  if (reader === undefined) {
-    return undefined;
-  }
-
-  if (IsReadableStreamDefaultReader(reader) === true) {
-    for (var i = 0; i < reader._readRequests.length; i++) {
-      var _resolve = reader._readRequests[i]._resolve;
-
-      _resolve(CreateIterResultObject(undefined, true));
-    }
-    reader._readRequests = [];
-  }
-
-  defaultReaderClosedPromiseResolve(reader);
-
-  return undefined;
-}
-
-function ReadableStreamError(stream, e) {
-  assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');
-  assert(stream._state === 'readable', 'state must be readable');
-
-  stream._state = 'errored';
-  stream._storedError = e;
-
-  var reader = stream._reader;
-
-  if (reader === undefined) {
-    return undefined;
-  }
-
-  if (IsReadableStreamDefaultReader(reader) === true) {
-    for (var i = 0; i < reader._readRequests.length; i++) {
-      var readRequest = reader._readRequests[i];
-      readRequest._reject(e);
-    }
-
-    reader._readRequests = [];
-  } else {
-    assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');
-
-    for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {
-      var readIntoRequest = reader._readIntoRequests[_i];
-      readIntoRequest._reject(e);
-    }
-
-    reader._readIntoRequests = [];
-  }
-
-  defaultReaderClosedPromiseReject(reader, e);
-  reader._closedPromise.catch(function () {});
-}
-
-function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {
-  var reader = stream._reader;
-
-  assert(reader._readIntoRequests.length > 0);
-
-  var readIntoRequest = reader._readIntoRequests.shift();
-  readIntoRequest._resolve(CreateIterResultObject(chunk, done));
-}
-
-function ReadableStreamFulfillReadRequest(stream, chunk, done) {
-  var reader = stream._reader;
-
-  assert(reader._readRequests.length > 0);
-
-  var readRequest = reader._readRequests.shift();
-  readRequest._resolve(CreateIterResultObject(chunk, done));
-}
-
-function ReadableStreamGetNumReadIntoRequests(stream) {
-  return stream._reader._readIntoRequests.length;
-}
-
-function ReadableStreamGetNumReadRequests(stream) {
-  return stream._reader._readRequests.length;
-}
-
-function ReadableStreamHasBYOBReader(stream) {
-  var reader = stream._reader;
-
-  if (reader === undefined) {
-    return false;
-  }
-
-  if (IsReadableStreamBYOBReader(reader) === false) {
-    return false;
-  }
-
-  return true;
-}
-
-function ReadableStreamHasDefaultReader(stream) {
-  var reader = stream._reader;
-
-  if (reader === undefined) {
-    return false;
-  }
-
-  if (IsReadableStreamDefaultReader(reader) === false) {
-    return false;
-  }
-
-  return true;
-}
-
-// Readers
-
-var ReadableStreamDefaultReader = function () {
-  function ReadableStreamDefaultReader(stream) {
-    _classCallCheck(this, ReadableStreamDefaultReader);
-
-    if (IsReadableStream(stream) === false) {
-      throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');
-    }
-    if (IsReadableStreamLocked(stream) === true) {
-      throw new TypeError('This stream has already been locked for exclusive reading by another reader');
-    }
-
-    ReadableStreamReaderGenericInitialize(this, stream);
-
-    this._readRequests = [];
-  }
-
-  _createClass(ReadableStreamDefaultReader, [{
-    key: 'cancel',
-    value: function cancel(reason) {
-      if (IsReadableStreamDefaultReader(this) === false) {
-        return Promise.reject(defaultReaderBrandCheckException('cancel'));
-      }
-
-      if (this._ownerReadableStream === undefined) {
-        return Promise.reject(readerLockException('cancel'));
-      }
-
-      return ReadableStreamReaderGenericCancel(this, reason);
-    }
-  }, {
-    key: 'read',
-    value: function read() {
-      if (IsReadableStreamDefaultReader(this) === false) {
-        return Promise.reject(defaultReaderBrandCheckException('read'));
-      }
-
-      if (this._ownerReadableStream === undefined) {
-        return Promise.reject(readerLockException('read from'));
-      }
-
-      return ReadableStreamDefaultReaderRead(this);
-    }
-  }, {
-    key: 'releaseLock',
-    value: function releaseLock() {
-      if (IsReadableStreamDefaultReader(this) === false) {
-        throw defaultReaderBrandCheckException('releaseLock');
-      }
-
-      if (this._ownerReadableStream === undefined) {
-        return;
-      }
-
-      if (this._readRequests.length > 0) {
-        throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
-      }
-
-      ReadableStreamReaderGenericRelease(this);
-    }
-  }, {
-    key: 'closed',
-    get: function get() {
-      if (IsReadableStreamDefaultReader(this) === false) {
-        return Promise.reject(defaultReaderBrandCheckException('closed'));
-      }
-
-      return this._closedPromise;
-    }
-  }]);
-
-  return ReadableStreamDefaultReader;
-}();
-
-var ReadableStreamBYOBReader = function () {
-  function ReadableStreamBYOBReader(stream) {
-    _classCallCheck(this, ReadableStreamBYOBReader);
-
-    if (!IsReadableStream(stream)) {
-      throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');
-    }
-    if (IsReadableByteStreamController(stream._readableStreamController) === false) {
-      throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');
-    }
-    if (IsReadableStreamLocked(stream)) {
-      throw new TypeError('This stream has already been locked for exclusive reading by another reader');
-    }
-
-    ReadableStreamReaderGenericInitialize(this, stream);
-
-    this._readIntoRequests = [];
-  }
-
-  _createClass(ReadableStreamBYOBReader, [{
-    key: 'cancel',
-    value: function cancel(reason) {
-      if (!IsReadableStreamBYOBReader(this)) {
-        return Promise.reject(byobReaderBrandCheckException('cancel'));
-      }
-
-      if (this._ownerReadableStream === undefined) {
-        return Promise.reject(readerLockException('cancel'));
-      }
-
-      return ReadableStreamReaderGenericCancel(this, reason);
-    }
-  }, {
-    key: 'read',
-    value: function read(view) {
-      if (!IsReadableStreamBYOBReader(this)) {
-        return Promise.reject(byobReaderBrandCheckException('read'));
-      }
-
-      if (this._ownerReadableStream === undefined) {
-        return Promise.reject(readerLockException('read from'));
-      }
-
-      if (!ArrayBuffer.isView(view)) {
-        return Promise.reject(new TypeError('view must be an array buffer view'));
-      }
-
-      if (view.byteLength === 0) {
-        return Promise.reject(new TypeError('view must have non-zero byteLength'));
-      }
-
-      return ReadableStreamBYOBReaderRead(this, view);
-    }
-  }, {
-    key: 'releaseLock',
-    value: function releaseLock() {
-      if (!IsReadableStreamBYOBReader(this)) {
-        throw byobReaderBrandCheckException('releaseLock');
-      }
-
-      if (this._ownerReadableStream === undefined) {
-        return;
-      }
-
-      if (this._readIntoRequests.length > 0) {
-        throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
-      }
-
-      ReadableStreamReaderGenericRelease(this);
-    }
-  }, {
-    key: 'closed',
-    get: function get() {
-      if (!IsReadableStreamBYOBReader(this)) {
-        return Promise.reject(byobReaderBrandCheckException('closed'));
-      }
-
-      return this._closedPromise;
-    }
-  }]);
-
-  return ReadableStreamBYOBReader;
-}();
-
-// Abstract operations for the readers.
-
-function IsReadableStreamBYOBReader(x) {
-  if (!typeIsObject(x)) {
-    return false;
-  }
-
-  if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {
-    return false;
-  }
-
-  return true;
-}
-
-function IsReadableStreamDefaultReader(x) {
-  if (!typeIsObject(x)) {
-    return false;
-  }
-
-  if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {
-    return false;
-  }
-
-  return true;
-}
-
-function ReadableStreamReaderGenericInitialize(reader, stream) {
-  reader._ownerReadableStream = stream;
-  stream._reader = reader;
-
-  if (stream._state === 'readable') {
-    defaultReaderClosedPromiseInitialize(reader);
-  } else if (stream._state === 'closed') {
-    defaultReaderClosedPromiseInitializeAsResolved(reader);
-  } else {
-    assert(stream._state === 'errored', 'state must be errored');
-
-    defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);
-    reader._closedPromise.catch(function () {});
-  }
-}
-
-// A client of ReadableStreamDefaultReader and ReadableStreamBYOBReader may use these functions directly to bypass state
-// check.
-
-function ReadableStreamReaderGenericCancel(reader, reason) {
-  var stream = reader._ownerReadableStream;
-  assert(stream !== undefined);
-  return ReadableStreamCancel(stream, reason);
-}
-
-function ReadableStreamReaderGenericRelease(reader) {
-  assert(reader._ownerReadableStream !== undefined);
-  assert(reader._ownerReadableStream._reader === reader);
-
-  if (reader._ownerReadableStream._state === 'readable') {
-    defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
-  } else {
-    defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
-  }
-  reader._closedPromise.catch(function () {});
-
-  reader._ownerReadableStream._reader = undefined;
-  reader._ownerReadableStream = undefined;
-}
-
-function ReadableStreamBYOBReaderRead(reader, view) {
-  var stream = reader._ownerReadableStream;
-
-  assert(stream !== undefined);
-
-  stream._disturbed = true;
-
-  if (stream._state === 'errored') {
-    return Promise.reject(stream._storedError);
-  }
-
-  // Controllers must implement this.
-  return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);
-}
-
-function ReadableStreamDefaultReaderRead(reader) {
-  var stream = reader._ownerReadableStream;
-
-  assert(stream !== undefined);
-
-  stream._disturbed = true;
-
-  if (stream._state === 'closed') {
-    return Promise.resolve(CreateIterResultObject(undefined, true));
-  }
-
-  if (stream._state === 'errored') {
-    return Promise.reject(stream._storedError);
-  }
-
-  assert(stream._state === 'readable');
-
-  return stream._readableStreamController.__pullSteps();
-}
-
-// Controllers
-
-var ReadableStreamDefaultController = function () {
-  function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {
-    _classCallCheck(this, ReadableStreamDefaultController);
-
-    if (IsReadableStream(stream) === false) {
-      throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');
-    }
-
-    if (stream._readableStreamController !== undefined) {
-      throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');
-    }
-
-    this._controlledReadableStream = stream;
-
-    this._underlyingSource = underlyingSource;
-
-    // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.
-    this._queue = undefined;
-    this._queueTotalSize = undefined;
-    ResetQueue(this);
-
-    this._started = false;
-    this._closeRequested = false;
-    this._pullAgain = false;
-    this._pulling = false;
-
-    var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
-    this._strategySize = normalizedStrategy.size;
-    this._strategyHWM = normalizedStrategy.highWaterMark;
-
-    var controller = this;
-
-    var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);
-    Promise.resolve(startResult).then(function () {
-      controller._started = true;
-
-      assert(controller._pulling === false);
-      assert(controller._pullAgain === false);
-
-      ReadableStreamDefaultControllerCallPullIfNeeded(controller);
-    }, function (r) {
-      ReadableStreamDefaultControllerErrorIfNeeded(controller, r);
-    }).catch(rethrowAssertionErrorRejection);
-  }
-
-  _createClass(ReadableStreamDefaultController, [{
-    key: 'close',
-    value: function close() {
-      if (IsReadableStreamDefaultController(this) === false) {
-        throw defaultControllerBrandCheckException('close');
-      }
-
-      if (this._closeRequested === true) {
-        throw new TypeError('The stream has already been closed; do not close it again!');
-      }
-
-      var state = this._controlledReadableStream._state;
-      if (state !== 'readable') {
-        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
-      }
-
-      ReadableStreamDefaultControllerClose(this);
-    }
-  }, {
-    key: 'enqueue',
-    value: function enqueue(chunk) {
-      if (IsReadableStreamDefaultController(this) === false) {
-        throw defaultControllerBrandCheckException('enqueue');
-      }
-
-      if (this._closeRequested === true) {
-        throw new TypeError('stream is closed or draining');
-      }
-
-      var state = this._controlledReadableStream._state;
-      if (state !== 'readable') {
-        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
-      }
-
-      return ReadableStreamDefaultControllerEnqueue(this, chunk);
-    }
-  }, {
-    key: 'error',
-    value: function error(e) {
-      if (IsReadableStreamDefaultController(this) === false) {
-        throw defaultControllerBrandCheckException('error');
-      }
-
-      var stream = this._controlledReadableStream;
-      if (stream._state !== 'readable') {
-        throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
-      }
-
-      ReadableStreamDefaultControllerError(this, e);
-    }
-  }, {
-    key: '__cancelSteps',
-    value: function __cancelSteps(reason) {
-      ResetQueue(this);
-      return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);
-    }
-  }, {
-    key: '__pullSteps',
-    value: function __pullSteps() {
-      var stream = this._controlledReadableStream;
-
-      if (this._queue.length > 0) {
-        var chunk = DequeueValue(this);
-
-        if (this._closeRequested === true && this._queue.length === 0) {
-          ReadableStreamClose(stream);
-        } else {
-          ReadableStreamDefaultControllerCallPullIfNeeded(this);
-        }
-
-        return Promise.resolve(CreateIterResultObject(chunk, false));
-      }
-
-      var pendingPromise = ReadableStreamAddReadRequest(stream);
-      ReadableStreamDefaultControllerCallPullIfNeeded(this);
-      return pendingPromise;
-    }
-  }, {
-    key: 'desiredSize',
-    get: function get() {
-      if (IsReadableStreamDefaultController(this) === false) {
-        throw defaultControllerBrandCheckException('desiredSize');
-      }
-
-      return ReadableStreamDefaultControllerGetDesiredSize(this);
-    }
-  }]);
-
-  return ReadableStreamDefaultController;
-}();
-
-// Abstract operations for the ReadableStreamDefaultController.
-
-function IsReadableStreamDefaultController(x) {
-  if (!typeIsObject(x)) {
-    return false;
-  }
-
-  if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {
-    return false;
-  }
-
-  return true;
-}
-
-function ReadableStreamDefaultControllerCallPullIfNeeded(controller) {
-  var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);
-  if (shouldPull === false) {
-    return undefined;
-  }
-
-  if (controller._pulling === true) {
-    controller._pullAgain = true;
-    return undefined;
-  }
-
-  assert(controller._pullAgain === false);
-
-  controller._pulling = true;
-
-  var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);
-  pullPromise.then(function () {
-    controller._pulling = false;
-
-    if (controller._pullAgain === true) {
-      controller._pullAgain = false;
-      return ReadableStreamDefaultControllerCallPullIfNeeded(controller);
-    }
-    return undefined;
-  }, function (e) {
-    ReadableStreamDefaultControllerErrorIfNeeded(controller, e);
-  }).catch(rethrowAssertionErrorRejection);
-
-  return undefined;
-}
-
-function ReadableStreamDefaultControllerShouldCallPull(controller) {
-  var stream = controller._controlledReadableStream;
-
-  if (stream._state === 'closed' || stream._state === 'errored') {
-    return false;
-  }
-
-  if (controller._closeRequested === true) {
-    return false;
-  }
-
-  if (controller._started === false) {
-    return false;
-  }
-
-  if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
-    return true;
-  }
-
-  var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);
-  if (desiredSize > 0) {
-    return true;
-  }
-
-  return false;
-}
-
-// A client of ReadableStreamDefaultController may use these functions directly to bypass state check.
-
-function ReadableStreamDefaultControllerClose(controller) {
-  var stream = controller._controlledReadableStream;
-
-  assert(controller._closeRequested === false);
-  assert(stream._state === 'readable');
-
-  controller._closeRequested = true;
-
-  if (controller._queue.length === 0) {
-    ReadableStreamClose(stream);
-  }
-}
-
-function ReadableStreamDefaultControllerEnqueue(controller, chunk) {
-  var stream = controller._controlledReadableStream;
-
-  assert(controller._closeRequested === false);
-  assert(stream._state === 'readable');
-
-  if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
-    ReadableStreamFulfillReadRequest(stream, chunk, false);
-  } else {
-    var chunkSize = 1;
-
-    if (controller._strategySize !== undefined) {
-      var strategySize = controller._strategySize;
-      try {
-        chunkSize = strategySize(chunk);
-      } catch (chunkSizeE) {
-        ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
-        throw chunkSizeE;
-      }
-    }
-
-    try {
-      EnqueueValueWithSize(controller, chunk, chunkSize);
-    } catch (enqueueE) {
-      ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
-      throw enqueueE;
-    }
-  }
-
-  ReadableStreamDefaultControllerCallPullIfNeeded(controller);
-
-  return undefined;
-}
-
-function ReadableStreamDefaultControllerError(controller, e) {
-  var stream = controller._controlledReadableStream;
-
-  assert(stream._state === 'readable');
-
-  ResetQueue(controller);
-
-  ReadableStreamError(stream, e);
-}
-
-function ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {
-  if (controller._controlledReadableStream._state === 'readable') {
-    ReadableStreamDefaultControllerError(controller, e);
-  }
-}
-
-function ReadableStreamDefaultControllerGetDesiredSize(controller) {
-  var stream = controller._controlledReadableStream;
-  var state = stream._state;
-
-  if (state === 'errored') {
-    return null;
-  }
-  if (state === 'closed') {
-    return 0;
-  }
-
-  return controller._strategyHWM - controller._queueTotalSize;
-}
-
-var ReadableStreamBYOBRequest = function () {
-  function ReadableStreamBYOBRequest(controller, view) {
-    _classCallCheck(this, ReadableStreamBYOBRequest);
-
-    this._associatedReadableByteStreamController = controller;
-    this._view = view;
-  }
-
-  _createClass(ReadableStreamBYOBRequest, [{
-    key: 'respond',
-    value: function respond(bytesWritten) {
-      if (IsReadableStreamBYOBRequest(this) === false) {
-        throw byobRequestBrandCheckException('respond');
-      }
-
-      if (this._associatedReadableByteStreamController === undefined) {
-        throw new TypeError('This BYOB request has been invalidated');
-      }
-
-      ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);
-    }
-  }, {
-    key: 'respondWithNewView',
-    value: function respondWithNewView(view) {
-      if (IsReadableStreamBYOBRequest(this) === false) {
-        throw byobRequestBrandCheckException('respond');
-      }
-
-      if (this._associatedReadableByteStreamController === undefined) {
-        throw new TypeError('This BYOB request has been invalidated');
-      }
-
-      if (!ArrayBuffer.isView(view)) {
-        throw new TypeError('You can only respond with array buffer views');
-      }
-
-      ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);
-    }
-  }, {
-    key: 'view',
-    get: function get() {
-      return this._view;
-    }
-  }]);
-
-  return ReadableStreamBYOBRequest;
-}();
-
-var ReadableByteStreamController = function () {
-  function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {
-    _classCallCheck(this, ReadableByteStreamController);
-
-    if (IsReadableStream(stream) === false) {
-      throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');
-    }
-
-    if (stream._readableStreamController !== undefined) {
-      throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');
-    }
-
-    this._controlledReadableStream = stream;
-
-    this._underlyingByteSource = underlyingByteSource;
-
-    this._pullAgain = false;
-    this._pulling = false;
-
-    ReadableByteStreamControllerClearPendingPullIntos(this);
-
-    // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.
-    this._queue = this._queueTotalSize = undefined;
-    ResetQueue(this);
-
-    this._closeRequested = false;
-    this._started = false;
-
-    this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);
-
-    var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;
-    if (autoAllocateChunkSize !== undefined) {
-      if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {
-        throw new RangeError('autoAllocateChunkSize must be a positive integer');
-      }
-    }
-    this._autoAllocateChunkSize = autoAllocateChunkSize;
-
-    this._pendingPullIntos = [];
-
-    var controller = this;
-
-    var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);
-    Promise.resolve(startResult).then(function () {
-      controller._started = true;
-
-      assert(controller._pulling === false);
-      assert(controller._pullAgain === false);
-
-      ReadableByteStreamControllerCallPullIfNeeded(controller);
-    }, function (r) {
-      if (stream._state === 'readable') {
-        ReadableByteStreamControllerError(controller, r);
-      }
-    }).catch(rethrowAssertionErrorRejection);
-  }
-
-  _createClass(ReadableByteStreamController, [{
-    key: 'close',
-    value: function close() {
-      if (IsReadableByteStreamController(this) === false) {
-        throw byteStreamControllerBrandCheckException('close');
-      }
-
-      if (this._closeRequested === true) {
-        throw new TypeError('The stream has already been closed; do not close it again!');
-      }
-
-      var state = this._controlledReadableStream._state;
-      if (state !== 'readable') {
-        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
-      }
-
-      ReadableByteStreamControllerClose(this);
-    }
-  }, {
-    key: 'enqueue',
-    value: function enqueue(chunk) {
-      if (IsReadableByteStreamController(this) === false) {
-        throw byteStreamControllerBrandCheckException('enqueue');
-      }
-
-      if (this._closeRequested === true) {
-        throw new TypeError('stream is closed or draining');
-      }
-
-      var state = this._controlledReadableStream._state;
-      if (state !== 'readable') {
-        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
-      }
-
-      if (!ArrayBuffer.isView(chunk)) {
-        throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');
-      }
-
-      ReadableByteStreamControllerEnqueue(this, chunk);
-    }
-  }, {
-    key: 'error',
-    value: function error(e) {
-      if (IsReadableByteStreamController(this) === false) {
-        throw byteStreamControllerBrandCheckException('error');
-      }
-
-      var stream = this._controlledReadableStream;
-      if (stream._state !== 'readable') {
-        throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
-      }
-
-      ReadableByteStreamControllerError(this, e);
-    }
-  }, {
-    key: '__cancelSteps',
-    value: function __cancelSteps(reason) {
-      if (this._pendingPullIntos.length > 0) {
-        var firstDescriptor = this._pendingPullIntos[0];
-        firstDescriptor.bytesFilled = 0;
-      }
-
-      ResetQueue(this);
-
-      return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);
-    }
-  }, {
-    key: '__pullSteps',
-    value: function __pullSteps() {
-      var stream = this._controlledReadableStream;
-      assert(ReadableStreamHasDefaultReader(stream) === true);
-
-      if (this._queueTotalSize > 0) {
-        assert(ReadableStreamGetNumReadRequests(stream) === 0);
-
-        var entry = this._queue.shift();
-        this._queueTotalSize -= entry.byteLength;
-
-        ReadableByteStreamControllerHandleQueueDrain(this);
-
-        var view = void 0;
-        try {
-          view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);
-        } catch (viewE) {
-          return Promise.reject(viewE);
-        }
-
-        return Promise.resolve(CreateIterResultObject(view, false));
-      }
-
-      var autoAllocateChunkSize = this._autoAllocateChunkSize;
-      if (autoAllocateChunkSize !== undefined) {
-        var buffer = void 0;
-        try {
-          buffer = new ArrayBuffer(autoAllocateChunkSize);
-        } catch (bufferE) {
-          return Promise.reject(bufferE);
-        }
-
-        var pullIntoDescriptor = {
-          buffer: buffer,
-          byteOffset: 0,
-          byteLength: autoAllocateChunkSize,
-          bytesFilled: 0,
-          elementSize: 1,
-          ctor: Uint8Array,
-          readerType: 'default'
-        };
-
-        this._pendingPullIntos.push(pullIntoDescriptor);
-      }
-
-      var promise = ReadableStreamAddReadRequest(stream);
-
-      ReadableByteStreamControllerCallPullIfNeeded(this);
-
-      return promise;
-    }
-  }, {
-    key: 'byobRequest',
-    get: function get() {
-      if (IsReadableByteStreamController(this) === false) {
-        throw byteStreamControllerBrandCheckException('byobRequest');
-      }
-
-      if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {
-        var firstDescriptor = this._pendingPullIntos[0];
-        var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);
-
-        this._byobRequest = new ReadableStreamBYOBRequest(this, view);
-      }
-
-      return this._byobRequest;
-    }
-  }, {
-    key: 'desiredSize',
-    get: function get() {
-      if (IsReadableByteStreamController(this) === false) {
-        throw byteStreamControllerBrandCheckException('desiredSize');
-      }
-
-      return ReadableByteStreamControllerGetDesiredSize(this);
-    }
-  }]);
-
-  return ReadableByteStreamController;
-}();
-
-// Abstract operations for the ReadableByteStreamController.
-
-function IsReadableByteStreamController(x) {
-  if (!typeIsObject(x)) {
-    return false;
-  }
-
-  if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {
-    return false;
-  }
-
-  return true;
-}
-
-function IsReadableStreamBYOBRequest(x) {
-  if (!typeIsObject(x)) {
-    return false;
-  }
-
-  if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {
-    return false;
-  }
-
-  return true;
-}
-
-function ReadableByteStreamControllerCallPullIfNeeded(controller) {
-  var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);
-  if (shouldPull === false) {
-    return undefined;
-  }
-
-  if (controller._pulling === true) {
-    controller._pullAgain = true;
-    return undefined;
-  }
-
-  assert(controller._pullAgain === false);
-
-  controller._pulling = true;
-
-  // TODO: Test controller argument
-  var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);
-  pullPromise.then(function () {
-    controller._pulling = false;
-
-    if (controller._pullAgain === true) {
-      controller._pullAgain = false;
-      ReadableByteStreamControllerCallPullIfNeeded(controller);
-    }
-  }, function (e) {
-    if (controller._controlledReadableStream._state === 'readable') {
-      ReadableByteStreamControllerError(controller, e);
-    }
-  }).catch(rethrowAssertionErrorRejection);
-
-  return undefined;
-}
-
-function ReadableByteStreamControllerClearPendingPullIntos(controller) {
-  ReadableByteStreamControllerInvalidateBYOBRequest(controller);
-  controller._pendingPullIntos = [];
-}
-
-function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {
-  assert(stream._state !== 'errored', 'state must not be errored');
-
-  var done = false;
-  if (stream._state === 'closed') {
-    assert(pullIntoDescriptor.bytesFilled === 0);
-    done = true;
-  }
-
-  var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
-  if (pullIntoDescriptor.readerType === 'default') {
-    ReadableStreamFulfillReadRequest(stream, filledView, done);
-  } else {
-    assert(pullIntoDescriptor.readerType === 'byob');
-    ReadableStreamFulfillReadIntoRequest(stream, filledView, done);
-  }
-}
-
-function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {
-  var bytesFilled = pullIntoDescriptor.bytesFilled;
-  var elementSize = pullIntoDescriptor.elementSize;
-
-  assert(bytesFilled <= pullIntoDescriptor.byteLength);
-  assert(bytesFilled % elementSize === 0);
-
-  return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);
-}
-
-function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {
-  controller._queue.push({ buffer: buffer, byteOffset: byteOffset, byteLength: byteLength });
-  controller._queueTotalSize += byteLength;
-}
-
-function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {
-  var elementSize = pullIntoDescriptor.elementSize;
-
-  var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;
-
-  var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);
-  var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;
-  var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;
-
-  var totalBytesToCopyRemaining = maxBytesToCopy;
-  var ready = false;
-  if (maxAlignedBytes > currentAlignedBytes) {
-    totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;
-    ready = true;
-  }
-
-  var queue = controller._queue;
-
-  while (totalBytesToCopyRemaining > 0) {
-    var headOfQueue = queue[0];
-
-    var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);
-
-    var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
-    ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);
-
-    if (headOfQueue.byteLength === bytesToCopy) {
-      queue.shift();
-    } else {
-      headOfQueue.byteOffset += bytesToCopy;
-      headOfQueue.byteLength -= bytesToCopy;
-    }
-    controller._queueTotalSize -= bytesToCopy;
-
-    ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);
-
-    totalBytesToCopyRemaining -= bytesToCopy;
-  }
-
-  if (ready === false) {
-    assert(controller._queueTotalSize === 0, 'queue must be empty');
-    assert(pullIntoDescriptor.bytesFilled > 0);
-    assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);
-  }
-
-  return ready;
-}
-
-function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {
-  assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);
-
-  ReadableByteStreamControllerInvalidateBYOBRequest(controller);
-  pullIntoDescriptor.bytesFilled += size;
-}
-
-function ReadableByteStreamControllerHandleQueueDrain(controller) {
-  assert(controller._controlledReadableStream._state === 'readable');
-
-  if (controller._queueTotalSize === 0 && controller._closeRequested === true) {
-    ReadableStreamClose(controller._controlledReadableStream);
-  } else {
-    ReadableByteStreamControllerCallPullIfNeeded(controller);
-  }
-}
-
-function ReadableByteStreamControllerInvalidateBYOBRequest(controller) {
-  if (controller._byobRequest === undefined) {
-    return;
-  }
-
-  controller._byobRequest._associatedReadableByteStreamController = undefined;
-  controller._byobRequest._view = undefined;
-  controller._byobRequest = undefined;
-}
-
-function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {
-  assert(controller._closeRequested === false);
-
-  while (controller._pendingPullIntos.length > 0) {
-    if (controller._queueTotalSize === 0) {
-      return;
-    }
-
-    var pullIntoDescriptor = controller._pendingPullIntos[0];
-
-    if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
-      ReadableByteStreamControllerShiftPendingPullInto(controller);
-
-      ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
-    }
-  }
-}
-
-function ReadableByteStreamControllerPullInto(controller, view) {
-  var stream = controller._controlledReadableStream;
-
-  var elementSize = 1;
-  if (view.constructor !== DataView) {
-    elementSize = view.constructor.BYTES_PER_ELEMENT;
-  }
-
-  var ctor = view.constructor;
-
-  var pullIntoDescriptor = {
-    buffer: view.buffer,
-    byteOffset: view.byteOffset,
-    byteLength: view.byteLength,
-    bytesFilled: 0,
-    elementSize: elementSize,
-    ctor: ctor,
-    readerType: 'byob'
-  };
-
-  if (controller._pendingPullIntos.length > 0) {
-    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
-    controller._pendingPullIntos.push(pullIntoDescriptor);
-
-    // No ReadableByteStreamControllerCallPullIfNeeded() call since:
-    // - No change happens on desiredSize
-    // - The source has already been notified of that there's at least 1 pending read(view)
-
-    return ReadableStreamAddReadIntoRequest(stream);
-  }
-
-  if (stream._state === 'closed') {
-    var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);
-    return Promise.resolve(CreateIterResultObject(emptyView, true));
-  }
-
-  if (controller._queueTotalSize > 0) {
-    if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
-      var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
-
-      ReadableByteStreamControllerHandleQueueDrain(controller);
-
-      return Promise.resolve(CreateIterResultObject(filledView, false));
-    }
-
-    if (controller._closeRequested === true) {
-      var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
-      ReadableByteStreamControllerError(controller, e);
-
-      return Promise.reject(e);
-    }
-  }
-
-  pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
-  controller._pendingPullIntos.push(pullIntoDescriptor);
-
-  var promise = ReadableStreamAddReadIntoRequest(stream);
-
-  ReadableByteStreamControllerCallPullIfNeeded(controller);
-
-  return promise;
-}
-
-function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {
-  firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);
-
-  assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');
-
-  var stream = controller._controlledReadableStream;
-  if (ReadableStreamHasBYOBReader(stream) === true) {
-    while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {
-      var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);
-      ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);
-    }
-  }
-}
-
-function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {
-  if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {
-    throw new RangeError('bytesWritten out of range');
-  }
-
-  ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);
-
-  if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {
-    // TODO: Figure out whether we should detach the buffer or not here.
-    return;
-  }
-
-  ReadableByteStreamControllerShiftPendingPullInto(controller);
-
-  var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;
-  if (remainderSize > 0) {
-    var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
-    var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);
-    ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);
-  }
-
-  pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
-  pullIntoDescriptor.bytesFilled -= remainderSize;
-  ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
-
-  ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
-}
-
-function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {
-  var firstDescriptor = controller._pendingPullIntos[0];
-
-  var stream = controller._controlledReadableStream;
-
-  if (stream._state === 'closed') {
-    if (bytesWritten !== 0) {
-      throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');
-    }
-
-    ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);
-  } else {
-    assert(stream._state === 'readable');
-
-    ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);
-  }
-}
-
-function ReadableByteStreamControllerShiftPendingPullInto(controller) {
-  var descriptor = controller._pendingPullIntos.shift();
-  ReadableByteStreamControllerInvalidateBYOBRequest(controller);
-  return descriptor;
-}
-
-function ReadableByteStreamControllerShouldCallPull(controller) {
-  var stream = controller._controlledReadableStream;
-
-  if (stream._state !== 'readable') {
-    return false;
-  }
-
-  if (controller._closeRequested === true) {
-    return false;
-  }
-
-  if (controller._started === false) {
-    return false;
-  }
-
-  if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
-    return true;
-  }
-
-  if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {
-    return true;
-  }
-
-  if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {
-    return true;
-  }
-
-  return false;
-}
-
-// A client of ReadableByteStreamController may use these functions directly to bypass state check.
-
-function ReadableByteStreamControllerClose(controller) {
-  var stream = controller._controlledReadableStream;
-
-  assert(controller._closeRequested === false);
-  assert(stream._state === 'readable');
-
-  if (controller._queueTotalSize > 0) {
-    controller._closeRequested = true;
-
-    return;
-  }
-
-  if (controller._pendingPullIntos.length > 0) {
-    var firstPendingPullInto = controller._pendingPullIntos[0];
-    if (firstPendingPullInto.bytesFilled > 0) {
-      var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
-      ReadableByteStreamControllerError(controller, e);
-
-      throw e;
-    }
-  }
-
-  ReadableStreamClose(stream);
-}
-
-function ReadableByteStreamControllerEnqueue(controller, chunk) {
-  var stream = controller._controlledReadableStream;
-
-  assert(controller._closeRequested === false);
-  assert(stream._state === 'readable');
-
-  var buffer = chunk.buffer;
-  var byteOffset = chunk.byteOffset;
-  var byteLength = chunk.byteLength;
-  var transferredBuffer = TransferArrayBuffer(buffer);
-
-  if (ReadableStreamHasDefaultReader(stream) === true) {
-    if (ReadableStreamGetNumReadRequests(stream) === 0) {
-      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
-    } else {
-      assert(controller._queue.length === 0);
-
-      var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);
-      ReadableStreamFulfillReadRequest(stream, transferredView, false);
-    }
-  } else if (ReadableStreamHasBYOBReader(stream) === true) {
-    // TODO: Ideally in this branch detaching should happen only if the buffer is not consumed fully.
-    ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
-    ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
-  } else {
-    assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');
-    ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
-  }
-}
-
-function ReadableByteStreamControllerError(controller, e) {
-  var stream = controller._controlledReadableStream;
-
-  assert(stream._state === 'readable');
-
-  ReadableByteStreamControllerClearPendingPullIntos(controller);
-
-  ResetQueue(controller);
-  ReadableStreamError(stream, e);
-}
-
-function ReadableByteStreamControllerGetDesiredSize(controller) {
-  var stream = controller._controlledReadableStream;
-  var state = stream._state;
-
-  if (state === 'errored') {
-    return null;
-  }
-  if (state === 'closed') {
-    return 0;
-  }
-
-  return controller._strategyHWM - controller._queueTotalSize;
-}
-
-function ReadableByteStreamControllerRespond(controller, bytesWritten) {
-  bytesWritten = Number(bytesWritten);
-  if (IsFiniteNonNegativeNumber(bytesWritten) === false) {
-    throw new RangeError('bytesWritten must be a finite');
-  }
-
-  assert(controller._pendingPullIntos.length > 0);
-
-  ReadableByteStreamControllerRespondInternal(controller, bytesWritten);
-}
-
-function ReadableByteStreamControllerRespondWithNewView(controller, view) {
-  assert(controller._pendingPullIntos.length > 0);
-
-  var firstDescriptor = controller._pendingPullIntos[0];
-
-  if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {
-    throw new RangeError('The region specified by view does not match byobRequest');
-  }
-  if (firstDescriptor.byteLength !== view.byteLength) {
-    throw new RangeError('The buffer of view has different capacity than byobRequest');
-  }
-
-  firstDescriptor.buffer = view.buffer;
-
-  ReadableByteStreamControllerRespondInternal(controller, view.byteLength);
-}
-
-// Helper functions for the ReadableStream.
-
-function streamBrandCheckException(name) {
-  return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');
-}
-
-// Helper functions for the readers.
-
-function readerLockException(name) {
-  return new TypeError('Cannot ' + name + ' a stream using a released reader');
-}
-
-// Helper functions for the ReadableStreamDefaultReader.
-
-function defaultReaderBrandCheckException(name) {
-  return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');
-}
-
-function defaultReaderClosedPromiseInitialize(reader) {
-  reader._closedPromise = new Promise(function (resolve, reject) {
-    reader._closedPromise_resolve = resolve;
-    reader._closedPromise_reject = reject;
-  });
-}
-
-function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {
-  reader._closedPromise = Promise.reject(reason);
-  reader._closedPromise_resolve = undefined;
-  reader._closedPromise_reject = undefined;
-}
-
-function defaultReaderClosedPromiseInitializeAsResolved(reader) {
-  reader._closedPromise = Promise.resolve(undefined);
-  reader._closedPromise_resolve = undefined;
-  reader._closedPromise_reject = undefined;
-}
-
-function defaultReaderClosedPromiseReject(reader, reason) {
-  assert(reader._closedPromise_resolve !== undefined);
-  assert(reader._closedPromise_reject !== undefined);
-
-  reader._closedPromise_reject(reason);
-  reader._closedPromise_resolve = undefined;
-  reader._closedPromise_reject = undefined;
-}
-
-function defaultReaderClosedPromiseResetToRejected(reader, reason) {
-  assert(reader._closedPromise_resolve === undefined);
-  assert(reader._closedPromise_reject === undefined);
-
-  reader._closedPromise = Promise.reject(reason);
-}
-
-function defaultReaderClosedPromiseResolve(reader) {
-  assert(reader._closedPromise_resolve !== undefined);
-  assert(reader._closedPromise_reject !== undefined);
-
-  reader._closedPromise_resolve(undefined);
-  reader._closedPromise_resolve = undefined;
-  reader._closedPromise_reject = undefined;
-}
-
-// Helper functions for the ReadableStreamDefaultReader.
-
-function byobReaderBrandCheckException(name) {
-  return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');
-}
-
-// Helper functions for the ReadableStreamDefaultController.
-
-function defaultControllerBrandCheckException(name) {
-  return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');
-}
-
-// Helper functions for the ReadableStreamBYOBRequest.
-
-function byobRequestBrandCheckException(name) {
-  return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');
-}
-
-// Helper functions for the ReadableByteStreamController.
-
-function byteStreamControllerBrandCheckException(name) {
-  return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');
-}
-
-// Helper function for ReadableStream pipeThrough
-
-function ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {
-  try {
-    // This relies on the brand-check that is enforced by Promise.prototype.then(). As with the rest of the reference
-    // implementation, it doesn't attempt to do the right thing if someone has modified the global environment.
-    Promise.prototype.then.call(promise, undefined, function () {});
-  } catch (e) {
-    // The brand check failed, therefore the internal slot is not present and there's nothing further to do.
-  }
-}
-
-/***/ }),
-/* 5 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var transformStream = __webpack_require__(6);
-var readableStream = __webpack_require__(4);
-var writableStream = __webpack_require__(2);
-
-exports.TransformStream = transformStream.TransformStream;
-exports.ReadableStream = readableStream.ReadableStream;
-exports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;
-exports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;
-exports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;
-exports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;
-exports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;
-exports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;
-exports.IsWritableStream = writableStream.IsWritableStream;
-exports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;
-exports.WritableStream = writableStream.WritableStream;
-exports.WritableStreamAbort = writableStream.WritableStreamAbort;
-exports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;
-exports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;
-exports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;
-exports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;
-
-/***/ }),
-/* 6 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-var _require = __webpack_require__(1),
-    assert = _require.assert;
-
-var _require2 = __webpack_require__(0),
-    InvokeOrNoop = _require2.InvokeOrNoop,
-    PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,
-    PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,
-    typeIsObject = _require2.typeIsObject;
-
-var _require3 = __webpack_require__(4),
-    ReadableStream = _require3.ReadableStream,
-    ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,
-    ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,
-    ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,
-    ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;
-
-var _require4 = __webpack_require__(2),
-    WritableStream = _require4.WritableStream,
-    WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;
-
-// Methods on the transform stream controller object
-
-function TransformStreamCloseReadable(transformStream) {
-  // console.log('TransformStreamCloseReadable()');
-
-  if (transformStream._errored === true) {
-    throw new TypeError('TransformStream is already errored');
-  }
-
-  if (transformStream._readableClosed === true) {
-    throw new TypeError('Readable side is already closed');
-  }
-
-  TransformStreamCloseReadableInternal(transformStream);
-}
-
-function TransformStreamEnqueueToReadable(transformStream, chunk) {
-  // console.log('TransformStreamEnqueueToReadable()');
-
-  if (transformStream._errored === true) {
-    throw new TypeError('TransformStream is already errored');
-  }
-
-  if (transformStream._readableClosed === true) {
-    throw new TypeError('Readable side is already closed');
-  }
-
-  // We throttle transformer.transform invocation based on the backpressure of the ReadableStream, but we still
-  // accept TransformStreamEnqueueToReadable() calls.
-
-  var controller = transformStream._readableController;
-
-  try {
-    ReadableStreamDefaultControllerEnqueue(controller, chunk);
-  } catch (e) {
-    // This happens when readableStrategy.size() throws.
-    // The ReadableStream has already errored itself.
-    transformStream._readableClosed = true;
-    TransformStreamErrorIfNeeded(transformStream, e);
-
-    throw transformStream._storedError;
-  }
-
-  var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);
-  var maybeBackpressure = desiredSize <= 0;
-
-  if (maybeBackpressure === true && transformStream._backpressure === false) {
-    // This allows pull() again. When desiredSize is 0, it's possible that a pull() will happen immediately (but
-    // asynchronously) after this because of pending read()s and set _backpressure back to false.
-    //
-    // If pull() could be called from inside enqueue(), then this logic would be wrong. This cannot happen
-    // because there is always a promise pending from start() or pull() when _backpressure is false.
-    TransformStreamSetBackpressure(transformStream, true);
-  }
-}
-
-function TransformStreamError(transformStream, e) {
-  if (transformStream._errored === true) {
-    throw new TypeError('TransformStream is already errored');
-  }
-
-  TransformStreamErrorInternal(transformStream, e);
-}
-
-// Abstract operations.
-
-function TransformStreamCloseReadableInternal(transformStream) {
-  assert(transformStream._errored === false);
-  assert(transformStream._readableClosed === false);
-
-  try {
-    ReadableStreamDefaultControllerClose(transformStream._readableController);
-  } catch (e) {
-    assert(false);
-  }
-
-  transformStream._readableClosed = true;
-}
-
-function TransformStreamErrorIfNeeded(transformStream, e) {
-  if (transformStream._errored === false) {
-    TransformStreamErrorInternal(transformStream, e);
-  }
-}
-
-function TransformStreamErrorInternal(transformStream, e) {
-  // console.log('TransformStreamErrorInternal()');
-
-  assert(transformStream._errored === false);
-
-  transformStream._errored = true;
-  transformStream._storedError = e;
-
-  if (transformStream._writableDone === false) {
-    WritableStreamDefaultControllerError(transformStream._writableController, e);
-  }
-  if (transformStream._readableClosed === false) {
-    ReadableStreamDefaultControllerError(transformStream._readableController, e);
-  }
-}
-
-// Used for preventing the next write() call on TransformStreamSink until there
-// is no longer backpressure.
-function TransformStreamReadableReadyPromise(transformStream) {
-  assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
-
-  if (transformStream._backpressure === false) {
-    return Promise.resolve();
-  }
-
-  assert(transformStream._backpressure === true, '_backpressure should have been initialized');
-
-  return transformStream._backpressureChangePromise;
-}
-
-function TransformStreamSetBackpressure(transformStream, backpressure) {
-  // console.log(`TransformStreamSetBackpressure(${backpressure})`);
-
-  // Passes also when called during construction.
-  assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');
-
-  if (transformStream._backpressureChangePromise !== undefined) {
-    // The fulfillment value is just for a sanity check.
-    transformStream._backpressureChangePromise_resolve(backpressure);
-  }
-
-  transformStream._backpressureChangePromise = new Promise(function (resolve) {
-    transformStream._backpressureChangePromise_resolve = resolve;
-  });
-
-  transformStream._backpressureChangePromise.then(function (resolution) {
-    assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');
-  });
-
-  transformStream._backpressure = backpressure;
-}
-
-function TransformStreamDefaultTransform(chunk, transformStreamController) {
-  var transformStream = transformStreamController._controlledTransformStream;
-  TransformStreamEnqueueToReadable(transformStream, chunk);
-  return Promise.resolve();
-}
-
-function TransformStreamTransform(transformStream, chunk) {
-  // console.log('TransformStreamTransform()');
-
-  assert(transformStream._errored === false);
-  assert(transformStream._transforming === false);
-  assert(transformStream._backpressure === false);
-
-  transformStream._transforming = true;
-
-  var transformer = transformStream._transformer;
-  var controller = transformStream._transformStreamController;
-
-  var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);
-
-  return transformPromise.then(function () {
-    transformStream._transforming = false;
-
-    return TransformStreamReadableReadyPromise(transformStream);
-  }, function (e) {
-    TransformStreamErrorIfNeeded(transformStream, e);
-    return Promise.reject(e);
-  });
-}
-
-function IsTransformStreamDefaultController(x) {
-  if (!typeIsObject(x)) {
-    return false;
-  }
-
-  if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {
-    return false;
-  }
-
-  return true;
-}
-
-function IsTransformStream(x) {
-  if (!typeIsObject(x)) {
-    return false;
-  }
-
-  if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {
-    return false;
-  }
-
-  return true;
-}
-
-var TransformStreamSink = function () {
-  function TransformStreamSink(transformStream, startPromise) {
-    _classCallCheck(this, TransformStreamSink);
-
-    this._transformStream = transformStream;
-    this._startPromise = startPromise;
-  }
-
-  _createClass(TransformStreamSink, [{
-    key: 'start',
-    value: function start(c) {
-      var transformStream = this._transformStream;
-
-      transformStream._writableController = c;
-
-      return this._startPromise.then(function () {
-        return TransformStreamReadableReadyPromise(transformStream);
-      });
-    }
-  }, {
-    key: 'write',
-    value: function write(chunk) {
-      // console.log('TransformStreamSink.write()');
-
-      var transformStream = this._transformStream;
-
-      return TransformStreamTransform(transformStream, chunk);
-    }
-  }, {
-    key: 'abort',
-    value: function abort() {
-      var transformStream = this._transformStream;
-      transformStream._writableDone = true;
-      TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));
-    }
-  }, {
-    key: 'close',
-    value: function close() {
-      // console.log('TransformStreamSink.close()');
-
-      var transformStream = this._transformStream;
-
-      assert(transformStream._transforming === false);
-
-      transformStream._writableDone = true;
-
-      var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);
-      // Return a promise that is fulfilled with undefined on success.
-      return flushPromise.then(function () {
-        if (transformStream._errored === true) {
-          return Promise.reject(transformStream._storedError);
-        }
-        if (transformStream._readableClosed === false) {
-          TransformStreamCloseReadableInternal(transformStream);
-        }
-        return Promise.resolve();
-      }).catch(function (r) {
-        TransformStreamErrorIfNeeded(transformStream, r);
-        return Promise.reject(transformStream._storedError);
-      });
-    }
-  }]);
-
-  return TransformStreamSink;
-}();
-
-var TransformStreamSource = function () {
-  function TransformStreamSource(transformStream, startPromise) {
-    _classCallCheck(this, TransformStreamSource);
-
-    this._transformStream = transformStream;
-    this._startPromise = startPromise;
-  }
-
-  _createClass(TransformStreamSource, [{
-    key: 'start',
-    value: function start(c) {
-      var transformStream = this._transformStream;
-
-      transformStream._readableController = c;
-
-      return this._startPromise.then(function () {
-        // Prevent the first pull() call until there is backpressure.
-
-        assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
-
-        if (transformStream._backpressure === true) {
-          return Promise.resolve();
-        }
-
-        assert(transformStream._backpressure === false, '_backpressure should have been initialized');
-
-        return transformStream._backpressureChangePromise;
-      });
-    }
-  }, {
-    key: 'pull',
-    value: function pull() {
-      // console.log('TransformStreamSource.pull()');
-
-      var transformStream = this._transformStream;
-
-      // Invariant. Enforced by the promises returned by start() and pull().
-      assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');
-
-      assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
-
-      TransformStreamSetBackpressure(transformStream, false);
-
-      // Prevent the next pull() call until there is backpressure.
-      return transformStream._backpressureChangePromise;
-    }
-  }, {
-    key: 'cancel',
-    value: function cancel() {
-      var transformStream = this._transformStream;
-      transformStream._readableClosed = true;
-      TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));
-    }
-  }]);
-
-  return TransformStreamSource;
-}();
-
-var TransformStreamDefaultController = function () {
-  function TransformStreamDefaultController(transformStream) {
-    _classCallCheck(this, TransformStreamDefaultController);
-
-    if (IsTransformStream(transformStream) === false) {
-      throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');
-    }
-
-    if (transformStream._transformStreamController !== undefined) {
-      throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');
-    }
-
-    this._controlledTransformStream = transformStream;
-  }
-
-  _createClass(TransformStreamDefaultController, [{
-    key: 'enqueue',
-    value: function enqueue(chunk) {
-      if (IsTransformStreamDefaultController(this) === false) {
-        throw defaultControllerBrandCheckException('enqueue');
-      }
-
-      TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);
-    }
-  }, {
-    key: 'close',
-    value: function close() {
-      if (IsTransformStreamDefaultController(this) === false) {
-        throw defaultControllerBrandCheckException('close');
-      }
-
-      TransformStreamCloseReadable(this._controlledTransformStream);
-    }
-  }, {
-    key: 'error',
-    value: function error(reason) {
-      if (IsTransformStreamDefaultController(this) === false) {
-        throw defaultControllerBrandCheckException('error');
-      }
-
-      TransformStreamError(this._controlledTransformStream, reason);
-    }
-  }, {
-    key: 'desiredSize',
-    get: function get() {
-      if (IsTransformStreamDefaultController(this) === false) {
-        throw defaultControllerBrandCheckException('desiredSize');
-      }
-
-      var transformStream = this._controlledTransformStream;
-      var readableController = transformStream._readableController;
-
-      return ReadableStreamDefaultControllerGetDesiredSize(readableController);
-    }
-  }]);
-
-  return TransformStreamDefaultController;
-}();
-
-var TransformStream = function () {
-  function TransformStream() {
-    var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
-    _classCallCheck(this, TransformStream);
-
-    this._transformer = transformer;
-    var readableStrategy = transformer.readableStrategy,
-        writableStrategy = transformer.writableStrategy;
-
-
-    this._transforming = false;
-    this._errored = false;
-    this._storedError = undefined;
-
-    this._writableController = undefined;
-    this._readableController = undefined;
-    this._transformStreamController = undefined;
-
-    this._writableDone = false;
-    this._readableClosed = false;
-
-    this._backpressure = undefined;
-    this._backpressureChangePromise = undefined;
-    this._backpressureChangePromise_resolve = undefined;
-
-    this._transformStreamController = new TransformStreamDefaultController(this);
-
-    var startPromise_resolve = void 0;
-    var startPromise = new Promise(function (resolve) {
-      startPromise_resolve = resolve;
-    });
-
-    var source = new TransformStreamSource(this, startPromise);
-
-    this._readable = new ReadableStream(source, readableStrategy);
-
-    var sink = new TransformStreamSink(this, startPromise);
-
-    this._writable = new WritableStream(sink, writableStrategy);
-
-    assert(this._writableController !== undefined);
-    assert(this._readableController !== undefined);
-
-    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);
-    // Set _backpressure based on desiredSize. As there is no read() at this point, we can just interpret
-    // desiredSize being non-positive as backpressure.
-    TransformStreamSetBackpressure(this, desiredSize <= 0);
-
-    var transformStream = this;
-    var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);
-    startPromise_resolve(startResult);
-    startPromise.catch(function (e) {
-      // The underlyingSink and underlyingSource will error the readable and writable ends on their own.
-      if (transformStream._errored === false) {
-        transformStream._errored = true;
-        transformStream._storedError = e;
-      }
-    });
-  }
-
-  _createClass(TransformStream, [{
-    key: 'readable',
-    get: function get() {
-      if (IsTransformStream(this) === false) {
-        throw streamBrandCheckException('readable');
-      }
-
-      return this._readable;
-    }
-  }, {
-    key: 'writable',
-    get: function get() {
-      if (IsTransformStream(this) === false) {
-        throw streamBrandCheckException('writable');
-      }
-
-      return this._writable;
-    }
-  }]);
-
-  return TransformStream;
-}();
-
-module.exports = { TransformStream: TransformStream };
-
-// Helper functions for the TransformStreamDefaultController.
-
-function defaultControllerBrandCheckException(name) {
-  return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');
-}
-
-// Helper functions for the TransformStream.
-
-function streamBrandCheckException(name) {
-  return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');
-}
-
-/***/ }),
-/* 7 */
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__(5);
-
-
-/***/ })
-/******/ ])));

+ 0 - 627
external/url/url-lib.js

@@ -1,627 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
-// Polyfill obtained from: https://github.com/Polymer/URL
-
-(function URLConstructorClosure() {
-  'use strict';
-
-  var relative = Object.create(null);
-  relative['ftp'] = 21;
-  relative['file'] = 0;
-  relative['gopher'] = 70;
-  relative['http'] = 80;
-  relative['https'] = 443;
-  relative['ws'] = 80;
-  relative['wss'] = 443;
-
-  var relativePathDotMapping = Object.create(null);
-  relativePathDotMapping['%2e'] = '.';
-  relativePathDotMapping['.%2e'] = '..';
-  relativePathDotMapping['%2e.'] = '..';
-  relativePathDotMapping['%2e%2e'] = '..';
-
-  function isRelativeScheme(scheme) {
-    return relative[scheme] !== undefined;
-  }
-
-  function invalid() {
-    clear.call(this);
-    this._isInvalid = true;
-  }
-
-  function IDNAToASCII(h) {
-    if (h === '') {
-      invalid.call(this);
-    }
-    // XXX
-    return h.toLowerCase();
-  }
-
-  function percentEscape(c) {
-    var unicode = c.charCodeAt(0);
-    if (unicode > 0x20 &&
-       unicode < 0x7F &&
-       // " # < > ? `
-       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) === -1
-      ) {
-      return c;
-    }
-    return encodeURIComponent(c);
-  }
-
-  function percentEscapeQuery(c) {
-    // XXX This actually needs to encode c using encoding and then
-    // convert the bytes one-by-one.
-
-    var unicode = c.charCodeAt(0);
-    if (unicode > 0x20 &&
-       unicode < 0x7F &&
-       // " # < > ` (do not escape '?')
-       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1
-      ) {
-      return c;
-    }
-    return encodeURIComponent(c);
-  }
-
-  var EOF, ALPHA = /[a-zA-Z]/,
-      ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
-
-  function parse(input, stateOverride, base) {
-    function err(message) {
-      errors.push(message);
-    }
-
-    var state = stateOverride || 'scheme start',
-        cursor = 0,
-        buffer = '',
-        seenAt = false,
-        seenBracket = false,
-        errors = [];
-
-    loop: while ((input[cursor - 1] !== EOF || cursor === 0) &&
-                 !this._isInvalid) {
-      var c = input[cursor];
-      switch (state) {
-        case 'scheme start':
-          if (c && ALPHA.test(c)) {
-            buffer += c.toLowerCase(); // ASCII-safe
-            state = 'scheme';
-          } else if (!stateOverride) {
-            buffer = '';
-            state = 'no scheme';
-            continue;
-          } else {
-            err('Invalid scheme.');
-            break loop;
-          }
-          break;
-
-        case 'scheme':
-          if (c && ALPHANUMERIC.test(c)) {
-            buffer += c.toLowerCase(); // ASCII-safe
-          } else if (c === ':') {
-            this._scheme = buffer;
-            buffer = '';
-            if (stateOverride) {
-              break loop;
-            }
-            if (isRelativeScheme(this._scheme)) {
-              this._isRelative = true;
-            }
-            if (this._scheme === 'file') {
-              state = 'relative';
-            } else if (this._isRelative && base &&
-                       base._scheme === this._scheme) {
-              state = 'relative or authority';
-            } else if (this._isRelative) {
-              state = 'authority first slash';
-            } else {
-              state = 'scheme data';
-            }
-          } else if (!stateOverride) {
-            buffer = '';
-            cursor = 0;
-            state = 'no scheme';
-            continue;
-          } else if (c === EOF) {
-            break loop;
-          } else {
-            err('Code point not allowed in scheme: ' + c);
-            break loop;
-          }
-          break;
-
-        case 'scheme data':
-          if (c === '?') {
-            this._query = '?';
-            state = 'query';
-          } else if (c === '#') {
-            this._fragment = '#';
-            state = 'fragment';
-          } else {
-            // XXX error handling
-            if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
-              this._schemeData += percentEscape(c);
-            }
-          }
-          break;
-
-        case 'no scheme':
-          if (!base || !(isRelativeScheme(base._scheme))) {
-            err('Missing scheme.');
-            invalid.call(this);
-          } else {
-            state = 'relative';
-            continue;
-          }
-          break;
-
-        case 'relative or authority':
-          if (c === '/' && input[cursor + 1] === '/') {
-            state = 'authority ignore slashes';
-          } else {
-            err('Expected /, got: ' + c);
-            state = 'relative';
-            continue;
-          }
-          break;
-
-        case 'relative':
-          this._isRelative = true;
-          if (this._scheme !== 'file') {
-            this._scheme = base._scheme;
-          }
-          if (c === EOF) {
-            this._host = base._host;
-            this._port = base._port;
-            this._path = base._path.slice();
-            this._query = base._query;
-            this._username = base._username;
-            this._password = base._password;
-            break loop;
-          } else if (c === '/' || c === '\\') {
-            if (c === '\\') {
-              err('\\ is an invalid code point.');
-            }
-            state = 'relative slash';
-          } else if (c === '?') {
-            this._host = base._host;
-            this._port = base._port;
-            this._path = base._path.slice();
-            this._query = '?';
-            this._username = base._username;
-            this._password = base._password;
-            state = 'query';
-          } else if (c === '#') {
-            this._host = base._host;
-            this._port = base._port;
-            this._path = base._path.slice();
-            this._query = base._query;
-            this._fragment = '#';
-            this._username = base._username;
-            this._password = base._password;
-            state = 'fragment';
-          } else {
-            var nextC = input[cursor + 1];
-            var nextNextC = input[cursor + 2];
-            if (this._scheme !== 'file' || !ALPHA.test(c) ||
-                (nextC !== ':' && nextC !== '|') ||
-                (nextNextC !== EOF && nextNextC !== '/' && nextNextC !== '\\' &&
-                 nextNextC !== '?' && nextNextC !== '#')) {
-              this._host = base._host;
-              this._port = base._port;
-              this._username = base._username;
-              this._password = base._password;
-              this._path = base._path.slice();
-              this._path.pop();
-            }
-            state = 'relative path';
-            continue;
-          }
-          break;
-
-        case 'relative slash':
-          if (c === '/' || c === '\\') {
-            if (c === '\\') {
-              err('\\ is an invalid code point.');
-            }
-            if (this._scheme === 'file') {
-              state = 'file host';
-            } else {
-              state = 'authority ignore slashes';
-            }
-          } else {
-            if (this._scheme !== 'file') {
-              this._host = base._host;
-              this._port = base._port;
-              this._username = base._username;
-              this._password = base._password;
-            }
-            state = 'relative path';
-            continue;
-          }
-          break;
-
-        case 'authority first slash':
-          if (c === '/') {
-            state = 'authority second slash';
-          } else {
-            err('Expected \'/\', got: ' + c);
-            state = 'authority ignore slashes';
-            continue;
-          }
-          break;
-
-        case 'authority second slash':
-          state = 'authority ignore slashes';
-          if (c !== '/') {
-            err('Expected \'/\', got: ' + c);
-            continue;
-          }
-          break;
-
-        case 'authority ignore slashes':
-          if (c !== '/' && c !== '\\') {
-            state = 'authority';
-            continue;
-          } else {
-            err('Expected authority, got: ' + c);
-          }
-          break;
-
-        case 'authority':
-          if (c === '@') {
-            if (seenAt) {
-              err('@ already seen.');
-              buffer += '%40';
-            }
-            seenAt = true;
-            for (var i = 0; i < buffer.length; i++) {
-              var cp = buffer[i];
-              if (cp === '\t' || cp === '\n' || cp === '\r') {
-                err('Invalid whitespace in authority.');
-                continue;
-              }
-              // XXX check URL code points
-              if (cp === ':' && this._password === null) {
-                this._password = '';
-                continue;
-              }
-              var tempC = percentEscape(cp);
-              if (this._password !== null) {
-                this._password += tempC;
-              } else {
-                this._username += tempC;
-              }
-            }
-            buffer = '';
-          } else if (c === EOF || c === '/' || c === '\\' ||
-                     c === '?' || c === '#') {
-            cursor -= buffer.length;
-            buffer = '';
-            state = 'host';
-            continue;
-          } else {
-            buffer += c;
-          }
-          break;
-
-        case 'file host':
-          if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') {
-            if (buffer.length === 2 && ALPHA.test(buffer[0]) &&
-                (buffer[1] === ':' || buffer[1] === '|')) {
-              state = 'relative path';
-            } else if (buffer.length === 0) {
-              state = 'relative path start';
-            } else {
-              this._host = IDNAToASCII.call(this, buffer);
-              buffer = '';
-              state = 'relative path start';
-            }
-            continue;
-          } else if (c === '\t' || c === '\n' || c === '\r') {
-            err('Invalid whitespace in file host.');
-          } else {
-            buffer += c;
-          }
-          break;
-
-        case 'host':
-        case 'hostname':
-          if (c === ':' && !seenBracket) {
-            // XXX host parsing
-            this._host = IDNAToASCII.call(this, buffer);
-            buffer = '';
-            state = 'port';
-            if (stateOverride === 'hostname') {
-              break loop;
-            }
-          } else if (c === EOF || c === '/' ||
-                     c === '\\' || c === '?' || c === '#') {
-            this._host = IDNAToASCII.call(this, buffer);
-            buffer = '';
-            state = 'relative path start';
-            if (stateOverride) {
-              break loop;
-            }
-            continue;
-          } else if (c !== '\t' && c !== '\n' && c !== '\r') {
-            if (c === '[') {
-              seenBracket = true;
-            } else if (c === ']') {
-              seenBracket = false;
-            }
-            buffer += c;
-          } else {
-            err('Invalid code point in host/hostname: ' + c);
-          }
-          break;
-
-        case 'port':
-          if (/[0-9]/.test(c)) {
-            buffer += c;
-          } else if (c === EOF || c === '/' || c === '\\' ||
-                     c === '?' || c === '#' || stateOverride) {
-            if (buffer !== '') {
-              var temp = parseInt(buffer, 10);
-              if (temp !== relative[this._scheme]) {
-                this._port = temp + '';
-              }
-              buffer = '';
-            }
-            if (stateOverride) {
-              break loop;
-            }
-            state = 'relative path start';
-            continue;
-          } else if (c === '\t' || c === '\n' || c === '\r') {
-            err('Invalid code point in port: ' + c);
-          } else {
-            invalid.call(this);
-          }
-          break;
-
-        case 'relative path start':
-          if (c === '\\') {
-            err('\'\\\' not allowed in path.');
-          }
-          state = 'relative path';
-          if (c !== '/' && c !== '\\') {
-            continue;
-          }
-          break;
-
-        case 'relative path':
-          if (c === EOF || c === '/' || c === '\\' ||
-              (!stateOverride && (c === '?' || c === '#'))) {
-            if (c === '\\') {
-              err('\\ not allowed in relative path.');
-            }
-            var tmp;
-            if ((tmp = relativePathDotMapping[buffer.toLowerCase()])) {
-              buffer = tmp;
-            }
-            if (buffer === '..') {
-              this._path.pop();
-              if (c !== '/' && c !== '\\') {
-                this._path.push('');
-              }
-            } else if (buffer === '.' && c !== '/' && c !== '\\') {
-              this._path.push('');
-            } else if (buffer !== '.') {
-              if (this._scheme === 'file' && this._path.length === 0 &&
-                  buffer.length === 2 && ALPHA.test(buffer[0]) &&
-                  buffer[1] === '|') {
-                buffer = buffer[0] + ':';
-              }
-              this._path.push(buffer);
-            }
-            buffer = '';
-            if (c === '?') {
-              this._query = '?';
-              state = 'query';
-            } else if (c === '#') {
-              this._fragment = '#';
-              state = 'fragment';
-            }
-          } else if (c !== '\t' && c !== '\n' && c !== '\r') {
-            buffer += percentEscape(c);
-          }
-          break;
-
-        case 'query':
-          if (!stateOverride && c === '#') {
-            this._fragment = '#';
-            state = 'fragment';
-          } else if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
-            this._query += percentEscapeQuery(c);
-          }
-          break;
-
-        case 'fragment':
-          if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
-            this._fragment += c;
-          }
-          break;
-      }
-
-      cursor++;
-    }
-  }
-
-  function clear() {
-    this._scheme = '';
-    this._schemeData = '';
-    this._username = '';
-    this._password = null;
-    this._host = '';
-    this._port = '';
-    this._path = [];
-    this._query = '';
-    this._fragment = '';
-    this._isInvalid = false;
-    this._isRelative = false;
-  }
-
-  // Does not process domain names or IP addresses.
-  // Does not handle encoding for the query parameter.
-  function JURL(url, base /* , encoding */) {
-    if (base !== undefined && !(base instanceof JURL)) {
-      base = new JURL(String(base));
-    }
-
-    this._url = url;
-    clear.call(this);
-
-    var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');
-    // encoding = encoding || 'utf-8'
-
-    parse.call(this, input, null, base);
-  }
-
-  JURL.prototype = {
-    toString() {
-      return this.href;
-    },
-    get href() {
-      if (this._isInvalid) {
-        return this._url;
-      }
-      var authority = '';
-      if (this._username !== '' || this._password !== null) {
-        authority = this._username +
-          (this._password !== null ? ':' + this._password : '') + '@';
-      }
-
-      return this.protocol +
-          (this._isRelative ? '//' + authority + this.host : '') +
-          this.pathname + this._query + this._fragment;
-    },
-    // The named parameter should be different from the setter's function name.
-    // Otherwise Safari 5 will throw an error (see issue 8541)
-    set href(value) {
-      clear.call(this);
-      parse.call(this, value);
-    },
-
-    get protocol() {
-      return this._scheme + ':';
-    },
-    set protocol(value) {
-      if (this._isInvalid) {
-        return;
-      }
-      parse.call(this, value + ':', 'scheme start');
-    },
-
-    get host() {
-      return this._isInvalid ? '' : this._port ?
-          this._host + ':' + this._port : this._host;
-    },
-    set host(value) {
-      if (this._isInvalid || !this._isRelative) {
-        return;
-      }
-      parse.call(this, value, 'host');
-    },
-
-    get hostname() {
-      return this._host;
-    },
-    set hostname(value) {
-      if (this._isInvalid || !this._isRelative) {
-        return;
-      }
-      parse.call(this, value, 'hostname');
-    },
-
-    get port() {
-      return this._port;
-    },
-    set port(value) {
-      if (this._isInvalid || !this._isRelative) {
-        return;
-      }
-      parse.call(this, value, 'port');
-    },
-
-    get pathname() {
-      return this._isInvalid ? '' : this._isRelative ?
-          '/' + this._path.join('/') : this._schemeData;
-    },
-    set pathname(value) {
-      if (this._isInvalid || !this._isRelative) {
-        return;
-      }
-      this._path = [];
-      parse.call(this, value, 'relative path start');
-    },
-
-    get search() {
-      return this._isInvalid || !this._query || this._query === '?' ?
-          '' : this._query;
-    },
-    set search(value) {
-      if (this._isInvalid || !this._isRelative) {
-        return;
-      }
-      this._query = '?';
-      if (value[0] === '?') {
-        value = value.slice(1);
-      }
-      parse.call(this, value, 'query');
-    },
-
-    get hash() {
-      return this._isInvalid || !this._fragment || this._fragment === '#' ?
-          '' : this._fragment;
-    },
-    set hash(value) {
-      if (this._isInvalid) {
-        return;
-      }
-      this._fragment = '#';
-      if (value[0] === '#') {
-        value = value.slice(1);
-      }
-      parse.call(this, value, 'fragment');
-    },
-
-    get origin() {
-      var host;
-      if (this._isInvalid || !this._scheme) {
-        return '';
-      }
-      // javascript: Gecko returns String(""), WebKit/Blink String("null")
-      // Gecko throws error for "data://"
-      // data: Gecko returns "", Blink returns "data://", WebKit returns "null"
-      // Gecko returns String("") for file: mailto:
-      // WebKit/Blink returns String("SCHEME://") for file: mailto:
-      switch (this._scheme) {
-        case 'data':
-        case 'file':
-        case 'javascript':
-        case 'mailto':
-          return 'null';
-        case 'blob':
-          // Special case of blob: -- returns valid origin of _schemeData.
-          try {
-            return new JURL(this._schemeData).origin || 'null';
-          } catch (_) {
-            // Invalid _schemeData origin -- ignoring errors.
-          }
-          return 'null';
-      }
-      host = this.host;
-      if (!host) {
-        return '';
-      }
-      return this._scheme + '://' + host;
-    },
-  };
-
-  exports.URL = JURL;
-})();

ファイルの差分が大きいため隠しています
+ 407 - 328
image_decoders/pdf.image_decoders.js


ファイルの差分が大きいため隠しています
+ 0 - 0
image_decoders/pdf.image_decoders.js.map


ファイルの差分が大きいため隠しています
+ 0 - 0
image_decoders/pdf.image_decoders.min.js


+ 203 - 39
lib/core/annotation.js

@@ -24,6 +24,7 @@
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.getQuadPoints = getQuadPoints;
 exports.MarkupAnnotation = exports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = void 0;
 
 var _util = require("../shared/util");
@@ -56,6 +57,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 
 function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
 
+function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
+
+function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
+
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+
+function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
+
 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
 function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -184,13 +193,47 @@ function () {
 
 exports.AnnotationFactory = AnnotationFactory;
 
-function getTransformMatrix(rect, bbox, matrix) {
-  var bounds = _util.Util.getAxialAlignedBoundingBox(bbox, matrix);
+function getQuadPoints(dict, rect) {
+  if (!dict.has('QuadPoints')) {
+    return null;
+  }
+
+  var quadPoints = dict.getArray('QuadPoints');
+
+  if (!Array.isArray(quadPoints) || quadPoints.length % 8 > 0) {
+    return null;
+  }
+
+  var quadPointsLists = [];
+
+  for (var i = 0, ii = quadPoints.length / 8; i < ii; i++) {
+    quadPointsLists.push([]);
 
-  var minX = bounds[0];
-  var minY = bounds[1];
-  var maxX = bounds[2];
-  var maxY = bounds[3];
+    for (var j = i * 8, jj = i * 8 + 8; j < jj; j += 2) {
+      var x = quadPoints[j];
+      var y = quadPoints[j + 1];
+
+      if (x < rect[0] || x > rect[2] || y < rect[1] || y > rect[3]) {
+        return null;
+      }
+
+      quadPointsLists[i].push({
+        x: x,
+        y: y
+      });
+    }
+  }
+
+  return quadPointsLists;
+}
+
+function getTransformMatrix(rect, bbox, matrix) {
+  var _Util$getAxialAligned = _util.Util.getAxialAlignedBoundingBox(bbox, matrix),
+      _Util$getAxialAligned2 = _slicedToArray(_Util$getAxialAligned, 4),
+      minX = _Util$getAxialAligned2[0],
+      minY = _Util$getAxialAligned2[1],
+      maxX = _Util$getAxialAligned2[2],
+      maxY = _Util$getAxialAligned2[3];
 
   if (minX === maxX || minY === maxY) {
     return [1, 0, 0, 1, rect[0], rect[1]];
@@ -519,16 +562,34 @@ function () {
       if (Array.isArray(dashArray) && dashArray.length > 0) {
         var isValid = true;
         var allZeros = true;
-
-        for (var i = 0, len = dashArray.length; i < len; i++) {
-          var element = dashArray[i];
-          var validNumber = +element >= 0;
-
-          if (!validNumber) {
-            isValid = false;
-            break;
-          } else if (element > 0) {
-            allZeros = false;
+        var _iteratorNormalCompletion = true;
+        var _didIteratorError = false;
+        var _iteratorError = undefined;
+
+        try {
+          for (var _iterator = dashArray[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+            var element = _step.value;
+            var validNumber = +element >= 0;
+
+            if (!validNumber) {
+              isValid = false;
+              break;
+            } else if (element > 0) {
+              allZeros = false;
+            }
+          }
+        } catch (err) {
+          _didIteratorError = true;
+          _iteratorError = err;
+        } finally {
+          try {
+            if (!_iteratorNormalCompletion && _iterator["return"] != null) {
+              _iterator["return"]();
+            }
+          } finally {
+            if (_didIteratorError) {
+              throw _iteratorError;
+            }
           }
         }
 
@@ -575,15 +636,59 @@ function (_Annotation) {
     _this2 = _possibleConstructorReturn(this, _getPrototypeOf(MarkupAnnotation).call(this, parameters));
     var dict = parameters.dict;
 
-    if (!dict.has('C')) {
-      _this2.data.color = null;
+    if (dict.has('IRT')) {
+      var rawIRT = dict.getRaw('IRT');
+      _this2.data.inReplyTo = (0, _primitives.isRef)(rawIRT) ? rawIRT.toString() : null;
+      var rt = dict.get('RT');
+      _this2.data.replyType = (0, _primitives.isName)(rt) ? rt.name : _util.AnnotationReplyType.REPLY;
     }
 
-    _this2.setCreationDate(dict.get('CreationDate'));
+    if (_this2.data.replyType === _util.AnnotationReplyType.GROUP) {
+      var parent = dict.get('IRT');
+      _this2.data.title = (0, _util.stringToPDFString)(parent.get('T') || '');
+
+      _this2.setContents(parent.get('Contents'));
+
+      _this2.data.contents = _this2.contents;
+
+      if (!parent.has('CreationDate')) {
+        _this2.data.creationDate = null;
+      } else {
+        _this2.setCreationDate(parent.get('CreationDate'));
+
+        _this2.data.creationDate = _this2.creationDate;
+      }
+
+      if (!parent.has('M')) {
+        _this2.data.modificationDate = null;
+      } else {
+        _this2.setModificationDate(parent.get('M'));
+
+        _this2.data.modificationDate = _this2.modificationDate;
+      }
+
+      _this2.data.hasPopup = parent.has('Popup');
+
+      if (!parent.has('C')) {
+        _this2.data.color = null;
+      } else {
+        _this2.setColor(parent.getArray('C'));
+
+        _this2.data.color = _this2.color;
+      }
+    } else {
+      _this2.data.title = (0, _util.stringToPDFString)(dict.get('T') || '');
+
+      _this2.setCreationDate(dict.get('CreationDate'));
+
+      _this2.data.creationDate = _this2.creationDate;
+      _this2.data.hasPopup = dict.has('Popup');
+
+      if (!dict.has('C')) {
+        _this2.data.color = null;
+      }
+    }
 
-    _this2.data.creationDate = _this2.creationDate;
-    _this2.data.hasPopup = dict.has('Popup');
-    _this2.data.title = (0, _util.stringToPDFString)(dict.get('T') || '');
     return _this2;
   }
 
@@ -854,12 +959,31 @@ function (_WidgetAnnotation2) {
         return;
       }
 
-      var keys = normalAppearanceState.getKeys();
+      var _iteratorNormalCompletion2 = true;
+      var _didIteratorError2 = false;
+      var _iteratorError2 = undefined;
 
-      for (var i = 0, ii = keys.length; i < ii; i++) {
-        if (keys[i] !== 'Off') {
-          this.data.buttonValue = keys[i];
-          break;
+      try {
+        for (var _iterator2 = normalAppearanceState.getKeys()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
+          var key = _step2.value;
+
+          if (key !== 'Off') {
+            this.data.buttonValue = key;
+            break;
+          }
+        }
+      } catch (err) {
+        _didIteratorError2 = true;
+        _iteratorError2 = err;
+      } finally {
+        try {
+          if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
+            _iterator2["return"]();
+          }
+        } finally {
+          if (_didIteratorError2) {
+            throw _iteratorError2;
+          }
         }
       }
     }
@@ -936,6 +1060,7 @@ function (_MarkupAnnotation) {
 
     var DEFAULT_ICON_SIZE = 22;
     _this7 = _possibleConstructorReturn(this, _getPrototypeOf(TextAnnotation).call(this, parameters));
+    var dict = parameters.dict;
     _this7.data.annotationType = _util.AnnotationType.TEXT;
 
     if (_this7.data.hasAppearance) {
@@ -943,7 +1068,15 @@ function (_MarkupAnnotation) {
     } else {
       _this7.data.rect[1] = _this7.data.rect[3] - DEFAULT_ICON_SIZE;
       _this7.data.rect[2] = _this7.data.rect[0] + DEFAULT_ICON_SIZE;
-      _this7.data.name = parameters.dict.has('Name') ? parameters.dict.get('Name').name : 'Note';
+      _this7.data.name = dict.has('Name') ? dict.get('Name').name : 'Note';
+    }
+
+    if (dict.has('State')) {
+      _this7.data.state = dict.get('State') || null;
+      _this7.data.stateModel = dict.get('StateModel') || null;
+    } else {
+      _this7.data.state = null;
+      _this7.data.stateModel = null;
     }
 
     return _this7;
@@ -964,6 +1097,11 @@ function (_Annotation3) {
 
     _this8 = _possibleConstructorReturn(this, _getPrototypeOf(LinkAnnotation).call(this, params));
     _this8.data.annotationType = _util.AnnotationType.LINK;
+    var quadPoints = getQuadPoints(params.dict, _this8.rectangle);
+
+    if (quadPoints) {
+      _this8.data.quadPoints = quadPoints;
+    }
 
     _obj.Catalog.parseDestDictionary({
       destDict: params.dict,
@@ -989,8 +1127,7 @@ function (_Annotation4) {
 
     _this9 = _possibleConstructorReturn(this, _getPrototypeOf(PopupAnnotation).call(this, parameters));
     _this9.data.annotationType = _util.AnnotationType.POPUP;
-    var dict = parameters.dict;
-    var parentItem = dict.get('Parent');
+    var parentItem = parameters.dict.get('Parent');
 
     if (!parentItem) {
       (0, _util.warn)('Popup annotation has a missing or invalid parent annotation.');
@@ -999,9 +1136,13 @@ function (_Annotation4) {
 
     var parentSubtype = parentItem.get('Subtype');
     _this9.data.parentType = (0, _primitives.isName)(parentSubtype) ? parentSubtype.name : null;
-    _this9.data.parentId = dict.getRaw('Parent').toString();
-    _this9.data.title = (0, _util.stringToPDFString)(parentItem.get('T') || '');
-    _this9.data.contents = (0, _util.stringToPDFString)(parentItem.get('Contents') || '');
+    var rawParent = parameters.dict.getRaw('Parent');
+    _this9.data.parentId = (0, _primitives.isRef)(rawParent) ? rawParent.toString() : null;
+    var rt = parentItem.get('RT');
+
+    if ((0, _primitives.isName)(rt, _util.AnnotationReplyType.GROUP)) {
+      parentItem = parentItem.get('IRT');
+    }
 
     if (!parentItem.has('M')) {
       _this9.data.modificationDate = null;
@@ -1027,6 +1168,8 @@ function (_Annotation4) {
       }
     }
 
+    _this9.data.title = (0, _util.stringToPDFString)(parentItem.get('T') || '');
+    _this9.data.contents = (0, _util.stringToPDFString)(parentItem.get('Contents') || '');
     return _this9;
   }
 
@@ -1063,8 +1206,7 @@ function (_MarkupAnnotation3) {
 
     _this11 = _possibleConstructorReturn(this, _getPrototypeOf(LineAnnotation).call(this, parameters));
     _this11.data.annotationType = _util.AnnotationType.LINE;
-    var dict = parameters.dict;
-    _this11.data.lineCoordinates = _util.Util.normalizeRect(dict.getArray('L'));
+    _this11.data.lineCoordinates = _util.Util.normalizeRect(parameters.dict.getArray('L'));
     return _this11;
   }
 
@@ -1119,8 +1261,7 @@ function (_MarkupAnnotation6) {
 
     _this14 = _possibleConstructorReturn(this, _getPrototypeOf(PolylineAnnotation).call(this, parameters));
     _this14.data.annotationType = _util.AnnotationType.POLYLINE;
-    var dict = parameters.dict;
-    var rawVertices = dict.getArray('Vertices');
+    var rawVertices = parameters.dict.getArray('Vertices');
     _this14.data.vertices = [];
 
     for (var i = 0, ii = rawVertices.length; i < ii; i += 2) {
@@ -1184,9 +1325,8 @@ function (_MarkupAnnotation8) {
 
     _this17 = _possibleConstructorReturn(this, _getPrototypeOf(InkAnnotation).call(this, parameters));
     _this17.data.annotationType = _util.AnnotationType.INK;
-    var dict = parameters.dict;
     var xref = parameters.xref;
-    var originalInkLists = dict.getArray('InkList');
+    var originalInkLists = parameters.dict.getArray('InkList');
     _this17.data.inkLists = [];
 
     for (var i = 0, ii = originalInkLists.length; i < ii; ++i) {
@@ -1218,6 +1358,12 @@ function (_MarkupAnnotation9) {
 
     _this18 = _possibleConstructorReturn(this, _getPrototypeOf(HighlightAnnotation).call(this, parameters));
     _this18.data.annotationType = _util.AnnotationType.HIGHLIGHT;
+    var quadPoints = getQuadPoints(parameters.dict, _this18.rectangle);
+
+    if (quadPoints) {
+      _this18.data.quadPoints = quadPoints;
+    }
+
     return _this18;
   }
 
@@ -1236,6 +1382,12 @@ function (_MarkupAnnotation10) {
 
     _this19 = _possibleConstructorReturn(this, _getPrototypeOf(UnderlineAnnotation).call(this, parameters));
     _this19.data.annotationType = _util.AnnotationType.UNDERLINE;
+    var quadPoints = getQuadPoints(parameters.dict, _this19.rectangle);
+
+    if (quadPoints) {
+      _this19.data.quadPoints = quadPoints;
+    }
+
     return _this19;
   }
 
@@ -1254,6 +1406,12 @@ function (_MarkupAnnotation11) {
 
     _this20 = _possibleConstructorReturn(this, _getPrototypeOf(SquigglyAnnotation).call(this, parameters));
     _this20.data.annotationType = _util.AnnotationType.SQUIGGLY;
+    var quadPoints = getQuadPoints(parameters.dict, _this20.rectangle);
+
+    if (quadPoints) {
+      _this20.data.quadPoints = quadPoints;
+    }
+
     return _this20;
   }
 
@@ -1272,6 +1430,12 @@ function (_MarkupAnnotation12) {
 
     _this21 = _possibleConstructorReturn(this, _getPrototypeOf(StrikeOutAnnotation).call(this, parameters));
     _this21.data.annotationType = _util.AnnotationType.STRIKEOUT;
+    var quadPoints = getQuadPoints(parameters.dict, _this21.rectangle);
+
+    if (quadPoints) {
+      _this21.data.quadPoints = quadPoints;
+    }
+
     return _this21;
   }
 

+ 32 - 9
lib/core/chunked_stream.js

@@ -190,7 +190,10 @@ function () {
         return -1;
       }
 
-      this.ensureByte(pos);
+      if (pos >= this.progressiveDataLength) {
+        this.ensureByte(pos);
+      }
+
       return this.bytes[this.pos++];
     }
   }, {
@@ -223,7 +226,9 @@ function () {
       var strEnd = this.end;
 
       if (!length) {
-        this.ensureRange(pos, strEnd);
+        if (strEnd > this.progressiveDataLength) {
+          this.ensureRange(pos, strEnd);
+        }
 
         var _subarray = bytes.subarray(pos, strEnd);
 
@@ -236,7 +241,10 @@ function () {
         end = strEnd;
       }
 
-      this.ensureRange(pos, end);
+      if (end > this.progressiveDataLength) {
+        this.ensureRange(pos, end);
+      }
+
       this.pos = end;
       var subarray = bytes.subarray(pos, end);
       return forceClamped ? new Uint8ClampedArray(subarray) : subarray;
@@ -259,7 +267,18 @@ function () {
   }, {
     key: "getByteRange",
     value: function getByteRange(begin, end) {
-      this.ensureRange(begin, end);
+      if (begin < 0) {
+        begin = 0;
+      }
+
+      if (end > this.end) {
+        end = this.end;
+      }
+
+      if (end > this.progressiveDataLength) {
+        this.ensureRange(begin, end);
+      }
+
       return this.bytes.subarray(begin, end);
     }
   }, {
@@ -285,9 +304,13 @@ function () {
     key: "makeSubStream",
     value: function makeSubStream(start, length, dict) {
       if (length) {
-        this.ensureRange(start, start + length);
+        if (start + length > this.progressiveDataLength) {
+          this.ensureRange(start, start + length);
+        }
       } else {
-        this.ensureByte(start);
+        if (start >= this.progressiveDataLength) {
+          this.ensureByte(start);
+        }
       }
 
       function ChunkedStreamSubstream() {}
@@ -714,15 +737,15 @@ function () {
     }
   }, {
     key: "abort",
-    value: function abort() {
+    value: function abort(reason) {
       this.aborted = true;
 
       if (this.pdfNetworkStream) {
-        this.pdfNetworkStream.cancelAllRequests('abort');
+        this.pdfNetworkStream.cancelAllRequests(reason);
       }
 
       for (var requestId in this.promisesByRequest) {
-        this.promisesByRequest[requestId].reject(new Error('Request was aborted'));
+        this.promisesByRequest[requestId].reject(reason);
       }
     }
   }]);

+ 48 - 22
lib/core/core_utils.js

@@ -31,6 +31,20 @@ exports.XRefParseException = exports.XRefEntryException = exports.MissingDataExc
 
 var _util = require("../shared/util");
 
+function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
+
+function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
+
+function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
+
+function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
+
 function getLookupTableFactory(initializer) {
   var lookup;
   return function () {
@@ -44,44 +58,56 @@ function getLookupTableFactory(initializer) {
   };
 }
 
-var MissingDataException = function MissingDataExceptionClosure() {
+var MissingDataException =
+/*#__PURE__*/
+function (_BaseException) {
+  _inherits(MissingDataException, _BaseException);
+
   function MissingDataException(begin, end) {
-    this.begin = begin;
-    this.end = end;
-    this.message = "Missing data [".concat(begin, ", ").concat(end, ")");
+    var _this;
+
+    _classCallCheck(this, MissingDataException);
+
+    _this = _possibleConstructorReturn(this, _getPrototypeOf(MissingDataException).call(this, "Missing data [".concat(begin, ", ").concat(end, ")")));
+    _this.begin = begin;
+    _this.end = end;
+    return _this;
   }
 
-  MissingDataException.prototype = new Error();
-  MissingDataException.prototype.name = 'MissingDataException';
-  MissingDataException.constructor = MissingDataException;
   return MissingDataException;
-}();
+}(_util.BaseException);
 
 exports.MissingDataException = MissingDataException;
 
-var XRefEntryException = function XRefEntryExceptionClosure() {
-  function XRefEntryException(msg) {
-    this.message = msg;
+var XRefEntryException =
+/*#__PURE__*/
+function (_BaseException2) {
+  _inherits(XRefEntryException, _BaseException2);
+
+  function XRefEntryException() {
+    _classCallCheck(this, XRefEntryException);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(XRefEntryException).apply(this, arguments));
   }
 
-  XRefEntryException.prototype = new Error();
-  XRefEntryException.prototype.name = 'XRefEntryException';
-  XRefEntryException.constructor = XRefEntryException;
   return XRefEntryException;
-}();
+}(_util.BaseException);
 
 exports.XRefEntryException = XRefEntryException;
 
-var XRefParseException = function XRefParseExceptionClosure() {
-  function XRefParseException(msg) {
-    this.message = msg;
+var XRefParseException =
+/*#__PURE__*/
+function (_BaseException3) {
+  _inherits(XRefParseException, _BaseException3);
+
+  function XRefParseException() {
+    _classCallCheck(this, XRefParseException);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(XRefParseException).apply(this, arguments));
   }
 
-  XRefParseException.prototype = new Error();
-  XRefParseException.prototype.name = 'XRefParseException';
-  XRefParseException.constructor = XRefParseException;
   return XRefParseException;
-}();
+}(_util.BaseException);
 
 exports.XRefParseException = XRefParseException;
 

+ 44 - 33
lib/core/document.js

@@ -52,7 +52,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 
@@ -128,6 +128,21 @@ function () {
 
       return _primitives.Dict.merge(this.xref, value);
     }
+  }, {
+    key: "_getBoundingBox",
+    value: function _getBoundingBox(name) {
+      var box = this._getInheritableProperty(name, true);
+
+      if (Array.isArray(box) && box.length === 4) {
+        if (box[2] - box[0] !== 0 && box[3] - box[1] !== 0) {
+          return box;
+        }
+
+        (0, _util.warn)("Empty /".concat(name, " entry."));
+      }
+
+      return null;
+    }
   }, {
     key: "getContentStream",
     value: function getContentStream() {
@@ -190,6 +205,7 @@ function () {
       var _this2 = this;
 
       var handler = _ref2.handler,
+          sink = _ref2.sink,
           task = _ref2.task,
           intent = _ref2.intent,
           renderInteractiveForms = _ref2.renderInteractiveForms;
@@ -210,7 +226,7 @@ function () {
         var _ref4 = _slicedToArray(_ref3, 1),
             contentStream = _ref4[0];
 
-        var opList = new _operator_list.OperatorList(intent, handler, _this2.pageIndex);
+        var opList = new _operator_list.OperatorList(intent, sink, _this2.pageIndex);
         handler.send('StartRenderPage', {
           transparency: partialEvaluator.hasBlendModes(_this2.resources),
           pageIndex: _this2.pageIndex,
@@ -232,7 +248,9 @@ function () {
 
         if (annotations.length === 0) {
           pageOpList.flush(true);
-          return pageOpList;
+          return {
+            length: pageOpList.totalLength
+          };
         }
 
         var opListPromises = [];
@@ -291,7 +309,9 @@ function () {
 
           pageOpList.addOp(_util.OPS.endAnnotations, []);
           pageOpList.flush(true);
-          return pageOpList;
+          return {
+            length: pageOpList.totalLength
+          };
         });
       });
     }
@@ -360,24 +380,12 @@ function () {
   }, {
     key: "mediaBox",
     get: function get() {
-      var mediaBox = this._getInheritableProperty('MediaBox', true);
-
-      if (!Array.isArray(mediaBox) || mediaBox.length !== 4) {
-        return (0, _util.shadow)(this, 'mediaBox', LETTER_SIZE_MEDIABOX);
-      }
-
-      return (0, _util.shadow)(this, 'mediaBox', mediaBox);
+      return (0, _util.shadow)(this, 'mediaBox', this._getBoundingBox('MediaBox') || LETTER_SIZE_MEDIABOX);
     }
   }, {
     key: "cropBox",
     get: function get() {
-      var cropBox = this._getInheritableProperty('CropBox', true);
-
-      if (!Array.isArray(cropBox) || cropBox.length !== 4) {
-        return (0, _util.shadow)(this, 'cropBox', this.mediaBox);
-      }
-
-      return (0, _util.shadow)(this, 'cropBox', cropBox);
+      return (0, _util.shadow)(this, 'cropBox', this._getBoundingBox('CropBox') || this.mediaBox);
     }
   }, {
     key: "userUnit",
@@ -393,16 +401,23 @@ function () {
   }, {
     key: "view",
     get: function get() {
-      var mediaBox = this.mediaBox,
-          cropBox = this.cropBox;
+      var cropBox = this.cropBox,
+          mediaBox = this.mediaBox;
+      var view;
 
-      if (mediaBox === cropBox) {
-        return (0, _util.shadow)(this, 'view', mediaBox);
-      }
+      if (cropBox === mediaBox || (0, _util.isArrayEqual)(cropBox, mediaBox)) {
+        view = mediaBox;
+      } else {
+        var box = _util.Util.intersect(cropBox, mediaBox);
 
-      var intersection = _util.Util.intersect(cropBox, mediaBox);
+        if (box && box[2] - box[0] !== 0 && box[3] - box[1] !== 0) {
+          view = box;
+        } else {
+          (0, _util.warn)('Empty /CropBox and /MediaBox intersection.');
+        }
+      }
 
-      return (0, _util.shadow)(this, 'view', intersection || mediaBox);
+      return (0, _util.shadow)(this, 'view', view || mediaBox);
     }
   }, {
     key: "rotate",
@@ -834,21 +849,17 @@ function () {
       if (Array.isArray(idArray) && idArray[0] && (0, _util.isString)(idArray[0]) && idArray[0] !== EMPTY_FINGERPRINT) {
         hash = (0, _util.stringToBytes)(idArray[0]);
       } else {
-        if (this.stream.ensureRange) {
-          this.stream.ensureRange(0, Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end));
-        }
-
-        hash = (0, _crypto.calculateMD5)(this.stream.bytes.subarray(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);
+        hash = (0, _crypto.calculateMD5)(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);
       }
 
-      var fingerprint = '';
+      var fingerprintBuf = [];
 
       for (var i = 0, ii = hash.length; i < ii; i++) {
         var hex = hash[i].toString(16);
-        fingerprint += hex.length === 1 ? '0' + hex : hex;
+        fingerprintBuf.push(hex.padStart(2, '0'));
       }
 
-      return (0, _util.shadow)(this, 'fingerprint', fingerprint);
+      return (0, _util.shadow)(this, 'fingerprint', fingerprintBuf.join(''));
     }
   }]);
 

+ 68 - 32
lib/core/evaluator.js

@@ -114,7 +114,7 @@ var PartialEvaluator = function PartialEvaluatorClosure() {
       var _ref2 = _asyncToGenerator(
       /*#__PURE__*/
       _regenerator["default"].mark(function _callee(name) {
-        var data;
+        var readableStream, reader, data;
         return _regenerator["default"].wrap(function _callee$(_context) {
           while (1) {
             switch (_context.prev = _context.next) {
@@ -127,12 +127,30 @@ var PartialEvaluator = function PartialEvaluatorClosure() {
                 return _context.abrupt("return", _this.builtInCMapCache.get(name));
 
               case 2:
-                _context.next = 4;
-                return _this.handler.sendWithPromise('FetchBuiltInCMap', {
+                readableStream = _this.handler.sendWithStream('FetchBuiltInCMap', {
                   name: name
                 });
+                reader = readableStream.getReader();
+                _context.next = 6;
+                return new Promise(function (resolve, reject) {
+                  function pump() {
+                    reader.read().then(function (_ref3) {
+                      var value = _ref3.value,
+                          done = _ref3.done;
+
+                      if (done) {
+                        return;
+                      }
+
+                      resolve(value);
+                      pump();
+                    }, reject);
+                  }
+
+                  pump();
+                });
 
-              case 4:
+              case 6:
                 data = _context.sent;
 
                 if (data.compressionType !== _util.CMapCompressionType.NONE) {
@@ -141,7 +159,7 @@ var PartialEvaluator = function PartialEvaluatorClosure() {
 
                 return _context.abrupt("return", data);
 
-              case 7:
+              case 9:
               case "end":
                 return _context.stop();
             }
@@ -355,7 +373,13 @@ var PartialEvaluator = function PartialEvaluatorClosure() {
           groupOptions.knockout = group.get('K') || false;
 
           if (group.has('CS')) {
-            colorSpace = _colorspace.ColorSpace.parse(group.get('CS'), this.xref, resources, this.pdfFunctionFactory);
+            colorSpace = group.get('CS');
+
+            if (colorSpace) {
+              colorSpace = _colorspace.ColorSpace.parse(colorSpace, this.xref, resources, this.pdfFunctionFactory);
+            } else {
+              (0, _util.warn)('buildFormXObject - invalid/non-existent Group /CS entry: ' + group.getRaw('CS'));
+            }
           }
         }
 
@@ -385,16 +409,16 @@ var PartialEvaluator = function PartialEvaluatorClosure() {
     buildPaintImageXObject: function () {
       var _buildPaintImageXObject = _asyncToGenerator(
       /*#__PURE__*/
-      _regenerator["default"].mark(function _callee2(_ref3) {
+      _regenerator["default"].mark(function _callee2(_ref4) {
         var _this2 = this;
 
-        var resources, image, _ref3$isInline, isInline, operatorList, cacheKey, imageCache, _ref3$forceDisableNat, forceDisableNativeImageDecoder, dict, w, h, maxImageSize, imageMask, imgData, args, width, height, bitStrideLength, imgArray, decode, softMask, mask, SMALL_IMAGE_DIMENSIONS, imageObj, nativeImageDecoderSupport, objId, nativeImageDecoder, imgPromise;
+        var resources, image, _ref4$isInline, isInline, operatorList, cacheKey, imageCache, _ref4$forceDisableNat, forceDisableNativeImageDecoder, dict, w, h, maxImageSize, imageMask, imgData, args, width, height, bitStrideLength, imgArray, decode, softMask, mask, SMALL_IMAGE_DIMENSIONS, imageObj, nativeImageDecoderSupport, objId, nativeImageDecoder, imgPromise;
 
         return _regenerator["default"].wrap(function _callee2$(_context2) {
           while (1) {
             switch (_context2.prev = _context2.next) {
               case 0:
-                resources = _ref3.resources, image = _ref3.image, _ref3$isInline = _ref3.isInline, isInline = _ref3$isInline === void 0 ? false : _ref3$isInline, operatorList = _ref3.operatorList, cacheKey = _ref3.cacheKey, imageCache = _ref3.imageCache, _ref3$forceDisableNat = _ref3.forceDisableNativeImageDecoder, forceDisableNativeImageDecoder = _ref3$forceDisableNat === void 0 ? false : _ref3$forceDisableNat;
+                resources = _ref4.resources, image = _ref4.image, _ref4$isInline = _ref4.isInline, isInline = _ref4$isInline === void 0 ? false : _ref4$isInline, operatorList = _ref4.operatorList, cacheKey = _ref4.cacheKey, imageCache = _ref4.imageCache, _ref4$forceDisableNat = _ref4.forceDisableNativeImageDecoder, forceDisableNativeImageDecoder = _ref4$forceDisableNat === void 0 ? false : _ref4$forceDisableNat;
                 dict = image.dict;
                 w = dict.get('Width', 'W');
                 h = dict.get('Height', 'H');
@@ -635,6 +659,10 @@ var PartialEvaluator = function PartialEvaluatorClosure() {
         operatorList.addDependencies(tilingOpList.dependencies);
         operatorList.addOp(fn, tilingPatternIR);
       }, function (reason) {
+        if (reason instanceof _util.AbortException) {
+          return;
+        }
+
         if (_this3.options.ignoreErrors) {
           _this3.handler.send('UnsupportedFeature', {
             featureId: _util.UNSUPPORTED_FEATURES.unknown
@@ -994,15 +1022,15 @@ var PartialEvaluator = function PartialEvaluatorClosure() {
 
       return handleColorN;
     }(),
-    getOperatorList: function getOperatorList(_ref4) {
+    getOperatorList: function getOperatorList(_ref5) {
       var _this7 = this;
 
-      var stream = _ref4.stream,
-          task = _ref4.task,
-          resources = _ref4.resources,
-          operatorList = _ref4.operatorList,
-          _ref4$initialState = _ref4.initialState,
-          initialState = _ref4$initialState === void 0 ? null : _ref4$initialState;
+      var stream = _ref5.stream,
+          task = _ref5.task,
+          resources = _ref5.resources,
+          operatorList = _ref5.operatorList,
+          _ref5$initialState = _ref5.initialState,
+          initialState = _ref5$initialState === void 0 ? null : _ref5$initialState;
       resources = resources || _primitives.Dict.empty;
       initialState = initialState || new EvalState();
 
@@ -1031,7 +1059,7 @@ var PartialEvaluator = function PartialEvaluatorClosure() {
 
       return new Promise(function promiseBody(resolve, reject) {
         var next = function next(promise) {
-          promise.then(function () {
+          Promise.all([promise, operatorList.ready]).then(function () {
             try {
               promiseBody(resolve, reject);
             } catch (ex) {
@@ -1115,6 +1143,10 @@ var PartialEvaluator = function PartialEvaluatorClosure() {
 
                 resolveXObject();
               })["catch"](function (reason) {
+                if (reason instanceof _util.AbortException) {
+                  return;
+                }
+
                 if (self.options.ignoreErrors) {
                   self.handler.send('UnsupportedFeature', {
                     featureId: _util.UNSUPPORTED_FEATURES.unknown
@@ -1364,6 +1396,10 @@ var PartialEvaluator = function PartialEvaluatorClosure() {
         closePendingRestoreOPS();
         resolve();
       })["catch"](function (reason) {
+        if (reason instanceof _util.AbortException) {
+          return;
+        }
+
         if (_this7.options.ignoreErrors) {
           _this7.handler.send('UnsupportedFeature', {
             featureId: _util.UNSUPPORTED_FEATURES.unknown
@@ -1377,21 +1413,21 @@ var PartialEvaluator = function PartialEvaluatorClosure() {
         throw reason;
       });
     },
-    getTextContent: function getTextContent(_ref5) {
+    getTextContent: function getTextContent(_ref6) {
       var _this8 = this;
 
-      var stream = _ref5.stream,
-          task = _ref5.task,
-          resources = _ref5.resources,
-          _ref5$stateManager = _ref5.stateManager,
-          stateManager = _ref5$stateManager === void 0 ? null : _ref5$stateManager,
-          _ref5$normalizeWhites = _ref5.normalizeWhitespace,
-          normalizeWhitespace = _ref5$normalizeWhites === void 0 ? false : _ref5$normalizeWhites,
-          _ref5$combineTextItem = _ref5.combineTextItems,
-          combineTextItems = _ref5$combineTextItem === void 0 ? false : _ref5$combineTextItem,
-          sink = _ref5.sink,
-          _ref5$seenStyles = _ref5.seenStyles,
-          seenStyles = _ref5$seenStyles === void 0 ? Object.create(null) : _ref5$seenStyles;
+      var stream = _ref6.stream,
+          task = _ref6.task,
+          resources = _ref6.resources,
+          _ref6$stateManager = _ref6.stateManager,
+          stateManager = _ref6$stateManager === void 0 ? null : _ref6$stateManager,
+          _ref6$normalizeWhites = _ref6.normalizeWhitespace,
+          normalizeWhitespace = _ref6$normalizeWhites === void 0 ? false : _ref6$normalizeWhites,
+          _ref6$combineTextItem = _ref6.combineTextItems,
+          combineTextItems = _ref6$combineTextItem === void 0 ? false : _ref6$combineTextItem,
+          sink = _ref6.sink,
+          _ref6$seenStyles = _ref6.seenStyles,
+          seenStyles = _ref6$seenStyles === void 0 ? Object.create(null) : _ref6$seenStyles;
       resources = resources || _primitives.Dict.empty;
       stateManager = stateManager || new StateManager(new TextState());
       var WhitespaceRegexp = /\s/g;
@@ -3352,7 +3388,7 @@ var EvaluatorPreprocessor = function EvaluatorPreprocessorClosure() {
       while (true) {
         var obj = this.parser.getObj();
 
-        if ((0, _primitives.isCmd)(obj)) {
+        if (obj instanceof _primitives.Cmd) {
           var cmd = obj.cmd;
           var opSpec = this.opMap[cmd];
 
@@ -3409,7 +3445,7 @@ var EvaluatorPreprocessor = function EvaluatorPreprocessorClosure() {
           return true;
         }
 
-        if ((0, _primitives.isEOF)(obj)) {
+        if (obj === _primitives.EOF) {
           return false;
         }
 

+ 2 - 2
lib/core/fonts.js

@@ -53,7 +53,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 
@@ -2923,7 +2923,7 @@ var Type1Font = function Type1FontClosure() {
 
     var eexecBlock = getEexecBlock(file, eexecBlockLength);
     var eexecBlockParser = new _type1_parser.Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED);
-    var data = eexecBlockParser.extractFontProgram();
+    var data = eexecBlockParser.extractFontProgram(properties);
 
     for (var info in data.properties) {
       properties[info] = data.properties[info];

+ 1 - 0
lib/core/glyphlist.js

@@ -1833,6 +1833,7 @@ var getGlyphsUnicode = getLookupTableFactory(function (t) {
   t['feicoptic'] = 0x03E5;
   t['female'] = 0x2640;
   t['ff'] = 0xFB00;
+  t['f_f'] = 0xFB00;
   t['ffi'] = 0xFB03;
   t['ffl'] = 0xFB04;
   t['fi'] = 0xFB01;

+ 1 - 1
lib/core/image.js

@@ -42,7 +42,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 

+ 23 - 6
lib/core/jbig2.js

@@ -32,16 +32,33 @@ var _arithmetic_decoder = require("./arithmetic_decoder");
 
 var _ccitt = require("./ccitt");
 
-var Jbig2Error = function Jbig2ErrorClosure() {
+function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
+
+function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
+
+function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
+
+function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
+
+var Jbig2Error =
+/*#__PURE__*/
+function (_BaseException) {
+  _inherits(Jbig2Error, _BaseException);
+
   function Jbig2Error(msg) {
-    this.message = 'JBIG2 error: ' + msg;
+    _classCallCheck(this, Jbig2Error);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(Jbig2Error).call(this, "JBIG2 error: ".concat(msg)));
   }
 
-  Jbig2Error.prototype = new Error();
-  Jbig2Error.prototype.name = 'Jbig2Error';
-  Jbig2Error.constructor = Jbig2Error;
   return Jbig2Error;
-}();
+}(_util.BaseException);
 
 var Jbig2Image = function Jbig2ImageClosure() {
   function ContextCache() {}

+ 54 - 23
lib/core/jpg.js

@@ -30,39 +30,63 @@ var _util = require("../shared/util");
 
 function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
 
-var JpegError = function JpegErrorClosure() {
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
+
+function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
+
+function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
+
+function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
+
+var JpegError =
+/*#__PURE__*/
+function (_BaseException) {
+  _inherits(JpegError, _BaseException);
+
   function JpegError(msg) {
-    this.message = 'JPEG error: ' + msg;
+    _classCallCheck(this, JpegError);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(JpegError).call(this, "JPEG error: ".concat(msg)));
   }
 
-  JpegError.prototype = new Error();
-  JpegError.prototype.name = 'JpegError';
-  JpegError.constructor = JpegError;
   return JpegError;
-}();
+}(_util.BaseException);
+
+var DNLMarkerError =
+/*#__PURE__*/
+function (_BaseException2) {
+  _inherits(DNLMarkerError, _BaseException2);
 
-var DNLMarkerError = function DNLMarkerErrorClosure() {
   function DNLMarkerError(message, scanLines) {
-    this.message = message;
-    this.scanLines = scanLines;
+    var _this;
+
+    _classCallCheck(this, DNLMarkerError);
+
+    _this = _possibleConstructorReturn(this, _getPrototypeOf(DNLMarkerError).call(this, message));
+    _this.scanLines = scanLines;
+    return _this;
   }
 
-  DNLMarkerError.prototype = new Error();
-  DNLMarkerError.prototype.name = 'DNLMarkerError';
-  DNLMarkerError.constructor = DNLMarkerError;
   return DNLMarkerError;
-}();
+}(_util.BaseException);
+
+var EOIMarkerError =
+/*#__PURE__*/
+function (_BaseException3) {
+  _inherits(EOIMarkerError, _BaseException3);
+
+  function EOIMarkerError() {
+    _classCallCheck(this, EOIMarkerError);
 
-var EOIMarkerError = function EOIMarkerErrorClosure() {
-  function EOIMarkerError(message) {
-    this.message = message;
+    return _possibleConstructorReturn(this, _getPrototypeOf(EOIMarkerError).apply(this, arguments));
   }
 
-  EOIMarkerError.prototype = new Error();
-  EOIMarkerError.prototype.name = 'EOIMarkerError';
-  EOIMarkerError.constructor = EOIMarkerError;
   return EOIMarkerError;
-}();
+}(_util.BaseException);
 
 var JpegImage = function JpegImageClosure() {
   var dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
@@ -457,7 +481,9 @@ var JpegImage = function JpegImageClosure() {
       bitsCount = 0;
       fileMarker = findNextFileMarker(data, offset);
 
-      if (fileMarker && fileMarker.invalid) {
+      if (!fileMarker) {
+        break;
+      } else if (fileMarker.invalid) {
         (0, _util.warn)('decodeScan - unexpected MCU data, current marker is: ' + fileMarker.invalid);
         offset = fileMarker.offset;
       }
@@ -465,7 +491,7 @@ var JpegImage = function JpegImageClosure() {
       var marker = fileMarker && fileMarker.marker;
 
       if (!marker || marker <= 0xFF00) {
-        throw new JpegError('marker was not found');
+        throw new JpegError('decodeScan - a valid marker was not found.');
       }
 
       if (marker >= 0xFFD0 && marker <= 0xFFD7) {
@@ -986,7 +1012,12 @@ var JpegImage = function JpegImageClosure() {
               break;
             }
 
-            throw new JpegError('unknown marker ' + fileMarker.toString(16));
+            if (offset > data.length - 2) {
+              (0, _util.warn)('JpegImage.parse - reached the end of the image data ' + 'without finding an EOI marker (0xFFD9).');
+              break markerLoop;
+            }
+
+            throw new JpegError('JpegImage.parse - unknown marker: ' + fileMarker.toString(16));
         }
 
         fileMarker = readUint16();

+ 23 - 6
lib/core/jpx.js

@@ -30,16 +30,33 @@ var _util = require("../shared/util");
 
 var _arithmetic_decoder = require("./arithmetic_decoder");
 
-var JpxError = function JpxErrorClosure() {
+function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
+
+function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
+
+function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
+
+function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
+
+var JpxError =
+/*#__PURE__*/
+function (_BaseException) {
+  _inherits(JpxError, _BaseException);
+
   function JpxError(msg) {
-    this.message = 'JPX error: ' + msg;
+    _classCallCheck(this, JpxError);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(JpxError).call(this, "JPX error: ".concat(msg)));
   }
 
-  JpxError.prototype = new Error();
-  JpxError.prototype.name = 'JpxError';
-  JpxError.constructor = JpxError;
   return JpxError;
-}();
+}(_util.BaseException);
 
 var JpxImage = function JpxImageClosure() {
   var SubbandsGainLog2 = {

+ 18 - 16
lib/core/obj.js

@@ -62,7 +62,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 
@@ -1229,10 +1229,10 @@ var XRef = function XRefClosure() {
     this.pdfManager = pdfManager;
     this.entries = [];
     this.xrefstms = Object.create(null);
-    this.cache = [];
+    this._cacheMap = new Map();
     this.stats = {
-      streamTypes: [],
-      fontTypes: []
+      streamTypes: Object.create(null),
+      fontTypes: Object.create(null)
     };
   }
 
@@ -1792,21 +1792,21 @@ var XRef = function XRefClosure() {
       return null;
     },
     fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) {
-      if (!(0, _primitives.isRef)(obj)) {
-        return obj;
+      if (obj instanceof _primitives.Ref) {
+        return this.fetch(obj, suppressEncryption);
       }
 
-      return this.fetch(obj, suppressEncryption);
+      return obj;
     },
     fetch: function XRef_fetch(ref, suppressEncryption) {
-      if (!(0, _primitives.isRef)(ref)) {
+      if (!(ref instanceof _primitives.Ref)) {
         throw new Error('ref object is not a reference');
       }
 
       var num = ref.num;
 
-      if (num in this.cache) {
-        var cacheEntry = this.cache[num];
+      if (this._cacheMap.has(num)) {
+        var cacheEntry = this._cacheMap.get(num);
 
         if (cacheEntry instanceof _primitives.Dict && !cacheEntry.objId) {
           cacheEntry.objId = ref.toString();
@@ -1818,7 +1818,9 @@ var XRef = function XRefClosure() {
       var xrefEntry = this.getEntry(num);
 
       if (xrefEntry === null) {
-        return this.cache[num] = null;
+        this._cacheMap.set(num, xrefEntry);
+
+        return xrefEntry;
       }
 
       if (xrefEntry.uncompressed) {
@@ -1885,7 +1887,7 @@ var XRef = function XRefClosure() {
       }
 
       if (!(0, _primitives.isStream)(xrefEntry)) {
-        this.cache[num] = xrefEntry;
+        this._cacheMap.set(num, xrefEntry);
       }
 
       return xrefEntry;
@@ -1942,7 +1944,7 @@ var XRef = function XRefClosure() {
         var entry = this.entries[num];
 
         if (entry && entry.offset === tableOffset && entry.gen === i) {
-          this.cache[num] = entries[i];
+          this._cacheMap.set(num, entries[i]);
         }
       }
 
@@ -1962,15 +1964,15 @@ var XRef = function XRefClosure() {
           while (1) {
             switch (_context.prev = _context.next) {
               case 0:
-                if ((0, _primitives.isRef)(obj)) {
+                if (!(obj instanceof _primitives.Ref)) {
                   _context.next = 2;
                   break;
                 }
 
-                return _context.abrupt("return", obj);
+                return _context.abrupt("return", this.fetchAsync(obj, suppressEncryption));
 
               case 2:
-                return _context.abrupt("return", this.fetchAsync(obj, suppressEncryption));
+                return _context.abrupt("return", obj);
 
               case 3:
               case "end":

+ 17 - 14
lib/core/operator_list.js

@@ -536,12 +536,12 @@ var OperatorList = function OperatorListClosure() {
   var CHUNK_SIZE = 1000;
   var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5;
 
-  function OperatorList(intent, messageHandler, pageIndex) {
-    this.messageHandler = messageHandler;
+  function OperatorList(intent, streamSink, pageIndex) {
+    this._streamSink = streamSink;
     this.fnArray = [];
     this.argsArray = [];
 
-    if (messageHandler && intent !== 'oplist') {
+    if (streamSink && intent !== 'oplist') {
       this.optimizer = new QueueOptimizer(this);
     } else {
       this.optimizer = new NullOptimizer(this);
@@ -552,6 +552,7 @@ var OperatorList = function OperatorListClosure() {
     this.pageIndex = pageIndex;
     this.intent = intent;
     this.weight = 0;
+    this._resolved = streamSink ? null : Promise.resolve();
   }
 
   OperatorList.prototype = {
@@ -559,6 +560,10 @@ var OperatorList = function OperatorListClosure() {
       return this.argsArray.length;
     },
 
+    get ready() {
+      return this._resolved || this._streamSink.ready;
+    },
+
     get totalLength() {
       return this._totalLength + this.length;
     },
@@ -567,7 +572,7 @@ var OperatorList = function OperatorListClosure() {
       this.optimizer.push(fn, args);
       this.weight++;
 
-      if (this.messageHandler) {
+      if (this._streamSink) {
         if (this.weight >= CHUNK_SIZE) {
           this.flush();
         } else if (this.weight >= CHUNK_SIZE_ABOUT && (fn === _util.OPS.restore || fn === _util.OPS.endText)) {
@@ -633,16 +638,14 @@ var OperatorList = function OperatorListClosure() {
       this.optimizer.flush();
       var length = this.length;
       this._totalLength += length;
-      this.messageHandler.send('RenderPageChunk', {
-        operatorList: {
-          fnArray: this.fnArray,
-          argsArray: this.argsArray,
-          lastChunk: lastChunk,
-          length: length
-        },
-        pageIndex: this.pageIndex,
-        intent: this.intent
-      }, this._transfers);
+
+      this._streamSink.enqueue({
+        fnArray: this.fnArray,
+        argsArray: this.argsArray,
+        lastChunk: lastChunk,
+        length: length
+      }, 1, this._transfers);
+
       this.dependencies = Object.create(null);
       this.fnArray.length = 0;
       this.argsArray.length = 0;

+ 9 - 12
lib/core/parser.js

@@ -94,7 +94,7 @@ function () {
   }, {
     key: "shift",
     value: function shift() {
-      if ((0, _primitives.isCmd)(this.buf2, 'ID')) {
+      if (this.buf2 instanceof _primitives.Cmd && this.buf2.cmd === 'ID') {
         this.buf1 = this.buf2;
         this.buf2 = null;
       } else {
@@ -118,7 +118,8 @@ function () {
     }
   }, {
     key: "getObj",
-    value: function getObj(cipherTransform) {
+    value: function getObj() {
+      var cipherTransform = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
       var buf1 = this.buf1;
       this.shift();
 
@@ -186,27 +187,23 @@ function () {
       }
 
       if (Number.isInteger(buf1)) {
-        var num = buf1;
-
         if (Number.isInteger(this.buf1) && (0, _primitives.isCmd)(this.buf2, 'R')) {
-          var ref = _primitives.Ref.get(num, this.buf1);
+          var ref = _primitives.Ref.get(buf1, this.buf1);
 
           this.shift();
           this.shift();
           return ref;
         }
 
-        return num;
+        return buf1;
       }
 
-      if ((0, _util.isString)(buf1)) {
-        var str = buf1;
-
+      if (typeof buf1 === 'string') {
         if (cipherTransform) {
-          str = cipherTransform.decryptString(str);
+          return cipherTransform.decryptString(buf1);
         }
 
-        return str;
+        return buf1;
       }
 
       return buf1;
@@ -748,7 +745,7 @@ function () {
         }
 
         if (name === 'RunLengthDecode' || name === 'RL') {
-          xrefStreamStats[_util.StreamType.RL] = true;
+          xrefStreamStats[_util.StreamType.RLX] = true;
           return new _stream.RunLengthStream(stream, maybeLength);
         }
 

+ 22 - 7
lib/core/pattern.js

@@ -104,6 +104,14 @@ Shadings.RadialAxial = function RadialAxialClosure() {
     var cs = dict.get('ColorSpace', 'CS');
     cs = _colorspace.ColorSpace.parse(cs, xref, res, pdfFunctionFactory);
     this.cs = cs;
+    var bbox = dict.getArray('BBox');
+
+    if (Array.isArray(bbox) && bbox.length === 4) {
+      this.bbox = _util.Util.normalizeRect(bbox);
+    } else {
+      this.bbox = null;
+    }
+
     var t0 = 0.0,
         t1 = 1.0;
 
@@ -140,8 +148,8 @@ Shadings.RadialAxial = function RadialAxialClosure() {
     this.extendEnd = extendEnd;
     var fnObj = dict.get('Function');
     var fn = pdfFunctionFactory.createFromArray(fnObj);
-    var diff = t1 - t0;
-    var step = diff / 10;
+    var NUMBER_OF_SAMPLES = 10;
+    var step = (t1 - t0) / NUMBER_OF_SAMPLES;
     var colorStops = this.colorStops = [];
 
     if (t0 >= t1 || step <= 0) {
@@ -153,14 +161,14 @@ Shadings.RadialAxial = function RadialAxialClosure() {
         ratio = new Float32Array(1);
     var rgbColor;
 
-    for (var i = t0; i <= t1; i += step) {
-      ratio[0] = i;
+    for (var i = 0; i <= NUMBER_OF_SAMPLES; i++) {
+      ratio[0] = t0 + i * step;
       fn(ratio, 0, color, 0);
       rgbColor = cs.getRgb(color, 0);
 
       var cssColor = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
 
-      colorStops.push([(i - t0) / diff, cssColor]);
+      colorStops.push([i / NUMBER_OF_SAMPLES, cssColor]);
     }
 
     var background = 'transparent';
@@ -219,7 +227,7 @@ Shadings.RadialAxial = function RadialAxialClosure() {
         }
       }
 
-      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
+      return ['RadialAxial', type, this.bbox, this.colorStops, p0, p1, r0, r1];
     }
   };
   return RadialAxial;
@@ -836,7 +844,14 @@ Shadings.Mesh = function MeshClosure() {
     this.matrix = matrix;
     this.shadingType = dict.get('ShadingType');
     this.type = 'Pattern';
-    this.bbox = dict.getArray('BBox');
+    var bbox = dict.getArray('BBox');
+
+    if (Array.isArray(bbox) && bbox.length === 4) {
+      this.bbox = _util.Util.normalizeRect(bbox);
+    } else {
+      this.bbox = null;
+    }
+
     var cs = dict.get('ColorSpace', 'CS');
     cs = _colorspace.ColorSpace.parse(cs, xref, res, pdfFunctionFactory);
     this.cs = cs;

+ 4 - 4
lib/core/pdf_manager.js

@@ -156,7 +156,7 @@ function () {
     }
   }, {
     key: "terminate",
-    value: function terminate() {
+    value: function terminate(reason) {
       (0, _util.unreachable)('Abstract method `terminate` called');
     }
   }, {
@@ -264,7 +264,7 @@ function (_BasePdfManager) {
     }
   }, {
     key: "terminate",
-    value: function terminate() {}
+    value: function terminate(reason) {}
   }]);
 
   return LocalPdfManager;
@@ -378,8 +378,8 @@ function (_BasePdfManager2) {
     }
   }, {
     key: "terminate",
-    value: function terminate() {
-      this.streamManager.abort();
+    value: function terminate(reason) {
+      this.streamManager.abort(reason);
     }
   }]);
 

+ 63 - 42
lib/core/primitives.js

@@ -34,10 +34,18 @@ exports.isRefsEqual = isRefsEqual;
 exports.isStream = isStream;
 exports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.Dict = exports.Cmd = exports.EOF = void 0;
 
+var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
+
 var _util = require("../shared/util");
 
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
+
 function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
 
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
 var EOF = {};
 exports.EOF = EOF;
 
@@ -104,68 +112,81 @@ var Dict = function DictClosure() {
     assignXref: function Dict_assignXref(newXref) {
       this.xref = newXref;
     },
-    get: function Dict_get(key1, key2, key3) {
-      var value;
-      var xref = this.xref,
-          suppressEncryption = this.suppressEncryption;
+    get: function get(key1, key2, key3) {
+      var value = this._map[key1];
 
-      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {
-        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
-      }
-
-      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {
-        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
-      }
+      if (value === undefined && !(key1 in this._map) && key2 !== undefined) {
+        value = this._map[key2];
 
-      value = this._map[key3] || null;
-      return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
-    },
-    getAsync: function Dict_getAsync(key1, key2, key3) {
-      var value;
-      var xref = this.xref,
-          suppressEncryption = this.suppressEncryption;
-
-      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {
-        if (xref) {
-          return xref.fetchIfRefAsync(value, suppressEncryption);
+        if (value === undefined && !(key2 in this._map) && key3 !== undefined) {
+          value = this._map[key3];
         }
-
-        return Promise.resolve(value);
       }
 
-      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {
-        if (xref) {
-          return xref.fetchIfRefAsync(value, suppressEncryption);
-        }
-
-        return Promise.resolve(value);
+      if (value instanceof Ref && this.xref) {
+        return this.xref.fetch(value, this.suppressEncryption);
       }
 
-      value = this._map[key3] || null;
-
-      if (xref) {
-        return xref.fetchIfRefAsync(value, suppressEncryption);
+      return value;
+    },
+    getAsync: function () {
+      var _getAsync = _asyncToGenerator(
+      /*#__PURE__*/
+      _regenerator["default"].mark(function _callee(key1, key2, key3) {
+        var value;
+        return _regenerator["default"].wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                value = this._map[key1];
+
+                if (value === undefined && !(key1 in this._map) && key2 !== undefined) {
+                  value = this._map[key2];
+
+                  if (value === undefined && !(key2 in this._map) && key3 !== undefined) {
+                    value = this._map[key3];
+                  }
+                }
+
+                if (!(value instanceof Ref && this.xref)) {
+                  _context.next = 4;
+                  break;
+                }
+
+                return _context.abrupt("return", this.xref.fetchAsync(value, this.suppressEncryption));
+
+              case 4:
+                return _context.abrupt("return", value);
+
+              case 5:
+              case "end":
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function getAsync(_x, _x2, _x3) {
+        return _getAsync.apply(this, arguments);
       }
 
-      return Promise.resolve(value);
-    },
-    getArray: function Dict_getArray(key1, key2, key3) {
+      return getAsync;
+    }(),
+    getArray: function getArray(key1, key2, key3) {
       var value = this.get(key1, key2, key3);
-      var xref = this.xref,
-          suppressEncryption = this.suppressEncryption;
 
-      if (!Array.isArray(value) || !xref) {
+      if (!Array.isArray(value) || !this.xref) {
         return value;
       }
 
       value = value.slice();
 
       for (var i = 0, ii = value.length; i < ii; i++) {
-        if (!isRef(value[i])) {
+        if (!(value[i] instanceof Ref)) {
           continue;
         }
 
-        value[i] = xref.fetch(value[i], suppressEncryption);
+        value[i] = this.xref.fetch(value[i], this.suppressEncryption);
       }
 
       return value;

+ 14 - 0
lib/core/stream.js

@@ -113,6 +113,17 @@ var Stream = function StreamClosure() {
       this.pos -= bytes.length;
       return bytes;
     },
+    getByteRange: function getByteRange(begin, end) {
+      if (begin < 0) {
+        begin = 0;
+      }
+
+      if (end > this.end) {
+        end = this.end;
+      }
+
+      return this.bytes.subarray(begin, end);
+    },
     skip: function Stream_skip(n) {
       if (!n) {
         n = 1;
@@ -271,6 +282,9 @@ var DecodeStream = function DecodeStreamClosure() {
 
       return new Stream(this.buffer, start, length, dict);
     },
+    getByteRange: function getByteRange(begin, end) {
+      (0, _util.unreachable)('Should not call DecodeStream.getByteRange');
+    },
     skip: function DecodeStream_skip(n) {
       if (!n) {
         n = 1;

+ 9 - 1
lib/core/type1_parser.js

@@ -496,7 +496,7 @@ var Type1Parser = function Type1ParserClosure() {
 
       return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV);
     },
-    extractFontProgram: function Type1Parser_extractFontProgram() {
+    extractFontProgram: function Type1Parser_extractFontProgram(properties) {
       var stream = this.stream;
       var subrs = [],
           charstrings = [];
@@ -635,6 +635,14 @@ var Type1Parser = function Type1ParserClosure() {
           lsb: charString.lsb,
           seac: charString.seac
         });
+
+        if (properties.builtInEncoding) {
+          var _index = properties.builtInEncoding.indexOf(glyph);
+
+          if (_index > -1 && properties.widths[_index] === undefined && _index >= properties.firstChar && _index <= properties.lastChar) {
+            properties.widths[_index] = charString.width;
+          }
+        }
       }
 
       return program;

+ 17 - 56
lib/core/worker.js

@@ -44,13 +44,11 @@ var _core_utils = require("./core_utils");
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
 
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
 function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 
@@ -97,28 +95,13 @@ var WorkerMessageHandler = {
       testMessageProcessed = true;
 
       if (!(data instanceof Uint8Array)) {
-        handler.send('test', false);
+        handler.send('test', null);
         return;
       }
 
       var supportTransfers = data[0] === 255;
       handler.postMessageTransfers = supportTransfers;
-      var xhr = new XMLHttpRequest();
-      var responseExists = 'response' in xhr;
-
-      try {
-        xhr.responseType;
-      } catch (e) {
-        responseExists = false;
-      }
-
-      if (!responseExists) {
-        handler.send('test', false);
-        return;
-      }
-
       handler.send('test', {
-        supportTypedArray: true,
         supportTransfers: supportTransfers
       });
     });
@@ -136,7 +119,7 @@ var WorkerMessageHandler = {
     var WorkerTasks = [];
     var verbosity = (0, _util.getVerbosityLevel)();
     var apiVersion = docParams.apiVersion;
-    var workerVersion = '2.2.228';
+    var workerVersion = '2.3.200';
 
     if (apiVersion !== workerVersion) {
       throw new Error("The API version \"".concat(apiVersion, "\" does not match ") + "the Worker version \"".concat(workerVersion, "\"."));
@@ -336,8 +319,8 @@ var WorkerMessageHandler = {
         cancelXHRs = null;
       });
 
-      cancelXHRs = function cancelXHRs() {
-        pdfStream.cancelAllRequests('abort');
+      cancelXHRs = function cancelXHRs(reason) {
+        pdfStream.cancelAllRequests(reason);
       };
 
       return pdfManagerCapability.promise;
@@ -405,7 +388,7 @@ var WorkerMessageHandler = {
       };
       getPdfManager(data, evaluatorOptions).then(function (newPdfManager) {
         if (terminated) {
-          newPdfManager.terminate();
+          newPdfManager.terminate(new _util.AbortException('Worker was terminated.'));
           throw new Error('Worker was terminated');
         }
 
@@ -494,24 +477,27 @@ var WorkerMessageHandler = {
         return page.getAnnotationsData(intent);
       });
     });
-    handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
+    handler.on('GetOperatorList', function wphSetupRenderPage(data, sink) {
       var pageIndex = data.pageIndex;
       pdfManager.getPage(pageIndex).then(function (page) {
-        var task = new WorkerTask('RenderPageRequest: page ' + pageIndex);
+        var task = new WorkerTask("GetOperatorList: page ".concat(pageIndex));
         startWorkerTask(task);
         var start = verbosity >= _util.VerbosityLevel.INFOS ? Date.now() : 0;
         page.getOperatorList({
           handler: handler,
+          sink: sink,
           task: task,
           intent: data.intent,
           renderInteractiveForms: data.renderInteractiveForms
-        }).then(function (operatorList) {
+        }).then(function (operatorListInfo) {
           finishWorkerTask(task);
 
           if (start) {
-            (0, _util.info)("page=".concat(pageIndex + 1, " - getOperatorList: time=") + "".concat(Date.now() - start, "ms, len=").concat(operatorList.totalLength));
+            (0, _util.info)("page=".concat(pageIndex + 1, " - getOperatorList: time=") + "".concat(Date.now() - start, "ms, len=").concat(operatorListInfo.length));
           }
-        }, function (e) {
+
+          sink.close();
+        }, function (reason) {
           finishWorkerTask(task);
 
           if (task.terminated) {
@@ -521,31 +507,7 @@ var WorkerMessageHandler = {
           handler.send('UnsupportedFeature', {
             featureId: _util.UNSUPPORTED_FEATURES.unknown
           });
-          var minimumStackMessage = 'worker.js: while trying to getPage() and getOperatorList()';
-          var wrappedException;
-
-          if (typeof e === 'string') {
-            wrappedException = {
-              message: e,
-              stack: minimumStackMessage
-            };
-          } else if (_typeof(e) === 'object') {
-            wrappedException = {
-              message: e.message || e.toString(),
-              stack: e.stack || minimumStackMessage
-            };
-          } else {
-            wrappedException = {
-              message: 'Unknown exception type: ' + _typeof(e),
-              stack: minimumStackMessage
-            };
-          }
-
-          handler.send('PageError', {
-            pageIndex: pageIndex,
-            error: wrappedException,
-            intent: data.intent
-          });
+          sink.error(reason);
         });
       });
     }, this);
@@ -582,7 +544,6 @@ var WorkerMessageHandler = {
           }
 
           sink.error(reason);
-          throw reason;
         });
       });
     });
@@ -596,12 +557,12 @@ var WorkerMessageHandler = {
       terminated = true;
 
       if (pdfManager) {
-        pdfManager.terminate();
+        pdfManager.terminate(new _util.AbortException('Worker was terminated.'));
         pdfManager = null;
       }
 
       if (cancelXHRs) {
-        cancelXHRs();
+        cancelXHRs(new _util.AbortException('Worker was terminated.'));
       }
 
       (0, _primitives.clearPrimitiveCaches)();

+ 194 - 85
lib/display/annotation_layer.js

@@ -186,11 +186,11 @@ function () {
 
       var rect = _util.Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]);
 
-      container.style.transform = 'matrix(' + viewport.transform.join(',') + ')';
-      container.style.transformOrigin = -rect[0] + 'px ' + -rect[1] + 'px';
+      container.style.transform = "matrix(".concat(viewport.transform.join(','), ")");
+      container.style.transformOrigin = "-".concat(rect[0], "px -").concat(rect[1], "px");
 
       if (!ignoreBorder && data.borderStyle.width > 0) {
-        container.style.borderWidth = data.borderStyle.width + 'px';
+        container.style.borderWidth = "".concat(data.borderStyle.width, "px");
 
         if (data.borderStyle.style !== _util.AnnotationBorderStyleType.UNDERLINE) {
           width = width - 2 * data.borderStyle.width;
@@ -201,7 +201,7 @@ function () {
         var verticalRadius = data.borderStyle.verticalCornerRadius;
 
         if (horizontalRadius > 0 || verticalRadius > 0) {
-          var radius = horizontalRadius + 'px / ' + verticalRadius + 'px';
+          var radius = "".concat(horizontalRadius, "px / ").concat(verticalRadius, "px");
           container.style.borderRadius = radius;
         }
 
@@ -237,10 +237,10 @@ function () {
         }
       }
 
-      container.style.left = rect[0] + 'px';
-      container.style.top = rect[1] + 'px';
-      container.style.width = width + 'px';
-      container.style.height = height + 'px';
+      container.style.left = "".concat(rect[0], "px");
+      container.style.top = "".concat(rect[1], "px");
+      container.style.width = "".concat(width, "px");
+      container.style.height = "".concat(height, "px");
       return container;
     }
   }, {
@@ -295,18 +295,18 @@ function (_AnnotationElement) {
       var data = this.data,
           linkService = this.linkService;
       var link = document.createElement('a');
-      (0, _display_utils.addLinkAttributes)(link, {
-        url: data.url,
-        target: data.newWindow ? _display_utils.LinkTarget.BLANK : linkService.externalLinkTarget,
-        rel: linkService.externalLinkRel
-      });
 
-      if (!data.url) {
-        if (data.action) {
-          this._bindNamedAction(link, data.action);
-        } else {
-          this._bindLink(link, data.dest);
-        }
+      if (data.url) {
+        (0, _display_utils.addLinkAttributes)(link, {
+          url: data.url,
+          target: data.newWindow ? _display_utils.LinkTarget.BLANK : linkService.externalLinkTarget,
+          rel: linkService.externalLinkRel,
+          enabled: linkService.externalLinkEnabled
+        });
+      } else if (data.action) {
+        this._bindNamedAction(link, data.action);
+      } else {
+        this._bindLink(link, data.dest);
       }
 
       this.container.appendChild(link);
@@ -449,7 +449,7 @@ function (_WidgetAnnotationElem) {
           var fieldWidth = this.data.rect[2] - this.data.rect[0];
           var combWidth = fieldWidth / this.data.maxLen;
           element.classList.add('comb');
-          element.style.letterSpacing = 'calc(' + combWidth + 'px - 1ch)';
+          element.style.letterSpacing = "calc(".concat(combWidth, "px - 1ch)");
         }
       } else {
         element = document.createElement('div');
@@ -476,7 +476,7 @@ function (_WidgetAnnotationElem) {
     key: "_setTextStyle",
     value: function _setTextStyle(element, font) {
       var style = element.style;
-      style.fontSize = this.data.fontSize + 'px';
+      style.fontSize = "".concat(this.data.fontSize, "px");
       style.direction = this.data.fontDirection < 0 ? 'rtl' : 'ltr';
 
       if (!font) {
@@ -485,7 +485,7 @@ function (_WidgetAnnotationElem) {
 
       style.fontWeight = font.black ? font.bold ? '900' : 'bold' : font.bold ? 'bold' : 'normal';
       style.fontStyle = font.italic ? 'italic' : 'normal';
-      var fontFamily = font.loadedName ? '"' + font.loadedName + '", ' : '';
+      var fontFamily = font.loadedName ? "\"".concat(font.loadedName, "\", ") : '';
       var fallbackName = font.fallbackName || 'Helvetica, sans-serif';
       style.fontFamily = fontFamily + fallbackName;
     }
@@ -607,17 +607,36 @@ function (_WidgetAnnotationElem4) {
         }
       }
 
-      for (var i = 0, ii = this.data.options.length; i < ii; i++) {
-        var option = this.data.options[i];
-        var optionElement = document.createElement('option');
-        optionElement.textContent = option.displayValue;
-        optionElement.value = option.exportValue;
+      var _iteratorNormalCompletion = true;
+      var _didIteratorError = false;
+      var _iteratorError = undefined;
 
-        if (this.data.fieldValue.includes(option.displayValue)) {
-          optionElement.setAttribute('selected', true);
-        }
+      try {
+        for (var _iterator = this.data.options[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+          var option = _step.value;
+          var optionElement = document.createElement('option');
+          optionElement.textContent = option.displayValue;
+          optionElement.value = option.exportValue;
 
-        selectElement.appendChild(optionElement);
+          if (this.data.fieldValue.includes(option.displayValue)) {
+            optionElement.setAttribute('selected', true);
+          }
+
+          selectElement.appendChild(optionElement);
+        }
+      } catch (err) {
+        _didIteratorError = true;
+        _iteratorError = err;
+      } finally {
+        try {
+          if (!_iteratorNormalCompletion && _iterator["return"] != null) {
+            _iterator["return"]();
+          }
+        } finally {
+          if (_didIteratorError) {
+            throw _iteratorError;
+          }
+        }
       }
 
       this.container.appendChild(selectElement);
@@ -650,7 +669,7 @@ function (_AnnotationElement4) {
         return this.container;
       }
 
-      var selector = '[data-annotation-id="' + this.data.parentId + '"]';
+      var selector = "[data-annotation-id=\"".concat(this.data.parentId, "\"]");
       var parentElement = this.layer.querySelector(selector);
 
       if (!parentElement) {
@@ -667,8 +686,8 @@ function (_AnnotationElement4) {
       });
       var parentLeft = parseFloat(parentElement.style.left);
       var parentWidth = parseFloat(parentElement.style.width);
-      this.container.style.transformOrigin = -(parentLeft + parentWidth) + 'px -' + parentElement.style.top;
-      this.container.style.left = parentLeft + parentWidth + 'px';
+      this.container.style.transformOrigin = "-".concat(parentLeft + parentWidth, "px -").concat(parentElement.style.top);
+      this.container.style.left = "".concat(parentLeft + parentWidth, "px");
       this.container.appendChild(popup.render());
       return this.container;
     }
@@ -972,20 +991,37 @@ function (_AnnotationElement9) {
       var width = data.rect[2] - data.rect[0];
       var height = data.rect[3] - data.rect[1];
       var svg = this.svgFactory.create(width, height);
-      var vertices = data.vertices;
       var points = [];
-
-      for (var i = 0, ii = vertices.length; i < ii; i++) {
-        var x = vertices[i].x - data.rect[0];
-        var y = data.rect[3] - vertices[i].y;
-        points.push(x + ',' + y);
+      var _iteratorNormalCompletion2 = true;
+      var _didIteratorError2 = false;
+      var _iteratorError2 = undefined;
+
+      try {
+        for (var _iterator2 = data.vertices[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
+          var coordinate = _step2.value;
+          var x = coordinate.x - data.rect[0];
+          var y = data.rect[3] - coordinate.y;
+          points.push(x + ',' + y);
+        }
+      } catch (err) {
+        _didIteratorError2 = true;
+        _iteratorError2 = err;
+      } finally {
+        try {
+          if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
+            _iterator2["return"]();
+          }
+        } finally {
+          if (_didIteratorError2) {
+            throw _iteratorError2;
+          }
+        }
       }
 
       points = points.join(' ');
-      var borderWidth = data.borderStyle.width;
       var polyline = this.svgFactory.createElement(this.svgElementName);
       polyline.setAttribute('points', points);
-      polyline.setAttribute('stroke-width', borderWidth);
+      polyline.setAttribute('stroke-width', data.borderStyle.width);
       polyline.setAttribute('stroke', 'transparent');
       polyline.setAttribute('fill', 'none');
       svg.appendChild(polyline);
@@ -1072,29 +1108,64 @@ function (_AnnotationElement11) {
       var width = data.rect[2] - data.rect[0];
       var height = data.rect[3] - data.rect[1];
       var svg = this.svgFactory.create(width, height);
-      var inkLists = data.inkLists;
-
-      for (var i = 0, ii = inkLists.length; i < ii; i++) {
-        var inkList = inkLists[i];
-        var points = [];
-
-        for (var j = 0, jj = inkList.length; j < jj; j++) {
-          var x = inkList[j].x - data.rect[0];
-          var y = data.rect[3] - inkList[j].y;
-          points.push(x + ',' + y);
-        }
+      var _iteratorNormalCompletion3 = true;
+      var _didIteratorError3 = false;
+      var _iteratorError3 = undefined;
+
+      try {
+        for (var _iterator3 = data.inkLists[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
+          var inkList = _step3.value;
+          var points = [];
+          var _iteratorNormalCompletion4 = true;
+          var _didIteratorError4 = false;
+          var _iteratorError4 = undefined;
+
+          try {
+            for (var _iterator4 = inkList[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
+              var coordinate = _step4.value;
+              var x = coordinate.x - data.rect[0];
+              var y = data.rect[3] - coordinate.y;
+              points.push("".concat(x, ",").concat(y));
+            }
+          } catch (err) {
+            _didIteratorError4 = true;
+            _iteratorError4 = err;
+          } finally {
+            try {
+              if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) {
+                _iterator4["return"]();
+              }
+            } finally {
+              if (_didIteratorError4) {
+                throw _iteratorError4;
+              }
+            }
+          }
 
-        points = points.join(' ');
-        var borderWidth = data.borderStyle.width;
-        var polyline = this.svgFactory.createElement(this.svgElementName);
-        polyline.setAttribute('points', points);
-        polyline.setAttribute('stroke-width', borderWidth);
-        polyline.setAttribute('stroke', 'transparent');
-        polyline.setAttribute('fill', 'none');
+          points = points.join(' ');
+          var polyline = this.svgFactory.createElement(this.svgElementName);
+          polyline.setAttribute('points', points);
+          polyline.setAttribute('stroke-width', data.borderStyle.width);
+          polyline.setAttribute('stroke', 'transparent');
+          polyline.setAttribute('fill', 'none');
 
-        this._createPopup(this.container, polyline, data);
+          this._createPopup(this.container, polyline, data);
 
-        svg.appendChild(polyline);
+          svg.appendChild(polyline);
+        }
+      } catch (err) {
+        _didIteratorError3 = true;
+        _iteratorError3 = err;
+      } finally {
+        try {
+          if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) {
+            _iterator3["return"]();
+          }
+        } finally {
+          if (_didIteratorError3) {
+            throw _iteratorError3;
+          }
+        }
       }
 
       this.container.append(svg);
@@ -1315,39 +1386,77 @@ function () {
   _createClass(AnnotationLayer, null, [{
     key: "render",
     value: function render(parameters) {
-      for (var i = 0, ii = parameters.annotations.length; i < ii; i++) {
-        var data = parameters.annotations[i];
+      var _iteratorNormalCompletion5 = true;
+      var _didIteratorError5 = false;
+      var _iteratorError5 = undefined;
 
-        if (!data) {
-          continue;
-        }
+      try {
+        for (var _iterator5 = parameters.annotations[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
+          var data = _step5.value;
 
-        var element = AnnotationElementFactory.create({
-          data: data,
-          layer: parameters.div,
-          page: parameters.page,
-          viewport: parameters.viewport,
-          linkService: parameters.linkService,
-          downloadManager: parameters.downloadManager,
-          imageResourcesPath: parameters.imageResourcesPath || '',
-          renderInteractiveForms: parameters.renderInteractiveForms || false,
-          svgFactory: new _display_utils.DOMSVGFactory()
-        });
+          if (!data) {
+            continue;
+          }
 
-        if (element.isRenderable) {
-          parameters.div.appendChild(element.render());
+          var element = AnnotationElementFactory.create({
+            data: data,
+            layer: parameters.div,
+            page: parameters.page,
+            viewport: parameters.viewport,
+            linkService: parameters.linkService,
+            downloadManager: parameters.downloadManager,
+            imageResourcesPath: parameters.imageResourcesPath || '',
+            renderInteractiveForms: parameters.renderInteractiveForms || false,
+            svgFactory: new _display_utils.DOMSVGFactory()
+          });
+
+          if (element.isRenderable) {
+            parameters.div.appendChild(element.render());
+          }
+        }
+      } catch (err) {
+        _didIteratorError5 = true;
+        _iteratorError5 = err;
+      } finally {
+        try {
+          if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) {
+            _iterator5["return"]();
+          }
+        } finally {
+          if (_didIteratorError5) {
+            throw _iteratorError5;
+          }
         }
       }
     }
   }, {
     key: "update",
     value: function update(parameters) {
-      for (var i = 0, ii = parameters.annotations.length; i < ii; i++) {
-        var data = parameters.annotations[i];
-        var element = parameters.div.querySelector('[data-annotation-id="' + data.id + '"]');
+      var _iteratorNormalCompletion6 = true;
+      var _didIteratorError6 = false;
+      var _iteratorError6 = undefined;
 
-        if (element) {
-          element.style.transform = 'matrix(' + parameters.viewport.transform.join(',') + ')';
+      try {
+        for (var _iterator6 = parameters.annotations[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
+          var data = _step6.value;
+          var element = parameters.div.querySelector("[data-annotation-id=\"".concat(data.id, "\"]"));
+
+          if (element) {
+            element.style.transform = "matrix(".concat(parameters.viewport.transform.join(','), ")");
+          }
+        }
+      } catch (err) {
+        _didIteratorError6 = true;
+        _iteratorError6 = err;
+      } finally {
+        try {
+          if (!_iteratorNormalCompletion6 && _iterator6["return"] != null) {
+            _iterator6["return"]();
+          }
+        } finally {
+          if (_didIteratorError6) {
+            throw _iteratorError6;
+          }
         }
       }
 

ファイルの差分が大きいため隠しています
+ 314 - 196
lib/display/api.js


+ 6 - 1
lib/display/canvas.js

@@ -1093,15 +1093,20 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
       consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
       var ctx = this.ctx;
       var strokeColor = this.current.strokeColor;
-      ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth);
       ctx.globalAlpha = this.current.strokeAlpha;
 
       if (strokeColor && strokeColor.hasOwnProperty('type') && strokeColor.type === 'Pattern') {
         ctx.save();
+        var transform = ctx.mozCurrentTransform;
+
+        var scale = _util.Util.singularValueDecompose2dScale(transform)[0];
+
         ctx.strokeStyle = strokeColor.getPattern(ctx, this);
+        ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth * scale);
         ctx.stroke();
         ctx.restore();
       } else {
+        ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth);
         ctx.stroke();
       }
 

+ 1 - 1
lib/display/content_disposition.js

@@ -30,7 +30,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 

+ 48 - 18
lib/display/display_utils.js

@@ -37,7 +37,19 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
 
 var _util = require("../shared/util");
 
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
+
+function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
+
+function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
+
+function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
+
+function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
 
 function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
 
@@ -458,17 +470,23 @@ function () {
 
 exports.PageViewport = PageViewport;
 
-var RenderingCancelledException = function RenderingCancelledException() {
+var RenderingCancelledException =
+/*#__PURE__*/
+function (_BaseException) {
+  _inherits(RenderingCancelledException, _BaseException);
+
   function RenderingCancelledException(msg, type) {
-    this.message = msg;
-    this.type = type;
+    var _this2;
+
+    _classCallCheck(this, RenderingCancelledException);
+
+    _this2 = _possibleConstructorReturn(this, _getPrototypeOf(RenderingCancelledException).call(this, msg));
+    _this2.type = type;
+    return _this2;
   }
 
-  RenderingCancelledException.prototype = new Error();
-  RenderingCancelledException.prototype.name = 'RenderingCancelledException';
-  RenderingCancelledException.constructor = RenderingCancelledException;
   return RenderingCancelledException;
-}();
+}(_util.BaseException);
 
 exports.RenderingCancelledException = RenderingCancelledException;
 var LinkTarget = {
@@ -485,16 +503,28 @@ function addLinkAttributes(link) {
   var _ref7 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
       url = _ref7.url,
       target = _ref7.target,
-      rel = _ref7.rel;
+      rel = _ref7.rel,
+      _ref7$enabled = _ref7.enabled,
+      enabled = _ref7$enabled === void 0 ? true : _ref7$enabled;
 
-  link.href = link.title = url ? (0, _util.removeNullCharacters)(url) : '';
+  (0, _util.assert)(url && typeof url === 'string', 'addLinkAttributes: A valid "url" parameter must provided.');
+  var urlNullRemoved = (0, _util.removeNullCharacters)(url);
 
-  if (url) {
-    var LinkTargetValues = Object.values(LinkTarget);
-    var targetIndex = LinkTargetValues.includes(target) ? target : LinkTarget.NONE;
-    link.target = LinkTargetStringMap[targetIndex];
-    link.rel = typeof rel === 'string' ? rel : DEFAULT_LINK_REL;
+  if (enabled) {
+    link.href = link.title = urlNullRemoved;
+  } else {
+    link.href = '';
+    link.title = "Disabled: ".concat(urlNullRemoved);
+
+    link.onclick = function () {
+      return false;
+    };
   }
+
+  var LinkTargetValues = Object.values(LinkTarget);
+  var targetIndex = LinkTargetValues.includes(target) ? target : LinkTarget.NONE;
+  link.target = LinkTargetStringMap[targetIndex];
+  link.rel = typeof rel === 'string' ? rel : DEFAULT_LINK_REL;
 }
 
 function getFilenameFromUrl(url) {
@@ -648,7 +678,7 @@ function isFetchSupported() {
 
 function isValidFetchUrl(url, baseUrl) {
   try {
-    var _ref8 = baseUrl ? new _util.URL(url, baseUrl) : new _util.URL(url),
+    var _ref8 = baseUrl ? new URL(url, baseUrl) : new URL(url),
         protocol = _ref8.protocol;
 
     return protocol === 'http:' || protocol === 'https:';
@@ -679,8 +709,8 @@ function releaseImageResources(img) {
   (0, _util.assert)(img instanceof Image, 'Invalid `img` parameter.');
   var url = img.src;
 
-  if (typeof url === 'string' && url.startsWith('blob:') && _util.URL.revokeObjectURL) {
-    _util.URL.revokeObjectURL(url);
+  if (typeof url === 'string' && url.startsWith('blob:') && URL.revokeObjectURL) {
+    URL.revokeObjectURL(url);
   }
 
   img.removeAttribute('src');

+ 6 - 0
lib/display/network_utils.js

@@ -79,6 +79,12 @@ function extractFilenameFromHeader(getResponseHeader) {
   if (contentDisposition) {
     var filename = (0, _content_disposition.getFilenameFromContentDispositionHeader)(contentDisposition);
 
+    if (filename.includes('%')) {
+      try {
+        filename = decodeURIComponent(filename);
+      } catch (ex) {}
+    }
+
     if (/\.pdf$/i.test(filename)) {
       return filename;
     }

+ 22 - 5
lib/display/pattern_helper.js

@@ -30,17 +30,32 @@ exports.TilingPattern = void 0;
 var _util = require("../shared/util");
 
 var ShadingIRs = {};
+
+function applyBoundingBox(ctx, bbox) {
+  if (!bbox || typeof Path2D === 'undefined') {
+    return;
+  }
+
+  var width = bbox[2] - bbox[0];
+  var height = bbox[3] - bbox[1];
+  var region = new Path2D();
+  region.rect(bbox[0], bbox[1], width, height);
+  ctx.clip(region);
+}
+
 ShadingIRs.RadialAxial = {
   fromIR: function RadialAxial_fromIR(raw) {
     var type = raw[1];
-    var colorStops = raw[2];
-    var p0 = raw[3];
-    var p1 = raw[4];
-    var r0 = raw[5];
-    var r1 = raw[6];
+    var bbox = raw[2];
+    var colorStops = raw[3];
+    var p0 = raw[4];
+    var p1 = raw[5];
+    var r0 = raw[6];
+    var r1 = raw[7];
     return {
       type: 'Pattern',
       getPattern: function RadialAxial_getPattern(ctx) {
+        applyBoundingBox(ctx, bbox);
         var grad;
 
         if (type === 'axial') {
@@ -268,10 +283,12 @@ ShadingIRs.Mesh = {
     var figures = raw[4];
     var bounds = raw[5];
     var matrix = raw[6];
+    var bbox = raw[7];
     var background = raw[8];
     return {
       type: 'Pattern',
       getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {
+        applyBoundingBox(ctx, bbox);
         var scale;
 
         if (shadingFill) {

+ 1 - 1
lib/display/svg.js

@@ -46,7 +46,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 

+ 62 - 53
lib/display/text_layer.js

@@ -40,12 +40,9 @@ var renderTextLayer = function renderTextLayerClosure() {
     return !NonWhitespaceRegexp.test(str);
   }
 
-  var styleBuf = ['left: ', 0, 'px; top: ', 0, 'px; font-size: ', 0, 'px; font-family: ', '', ';'];
-
   function appendText(task, geom, styles) {
     var textDiv = document.createElement('span');
     var textDivProperties = {
-      style: null,
       angle: 0,
       canvasWidth: 0,
       isWhitespace: false,
@@ -85,8 +82,7 @@ var renderTextLayer = function renderTextLayerClosure() {
       fontAscent = (1 + style.descent) * fontAscent;
     }
 
-    var left;
-    var top;
+    var left, top;
 
     if (angle === 0) {
       left = tx[4];
@@ -96,12 +92,10 @@ var renderTextLayer = function renderTextLayerClosure() {
       top = tx[5] - fontAscent * Math.cos(angle);
     }
 
-    styleBuf[1] = left;
-    styleBuf[3] = top;
-    styleBuf[5] = fontHeight;
-    styleBuf[7] = style.fontFamily;
-    textDivProperties.style = styleBuf.join('');
-    textDiv.setAttribute('style', textDivProperties.style);
+    textDiv.style.left = "".concat(left, "px");
+    textDiv.style.top = "".concat(top, "px");
+    textDiv.style.fontSize = "".concat(fontHeight, "px");
+    textDiv.style.fontFamily = style.fontFamily;
     textDiv.textContent = geom.str;
 
     if (task._fontInspectorEnabled) {
@@ -483,7 +477,7 @@ var renderTextLayer = function renderTextLayerClosure() {
         _this._layoutTextCtx.canvas.height = 0;
         _this._layoutTextCtx = null;
       }
-    });
+    })["catch"](function () {});
   }
 
   TextLayerRenderTask.prototype = {
@@ -515,30 +509,32 @@ var renderTextLayer = function renderTextLayerClosure() {
       }
     },
     _layoutText: function _layoutText(textDiv) {
-      var textLayerFrag = this._container;
-
       var textDivProperties = this._textDivProperties.get(textDiv);
 
       if (textDivProperties.isWhitespace) {
         return;
       }
 
-      var fontSize = textDiv.style.fontSize;
-      var fontFamily = textDiv.style.fontFamily;
+      var transform = '';
 
-      if (fontSize !== this._layoutTextLastFontSize || fontFamily !== this._layoutTextLastFontFamily) {
-        this._layoutTextCtx.font = fontSize + ' ' + fontFamily;
-        this._layoutTextLastFontSize = fontSize;
-        this._layoutTextLastFontFamily = fontFamily;
-      }
+      if (textDivProperties.canvasWidth !== 0) {
+        var _textDiv$style = textDiv.style,
+            fontSize = _textDiv$style.fontSize,
+            fontFamily = _textDiv$style.fontFamily;
 
-      var width = this._layoutTextCtx.measureText(textDiv.textContent).width;
+        if (fontSize !== this._layoutTextLastFontSize || fontFamily !== this._layoutTextLastFontFamily) {
+          this._layoutTextCtx.font = "".concat(fontSize, " ").concat(fontFamily);
+          this._layoutTextLastFontSize = fontSize;
+          this._layoutTextLastFontFamily = fontFamily;
+        }
 
-      var transform = '';
+        var _this$_layoutTextCtx$ = this._layoutTextCtx.measureText(textDiv.textContent),
+            width = _this$_layoutTextCtx$.width;
 
-      if (textDivProperties.canvasWidth !== 0 && width > 0) {
-        textDivProperties.scale = textDivProperties.canvasWidth / width;
-        transform = "scaleX(".concat(textDivProperties.scale, ")");
+        if (width > 0) {
+          textDivProperties.scale = textDivProperties.canvasWidth / width;
+          transform = "scaleX(".concat(textDivProperties.scale, ")");
+        }
       }
 
       if (textDivProperties.angle !== 0) {
@@ -546,13 +542,16 @@ var renderTextLayer = function renderTextLayerClosure() {
       }
 
       if (transform.length > 0) {
-        textDivProperties.originalTransform = transform;
+        if (this._enhanceTextSelection) {
+          textDivProperties.originalTransform = transform;
+        }
+
         textDiv.style.transform = transform;
       }
 
       this._textDivProperties.set(textDiv, textDivProperties);
 
-      textLayerFrag.appendChild(textDiv);
+      this._container.appendChild(textDiv);
     },
     _render: function TextLayer_render(timeout) {
       var _this2 = this;
@@ -620,55 +619,65 @@ var renderTextLayer = function renderTextLayerClosure() {
         this._bounds = null;
       }
 
+      var NO_PADDING = '0 0 0 0';
+      var transformBuf = [],
+          paddingBuf = [];
+
       for (var i = 0, ii = this._textDivs.length; i < ii; i++) {
         var div = this._textDivs[i];
 
-        var divProperties = this._textDivProperties.get(div);
+        var divProps = this._textDivProperties.get(div);
 
-        if (divProperties.isWhitespace) {
+        if (divProps.isWhitespace) {
           continue;
         }
 
         if (expandDivs) {
-          var transform = '',
-              padding = '';
+          transformBuf.length = 0;
+          paddingBuf.length = 0;
 
-          if (divProperties.scale !== 1) {
-            transform = 'scaleX(' + divProperties.scale + ')';
+          if (divProps.originalTransform) {
+            transformBuf.push(divProps.originalTransform);
           }
 
-          if (divProperties.angle !== 0) {
-            transform = 'rotate(' + divProperties.angle + 'deg) ' + transform;
+          if (divProps.paddingTop > 0) {
+            paddingBuf.push("".concat(divProps.paddingTop, "px"));
+            transformBuf.push("translateY(".concat(-divProps.paddingTop, "px)"));
+          } else {
+            paddingBuf.push(0);
           }
 
-          if (divProperties.paddingLeft !== 0) {
-            padding += ' padding-left: ' + divProperties.paddingLeft / divProperties.scale + 'px;';
-            transform += ' translateX(' + -divProperties.paddingLeft / divProperties.scale + 'px)';
+          if (divProps.paddingRight > 0) {
+            paddingBuf.push("".concat(divProps.paddingRight / divProps.scale, "px"));
+          } else {
+            paddingBuf.push(0);
           }
 
-          if (divProperties.paddingTop !== 0) {
-            padding += ' padding-top: ' + divProperties.paddingTop + 'px;';
-            transform += ' translateY(' + -divProperties.paddingTop + 'px)';
+          if (divProps.paddingBottom > 0) {
+            paddingBuf.push("".concat(divProps.paddingBottom, "px"));
+          } else {
+            paddingBuf.push(0);
           }
 
-          if (divProperties.paddingRight !== 0) {
-            padding += ' padding-right: ' + divProperties.paddingRight / divProperties.scale + 'px;';
+          if (divProps.paddingLeft > 0) {
+            paddingBuf.push("".concat(divProps.paddingLeft / divProps.scale, "px"));
+            transformBuf.push("translateX(".concat(-divProps.paddingLeft / divProps.scale, "px)"));
+          } else {
+            paddingBuf.push(0);
           }
 
-          if (divProperties.paddingBottom !== 0) {
-            padding += ' padding-bottom: ' + divProperties.paddingBottom + 'px;';
-          }
+          var padding = paddingBuf.join(' ');
 
-          if (padding !== '') {
-            div.setAttribute('style', divProperties.style + padding);
+          if (padding !== NO_PADDING) {
+            div.style.padding = padding;
           }
 
-          if (transform !== '') {
-            div.style.transform = transform;
+          if (transformBuf.length) {
+            div.style.transform = transformBuf.join(' ');
           }
         } else {
-          div.style.padding = 0;
-          div.style.transform = divProperties.originalTransform || '';
+          div.style.padding = null;
+          div.style.transform = divProps.originalTransform;
         }
       }
     }

+ 1 - 1
lib/display/xml_parser.js

@@ -32,7 +32,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 

+ 2 - 3
lib/pdf.js

@@ -21,8 +21,8 @@
  */
 'use strict';
 
-var pdfjsVersion = '2.2.228';
-var pdfjsBuild = 'd7afb74a';
+var pdfjsVersion = '2.3.200';
+var pdfjsBuild = '4ae3f9fc';
 
 var pdfjsSharedUtil = require('./shared/util.js');
 
@@ -93,7 +93,6 @@ exports.removeNullCharacters = pdfjsSharedUtil.removeNullCharacters;
 exports.shadow = pdfjsSharedUtil.shadow;
 exports.Util = pdfjsSharedUtil.Util;
 exports.ReadableStream = pdfjsSharedUtil.ReadableStream;
-exports.URL = pdfjsSharedUtil.URL;
 exports.RenderingCancelledException = pdfjsDisplayDisplayUtils.RenderingCancelledException;
 exports.getFilenameFromUrl = pdfjsDisplayDisplayUtils.getFilenameFromUrl;
 exports.LinkTarget = pdfjsDisplayDisplayUtils.LinkTarget;

+ 2 - 2
lib/pdf.worker.js

@@ -21,8 +21,8 @@
  */
 'use strict';
 
-var pdfjsVersion = '2.2.228';
-var pdfjsBuild = 'd7afb74a';
+var pdfjsVersion = '2.3.200';
+var pdfjsBuild = '4ae3f9fc';
 
 var pdfjsCoreWorker = require('./core/worker.js');
 

+ 23 - 19
lib/shared/compatibility.js

@@ -128,7 +128,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    require('core-js/fn/string/starts-with');
+    require('core-js/es/string/starts-with');
   })();
 
   (function checkStringEndsWith() {
@@ -136,7 +136,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    require('core-js/fn/string/ends-with');
+    require('core-js/es/string/ends-with');
   })();
 
   (function checkStringIncludes() {
@@ -144,7 +144,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    require('core-js/fn/string/includes');
+    require('core-js/es/string/includes');
   })();
 
   (function checkArrayIncludes() {
@@ -152,7 +152,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    require('core-js/fn/array/includes');
+    require('core-js/es/array/includes');
   })();
 
   (function checkArrayFrom() {
@@ -160,7 +160,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    require('core-js/fn/array/from');
+    require('core-js/es/array/from');
   })();
 
   (function checkObjectAssign() {
@@ -168,7 +168,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    require('core-js/fn/object/assign');
+    require('core-js/es/object/assign');
   })();
 
   (function checkMathLog2() {
@@ -176,7 +176,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    Math.log2 = require('core-js/fn/math/log2');
+    Math.log2 = require('core-js/es/math/log2');
   })();
 
   (function checkNumberIsNaN() {
@@ -184,7 +184,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    Number.isNaN = require('core-js/fn/number/is-nan');
+    Number.isNaN = require('core-js/es/number/is-nan');
   })();
 
   (function checkNumberIsInteger() {
@@ -192,7 +192,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    Number.isInteger = require('core-js/fn/number/is-integer');
+    Number.isInteger = require('core-js/es/number/is-integer');
   })();
 
   (function checkPromise() {
@@ -200,7 +200,11 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    globalScope.Promise = require('core-js/fn/promise');
+    globalScope.Promise = require('core-js/es/promise/index');
+  })();
+
+  (function checkURL() {
+    globalScope.URL = require('core-js/web/url');
   })();
 
   (function checkWeakMap() {
@@ -208,7 +212,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    globalScope.WeakMap = require('core-js/fn/weak-map');
+    globalScope.WeakMap = require('core-js/es/weak-map/index');
   })();
 
   (function checkWeakSet() {
@@ -216,15 +220,15 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    globalScope.WeakSet = require('core-js/fn/weak-set');
+    globalScope.WeakSet = require('core-js/es/weak-set/index');
   })();
 
   (function checkStringCodePointAt() {
-    if (String.codePointAt) {
+    if (String.prototype.codePointAt) {
       return;
     }
 
-    String.codePointAt = require('core-js/fn/string/code-point-at');
+    require('core-js/es/string/code-point-at');
   })();
 
   (function checkStringFromCodePoint() {
@@ -232,7 +236,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    String.fromCodePoint = require('core-js/fn/string/from-code-point');
+    String.fromCodePoint = require('core-js/es/string/from-code-point');
   })();
 
   (function checkSymbol() {
@@ -240,7 +244,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    require('core-js/es6/symbol');
+    require('core-js/es/symbol/index');
   })();
 
   (function checkStringPadStart() {
@@ -248,7 +252,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    require('core-js/fn/string/pad-start');
+    require('core-js/es/string/pad-start');
   })();
 
   (function checkStringPadEnd() {
@@ -256,7 +260,7 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    require('core-js/fn/string/pad-end');
+    require('core-js/es/string/pad-end');
   })();
 
   (function checkObjectValues() {
@@ -264,6 +268,6 @@ if (!globalScope._pdfjsCompatibilityChecked) {
       return;
     }
 
-    Object.values = require('core-js/fn/object/values');
+    Object.values = require('core-js/es/object/values');
   })();
 }

+ 163 - 196
lib/shared/message_handler.js

@@ -26,53 +26,21 @@ Object.defineProperty(exports, "__esModule", {
 });
 exports.MessageHandler = MessageHandler;
 
-var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
-
 var _util = require("./util");
 
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
 function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
 
-function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
-
-function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
-
-function resolveCall(_x, _x2) {
-  return _resolveCall.apply(this, arguments);
-}
-
-function _resolveCall() {
-  _resolveCall = _asyncToGenerator(
-  /*#__PURE__*/
-  _regenerator["default"].mark(function _callee(fn, args) {
-    var thisArg,
-        _args = arguments;
-    return _regenerator["default"].wrap(function _callee$(_context) {
-      while (1) {
-        switch (_context.prev = _context.next) {
-          case 0:
-            thisArg = _args.length > 2 && _args[2] !== undefined ? _args[2] : null;
-
-            if (fn) {
-              _context.next = 3;
-              break;
-            }
-
-            return _context.abrupt("return", undefined);
-
-          case 3:
-            return _context.abrupt("return", fn.apply(thisArg, args));
-
-          case 4:
-          case "end":
-            return _context.stop();
-        }
-      }
-    }, _callee);
-  }));
-  return _resolveCall.apply(this, arguments);
-}
+var StreamKind = {
+  UNKNOWN: 0,
+  CANCEL: 1,
+  CANCEL_COMPLETE: 2,
+  CLOSE: 3,
+  ENQUEUE: 4,
+  ERROR: 5,
+  PULL: 6,
+  PULL_COMPLETE: 7,
+  START_COMPLETE: 8
+};
 
 function wrapReason(reason) {
   if (_typeof(reason) !== 'object') {
@@ -89,31 +57,14 @@ function wrapReason(reason) {
     case 'UnexpectedResponseException':
       return new _util.UnexpectedResponseException(reason.message, reason.status);
 
-    default:
+    case 'UnknownErrorException':
       return new _util.UnknownErrorException(reason.message, reason.details);
-  }
-}
-
-function makeReasonSerializable(reason) {
-  if (!(reason instanceof Error) || reason instanceof _util.AbortException || reason instanceof _util.MissingPDFException || reason instanceof _util.UnexpectedResponseException || reason instanceof _util.UnknownErrorException) {
-    return reason;
-  }
-
-  return new _util.UnknownErrorException(reason.message, reason.toString());
-}
 
-function resolveOrReject(capability, success, reason) {
-  if (success) {
-    capability.resolve();
-  } else {
-    capability.reject(reason);
+    default:
+      return new _util.UnknownErrorException(reason.message, reason.toString());
   }
 }
 
-function finalize(promise) {
-  return Promise.resolve(promise)["catch"](function () {});
-}
-
 function MessageHandler(sourceName, targetName, comObj) {
   var _this = this;
 
@@ -144,8 +95,8 @@ function MessageHandler(sourceName, targetName, comObj) {
         var callback = callbacksCapabilities[callbackId];
         delete callbacksCapabilities[callbackId];
 
-        if ('error' in data) {
-          callback.reject(wrapReason(data.error));
+        if ('reason' in data) {
+          callback.reject(wrapReason(data.reason));
         } else {
           callback.resolve(data.data);
         }
@@ -158,8 +109,8 @@ function MessageHandler(sourceName, targetName, comObj) {
       if (data.callbackId) {
         var _sourceName = _this.sourceName;
         var _targetName = data.sourceName;
-        Promise.resolve().then(function () {
-          return action[0].call(action[1], data.data);
+        new Promise(function (resolve) {
+          resolve(action(data.data));
         }).then(function (result) {
           comObj.postMessage({
             sourceName: _sourceName,
@@ -174,13 +125,13 @@ function MessageHandler(sourceName, targetName, comObj) {
             targetName: _targetName,
             isReply: true,
             callbackId: data.callbackId,
-            error: makeReasonSerializable(reason)
+            reason: wrapReason(reason)
           });
         });
       } else if (data.streamId) {
         _this._createStreamSink(data);
       } else {
-        action[0].call(action[1], data.data);
+        action(data.data);
       }
     } else {
       throw new Error("Unknown action from worker: ".concat(data.action));
@@ -191,40 +142,38 @@ function MessageHandler(sourceName, targetName, comObj) {
 }
 
 MessageHandler.prototype = {
-  on: function on(actionName, handler, scope) {
+  on: function on(actionName, handler) {
     var ah = this.actionHandler;
 
     if (ah[actionName]) {
       throw new Error("There is already an actionName called \"".concat(actionName, "\""));
     }
 
-    ah[actionName] = [handler, scope];
+    ah[actionName] = handler;
   },
   send: function send(actionName, data, transfers) {
-    var message = {
+    this.postMessage({
       sourceName: this.sourceName,
       targetName: this.targetName,
       action: actionName,
       data: data
-    };
-    this.postMessage(message, transfers);
+    }, transfers);
   },
   sendWithPromise: function sendWithPromise(actionName, data, transfers) {
     var callbackId = this.callbackId++;
-    var message = {
-      sourceName: this.sourceName,
-      targetName: this.targetName,
-      action: actionName,
-      data: data,
-      callbackId: callbackId
-    };
     var capability = (0, _util.createPromiseCapability)();
     this.callbacksCapabilities[callbackId] = capability;
 
     try {
-      this.postMessage(message, transfers);
-    } catch (e) {
-      capability.reject(e);
+      this.postMessage({
+        sourceName: this.sourceName,
+        targetName: this.targetName,
+        action: actionName,
+        callbackId: callbackId,
+        data: data
+      }, transfers);
+    } catch (ex) {
+      capability.reject(ex);
     }
 
     return capability.promise;
@@ -235,12 +184,15 @@ MessageHandler.prototype = {
     var streamId = this.streamId++;
     var sourceName = this.sourceName;
     var targetName = this.targetName;
+    var comObj = this.comObj;
     return new _util.ReadableStream({
       start: function start(controller) {
         var startCapability = (0, _util.createPromiseCapability)();
         _this2.streamControllers[streamId] = {
           controller: controller,
           startCall: startCapability,
+          pullCall: null,
+          cancelCall: null,
           isClosed: false
         };
 
@@ -251,44 +203,39 @@ MessageHandler.prototype = {
           streamId: streamId,
           data: data,
           desiredSize: controller.desiredSize
-        });
+        }, transfers);
 
         return startCapability.promise;
       },
       pull: function pull(controller) {
         var pullCapability = (0, _util.createPromiseCapability)();
         _this2.streamControllers[streamId].pullCall = pullCapability;
-
-        _this2.postMessage({
+        comObj.postMessage({
           sourceName: sourceName,
           targetName: targetName,
-          stream: 'pull',
+          stream: StreamKind.PULL,
           streamId: streamId,
           desiredSize: controller.desiredSize
         });
-
         return pullCapability.promise;
       },
       cancel: function cancel(reason) {
+        (0, _util.assert)(reason instanceof Error, 'cancel must have a valid reason');
         var cancelCapability = (0, _util.createPromiseCapability)();
         _this2.streamControllers[streamId].cancelCall = cancelCapability;
         _this2.streamControllers[streamId].isClosed = true;
-
-        _this2.postMessage({
+        comObj.postMessage({
           sourceName: sourceName,
           targetName: targetName,
-          stream: 'cancel',
-          reason: reason,
-          streamId: streamId
+          stream: StreamKind.CANCEL,
+          streamId: streamId,
+          reason: wrapReason(reason)
         });
-
         return cancelCapability.promise;
       }
     }, queueingStrategy);
   },
   _createStreamSink: function _createStreamSink(data) {
-    var _this3 = this;
-
     var self = this;
     var action = this.actionHandler[data.action];
     var streamId = data.streamId;
@@ -296,25 +243,7 @@ MessageHandler.prototype = {
     var sourceName = this.sourceName;
     var targetName = data.sourceName;
     var capability = (0, _util.createPromiseCapability)();
-
-    var sendStreamRequest = function sendStreamRequest(_ref) {
-      var stream = _ref.stream,
-          chunk = _ref.chunk,
-          transfers = _ref.transfers,
-          success = _ref.success,
-          reason = _ref.reason;
-
-      _this3.postMessage({
-        sourceName: sourceName,
-        targetName: targetName,
-        stream: stream,
-        streamId: streamId,
-        chunk: chunk,
-        success: success,
-        reason: reason
-      }, transfers);
-    };
-
+    var comObj = this.comObj;
     var streamSink = {
       enqueue: function enqueue(chunk) {
         var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
@@ -332,11 +261,13 @@ MessageHandler.prototype = {
           this.ready = this.sinkCapability.promise;
         }
 
-        sendStreamRequest({
-          stream: 'enqueue',
-          chunk: chunk,
-          transfers: transfers
-        });
+        self.postMessage({
+          sourceName: sourceName,
+          targetName: targetName,
+          stream: StreamKind.ENQUEUE,
+          streamId: streamId,
+          chunk: chunk
+        }, transfers);
       },
       close: function close() {
         if (this.isCancelled) {
@@ -344,20 +275,28 @@ MessageHandler.prototype = {
         }
 
         this.isCancelled = true;
-        sendStreamRequest({
-          stream: 'close'
+        comObj.postMessage({
+          sourceName: sourceName,
+          targetName: targetName,
+          stream: StreamKind.CLOSE,
+          streamId: streamId
         });
         delete self.streamSinks[streamId];
       },
       error: function error(reason) {
+        (0, _util.assert)(reason instanceof Error, 'error must have a valid reason');
+
         if (this.isCancelled) {
           return;
         }
 
         this.isCancelled = true;
-        sendStreamRequest({
-          stream: 'error',
-          reason: reason
+        comObj.postMessage({
+          sourceName: sourceName,
+          targetName: targetName,
+          stream: StreamKind.ERROR,
+          streamId: streamId,
+          reason: wrapReason(reason)
         });
       },
       sinkCapability: capability,
@@ -370,138 +309,166 @@ MessageHandler.prototype = {
     streamSink.sinkCapability.resolve();
     streamSink.ready = streamSink.sinkCapability.promise;
     this.streamSinks[streamId] = streamSink;
-    resolveCall(action[0], [data.data, streamSink], action[1]).then(function () {
-      sendStreamRequest({
-        stream: 'start_complete',
+    new Promise(function (resolve) {
+      resolve(action(data.data, streamSink));
+    }).then(function () {
+      comObj.postMessage({
+        sourceName: sourceName,
+        targetName: targetName,
+        stream: StreamKind.START_COMPLETE,
+        streamId: streamId,
         success: true
       });
     }, function (reason) {
-      sendStreamRequest({
-        stream: 'start_complete',
-        success: false,
-        reason: reason
+      comObj.postMessage({
+        sourceName: sourceName,
+        targetName: targetName,
+        stream: StreamKind.START_COMPLETE,
+        streamId: streamId,
+        reason: wrapReason(reason)
       });
     });
   },
   _processStreamMessage: function _processStreamMessage(data) {
-    var _this4 = this;
+    var _this3 = this;
 
     var sourceName = this.sourceName;
     var targetName = data.sourceName;
     var streamId = data.streamId;
-
-    var sendStreamResponse = function sendStreamResponse(_ref2) {
-      var stream = _ref2.stream,
-          success = _ref2.success,
-          reason = _ref2.reason;
-
-      _this4.comObj.postMessage({
-        sourceName: sourceName,
-        targetName: targetName,
-        stream: stream,
-        success: success,
-        streamId: streamId,
-        reason: reason
-      });
-    };
+    var comObj = this.comObj;
 
     var deleteStreamController = function deleteStreamController() {
-      Promise.all([_this4.streamControllers[data.streamId].startCall, _this4.streamControllers[data.streamId].pullCall, _this4.streamControllers[data.streamId].cancelCall].map(function (capability) {
-        return capability && finalize(capability.promise);
+      Promise.all([_this3.streamControllers[streamId].startCall, _this3.streamControllers[streamId].pullCall, _this3.streamControllers[streamId].cancelCall].map(function (capability) {
+        return capability && capability.promise["catch"](function () {});
       })).then(function () {
-        delete _this4.streamControllers[data.streamId];
+        delete _this3.streamControllers[streamId];
       });
     };
 
     switch (data.stream) {
-      case 'start_complete':
-        resolveOrReject(this.streamControllers[data.streamId].startCall, data.success, wrapReason(data.reason));
+      case StreamKind.START_COMPLETE:
+        if (data.success) {
+          this.streamControllers[streamId].startCall.resolve();
+        } else {
+          this.streamControllers[streamId].startCall.reject(wrapReason(data.reason));
+        }
+
         break;
 
-      case 'pull_complete':
-        resolveOrReject(this.streamControllers[data.streamId].pullCall, data.success, wrapReason(data.reason));
+      case StreamKind.PULL_COMPLETE:
+        if (data.success) {
+          this.streamControllers[streamId].pullCall.resolve();
+        } else {
+          this.streamControllers[streamId].pullCall.reject(wrapReason(data.reason));
+        }
+
         break;
 
-      case 'pull':
-        if (!this.streamSinks[data.streamId]) {
-          sendStreamResponse({
-            stream: 'pull_complete',
+      case StreamKind.PULL:
+        if (!this.streamSinks[streamId]) {
+          comObj.postMessage({
+            sourceName: sourceName,
+            targetName: targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId: streamId,
             success: true
           });
           break;
         }
 
-        if (this.streamSinks[data.streamId].desiredSize <= 0 && data.desiredSize > 0) {
-          this.streamSinks[data.streamId].sinkCapability.resolve();
+        if (this.streamSinks[streamId].desiredSize <= 0 && data.desiredSize > 0) {
+          this.streamSinks[streamId].sinkCapability.resolve();
         }
 
-        this.streamSinks[data.streamId].desiredSize = data.desiredSize;
-        resolveCall(this.streamSinks[data.streamId].onPull).then(function () {
-          sendStreamResponse({
-            stream: 'pull_complete',
+        this.streamSinks[streamId].desiredSize = data.desiredSize;
+        var onPull = this.streamSinks[data.streamId].onPull;
+        new Promise(function (resolve) {
+          resolve(onPull && onPull());
+        }).then(function () {
+          comObj.postMessage({
+            sourceName: sourceName,
+            targetName: targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId: streamId,
             success: true
           });
         }, function (reason) {
-          sendStreamResponse({
-            stream: 'pull_complete',
-            success: false,
-            reason: reason
+          comObj.postMessage({
+            sourceName: sourceName,
+            targetName: targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId: streamId,
+            reason: wrapReason(reason)
           });
         });
         break;
 
-      case 'enqueue':
-        (0, _util.assert)(this.streamControllers[data.streamId], 'enqueue should have stream controller');
+      case StreamKind.ENQUEUE:
+        (0, _util.assert)(this.streamControllers[streamId], 'enqueue should have stream controller');
 
-        if (!this.streamControllers[data.streamId].isClosed) {
-          this.streamControllers[data.streamId].controller.enqueue(data.chunk);
+        if (this.streamControllers[streamId].isClosed) {
+          break;
         }
 
+        this.streamControllers[streamId].controller.enqueue(data.chunk);
         break;
 
-      case 'close':
-        (0, _util.assert)(this.streamControllers[data.streamId], 'close should have stream controller');
+      case StreamKind.CLOSE:
+        (0, _util.assert)(this.streamControllers[streamId], 'close should have stream controller');
 
-        if (this.streamControllers[data.streamId].isClosed) {
+        if (this.streamControllers[streamId].isClosed) {
           break;
         }
 
-        this.streamControllers[data.streamId].isClosed = true;
-        this.streamControllers[data.streamId].controller.close();
+        this.streamControllers[streamId].isClosed = true;
+        this.streamControllers[streamId].controller.close();
         deleteStreamController();
         break;
 
-      case 'error':
-        (0, _util.assert)(this.streamControllers[data.streamId], 'error should have stream controller');
-        this.streamControllers[data.streamId].controller.error(wrapReason(data.reason));
+      case StreamKind.ERROR:
+        (0, _util.assert)(this.streamControllers[streamId], 'error should have stream controller');
+        this.streamControllers[streamId].controller.error(wrapReason(data.reason));
         deleteStreamController();
         break;
 
-      case 'cancel_complete':
-        resolveOrReject(this.streamControllers[data.streamId].cancelCall, data.success, wrapReason(data.reason));
+      case StreamKind.CANCEL_COMPLETE:
+        if (data.success) {
+          this.streamControllers[streamId].cancelCall.resolve();
+        } else {
+          this.streamControllers[streamId].cancelCall.reject(wrapReason(data.reason));
+        }
+
         deleteStreamController();
         break;
 
-      case 'cancel':
-        if (!this.streamSinks[data.streamId]) {
+      case StreamKind.CANCEL:
+        if (!this.streamSinks[streamId]) {
           break;
         }
 
-        resolveCall(this.streamSinks[data.streamId].onCancel, [wrapReason(data.reason)]).then(function () {
-          sendStreamResponse({
-            stream: 'cancel_complete',
+        var onCancel = this.streamSinks[data.streamId].onCancel;
+        new Promise(function (resolve) {
+          resolve(onCancel && onCancel(wrapReason(data.reason)));
+        }).then(function () {
+          comObj.postMessage({
+            sourceName: sourceName,
+            targetName: targetName,
+            stream: StreamKind.CANCEL_COMPLETE,
+            streamId: streamId,
             success: true
           });
         }, function (reason) {
-          sendStreamResponse({
-            stream: 'cancel_complete',
-            success: false,
-            reason: reason
+          comObj.postMessage({
+            sourceName: sourceName,
+            targetName: targetName,
+            stream: StreamKind.CANCEL_COMPLETE,
+            streamId: streamId,
+            reason: wrapReason(reason)
           });
         });
-        this.streamSinks[data.streamId].sinkCapability.reject(wrapReason(data.reason));
-        this.streamSinks[data.streamId].isCancelled = true;
-        delete this.streamSinks[data.streamId];
+        this.streamSinks[streamId].sinkCapability.reject(wrapReason(data.reason));
+        this.streamSinks[streamId].isCancelled = true;
+        delete this.streamSinks[streamId];
         break;
 
       default:

+ 1 - 1
lib/shared/streams_polyfill.js

@@ -38,6 +38,6 @@
   if (isReadableStreamSupported) {
     exports.ReadableStream = ReadableStream;
   } else {
-    exports.ReadableStream = require('../../external/streams/streams-lib').ReadableStream;
+    exports.ReadableStream = require('web-streams-polyfill/dist/ponyfill').ReadableStream;
   }
 }

+ 0 - 56
lib/shared/url_polyfill.js

@@ -1,56 +0,0 @@
-/**
- * @licstart The following is the entire license notice for the
- * Javascript code in this page
- *
- * Copyright 2019 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * @licend The above is the entire license notice for the
- * Javascript code in this page
- */
-"use strict";
-
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-{
-  var isURLSupported = false;
-
-  try {
-    if (typeof URL === 'function' && _typeof(URL.prototype) === 'object' && 'origin' in URL.prototype) {
-      var u = new URL('b', 'http://a');
-      u.pathname = 'c%20d';
-      isURLSupported = u.href === 'http://a/c%20d';
-    }
-  } catch (ex) {}
-
-  if (isURLSupported) {
-    exports.URL = URL;
-  } else {
-    var PolyfillURL = require('../../external/url/url-lib').URL;
-
-    var OriginalURL = require('./global_scope').URL;
-
-    if (OriginalURL) {
-      PolyfillURL.createObjectURL = function (blob) {
-        return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
-      };
-
-      PolyfillURL.revokeObjectURL = function (url) {
-        OriginalURL.revokeObjectURL(url);
-      };
-    }
-
-    exports.URL = PolyfillURL;
-  }
-}

+ 288 - 196
lib/shared/util.js

@@ -58,26 +58,34 @@ exports.warn = warn;
 exports.unreachable = unreachable;
 Object.defineProperty(exports, "ReadableStream", {
   enumerable: true,
-  get: function get() {
+  get: function () {
     return _streams_polyfill.ReadableStream;
   }
 });
-Object.defineProperty(exports, "URL", {
-  enumerable: true,
-  get: function get() {
-    return _url_polyfill.URL;
-  }
-});
-exports.createObjectURL = exports.FormatError = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.NativeImageDecoding = exports.MissingPDFException = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = void 0;
+exports.createObjectURL = exports.FormatError = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.NativeImageDecoding = exports.MissingPDFException = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = exports.BaseException = void 0;
 
 require("./compatibility");
 
 var _streams_polyfill = require("./streams_polyfill");
 
-var _url_polyfill = require("./url_polyfill");
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
 
 function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
 
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
+
+function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
+
+function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
+
+function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
+
 var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
 exports.IDENTITY_MATRIX = IDENTITY_MATRIX;
 var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
@@ -147,6 +155,29 @@ var AnnotationType = {
   REDACT: 26
 };
 exports.AnnotationType = AnnotationType;
+var AnnotationStateModelType = {
+  MARKED: 'Marked',
+  REVIEW: 'Review'
+};
+exports.AnnotationStateModelType = AnnotationStateModelType;
+var AnnotationMarkedState = {
+  MARKED: 'Marked',
+  UNMARKED: 'Unmarked'
+};
+exports.AnnotationMarkedState = AnnotationMarkedState;
+var AnnotationReviewState = {
+  ACCEPTED: 'Accepted',
+  REJECTED: 'Rejected',
+  CANCELLED: 'Cancelled',
+  COMPLETED: 'Completed',
+  NONE: 'None'
+};
+exports.AnnotationReviewState = AnnotationReviewState;
+var AnnotationReplyType = {
+  GROUP: 'Group',
+  REPLY: 'R'
+};
+exports.AnnotationReplyType = AnnotationReplyType;
 var AnnotationFlag = {
   INVISIBLE: 0x01,
   HIDDEN: 0x02,
@@ -191,30 +222,30 @@ var AnnotationBorderStyleType = {
 };
 exports.AnnotationBorderStyleType = AnnotationBorderStyleType;
 var StreamType = {
-  UNKNOWN: 0,
-  FLATE: 1,
-  LZW: 2,
-  DCT: 3,
-  JPX: 4,
-  JBIG: 5,
-  A85: 6,
-  AHX: 7,
-  CCF: 8,
-  RL: 9
+  UNKNOWN: 'UNKNOWN',
+  FLATE: 'FLATE',
+  LZW: 'LZW',
+  DCT: 'DCT',
+  JPX: 'JPX',
+  JBIG: 'JBIG',
+  A85: 'A85',
+  AHX: 'AHX',
+  CCF: 'CCF',
+  RLX: 'RLX'
 };
 exports.StreamType = StreamType;
 var FontType = {
-  UNKNOWN: 0,
-  TYPE1: 1,
-  TYPE1C: 2,
-  CIDFONTTYPE0: 3,
-  CIDFONTTYPE0C: 4,
-  TRUETYPE: 5,
-  CIDFONTTYPE2: 6,
-  TYPE3: 7,
-  OPENTYPE: 8,
-  TYPE0: 9,
-  MMTYPE1: 10
+  UNKNOWN: 'UNKNOWN',
+  TYPE1: 'TYPE1',
+  TYPE1C: 'TYPE1C',
+  CIDFONTTYPE0: 'CIDFONTTYPE0',
+  CIDFONTTYPE0C: 'CIDFONTTYPE0C',
+  TRUETYPE: 'TRUETYPE',
+  CIDFONTTYPE2: 'CIDFONTTYPE2',
+  TYPE3: 'TYPE3',
+  OPENTYPE: 'OPENTYPE',
+  TYPE0: 'TYPE0',
+  MMTYPE1: 'MMTYPE1'
 };
 exports.FontType = FontType;
 var VerbosityLevel = {
@@ -351,13 +382,13 @@ function getVerbosityLevel() {
 
 function info(msg) {
   if (verbosity >= VerbosityLevel.INFOS) {
-    console.log('Info: ' + msg);
+    console.log("Info: ".concat(msg));
   }
 }
 
 function warn(msg) {
   if (verbosity >= VerbosityLevel.WARNINGS) {
-    console.log('Warning: ' + msg);
+    console.log("Warning: ".concat(msg));
   }
 }
 
@@ -372,8 +403,10 @@ function assert(cond, msg) {
 }
 
 function isSameOrigin(baseUrl, otherUrl) {
+  var base;
+
   try {
-    var base = new _url_polyfill.URL(baseUrl);
+    base = new URL(baseUrl);
 
     if (!base.origin || base.origin === 'null') {
       return false;
@@ -382,7 +415,7 @@ function isSameOrigin(baseUrl, otherUrl) {
     return false;
   }
 
-  var other = new _url_polyfill.URL(otherUrl, base);
+  var other = new URL(otherUrl, base);
   return base.origin === other.origin;
 }
 
@@ -410,7 +443,7 @@ function createValidAbsoluteUrl(url, baseUrl) {
   }
 
   try {
-    var absoluteUrl = baseUrl ? new _url_polyfill.URL(url, baseUrl) : new _url_polyfill.URL(url);
+    var absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);
 
     if (_isValidProtocol(absoluteUrl)) {
       return absoluteUrl;
@@ -430,97 +463,144 @@ function shadow(obj, prop, value) {
   return value;
 }
 
-var PasswordException = function PasswordExceptionClosure() {
+var BaseException = function BaseExceptionClosure() {
+  function BaseException(message) {
+    if (this.constructor === BaseException) {
+      unreachable('Cannot initialize BaseException.');
+    }
+
+    this.message = message;
+    this.name = this.constructor.name;
+  }
+
+  BaseException.prototype = new Error();
+  BaseException.constructor = BaseException;
+  return BaseException;
+}();
+
+exports.BaseException = BaseException;
+
+var PasswordException =
+/*#__PURE__*/
+function (_BaseException) {
+  _inherits(PasswordException, _BaseException);
+
   function PasswordException(msg, code) {
-    this.name = 'PasswordException';
-    this.message = msg;
-    this.code = code;
+    var _this;
+
+    _classCallCheck(this, PasswordException);
+
+    _this = _possibleConstructorReturn(this, _getPrototypeOf(PasswordException).call(this, msg));
+    _this.code = code;
+    return _this;
   }
 
-  PasswordException.prototype = new Error();
-  PasswordException.constructor = PasswordException;
   return PasswordException;
-}();
+}(BaseException);
 
 exports.PasswordException = PasswordException;
 
-var UnknownErrorException = function UnknownErrorExceptionClosure() {
+var UnknownErrorException =
+/*#__PURE__*/
+function (_BaseException2) {
+  _inherits(UnknownErrorException, _BaseException2);
+
   function UnknownErrorException(msg, details) {
-    this.name = 'UnknownErrorException';
-    this.message = msg;
-    this.details = details;
+    var _this2;
+
+    _classCallCheck(this, UnknownErrorException);
+
+    _this2 = _possibleConstructorReturn(this, _getPrototypeOf(UnknownErrorException).call(this, msg));
+    _this2.details = details;
+    return _this2;
   }
 
-  UnknownErrorException.prototype = new Error();
-  UnknownErrorException.constructor = UnknownErrorException;
   return UnknownErrorException;
-}();
+}(BaseException);
 
 exports.UnknownErrorException = UnknownErrorException;
 
-var InvalidPDFException = function InvalidPDFExceptionClosure() {
-  function InvalidPDFException(msg) {
-    this.name = 'InvalidPDFException';
-    this.message = msg;
+var InvalidPDFException =
+/*#__PURE__*/
+function (_BaseException3) {
+  _inherits(InvalidPDFException, _BaseException3);
+
+  function InvalidPDFException() {
+    _classCallCheck(this, InvalidPDFException);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(InvalidPDFException).apply(this, arguments));
   }
 
-  InvalidPDFException.prototype = new Error();
-  InvalidPDFException.constructor = InvalidPDFException;
   return InvalidPDFException;
-}();
+}(BaseException);
 
 exports.InvalidPDFException = InvalidPDFException;
 
-var MissingPDFException = function MissingPDFExceptionClosure() {
-  function MissingPDFException(msg) {
-    this.name = 'MissingPDFException';
-    this.message = msg;
+var MissingPDFException =
+/*#__PURE__*/
+function (_BaseException4) {
+  _inherits(MissingPDFException, _BaseException4);
+
+  function MissingPDFException() {
+    _classCallCheck(this, MissingPDFException);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(MissingPDFException).apply(this, arguments));
   }
 
-  MissingPDFException.prototype = new Error();
-  MissingPDFException.constructor = MissingPDFException;
   return MissingPDFException;
-}();
+}(BaseException);
 
 exports.MissingPDFException = MissingPDFException;
 
-var UnexpectedResponseException = function UnexpectedResponseExceptionClosure() {
+var UnexpectedResponseException =
+/*#__PURE__*/
+function (_BaseException5) {
+  _inherits(UnexpectedResponseException, _BaseException5);
+
   function UnexpectedResponseException(msg, status) {
-    this.name = 'UnexpectedResponseException';
-    this.message = msg;
-    this.status = status;
+    var _this3;
+
+    _classCallCheck(this, UnexpectedResponseException);
+
+    _this3 = _possibleConstructorReturn(this, _getPrototypeOf(UnexpectedResponseException).call(this, msg));
+    _this3.status = status;
+    return _this3;
   }
 
-  UnexpectedResponseException.prototype = new Error();
-  UnexpectedResponseException.constructor = UnexpectedResponseException;
   return UnexpectedResponseException;
-}();
+}(BaseException);
 
 exports.UnexpectedResponseException = UnexpectedResponseException;
 
-var FormatError = function FormatErrorClosure() {
-  function FormatError(msg) {
-    this.message = msg;
+var FormatError =
+/*#__PURE__*/
+function (_BaseException6) {
+  _inherits(FormatError, _BaseException6);
+
+  function FormatError() {
+    _classCallCheck(this, FormatError);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(FormatError).apply(this, arguments));
   }
 
-  FormatError.prototype = new Error();
-  FormatError.prototype.name = 'FormatError';
-  FormatError.constructor = FormatError;
   return FormatError;
-}();
+}(BaseException);
 
 exports.FormatError = FormatError;
 
-var AbortException = function AbortExceptionClosure() {
-  function AbortException(msg) {
-    this.name = 'AbortException';
-    this.message = msg;
+var AbortException =
+/*#__PURE__*/
+function (_BaseException7) {
+  _inherits(AbortException, _BaseException7);
+
+  function AbortException() {
+    _classCallCheck(this, AbortException);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(AbortException).apply(this, arguments));
   }
 
-  AbortException.prototype = new Error();
-  AbortException.constructor = AbortException;
   return AbortException;
-}();
+}(BaseException);
 
 exports.AbortException = AbortException;
 var NullCharactersRegExp = /\x00/g;
@@ -576,26 +656,23 @@ function arrayByteLength(arr) {
 }
 
 function arraysToBytes(arr) {
-  if (arr.length === 1 && arr[0] instanceof Uint8Array) {
+  var length = arr.length;
+
+  if (length === 1 && arr[0] instanceof Uint8Array) {
     return arr[0];
   }
 
   var resultLength = 0;
-  var i,
-      ii = arr.length;
-  var item, itemLength;
-
-  for (i = 0; i < ii; i++) {
-    item = arr[i];
-    itemLength = arrayByteLength(item);
-    resultLength += itemLength;
+
+  for (var i = 0; i < length; i++) {
+    resultLength += arrayByteLength(arr[i]);
   }
 
   var pos = 0;
   var data = new Uint8Array(resultLength);
 
-  for (i = 0; i < ii; i++) {
-    item = arr[i];
+  for (var _i = 0; _i < length; _i++) {
+    var item = arr[_i];
 
     if (!(item instanceof Uint8Array)) {
       if (typeof item === 'string') {
@@ -605,7 +682,7 @@ function arraysToBytes(arr) {
       }
     }
 
-    itemLength = item.byteLength;
+    var itemLength = item.byteLength;
     data.set(item, pos);
     pos += itemLength;
   }
@@ -653,108 +730,124 @@ function isEvalSupported() {
   }
 }
 
-var Util = function UtilClosure() {
-  function Util() {}
-
-  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];
-
-  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
-    rgbBuf[1] = r;
-    rgbBuf[3] = g;
-    rgbBuf[5] = b;
-    return rgbBuf.join('');
-  };
-
-  Util.transform = function Util_transform(m1, m2) {
-    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];
-  };
-
-  Util.applyTransform = function Util_applyTransform(p, m) {
-    var xt = p[0] * m[0] + p[1] * m[2] + m[4];
-    var yt = p[0] * m[1] + p[1] * m[3] + m[5];
-    return [xt, yt];
-  };
-
-  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
-    var d = m[0] * m[3] - m[1] * m[2];
-    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
-    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
-    return [xt, yt];
-  };
-
-  Util.getAxialAlignedBoundingBox = function Util_getAxialAlignedBoundingBox(r, m) {
-    var p1 = Util.applyTransform(r, m);
-    var p2 = Util.applyTransform(r.slice(2, 4), m);
-    var p3 = Util.applyTransform([r[0], r[3]], m);
-    var p4 = Util.applyTransform([r[2], r[1]], m);
-    return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];
-  };
-
-  Util.inverseTransform = function Util_inverseTransform(m) {
-    var d = m[0] * m[3] - m[1] * m[2];
-    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
-  };
+var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];
 
-  Util.apply3dTransform = function Util_apply3dTransform(m, v) {
-    return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]];
-  };
-
-  Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) {
-    var transpose = [m[0], m[2], m[1], m[3]];
-    var a = m[0] * transpose[0] + m[1] * transpose[2];
-    var b = m[0] * transpose[1] + m[1] * transpose[3];
-    var c = m[2] * transpose[0] + m[3] * transpose[2];
-    var d = m[2] * transpose[1] + m[3] * transpose[3];
-    var first = (a + d) / 2;
-    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
-    var sx = first + second || 1;
-    var sy = first - second || 1;
-    return [Math.sqrt(sx), Math.sqrt(sy)];
-  };
-
-  Util.normalizeRect = function Util_normalizeRect(rect) {
-    var r = rect.slice(0);
+var Util =
+/*#__PURE__*/
+function () {
+  function Util() {
+    _classCallCheck(this, Util);
+  }
 
-    if (rect[0] > rect[2]) {
-      r[0] = rect[2];
-      r[2] = rect[0];
+  _createClass(Util, null, [{
+    key: "makeCssRgb",
+    value: function makeCssRgb(r, g, b) {
+      rgbBuf[1] = r;
+      rgbBuf[3] = g;
+      rgbBuf[5] = b;
+      return rgbBuf.join('');
     }
-
-    if (rect[1] > rect[3]) {
-      r[1] = rect[3];
-      r[3] = rect[1];
+  }, {
+    key: "transform",
+    value: function transform(m1, m2) {
+      return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];
+    }
+  }, {
+    key: "applyTransform",
+    value: function applyTransform(p, m) {
+      var xt = p[0] * m[0] + p[1] * m[2] + m[4];
+      var yt = p[0] * m[1] + p[1] * m[3] + m[5];
+      return [xt, yt];
+    }
+  }, {
+    key: "applyInverseTransform",
+    value: function applyInverseTransform(p, m) {
+      var d = m[0] * m[3] - m[1] * m[2];
+      var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
+      var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
+      return [xt, yt];
+    }
+  }, {
+    key: "getAxialAlignedBoundingBox",
+    value: function getAxialAlignedBoundingBox(r, m) {
+      var p1 = Util.applyTransform(r, m);
+      var p2 = Util.applyTransform(r.slice(2, 4), m);
+      var p3 = Util.applyTransform([r[0], r[3]], m);
+      var p4 = Util.applyTransform([r[2], r[1]], m);
+      return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];
+    }
+  }, {
+    key: "inverseTransform",
+    value: function inverseTransform(m) {
+      var d = m[0] * m[3] - m[1] * m[2];
+      return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
+    }
+  }, {
+    key: "apply3dTransform",
+    value: function apply3dTransform(m, v) {
+      return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]];
     }
+  }, {
+    key: "singularValueDecompose2dScale",
+    value: function singularValueDecompose2dScale(m) {
+      var transpose = [m[0], m[2], m[1], m[3]];
+      var a = m[0] * transpose[0] + m[1] * transpose[2];
+      var b = m[0] * transpose[1] + m[1] * transpose[3];
+      var c = m[2] * transpose[0] + m[3] * transpose[2];
+      var d = m[2] * transpose[1] + m[3] * transpose[3];
+      var first = (a + d) / 2;
+      var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
+      var sx = first + second || 1;
+      var sy = first - second || 1;
+      return [Math.sqrt(sx), Math.sqrt(sy)];
+    }
+  }, {
+    key: "normalizeRect",
+    value: function normalizeRect(rect) {
+      var r = rect.slice(0);
+
+      if (rect[0] > rect[2]) {
+        r[0] = rect[2];
+        r[2] = rect[0];
+      }
 
-    return r;
-  };
+      if (rect[1] > rect[3]) {
+        r[1] = rect[3];
+        r[3] = rect[1];
+      }
 
-  Util.intersect = function Util_intersect(rect1, rect2) {
-    function compare(a, b) {
-      return a - b;
+      return r;
     }
+  }, {
+    key: "intersect",
+    value: function intersect(rect1, rect2) {
+      function compare(a, b) {
+        return a - b;
+      }
 
-    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
-        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
-        result = [];
-    rect1 = Util.normalizeRect(rect1);
-    rect2 = Util.normalizeRect(rect2);
+      var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare);
+      var orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare);
+      var result = [];
+      rect1 = Util.normalizeRect(rect1);
+      rect2 = Util.normalizeRect(rect2);
 
-    if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {
-      result[0] = orderedX[1];
-      result[2] = orderedX[2];
-    } else {
-      return false;
-    }
+      if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {
+        result[0] = orderedX[1];
+        result[2] = orderedX[2];
+      } else {
+        return null;
+      }
 
-    if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {
-      result[1] = orderedY[1];
-      result[3] = orderedY[2];
-    } else {
-      return false;
-    }
+      if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {
+        result[1] = orderedY[1];
+        result[3] = orderedY[2];
+      } else {
+        return null;
+      }
 
-    return result;
-  };
+      return result;
+    }
+  }]);
 
   return Util;
 }();
@@ -763,18 +856,17 @@ exports.Util = Util;
 var PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];
 
 function stringToPDFString(str) {
-  var i,
-      n = str.length,
+  var length = str.length,
       strBuf = [];
 
   if (str[0] === '\xFE' && str[1] === '\xFF') {
-    for (i = 2; i < n; i += 2) {
+    for (var i = 2; i < length; i += 2) {
       strBuf.push(String.fromCharCode(str.charCodeAt(i) << 8 | str.charCodeAt(i + 1)));
     }
   } else {
-    for (i = 0; i < n; ++i) {
-      var code = PDFStringTranslateTable[str.charCodeAt(i)];
-      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
+    for (var _i2 = 0; _i2 < length; ++_i2) {
+      var code = PDFStringTranslateTable[str.charCodeAt(_i2)];
+      strBuf.push(code ? String.fromCharCode(code) : str.charAt(_i2));
     }
   }
 
@@ -854,14 +946,14 @@ var createObjectURL = function createObjectURLClosure() {
   return function createObjectURL(data, contentType) {
     var forceDataSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
 
-    if (!forceDataSchema && _url_polyfill.URL.createObjectURL) {
+    if (!forceDataSchema && URL.createObjectURL) {
       var blob = new Blob([data], {
         type: contentType
       });
-      return _url_polyfill.URL.createObjectURL(blob);
+      return URL.createObjectURL(blob);
     }
 
-    var buffer = 'data:' + contentType + ';base64,';
+    var buffer = "data:".concat(contentType, ";base64,");
 
     for (var i = 0, ii = data.length; i < ii; i += 3) {
       var b1 = data[i] & 0xFF;

+ 687 - 93
lib/test/unit/annotation_spec.js

@@ -138,6 +138,68 @@ describe('annotation', function () {
       }, done.fail);
     });
   });
+  describe('getQuadPoints', function () {
+    var dict, rect;
+    beforeEach(function (done) {
+      dict = new _primitives.Dict();
+      rect = [];
+      done();
+    });
+    afterEach(function () {
+      dict = null;
+      rect = null;
+    });
+    it('should ignore missing quadpoints', function () {
+      expect((0, _annotation.getQuadPoints)(dict, rect)).toEqual(null);
+    });
+    it('should ignore non-array values', function () {
+      dict.set('QuadPoints', 'foo');
+      expect((0, _annotation.getQuadPoints)(dict, rect)).toEqual(null);
+    });
+    it('should ignore arrays where the length is not a multiple of eight', function () {
+      dict.set('QuadPoints', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+      expect((0, _annotation.getQuadPoints)(dict, rect)).toEqual(null);
+    });
+    it('should ignore quadpoints if one coordinate lies outside the rectangle', function () {
+      rect = [10, 10, 20, 20];
+      var inputs = [[11, 11, 12, 12, 9, 13, 14, 14], [11, 11, 12, 12, 13, 9, 14, 14], [11, 11, 12, 12, 21, 13, 14, 14], [11, 11, 12, 12, 13, 21, 14, 14]];
+
+      for (var _i = 0, _inputs = inputs; _i < _inputs.length; _i++) {
+        var input = _inputs[_i];
+        dict.set('QuadPoints', input);
+        expect((0, _annotation.getQuadPoints)(dict, rect)).toEqual(null);
+      }
+    });
+    it('should process valid quadpoints arrays', function () {
+      rect = [10, 10, 20, 20];
+      dict.set('QuadPoints', [11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18]);
+      expect((0, _annotation.getQuadPoints)(dict, rect)).toEqual([[{
+        x: 11,
+        y: 11
+      }, {
+        x: 12,
+        y: 12
+      }, {
+        x: 13,
+        y: 13
+      }, {
+        x: 14,
+        y: 14
+      }], [{
+        x: 15,
+        y: 15
+      }, {
+        x: 16,
+        y: 16
+      }, {
+        x: 17,
+        y: 17
+      }, {
+        x: 18,
+        y: 18
+      }]]);
+    });
+  });
   describe('Annotation', function () {
     var dict, ref;
     beforeAll(function (done) {
@@ -350,6 +412,218 @@ describe('annotation', function () {
       markupAnnotation.setCreationDate(undefined);
       expect(markupAnnotation.creationDate).toEqual(null);
     });
+    it('should not parse IRT/RT when not defined', function (done) {
+      dict.set('Type', _primitives.Name.get('Annot'));
+      dict.set('Subtype', _primitives.Name.get('Text'));
+      var xref = new _test_utils.XRefMock([{
+        ref: ref,
+        data: dict
+      }]);
+
+      _annotation.AnnotationFactory.create(xref, ref, pdfManagerMock, idFactoryMock).then(function (_ref5) {
+        var data = _ref5.data;
+        expect(data.inReplyTo).toBeUndefined();
+        expect(data.replyType).toBeUndefined();
+        done();
+      }, done.fail);
+    });
+    it('should parse IRT and set default RT when not defined.', function (done) {
+      var annotationRef = new _primitives.Ref(819, 0);
+      var annotationDict = new _primitives.Dict();
+      annotationDict.set('Type', _primitives.Name.get('Annot'));
+      annotationDict.set('Subtype', _primitives.Name.get('Text'));
+      var replyRef = new _primitives.Ref(820, 0);
+      var replyDict = new _primitives.Dict();
+      replyDict.set('Type', _primitives.Name.get('Annot'));
+      replyDict.set('Subtype', _primitives.Name.get('Text'));
+      replyDict.set('IRT', annotationRef);
+      var xref = new _test_utils.XRefMock([{
+        ref: annotationRef,
+        data: annotationDict
+      }, {
+        ref: replyRef,
+        data: replyDict
+      }]);
+      annotationDict.assignXref(xref);
+      replyDict.assignXref(xref);
+
+      _annotation.AnnotationFactory.create(xref, replyRef, pdfManagerMock, idFactoryMock).then(function (_ref6) {
+        var data = _ref6.data;
+        expect(data.inReplyTo).toEqual(annotationRef.toString());
+        expect(data.replyType).toEqual('R');
+        done();
+      }, done.fail);
+    });
+    it('should parse IRT/RT for a group type', function (done) {
+      var annotationRef = new _primitives.Ref(819, 0);
+      var annotationDict = new _primitives.Dict();
+      annotationDict.set('Type', _primitives.Name.get('Annot'));
+      annotationDict.set('Subtype', _primitives.Name.get('Text'));
+      annotationDict.set('T', 'ParentTitle');
+      annotationDict.set('Contents', 'ParentText');
+      annotationDict.set('CreationDate', 'D:20180423');
+      annotationDict.set('M', 'D:20190423');
+      annotationDict.set('C', [0, 0, 1]);
+      var popupRef = new _primitives.Ref(820, 0);
+      var popupDict = new _primitives.Dict();
+      popupDict.set('Type', _primitives.Name.get('Annot'));
+      popupDict.set('Subtype', _primitives.Name.get('Popup'));
+      popupDict.set('Parent', annotationRef);
+      annotationDict.set('Popup', popupRef);
+      var replyRef = new _primitives.Ref(821, 0);
+      var replyDict = new _primitives.Dict();
+      replyDict.set('Type', _primitives.Name.get('Annot'));
+      replyDict.set('Subtype', _primitives.Name.get('Text'));
+      replyDict.set('IRT', annotationRef);
+      replyDict.set('RT', _primitives.Name.get('Group'));
+      replyDict.set('T', 'ReplyTitle');
+      replyDict.set('Contents', 'ReplyText');
+      replyDict.set('CreationDate', 'D:20180523');
+      replyDict.set('M', 'D:20190523');
+      replyDict.set('C', [0.4]);
+      var xref = new _test_utils.XRefMock([{
+        ref: annotationRef,
+        data: annotationDict
+      }, {
+        ref: popupRef,
+        data: popupDict
+      }, {
+        ref: replyRef,
+        data: replyDict
+      }]);
+      annotationDict.assignXref(xref);
+      popupDict.assignXref(xref);
+      replyDict.assignXref(xref);
+
+      _annotation.AnnotationFactory.create(xref, replyRef, pdfManagerMock, idFactoryMock).then(function (_ref7) {
+        var data = _ref7.data;
+        expect(data.inReplyTo).toEqual(annotationRef.toString());
+        expect(data.replyType).toEqual('Group');
+        expect(data.title).toEqual('ParentTitle');
+        expect(data.contents).toEqual('ParentText');
+        expect(data.creationDate).toEqual('D:20180423');
+        expect(data.modificationDate).toEqual('D:20190423');
+        expect(data.color).toEqual(new Uint8ClampedArray([0, 0, 255]));
+        expect(data.hasPopup).toEqual(true);
+        done();
+      }, done.fail);
+    });
+    it('should parse IRT/RT for a reply type', function (done) {
+      var annotationRef = new _primitives.Ref(819, 0);
+      var annotationDict = new _primitives.Dict();
+      annotationDict.set('Type', _primitives.Name.get('Annot'));
+      annotationDict.set('Subtype', _primitives.Name.get('Text'));
+      annotationDict.set('T', 'ParentTitle');
+      annotationDict.set('Contents', 'ParentText');
+      annotationDict.set('CreationDate', 'D:20180423');
+      annotationDict.set('M', 'D:20190423');
+      annotationDict.set('C', [0, 0, 1]);
+      var popupRef = new _primitives.Ref(820, 0);
+      var popupDict = new _primitives.Dict();
+      popupDict.set('Type', _primitives.Name.get('Annot'));
+      popupDict.set('Subtype', _primitives.Name.get('Popup'));
+      popupDict.set('Parent', annotationRef);
+      annotationDict.set('Popup', popupRef);
+      var replyRef = new _primitives.Ref(821, 0);
+      var replyDict = new _primitives.Dict();
+      replyDict.set('Type', _primitives.Name.get('Annot'));
+      replyDict.set('Subtype', _primitives.Name.get('Text'));
+      replyDict.set('IRT', annotationRef);
+      replyDict.set('RT', _primitives.Name.get('R'));
+      replyDict.set('T', 'ReplyTitle');
+      replyDict.set('Contents', 'ReplyText');
+      replyDict.set('CreationDate', 'D:20180523');
+      replyDict.set('M', 'D:20190523');
+      replyDict.set('C', [0.4]);
+      var xref = new _test_utils.XRefMock([{
+        ref: annotationRef,
+        data: annotationDict
+      }, {
+        ref: popupRef,
+        data: popupDict
+      }, {
+        ref: replyRef,
+        data: replyDict
+      }]);
+      annotationDict.assignXref(xref);
+      popupDict.assignXref(xref);
+      replyDict.assignXref(xref);
+
+      _annotation.AnnotationFactory.create(xref, replyRef, pdfManagerMock, idFactoryMock).then(function (_ref8) {
+        var data = _ref8.data;
+        expect(data.inReplyTo).toEqual(annotationRef.toString());
+        expect(data.replyType).toEqual('R');
+        expect(data.title).toEqual('ReplyTitle');
+        expect(data.contents).toEqual('ReplyText');
+        expect(data.creationDate).toEqual('D:20180523');
+        expect(data.modificationDate).toEqual('D:20190523');
+        expect(data.color).toEqual(new Uint8ClampedArray([102, 102, 102]));
+        expect(data.hasPopup).toEqual(false);
+        done();
+      }, done.fail);
+    });
+  });
+  describe('TextAnnotation', function () {
+    it('should not parse state model and state when not defined', function (done) {
+      var annotationRef = new _primitives.Ref(819, 0);
+      var annotationDict = new _primitives.Dict();
+      annotationDict.set('Type', _primitives.Name.get('Annot'));
+      annotationDict.set('Subtype', _primitives.Name.get('Text'));
+      annotationDict.set('Contents', 'TestText');
+      var replyRef = new _primitives.Ref(820, 0);
+      var replyDict = new _primitives.Dict();
+      replyDict.set('Type', _primitives.Name.get('Annot'));
+      replyDict.set('Subtype', _primitives.Name.get('Text'));
+      replyDict.set('IRT', annotationRef);
+      replyDict.set('RT', _primitives.Name.get('R'));
+      replyDict.set('Contents', 'ReplyText');
+      var xref = new _test_utils.XRefMock([{
+        ref: annotationRef,
+        data: annotationDict
+      }, {
+        ref: replyRef,
+        data: replyDict
+      }]);
+      annotationDict.assignXref(xref);
+      replyDict.assignXref(xref);
+
+      _annotation.AnnotationFactory.create(xref, replyRef, pdfManagerMock, idFactoryMock).then(function (_ref9) {
+        var data = _ref9.data;
+        expect(data.stateModel).toBeNull();
+        expect(data.state).toBeNull();
+        done();
+      }, done.fail);
+    });
+    it('should correctly parse state model and state when defined', function (done) {
+      var annotationRef = new _primitives.Ref(819, 0);
+      var annotationDict = new _primitives.Dict();
+      annotationDict.set('Type', _primitives.Name.get('Annot'));
+      annotationDict.set('Subtype', _primitives.Name.get('Text'));
+      var replyRef = new _primitives.Ref(820, 0);
+      var replyDict = new _primitives.Dict();
+      replyDict.set('Type', _primitives.Name.get('Annot'));
+      replyDict.set('Subtype', _primitives.Name.get('Text'));
+      replyDict.set('IRT', annotationRef);
+      replyDict.set('RT', _primitives.Name.get('R'));
+      replyDict.set('StateModel', 'Review');
+      replyDict.set('State', 'Rejected');
+      var xref = new _test_utils.XRefMock([{
+        ref: annotationRef,
+        data: annotationDict
+      }, {
+        ref: replyRef,
+        data: replyDict
+      }]);
+      annotationDict.assignXref(xref);
+      replyDict.assignXref(xref);
+
+      _annotation.AnnotationFactory.create(xref, replyRef, pdfManagerMock, idFactoryMock).then(function (_ref10) {
+        var data = _ref10.data;
+        expect(data.stateModel).toEqual('Review');
+        expect(data.state).toEqual('Rejected');
+        done();
+      }, done.fail);
+    });
   });
   describe('LinkAnnotation', function () {
     it('should correctly parse a URI action', function (done) {
@@ -369,8 +643,8 @@ describe('annotation', function () {
         data: annotationDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref5) {
-        var data = _ref5.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref11) {
+        var data = _ref11.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toEqual('http://www.ctan.org/tex-archive/info/lshort');
         expect(data.unsafeUrl).toEqual('http://www.ctan.org/tex-archive/info/lshort');
@@ -395,8 +669,8 @@ describe('annotation', function () {
         data: annotationDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref6) {
-        var data = _ref6.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref12) {
+        var data = _ref12.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toEqual('http://www.hmrc.gov.uk/');
         expect(data.unsafeUrl).toEqual('http://www.hmrc.gov.uk');
@@ -423,8 +697,8 @@ describe('annotation', function () {
         data: annotationDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref7) {
-        var data = _ref7.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref13) {
+        var data = _ref13.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toEqual(new URL((0, _util.stringToUTF8String)('http://www.example.com/\xC3\xBC\xC3\xB6\xC3\xA4')).href);
         expect(data.unsafeUrl).toEqual((0, _util.stringToUTF8String)('http://www.example.com/\xC3\xBC\xC3\xB6\xC3\xA4'));
@@ -449,8 +723,8 @@ describe('annotation', function () {
         data: annotationDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref8) {
-        var data = _ref8.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref14) {
+        var data = _ref14.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toBeUndefined();
         expect(data.unsafeUrl).toBeUndefined();
@@ -477,8 +751,8 @@ describe('annotation', function () {
         data: annotationDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref9) {
-        var data = _ref9.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref15) {
+        var data = _ref15.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toBeUndefined();
         expect(data.unsafeUrl).toEqual('../../0013/001346/134685E.pdf#4.3');
@@ -508,8 +782,8 @@ describe('annotation', function () {
         docBaseUrl: 'http://www.example.com/test/pdfs/qwerty.pdf'
       });
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManager, idFactoryMock).then(function (_ref10) {
-        var data = _ref10.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManager, idFactoryMock).then(function (_ref16) {
+        var data = _ref16.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toEqual('http://www.example.com/0013/001346/134685E.pdf#4.3');
         expect(data.unsafeUrl).toEqual('../../0013/001346/134685E.pdf#4.3');
@@ -535,8 +809,8 @@ describe('annotation', function () {
         data: annotationDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref11) {
-        var data = _ref11.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref17) {
+        var data = _ref17.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toEqual('http://www.example.com/test.pdf#15');
         expect(data.unsafeUrl).toEqual('http://www.example.com/test.pdf#15');
@@ -563,8 +837,8 @@ describe('annotation', function () {
         data: annotationDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref12) {
-        var data = _ref12.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref18) {
+        var data = _ref18.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toEqual(new URL('http://www.example.com/test.pdf#' + '[14,{"name":"XYZ"},null,298.043,null]').href);
         expect(data.unsafeUrl).toEqual('http://www.example.com/test.pdf#' + '[14,{"name":"XYZ"},null,298.043,null]');
@@ -598,8 +872,8 @@ describe('annotation', function () {
         docBaseUrl: 'http://www.example.com/test/pdfs/qwerty.pdf'
       });
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManager, idFactoryMock).then(function (_ref13) {
-        var data = _ref13.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManager, idFactoryMock).then(function (_ref19) {
+        var data = _ref19.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toEqual(new URL('http://www.example.com/test/pdfs/Part II/Part II.pdf').href);
         expect(data.unsafeUrl).toEqual('Part II/Part II.pdf');
@@ -629,8 +903,8 @@ describe('annotation', function () {
           ref: annotationRef,
           data: annotationDict
         }]);
-        return _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref14) {
-          var data = _ref14.data;
+        return _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref20) {
+          var data = _ref20.data;
           expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
           expect(data.url).toEqual(expectedUrl);
           expect(data.unsafeUrl).toEqual(expectedUnsafeUrl);
@@ -676,8 +950,8 @@ describe('annotation', function () {
         data: annotationDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref15) {
-        var data = _ref15.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref21) {
+        var data = _ref21.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toBeUndefined();
         expect(data.unsafeUrl).toBeUndefined();
@@ -698,8 +972,8 @@ describe('annotation', function () {
         data: annotationDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref16) {
-        var data = _ref16.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref22) {
+        var data = _ref22.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toBeUndefined();
         expect(data.unsafeUrl).toBeUndefined();
@@ -720,8 +994,8 @@ describe('annotation', function () {
         data: annotationDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref17) {
-        var data = _ref17.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref23) {
+        var data = _ref23.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toBeUndefined();
         expect(data.unsafeUrl).toBeUndefined();
@@ -751,8 +1025,8 @@ describe('annotation', function () {
         data: annotationDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref18) {
-        var data = _ref18.data;
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref24) {
+        var data = _ref24.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
         expect(data.url).toBeUndefined();
         expect(data.unsafeUrl).toBeUndefined();
@@ -760,6 +1034,58 @@ describe('annotation', function () {
         done();
       }, done.fail);
     });
+    it('should not set quadpoints if not defined', function (done) {
+      var annotationDict = new _primitives.Dict();
+      annotationDict.set('Type', _primitives.Name.get('Annot'));
+      annotationDict.set('Subtype', _primitives.Name.get('Link'));
+
+      var annotationRef = _primitives.Ref.get(121, 0);
+
+      var xref = new _test_utils.XRefMock([{
+        ref: annotationRef,
+        data: annotationDict
+      }]);
+
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref25) {
+        var data = _ref25.data;
+        expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
+        expect(data.quadPoints).toBeUndefined();
+        done();
+      }, done.fail);
+    });
+    it('should set quadpoints if defined', function (done) {
+      var annotationDict = new _primitives.Dict();
+      annotationDict.set('Type', _primitives.Name.get('Annot'));
+      annotationDict.set('Subtype', _primitives.Name.get('Link'));
+      annotationDict.set('Rect', [10, 10, 20, 20]);
+      annotationDict.set('QuadPoints', [11, 11, 12, 12, 13, 13, 14, 14]);
+
+      var annotationRef = _primitives.Ref.get(121, 0);
+
+      var xref = new _test_utils.XRefMock([{
+        ref: annotationRef,
+        data: annotationDict
+      }]);
+
+      _annotation.AnnotationFactory.create(xref, annotationRef, pdfManagerMock, idFactoryMock).then(function (_ref26) {
+        var data = _ref26.data;
+        expect(data.annotationType).toEqual(_util.AnnotationType.LINK);
+        expect(data.quadPoints).toEqual([[{
+          x: 11,
+          y: 11
+        }, {
+          x: 12,
+          y: 12
+        }, {
+          x: 13,
+          y: 13
+        }, {
+          x: 14,
+          y: 14
+        }]]);
+        done();
+      }, done.fail);
+    });
   });
   describe('WidgetAnnotation', function () {
     var widgetDict;
@@ -780,8 +1106,8 @@ describe('annotation', function () {
         data: widgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, widgetRef, pdfManagerMock, idFactoryMock).then(function (_ref19) {
-        var data = _ref19.data;
+      _annotation.AnnotationFactory.create(xref, widgetRef, pdfManagerMock, idFactoryMock).then(function (_ref27) {
+        var data = _ref27.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.fieldName).toEqual('');
         done();
@@ -797,8 +1123,8 @@ describe('annotation', function () {
         data: widgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, widgetRef, pdfManagerMock, idFactoryMock).then(function (_ref20) {
-        var data = _ref20.data;
+      _annotation.AnnotationFactory.create(xref, widgetRef, pdfManagerMock, idFactoryMock).then(function (_ref28) {
+        var data = _ref28.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.fieldName).toEqual('foo');
         done();
@@ -820,8 +1146,8 @@ describe('annotation', function () {
         data: widgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, widgetRef, pdfManagerMock, idFactoryMock).then(function (_ref21) {
-        var data = _ref21.data;
+      _annotation.AnnotationFactory.create(xref, widgetRef, pdfManagerMock, idFactoryMock).then(function (_ref29) {
+        var data = _ref29.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.fieldName).toEqual('foo.bar.baz');
         done();
@@ -841,8 +1167,8 @@ describe('annotation', function () {
         data: widgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, widgetRef, pdfManagerMock, idFactoryMock).then(function (_ref22) {
-        var data = _ref22.data;
+      _annotation.AnnotationFactory.create(xref, widgetRef, pdfManagerMock, idFactoryMock).then(function (_ref30) {
+        var data = _ref30.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.fieldName).toEqual('foo.bar');
         done();
@@ -869,8 +1195,8 @@ describe('annotation', function () {
         data: textWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref23) {
-        var data = _ref23.data;
+      _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref31) {
+        var data = _ref31.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.textAlignment).toEqual(null);
         expect(data.maxLen).toEqual(null);
@@ -892,8 +1218,8 @@ describe('annotation', function () {
         data: textWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref24) {
-        var data = _ref24.data;
+      _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref32) {
+        var data = _ref32.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.textAlignment).toEqual(null);
         expect(data.maxLen).toEqual(null);
@@ -915,8 +1241,8 @@ describe('annotation', function () {
         data: textWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref25) {
-        var data = _ref25.data;
+      _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref33) {
+        var data = _ref33.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.textAlignment).toEqual(1);
         expect(data.maxLen).toEqual(20);
@@ -935,8 +1261,8 @@ describe('annotation', function () {
         data: textWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref26) {
-        var data = _ref26.data;
+      _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref34) {
+        var data = _ref34.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.comb).toEqual(false);
         done();
@@ -953,8 +1279,8 @@ describe('annotation', function () {
         data: textWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref27) {
-        var data = _ref27.data;
+      _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref35) {
+        var data = _ref35.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.comb).toEqual(true);
         done();
@@ -976,8 +1302,8 @@ describe('annotation', function () {
             ref: textWidgetRef,
             data: textWidgetDict
           }]);
-          return _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref28) {
-            var data = _ref28.data;
+          return _annotation.AnnotationFactory.create(xref, textWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref36) {
+            var data = _ref36.data;
             expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
             var valid = invalidFieldFlags.length === 0;
             expect(data.comb).toEqual(valid);
@@ -1020,8 +1346,8 @@ describe('annotation', function () {
         data: buttonWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, buttonWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref29) {
-        var data = _ref29.data;
+      _annotation.AnnotationFactory.create(xref, buttonWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref37) {
+        var data = _ref37.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.checkBox).toEqual(true);
         expect(data.fieldValue).toEqual('1');
@@ -1040,8 +1366,8 @@ describe('annotation', function () {
         data: buttonWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, buttonWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref30) {
-        var data = _ref30.data;
+      _annotation.AnnotationFactory.create(xref, buttonWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref38) {
+        var data = _ref38.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.checkBox).toEqual(true);
         expect(data.fieldValue).toEqual('1');
@@ -1067,8 +1393,8 @@ describe('annotation', function () {
         data: buttonWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, buttonWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref31) {
-        var data = _ref31.data;
+      _annotation.AnnotationFactory.create(xref, buttonWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref39) {
+        var data = _ref39.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.checkBox).toEqual(false);
         expect(data.radioButton).toEqual(true);
@@ -1092,8 +1418,8 @@ describe('annotation', function () {
         data: buttonWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, buttonWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref32) {
-        var data = _ref32.data;
+      _annotation.AnnotationFactory.create(xref, buttonWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref40) {
+        var data = _ref40.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.checkBox).toEqual(false);
         expect(data.radioButton).toEqual(true);
@@ -1123,8 +1449,8 @@ describe('annotation', function () {
         data: choiceWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref33) {
-        var data = _ref33.data;
+      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref41) {
+        var data = _ref41.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.options).toEqual([]);
         done();
@@ -1161,8 +1487,8 @@ describe('annotation', function () {
         data: optionOneArr
       }]);
 
-      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref34) {
-        var data = _ref34.data;
+      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref42) {
+        var data = _ref42.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.options).toEqual(expected);
         done();
@@ -1192,8 +1518,8 @@ describe('annotation', function () {
         data: optionBarStr
       }]);
 
-      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref35) {
-        var data = _ref35.data;
+      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref43) {
+        var data = _ref43.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.options).toEqual(expected);
         done();
@@ -1219,8 +1545,8 @@ describe('annotation', function () {
         data: choiceWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref36) {
-        var data = _ref36.data;
+      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref44) {
+        var data = _ref44.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.options).toEqual(expected);
         done();
@@ -1241,8 +1567,8 @@ describe('annotation', function () {
         data: choiceWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref37) {
-        var data = _ref37.data;
+      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref45) {
+        var data = _ref45.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.options).toEqual(expected);
         done();
@@ -1259,8 +1585,8 @@ describe('annotation', function () {
         data: choiceWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref38) {
-        var data = _ref38.data;
+      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref46) {
+        var data = _ref46.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.fieldValue).toEqual(fieldValue);
         done();
@@ -1277,8 +1603,8 @@ describe('annotation', function () {
         data: choiceWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref39) {
-        var data = _ref39.data;
+      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref47) {
+        var data = _ref47.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.fieldValue).toEqual([fieldValue]);
         done();
@@ -1292,8 +1618,8 @@ describe('annotation', function () {
         data: choiceWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref40) {
-        var data = _ref40.data;
+      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref48) {
+        var data = _ref48.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.readOnly).toEqual(false);
         expect(data.combo).toEqual(false);
@@ -1311,8 +1637,8 @@ describe('annotation', function () {
         data: choiceWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref41) {
-        var data = _ref41.data;
+      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref49) {
+        var data = _ref49.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.readOnly).toEqual(false);
         expect(data.combo).toEqual(false);
@@ -1330,8 +1656,8 @@ describe('annotation', function () {
         data: choiceWidgetDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref42) {
-        var data = _ref42.data;
+      _annotation.AnnotationFactory.create(xref, choiceWidgetRef, pdfManagerMock, idFactoryMock).then(function (_ref50) {
+        var data = _ref50.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.WIDGET);
         expect(data.readOnly).toEqual(true);
         expect(data.combo).toEqual(true);
@@ -1354,8 +1680,8 @@ describe('annotation', function () {
         data: lineDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, lineRef, pdfManagerMock, idFactoryMock).then(function (_ref43) {
-        var data = _ref43.data;
+      _annotation.AnnotationFactory.create(xref, lineRef, pdfManagerMock, idFactoryMock).then(function (_ref51) {
+        var data = _ref51.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.LINE);
         expect(data.lineCoordinates).toEqual([1, 2, 3, 4]);
         done();
@@ -1407,8 +1733,8 @@ describe('annotation', function () {
       fileSpecDict.assignXref(xref);
       fileAttachmentDict.assignXref(xref);
 
-      _annotation.AnnotationFactory.create(xref, fileAttachmentRef, pdfManagerMock, idFactoryMock).then(function (_ref44) {
-        var data = _ref44.data;
+      _annotation.AnnotationFactory.create(xref, fileAttachmentRef, pdfManagerMock, idFactoryMock).then(function (_ref52) {
+        var data = _ref52.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.FILEATTACHMENT);
         expect(data.file.filename).toEqual('Test.txt');
         expect(data.file.content).toEqual((0, _util.stringToBytes)('Test attachment'));
@@ -1435,9 +1761,9 @@ describe('annotation', function () {
         data: popupDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, popupRef, pdfManagerMock, idFactoryMock).then(function (_ref45) {
-        var data = _ref45.data,
-            viewable = _ref45.viewable;
+      _annotation.AnnotationFactory.create(xref, popupRef, pdfManagerMock, idFactoryMock).then(function (_ref53) {
+        var data = _ref53.data,
+            viewable = _ref53.viewable;
         expect(data.annotationType).toEqual(_util.AnnotationType.POPUP);
         expect(data.modificationDate).toEqual('D:20190423');
         expect(data.color).toEqual(new Uint8ClampedArray([0, 0, 255]));
@@ -1460,9 +1786,9 @@ describe('annotation', function () {
         data: popupDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, popupRef, pdfManagerMock, idFactoryMock).then(function (_ref46) {
-        var data = _ref46.data,
-            viewable = _ref46.viewable;
+      _annotation.AnnotationFactory.create(xref, popupRef, pdfManagerMock, idFactoryMock).then(function (_ref54) {
+        var data = _ref54.data,
+            viewable = _ref54.viewable;
         expect(data.annotationType).toEqual(_util.AnnotationType.POPUP);
         expect(data.modificationDate).toEqual(null);
         expect(data.color).toEqual(null);
@@ -1487,15 +1813,67 @@ describe('annotation', function () {
         data: popupDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, popupRef, pdfManagerMock, idFactoryMock).then(function (_ref47) {
-        var data = _ref47.data,
-            viewable = _ref47.viewable;
+      _annotation.AnnotationFactory.create(xref, popupRef, pdfManagerMock, idFactoryMock).then(function (_ref55) {
+        var data = _ref55.data,
+            viewable = _ref55.viewable;
         expect(data.annotationType).toEqual(_util.AnnotationType.POPUP);
         expect(data.annotationFlags).toEqual(25);
         expect(viewable).toEqual(true);
         done();
       }, done.fail);
     });
+    it('should correctly inherit Contents from group-master annotation ' + 'if parent has ReplyType == Group', function (done) {
+      var annotationRef = new _primitives.Ref(819, 0);
+      var annotationDict = new _primitives.Dict();
+      annotationDict.set('Type', _primitives.Name.get('Annot'));
+      annotationDict.set('Subtype', _primitives.Name.get('Text'));
+      annotationDict.set('T', 'Correct Title');
+      annotationDict.set('Contents', 'Correct Text');
+      annotationDict.set('M', 'D:20190423');
+      annotationDict.set('C', [0, 0, 1]);
+      var replyRef = new _primitives.Ref(820, 0);
+      var replyDict = new _primitives.Dict();
+      replyDict.set('Type', _primitives.Name.get('Annot'));
+      replyDict.set('Subtype', _primitives.Name.get('Text'));
+      replyDict.set('IRT', annotationRef);
+      replyDict.set('RT', _primitives.Name.get('Group'));
+      replyDict.set('T', 'Reply Title');
+      replyDict.set('Contents', 'Reply Text');
+      replyDict.set('M', 'D:20190523');
+      replyDict.set('C', [0.4]);
+      var popupRef = new _primitives.Ref(821, 0);
+      var popupDict = new _primitives.Dict();
+      popupDict.set('Type', _primitives.Name.get('Annot'));
+      popupDict.set('Subtype', _primitives.Name.get('Popup'));
+      popupDict.set('T', 'Wrong Title');
+      popupDict.set('Contents', 'Wrong Text');
+      popupDict.set('Parent', replyRef);
+      popupDict.set('M', 'D:20190623');
+      popupDict.set('C', [0.8]);
+      replyDict.set('Popup', popupRef);
+      var xref = new _test_utils.XRefMock([{
+        ref: annotationRef,
+        data: annotationDict
+      }, {
+        ref: replyRef,
+        data: replyDict
+      }, {
+        ref: popupRef,
+        data: popupDict
+      }]);
+      annotationDict.assignXref(xref);
+      popupDict.assignXref(xref);
+      replyDict.assignXref(xref);
+
+      _annotation.AnnotationFactory.create(xref, popupRef, pdfManagerMock, idFactoryMock).then(function (_ref56) {
+        var data = _ref56.data;
+        expect(data.title).toEqual('Correct Title');
+        expect(data.contents).toEqual('Correct Text');
+        expect(data.modificationDate).toEqual('D:20190423');
+        expect(data.color).toEqual(new Uint8ClampedArray([0, 0, 255]));
+        done();
+      }, done.fail);
+    });
   });
   describe('InkAnnotation', function () {
     it('should handle a single ink list', function (done) {
@@ -1511,8 +1889,8 @@ describe('annotation', function () {
         data: inkDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, inkRef, pdfManagerMock, idFactoryMock).then(function (_ref48) {
-        var data = _ref48.data;
+      _annotation.AnnotationFactory.create(xref, inkRef, pdfManagerMock, idFactoryMock).then(function (_ref57) {
+        var data = _ref57.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.INK);
         expect(data.inkLists.length).toEqual(1);
         expect(data.inkLists[0]).toEqual([{
@@ -1544,8 +1922,8 @@ describe('annotation', function () {
         data: inkDict
       }]);
 
-      _annotation.AnnotationFactory.create(xref, inkRef, pdfManagerMock, idFactoryMock).then(function (_ref49) {
-        var data = _ref49.data;
+      _annotation.AnnotationFactory.create(xref, inkRef, pdfManagerMock, idFactoryMock).then(function (_ref58) {
+        var data = _ref58.data;
         expect(data.annotationType).toEqual(_util.AnnotationType.INK);
         expect(data.inkLists.length).toEqual(2);
         expect(data.inkLists[0]).toEqual([{
@@ -1566,4 +1944,220 @@ describe('annotation', function () {
       }, done.fail);
     });
   });
+  describe('HightlightAnnotation', function () {
+    it('should not set quadpoints if not defined', function (done) {
+      var highlightDict = new _primitives.Dict();
+      highlightDict.set('Type', _primitives.Name.get('Annot'));
+      highlightDict.set('Subtype', _primitives.Name.get('Highlight'));
+
+      var highlightRef = _primitives.Ref.get(121, 0);
+
+      var xref = new _test_utils.XRefMock([{
+        ref: highlightRef,
+        data: highlightDict
+      }]);
+
+      _annotation.AnnotationFactory.create(xref, highlightRef, pdfManagerMock, idFactoryMock).then(function (_ref59) {
+        var data = _ref59.data;
+        expect(data.annotationType).toEqual(_util.AnnotationType.HIGHLIGHT);
+        expect(data.quadPoints).toBeUndefined();
+        done();
+      }, done.fail);
+    });
+    it('should set quadpoints if defined', function (done) {
+      var highlightDict = new _primitives.Dict();
+      highlightDict.set('Type', _primitives.Name.get('Annot'));
+      highlightDict.set('Subtype', _primitives.Name.get('Highlight'));
+      highlightDict.set('Rect', [10, 10, 20, 20]);
+      highlightDict.set('QuadPoints', [11, 11, 12, 12, 13, 13, 14, 14]);
+
+      var highlightRef = _primitives.Ref.get(121, 0);
+
+      var xref = new _test_utils.XRefMock([{
+        ref: highlightRef,
+        data: highlightDict
+      }]);
+
+      _annotation.AnnotationFactory.create(xref, highlightRef, pdfManagerMock, idFactoryMock).then(function (_ref60) {
+        var data = _ref60.data;
+        expect(data.annotationType).toEqual(_util.AnnotationType.HIGHLIGHT);
+        expect(data.quadPoints).toEqual([[{
+          x: 11,
+          y: 11
+        }, {
+          x: 12,
+          y: 12
+        }, {
+          x: 13,
+          y: 13
+        }, {
+          x: 14,
+          y: 14
+        }]]);
+        done();
+      }, done.fail);
+    });
+  });
+  describe('UnderlineAnnotation', function () {
+    it('should not set quadpoints if not defined', function (done) {
+      var underlineDict = new _primitives.Dict();
+      underlineDict.set('Type', _primitives.Name.get('Annot'));
+      underlineDict.set('Subtype', _primitives.Name.get('Underline'));
+
+      var underlineRef = _primitives.Ref.get(121, 0);
+
+      var xref = new _test_utils.XRefMock([{
+        ref: underlineRef,
+        data: underlineDict
+      }]);
+
+      _annotation.AnnotationFactory.create(xref, underlineRef, pdfManagerMock, idFactoryMock).then(function (_ref61) {
+        var data = _ref61.data;
+        expect(data.annotationType).toEqual(_util.AnnotationType.UNDERLINE);
+        expect(data.quadPoints).toBeUndefined();
+        done();
+      }, done.fail);
+    });
+    it('should set quadpoints if defined', function (done) {
+      var underlineDict = new _primitives.Dict();
+      underlineDict.set('Type', _primitives.Name.get('Annot'));
+      underlineDict.set('Subtype', _primitives.Name.get('Underline'));
+      underlineDict.set('Rect', [10, 10, 20, 20]);
+      underlineDict.set('QuadPoints', [11, 11, 12, 12, 13, 13, 14, 14]);
+
+      var underlineRef = _primitives.Ref.get(121, 0);
+
+      var xref = new _test_utils.XRefMock([{
+        ref: underlineRef,
+        data: underlineDict
+      }]);
+
+      _annotation.AnnotationFactory.create(xref, underlineRef, pdfManagerMock, idFactoryMock).then(function (_ref62) {
+        var data = _ref62.data;
+        expect(data.annotationType).toEqual(_util.AnnotationType.UNDERLINE);
+        expect(data.quadPoints).toEqual([[{
+          x: 11,
+          y: 11
+        }, {
+          x: 12,
+          y: 12
+        }, {
+          x: 13,
+          y: 13
+        }, {
+          x: 14,
+          y: 14
+        }]]);
+        done();
+      }, done.fail);
+    });
+  });
+  describe('SquigglyAnnotation', function () {
+    it('should not set quadpoints if not defined', function (done) {
+      var squigglyDict = new _primitives.Dict();
+      squigglyDict.set('Type', _primitives.Name.get('Annot'));
+      squigglyDict.set('Subtype', _primitives.Name.get('Squiggly'));
+
+      var squigglyRef = _primitives.Ref.get(121, 0);
+
+      var xref = new _test_utils.XRefMock([{
+        ref: squigglyRef,
+        data: squigglyDict
+      }]);
+
+      _annotation.AnnotationFactory.create(xref, squigglyRef, pdfManagerMock, idFactoryMock).then(function (_ref63) {
+        var data = _ref63.data;
+        expect(data.annotationType).toEqual(_util.AnnotationType.SQUIGGLY);
+        expect(data.quadPoints).toBeUndefined();
+        done();
+      }, done.fail);
+    });
+    it('should set quadpoints if defined', function (done) {
+      var squigglyDict = new _primitives.Dict();
+      squigglyDict.set('Type', _primitives.Name.get('Annot'));
+      squigglyDict.set('Subtype', _primitives.Name.get('Squiggly'));
+      squigglyDict.set('Rect', [10, 10, 20, 20]);
+      squigglyDict.set('QuadPoints', [11, 11, 12, 12, 13, 13, 14, 14]);
+
+      var squigglyRef = _primitives.Ref.get(121, 0);
+
+      var xref = new _test_utils.XRefMock([{
+        ref: squigglyRef,
+        data: squigglyDict
+      }]);
+
+      _annotation.AnnotationFactory.create(xref, squigglyRef, pdfManagerMock, idFactoryMock).then(function (_ref64) {
+        var data = _ref64.data;
+        expect(data.annotationType).toEqual(_util.AnnotationType.SQUIGGLY);
+        expect(data.quadPoints).toEqual([[{
+          x: 11,
+          y: 11
+        }, {
+          x: 12,
+          y: 12
+        }, {
+          x: 13,
+          y: 13
+        }, {
+          x: 14,
+          y: 14
+        }]]);
+        done();
+      }, done.fail);
+    });
+  });
+  describe('StrikeOutAnnotation', function () {
+    it('should not set quadpoints if not defined', function (done) {
+      var strikeOutDict = new _primitives.Dict();
+      strikeOutDict.set('Type', _primitives.Name.get('Annot'));
+      strikeOutDict.set('Subtype', _primitives.Name.get('StrikeOut'));
+
+      var strikeOutRef = _primitives.Ref.get(121, 0);
+
+      var xref = new _test_utils.XRefMock([{
+        ref: strikeOutRef,
+        data: strikeOutDict
+      }]);
+
+      _annotation.AnnotationFactory.create(xref, strikeOutRef, pdfManagerMock, idFactoryMock).then(function (_ref65) {
+        var data = _ref65.data;
+        expect(data.annotationType).toEqual(_util.AnnotationType.STRIKEOUT);
+        expect(data.quadPoints).toBeUndefined();
+        done();
+      }, done.fail);
+    });
+    it('should set quadpoints if defined', function (done) {
+      var strikeOutDict = new _primitives.Dict();
+      strikeOutDict.set('Type', _primitives.Name.get('Annot'));
+      strikeOutDict.set('Subtype', _primitives.Name.get('StrikeOut'));
+      strikeOutDict.set('Rect', [10, 10, 20, 20]);
+      strikeOutDict.set('QuadPoints', [11, 11, 12, 12, 13, 13, 14, 14]);
+
+      var strikeOutRef = _primitives.Ref.get(121, 0);
+
+      var xref = new _test_utils.XRefMock([{
+        ref: strikeOutRef,
+        data: strikeOutDict
+      }]);
+
+      _annotation.AnnotationFactory.create(xref, strikeOutRef, pdfManagerMock, idFactoryMock).then(function (_ref66) {
+        var data = _ref66.data;
+        expect(data.annotationType).toEqual(_util.AnnotationType.STRIKEOUT);
+        expect(data.quadPoints).toEqual([[{
+          x: 11,
+          y: 11
+        }, {
+          x: 12,
+          y: 12
+        }, {
+          x: 13,
+          y: 13
+        }, {
+          x: 14,
+          y: 14
+        }]]);
+        done();
+      }, done.fail);
+    });
+  });
 });

+ 72 - 27
lib/test/unit/api_spec.js

@@ -47,7 +47,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 
@@ -395,9 +395,7 @@ describe('api', function () {
       expect(doc.numPages).toEqual(3);
     });
     it('gets fingerprint', function () {
-      var fingerprint = doc.fingerprint;
-      expect(_typeof(fingerprint)).toEqual('string');
-      expect(fingerprint.length > 0).toEqual(true);
+      expect(doc.fingerprint).toEqual('ea8b35919d6279a369e835bde778611b');
     });
     it('gets page', function (done) {
       var promise = doc.getPage(1);
@@ -668,19 +666,14 @@ describe('api', function () {
       })["catch"](done.fail);
     });
     it('gets attachments', function (done) {
-      if ((0, _is_node["default"])()) {
-        pending('TODO: Use a non-linked test-case.');
-      }
-
-      var loadingTask = (0, _api.getDocument)((0, _test_utils.buildGetDocumentParams)('bug766138.pdf'));
+      var loadingTask = (0, _api.getDocument)((0, _test_utils.buildGetDocumentParams)('attachment.pdf'));
       var promise = loadingTask.promise.then(function (pdfDoc) {
         return pdfDoc.getAttachments();
       });
       promise.then(function (data) {
-        var attachment = data['Press Quality.joboptions'];
-        expect(attachment.filename).toEqual('Press Quality.joboptions');
-        expect(attachment.content instanceof Uint8Array).toBeTruthy();
-        expect(attachment.content.length).toEqual(30098);
+        var attachment = data['foo.txt'];
+        expect(attachment.filename).toEqual('foo.txt');
+        expect(attachment.content).toEqual(new Uint8Array([98, 97, 114, 32, 98, 97, 122, 32, 10]));
         loadingTask.destroy().then(done);
       })["catch"](done.fail);
     });
@@ -858,8 +851,8 @@ describe('api', function () {
       var promise = doc.getStats();
       promise.then(function (stats) {
         expect(stats).toEqual({
-          streamTypes: [],
-          fontTypes: []
+          streamTypes: {},
+          fontTypes: {}
         });
         done();
       })["catch"](done.fail);
@@ -867,15 +860,12 @@ describe('api', function () {
     it('checks that fingerprints are unique', function (done) {
       var loadingTask1 = (0, _api.getDocument)((0, _test_utils.buildGetDocumentParams)('issue4436r.pdf'));
       var loadingTask2 = (0, _api.getDocument)((0, _test_utils.buildGetDocumentParams)('issue4575.pdf'));
-      var promises = [loadingTask1.promise, loadingTask2.promise];
-      Promise.all(promises).then(function (data) {
+      Promise.all([loadingTask1.promise, loadingTask2.promise]).then(function (data) {
         var fingerprint1 = data[0].fingerprint;
-        expect(_typeof(fingerprint1)).toEqual('string');
-        expect(fingerprint1.length > 0).toEqual(true);
         var fingerprint2 = data[1].fingerprint;
-        expect(_typeof(fingerprint2)).toEqual('string');
-        expect(fingerprint2.length > 0).toEqual(true);
         expect(fingerprint1).not.toEqual(fingerprint2);
+        expect(fingerprint1).toEqual('2f695a83d6e7553c24fc08b7ac69712d');
+        expect(fingerprint2).toEqual('04c7126b34a46b6d4d6e7a1eff7edcb6');
         Promise.all([loadingTask1.destroy(), loadingTask2.destroy()]).then(done);
       })["catch"](done.fail);
     });
@@ -990,6 +980,32 @@ describe('api', function () {
     it('gets view', function () {
       expect(page.view).toEqual([0, 0, 595.28, 841.89]);
     });
+    it('gets view, with empty/invalid bounding boxes', function (done) {
+      var viewLoadingTask = (0, _api.getDocument)((0, _test_utils.buildGetDocumentParams)('boundingBox_invalid.pdf'));
+      viewLoadingTask.promise.then(function (pdfDoc) {
+        var numPages = pdfDoc.numPages;
+        expect(numPages).toEqual(3);
+        var viewPromises = [];
+
+        for (var i = 0; i < numPages; i++) {
+          viewPromises[i] = pdfDoc.getPage(i + 1).then(function (pdfPage) {
+            return pdfPage.view;
+          });
+        }
+
+        Promise.all(viewPromises).then(function (_ref3) {
+          var _ref4 = _slicedToArray(_ref3, 3),
+              page1 = _ref4[0],
+              page2 = _ref4[1],
+              page3 = _ref4[2];
+
+          expect(page1).toEqual([0, 0, 612, 792]);
+          expect(page2).toEqual([0, 0, 800, 600]);
+          expect(page3).toEqual([0, 0, 600, 800]);
+          viewLoadingTask.destroy().then(done);
+        });
+      })["catch"](done.fail);
+    });
     it('gets viewport', function () {
       var viewport = page.getViewport({
         scale: 1.5,
@@ -1095,9 +1111,9 @@ describe('api', function () {
       var loadingTask = (0, _api.getDocument)((0, _test_utils.buildGetDocumentParams)('issue8276_reduced.pdf'));
       loadingTask.promise.then(function (pdfDoc) {
         pdfDoc.getPage(1).then(function (pdfPage) {
-          pdfPage.getTextContent().then(function (_ref3) {
-            var items = _ref3.items,
-                styles = _ref3.styles;
+          pdfPage.getTextContent().then(function (_ref5) {
+            var items = _ref5.items,
+                styles = _ref5.styles;
             expect(items.length).toEqual(1);
             expect(Object.keys(styles)).toEqual(['Times']);
             expect(items[0]).toEqual({
@@ -1146,13 +1162,42 @@ describe('api', function () {
         });
       })["catch"](done.fail);
     });
+    it('gets operatorList, from corrupt PDF file (issue 8702), ' + 'with/without `stopAtErrors` set', function (done) {
+      var loadingTask1 = (0, _api.getDocument)((0, _test_utils.buildGetDocumentParams)('issue8702.pdf', {
+        stopAtErrors: false
+      }));
+      var loadingTask2 = (0, _api.getDocument)((0, _test_utils.buildGetDocumentParams)('issue8702.pdf', {
+        stopAtErrors: true
+      }));
+      var result1 = loadingTask1.promise.then(function (pdfDoc) {
+        return pdfDoc.getPage(1).then(function (pdfPage) {
+          return pdfPage.getOperatorList().then(function (opList) {
+            expect(opList.fnArray.length).toEqual(722);
+            expect(opList.argsArray.length).toEqual(722);
+            expect(opList.lastChunk).toEqual(true);
+            return loadingTask1.destroy();
+          });
+        });
+      });
+      var result2 = loadingTask2.promise.then(function (pdfDoc) {
+        return pdfDoc.getPage(1).then(function (pdfPage) {
+          return pdfPage.getOperatorList().then(function (opList) {
+            expect(opList.fnArray.length).toEqual(0);
+            expect(opList.argsArray.length).toEqual(0);
+            expect(opList.lastChunk).toEqual(true);
+            return loadingTask2.destroy();
+          });
+        });
+      });
+      Promise.all([result1, result2]).then(done, done.fail);
+    });
     it('gets document stats after parsing page', function (done) {
       var promise = page.getOperatorList().then(function () {
         return pdfDocument.getStats();
       });
-      var expectedStreamTypes = [];
+      var expectedStreamTypes = {};
       expectedStreamTypes[_util.StreamType.FLATE] = true;
-      var expectedFontTypes = [];
+      var expectedFontTypes = {};
       expectedFontTypes[_util.FontType.TYPE1] = true;
       expectedFontTypes[_util.FontType.CIDFONTTYPE2] = true;
       promise.then(function (stats) {
@@ -1189,7 +1234,7 @@ describe('api', function () {
             statEntry = _stats$times[0];
 
         expect(statEntry.name).toEqual('Page Request');
-        expect(statEntry.end - statEntry.start).toBeGreaterThan(0);
+        expect(statEntry.end - statEntry.start).toBeGreaterThanOrEqual(0);
         loadingTask.destroy().then(done);
       }, done.fail);
     });

+ 1 - 1
lib/test/unit/display_utils_spec.js

@@ -31,7 +31,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 

+ 21 - 5
lib/test/unit/evaluator_spec.js

@@ -35,6 +35,12 @@ var _evaluator = require("../../core/evaluator");
 
 var _worker = require("../../core/worker");
 
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
 describe('evaluator', function () {
   function HandlerMock() {
     this.inputs = [];
@@ -301,13 +307,23 @@ describe('evaluator', function () {
     });
   });
   describe('operator list', function () {
-    function MessageHandlerMock() {}
+    var StreamSinkMock =
+    /*#__PURE__*/
+    function () {
+      function StreamSinkMock() {
+        _classCallCheck(this, StreamSinkMock);
+      }
+
+      _createClass(StreamSinkMock, [{
+        key: "enqueue",
+        value: function enqueue() {}
+      }]);
+
+      return StreamSinkMock;
+    }();
 
-    MessageHandlerMock.prototype = {
-      send: function send() {}
-    };
     it('should get correct total length after flushing', function () {
-      var operatorList = new _operator_list.OperatorList(null, new MessageHandlerMock());
+      var operatorList = new _operator_list.OperatorList(null, new StreamSinkMock());
       operatorList.addOp(_util.OPS.save, null);
       operatorList.addOp(_util.OPS.restore, null);
       expect(operatorList.totalLength).toEqual(2);

+ 3 - 1
lib/test/unit/fetch_stream_spec.js

@@ -21,6 +21,8 @@
  */
 "use strict";
 
+var _util = require("../../shared/util");
+
 var _fetch_stream = require("../../display/fetch_stream");
 
 describe('fetch_stream', function () {
@@ -72,7 +74,7 @@ describe('fetch_stream', function () {
     var promise = fullReader.headersReady.then(function () {
       isStreamingSupported = fullReader.isStreamingSupported;
       isRangeSupported = fullReader.isRangeSupported;
-      fullReader.cancel(new Error('Don\'t need full reader'));
+      fullReader.cancel(new _util.AbortException('Don\'t need fullReader.'));
       fullReaderCancelled = true;
     });
     var tailSize = pdfLength % rangeSize || rangeSize;

+ 10 - 6
lib/test/unit/message_handler_spec.js

@@ -135,7 +135,7 @@ describe('message_handler', function () {
         return sleep(10);
       }).then(function () {
         expect(log).toEqual('01p2');
-        return reader.cancel();
+        return reader.cancel(new _util.AbortException('reader cancelled.'));
       }).then(function () {
         expect(log).toEqual('01p2c4');
         done();
@@ -154,12 +154,14 @@ describe('message_handler', function () {
           log += 'c';
         };
 
+        log += '0';
         sink.ready.then(function () {
+          log += '1';
           sink.enqueue([1, 2, 3, 4], 4);
           return sink.ready;
         }).then(function () {
-          log += 'error';
-          sink.error('error');
+          log += 'e';
+          sink.error(new Error('should not read when errored'));
         });
       });
       var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
@@ -171,14 +173,16 @@ describe('message_handler', function () {
       });
       var reader = readable.getReader();
       sleep(10).then(function () {
-        expect(log).toEqual('');
+        expect(log).toEqual('01');
         return reader.read();
       }).then(function (result) {
         expect(result.value).toEqual([1, 2, 3, 4]);
         expect(result.done).toEqual(false);
         return reader.read();
-      }).then(function () {}, function (reason) {
-        expect(reason).toEqual('error');
+      })["catch"](function (reason) {
+        expect(log).toEqual('01pe');
+        expect(reason instanceof _util.UnknownErrorException).toEqual(true);
+        expect(reason.message).toEqual('should not read when errored');
         done();
       });
     });

+ 3 - 1
lib/test/unit/network_spec.js

@@ -21,6 +21,8 @@
  */
 "use strict";
 
+var _util = require("../../shared/util");
+
 var _network = require("../../display/network");
 
 describe('network', function () {
@@ -79,7 +81,7 @@ describe('network', function () {
     var promise = fullReader.headersReady.then(function () {
       isStreamingSupported = fullReader.isStreamingSupported;
       isRangeSupported = fullReader.isRangeSupported;
-      fullReader.cancel('Don\'t need full reader');
+      fullReader.cancel(new _util.AbortException('Don\'t need fullReader.'));
       fullReaderCancelled = true;
     });
     var tailSize = pdf1Length % rangeSize || rangeSize;

+ 14 - 0
lib/test/unit/network_utils_spec.js

@@ -244,6 +244,20 @@ describe('network_utils', function () {
 
         throw new Error("Unexpected headerName: ".concat(headerName));
       })).toEqual('filename.pdf');
+      expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
+        if (headerName === 'Content-Disposition') {
+          return 'attachment; filename="%e4%b8%ad%e6%96%87.pdf"';
+        }
+
+        throw new Error("Unexpected headerName: ".concat(headerName));
+      })).toEqual('中文.pdf');
+      expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
+        if (headerName === 'Content-Disposition') {
+          return 'attachment; filename="100%.pdf"';
+        }
+
+        throw new Error("Unexpected headerName: ".concat(headerName));
+      })).toEqual('100%.pdf');
     });
     it('gets the filename from the response header (RFC 6266)', function () {
       expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {

+ 3 - 3
lib/test/unit/node_stream_spec.js

@@ -33,7 +33,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 
@@ -185,13 +185,13 @@ describe('node_stream', function () {
     var promise1 = fullReader1.headersReady.then(function () {
       isStreamingSupported1 = fullReader1.isStreamingSupported;
       isRangeSupported1 = fullReader1.isRangeSupported;
-      fullReader1.cancel('Don\'t need full reader');
+      fullReader1.cancel(new _util.AbortException('Don\'t need fullReader1.'));
       fullReaderCancelled1 = true;
     });
     var promise2 = fullReader2.headersReady.then(function () {
       isStreamingSupported2 = fullReader2.isStreamingSupported;
       isRangeSupported2 = fullReader2.isRangeSupported;
-      fullReader2.cancel('Don\'t need full reader');
+      fullReader2.cancel(new _util.AbortException('Don\'t need fullReader2.'));
       fullReaderCancelled2 = true;
     });
     var tailSize = pdfLength % rangeSize || rangeSize;

+ 2 - 2
lib/test/unit/primitives_spec.js

@@ -80,7 +80,7 @@ describe('primitives', function () {
       expect(dict.get()).toBeUndefined();
       expect(dict.get('Prev')).toBeUndefined();
       expect(dict.get('Decode', 'D')).toBeUndefined();
-      expect(dict.get('FontFile', 'FontFile2', 'FontFile3')).toBeNull();
+      expect(dict.get('FontFile', 'FontFile2', 'FontFile3')).toBeUndefined();
     };
 
     var emptyDict, dictWithSizeKey, dictWithManyKeys;
@@ -133,7 +133,7 @@ describe('primitives', function () {
       var keyPromises = [dictWithManyKeys.getAsync('Size'), dictWithSizeKey.getAsync('FontFile', 'FontFile2', 'FontFile3')];
       Promise.all(keyPromises).then(function (values) {
         expect(values[0]).toBeUndefined();
-        expect(values[1]).toBeNull();
+        expect(values[1]).toBeUndefined();
         done();
       })["catch"](function (reason) {
         done.fail(reason);

+ 1 - 1
lib/test/unit/type1_parser_spec.js

@@ -81,7 +81,7 @@ describe('Type1Parser', function () {
   it('parses font program', function () {
     var stream = new _stream.StringStream('/ExpansionFactor  99\n' + '/Subrs 1 array\n' + 'dup 0 1 RD x noaccess put\n' + 'end\n' + '/CharStrings 46 dict dup begin\n' + '/.notdef 1 RD x ND\n' + 'end');
     var parser = new _type1_parser.Type1Parser(stream, false, _fonts.SEAC_ANALYSIS_ENABLED);
-    var program = parser.extractFontProgram();
+    var program = parser.extractFontProgram({});
     expect(program.charstrings.length).toEqual(1);
     expect(program.properties.privateData.ExpansionFactor).toEqual(99);
   });

+ 1 - 1
lib/test/unit/ui_utils_spec.js

@@ -33,7 +33,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 

+ 10 - 10
lib/test/unit/util_spec.js

@@ -192,11 +192,11 @@ describe('util', function () {
   });
   describe('URL', function () {
     it('should return an Object', function () {
-      var url = new _util.URL('https://example.com');
+      var url = new URL('https://example.com');
       expect(_typeof(url)).toEqual('object');
     });
     it('should have property `href`', function () {
-      var url = new _util.URL('https://example.com');
+      var url = new URL('https://example.com');
       expect(_typeof(url.href)).toEqual('string');
     });
   });
@@ -220,15 +220,15 @@ describe('util', function () {
       expect((0, _util.createValidAbsoluteUrl)('magnet:?foo', null)).toEqual(null);
     });
     it('correctly creates a valid URL for whitelisted protocols', function () {
-      expect((0, _util.createValidAbsoluteUrl)('http://www.mozilla.org/foo', null)).toEqual(new _util.URL('http://www.mozilla.org/foo'));
-      expect((0, _util.createValidAbsoluteUrl)('/foo', 'http://www.mozilla.org')).toEqual(new _util.URL('http://www.mozilla.org/foo'));
-      expect((0, _util.createValidAbsoluteUrl)('https://www.mozilla.org/foo', null)).toEqual(new _util.URL('https://www.mozilla.org/foo'));
-      expect((0, _util.createValidAbsoluteUrl)('/foo', 'https://www.mozilla.org')).toEqual(new _util.URL('https://www.mozilla.org/foo'));
-      expect((0, _util.createValidAbsoluteUrl)('ftp://www.mozilla.org/foo', null)).toEqual(new _util.URL('ftp://www.mozilla.org/foo'));
-      expect((0, _util.createValidAbsoluteUrl)('/foo', 'ftp://www.mozilla.org')).toEqual(new _util.URL('ftp://www.mozilla.org/foo'));
-      expect((0, _util.createValidAbsoluteUrl)('mailto:foo@bar.baz', null)).toEqual(new _util.URL('mailto:foo@bar.baz'));
+      expect((0, _util.createValidAbsoluteUrl)('http://www.mozilla.org/foo', null)).toEqual(new URL('http://www.mozilla.org/foo'));
+      expect((0, _util.createValidAbsoluteUrl)('/foo', 'http://www.mozilla.org')).toEqual(new URL('http://www.mozilla.org/foo'));
+      expect((0, _util.createValidAbsoluteUrl)('https://www.mozilla.org/foo', null)).toEqual(new URL('https://www.mozilla.org/foo'));
+      expect((0, _util.createValidAbsoluteUrl)('/foo', 'https://www.mozilla.org')).toEqual(new URL('https://www.mozilla.org/foo'));
+      expect((0, _util.createValidAbsoluteUrl)('ftp://www.mozilla.org/foo', null)).toEqual(new URL('ftp://www.mozilla.org/foo'));
+      expect((0, _util.createValidAbsoluteUrl)('/foo', 'ftp://www.mozilla.org')).toEqual(new URL('ftp://www.mozilla.org/foo'));
+      expect((0, _util.createValidAbsoluteUrl)('mailto:foo@bar.baz', null)).toEqual(new URL('mailto:foo@bar.baz'));
       expect((0, _util.createValidAbsoluteUrl)('/foo', 'mailto:foo@bar.baz')).toEqual(null);
-      expect((0, _util.createValidAbsoluteUrl)('tel:+0123456789', null)).toEqual(new _util.URL('tel:+0123456789'));
+      expect((0, _util.createValidAbsoluteUrl)('tel:+0123456789', null)).toEqual(new URL('tel:+0123456789'));
       expect((0, _util.createValidAbsoluteUrl)('/foo', 'tel:0123456789')).toEqual(null);
     });
   });

+ 47 - 35
lib/web/app.js

@@ -78,7 +78,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 
@@ -466,7 +466,11 @@ var PDFViewerApplication = {
                 eventBus: eventBus
               });
               pdfLinkService.setHistory(this.pdfHistory);
-              this.findBar = new _pdf_find_bar.PDFFindBar(appConfig.findBar, eventBus, this.l10n);
+
+              if (!this.supportsIntegratedFind) {
+                this.findBar = new _pdf_find_bar.PDFFindBar(appConfig.findBar, eventBus, this.l10n);
+              }
+
               this.pdfDocumentProperties = new _pdf_document_properties.PDFDocumentProperties(appConfig.documentProperties, this.overlayManager, eventBus, this.l10n);
               this.pdfCursorTools = new _pdf_cursor_tools.PDFCursorTools({
                 container: container,
@@ -525,6 +529,10 @@ var PDFViewerApplication = {
     this.initialize(config).then(webViewerInitialized);
   },
   zoomIn: function zoomIn(ticks) {
+    if (this.pdfViewer.isInPresentationMode) {
+      return;
+    }
+
     var newScale = this.pdfViewer.currentScale;
 
     do {
@@ -536,6 +544,10 @@ var PDFViewerApplication = {
     this.pdfViewer.currentScaleValue = newScale;
   },
   zoomOut: function zoomOut(ticks) {
+    if (this.pdfViewer.isInPresentationMode) {
+      return;
+    }
+
     var newScale = this.pdfViewer.currentScale;
 
     do {
@@ -547,12 +559,8 @@ var PDFViewerApplication = {
     this.pdfViewer.currentScaleValue = newScale;
   },
   zoomReset: function zoomReset() {
-    var ignoreDuplicate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
     if (this.pdfViewer.isInPresentationMode) {
       return;
-    } else if (ignoreDuplicate && this.pdfViewer.currentScaleValue === _ui_utils.DEFAULT_SCALE_VALUE) {
-      return;
     }
 
     this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
@@ -677,7 +685,11 @@ var PDFViewerApplication = {
               this.pdfSidebar.reset();
               this.pdfOutlineViewer.reset();
               this.pdfAttachmentViewer.reset();
-              this.findBar.reset();
+
+              if (this.findBar) {
+                this.findBar.reset();
+              }
+
               this.toolbar.reset();
               this.secondaryToolbar.reset();
 
@@ -707,7 +719,7 @@ var PDFViewerApplication = {
     _regenerator["default"].mark(function _callee7(file, args) {
       var _this2 = this;
 
-      var workerParameters, key, parameters, apiParameters, _key, prop, loadingTask;
+      var workerParameters, key, parameters, apiParameters, _key, value, _key2, _value, loadingTask;
 
       return _regenerator["default"].wrap(function _callee7$(_context7) {
         while (1) {
@@ -743,16 +755,22 @@ var PDFViewerApplication = {
               apiParameters = _app_options.AppOptions.getAll(_app_options.OptionKind.API);
 
               for (_key in apiParameters) {
-                parameters[_key] = apiParameters[_key];
+                value = apiParameters[_key];
+
+                if (_key === 'docBaseUrl' && !value) {}
+
+                parameters[_key] = value;
               }
 
               if (args) {
-                for (prop in args) {
-                  if (prop === 'length') {
-                    this.pdfDocumentProperties.setFileSize(args[prop]);
+                for (_key2 in args) {
+                  _value = args[_key2];
+
+                  if (_key2 === 'length') {
+                    this.pdfDocumentProperties.setFileSize(_value);
                   }
 
-                  parameters[prop] = args[prop];
+                  parameters[_key2] = _value;
                 }
               }
 
@@ -760,6 +778,8 @@ var PDFViewerApplication = {
               this.pdfLoadingTask = loadingTask;
 
               loadingTask.onPassword = function (updateCallback, reason) {
+                _this2.pdfLinkService.externalLinkEnabled = false;
+
                 _this2.passwordPrompt.setUpdateCallback(updateCallback, reason);
 
                 _this2.passwordPrompt.open();
@@ -984,19 +1004,19 @@ var PDFViewerApplication = {
         scrollMode: _ui_utils.ScrollMode.UNKNOWN,
         spreadMode: _ui_utils.SpreadMode.UNKNOWN
       })["catch"](function () {});
-      Promise.all([storePromise, pageLayoutPromise, pageModePromise, openActionDestPromise]).then(
+      Promise.all([_ui_utils.animationStarted, storePromise, pageLayoutPromise, pageModePromise, openActionDestPromise]).then(
       /*#__PURE__*/
       function () {
         var _ref3 = _asyncToGenerator(
         /*#__PURE__*/
         _regenerator["default"].mark(function _callee8(_ref2) {
-          var _ref4, _ref4$, values, pageLayout, pageMode, openActionDest, viewOnLoad, initialBookmark, zoom, hash, rotation, sidebarView, scrollMode, spreadMode;
+          var _ref4, timeStamp, _ref4$, values, pageLayout, pageMode, openActionDest, viewOnLoad, initialBookmark, zoom, hash, rotation, sidebarView, scrollMode, spreadMode;
 
           return _regenerator["default"].wrap(function _callee8$(_context8) {
             while (1) {
               switch (_context8.prev = _context8.next) {
                 case 0:
-                  _ref4 = _slicedToArray(_ref2, 4), _ref4$ = _ref4[0], values = _ref4$ === void 0 ? {} : _ref4$, pageLayout = _ref4[1], pageMode = _ref4[2], openActionDest = _ref4[3];
+                  _ref4 = _slicedToArray(_ref2, 5), timeStamp = _ref4[0], _ref4$ = _ref4[1], values = _ref4$ === void 0 ? {} : _ref4$, pageLayout = _ref4[2], pageMode = _ref4[3], openActionDest = _ref4[4];
                   viewOnLoad = _app_options.AppOptions.get('viewOnLoad');
 
                   _this5._initializePdfHistory({
@@ -1160,7 +1180,7 @@ var PDFViewerApplication = {
         }
       });
     });
-    Promise.all([onePageRendered, _ui_utils.animationStarted]).then(function () {
+    onePageRendered.then(function () {
       pdfDocument.getOutline().then(function (outline) {
         _this5.pdfOutlineViewer.render({
           outline: outline
@@ -1327,7 +1347,7 @@ var PDFViewerApplication = {
     this.forceRendering();
     printService.layout();
   },
-  afterPrint: function pdfViewSetupAfterPrint() {
+  afterPrint: function afterPrint() {
     if (this.printService) {
       this.printService.destroy();
       this.printService = null;
@@ -1507,13 +1527,13 @@ var validateFileURL;
     }
 
     try {
-      var viewerOrigin = new _pdf.URL(window.location.href).origin || 'null';
+      var viewerOrigin = new URL(window.location.href).origin || 'null';
 
       if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) {
         return;
       }
 
-      var _ref8 = new _pdf.URL(file, window.location.href),
+      var _ref8 = new URL(file, window.location.href),
           origin = _ref8.origin,
           protocol = _ref8.protocol;
 
@@ -1623,9 +1643,6 @@ function webViewerInitialized() {
       });
     }
   }, true);
-  appConfig.sidebar.toggleButton.addEventListener('click', function () {
-    PDFViewerApplication.pdfSidebar.toggle();
-  });
 
   try {
     webViewerOpenFileViaURL(file);
@@ -1830,8 +1847,8 @@ var webViewerFileInputChange;
 
     var file = evt.fileInput.files[0];
 
-    if (_pdf.URL.createObjectURL && !_app_options.AppOptions.get('disableCreateObjectURL')) {
-      var url = _pdf.URL.createObjectURL(file);
+    if (URL.createObjectURL && !_app_options.AppOptions.get('disableCreateObjectURL')) {
+      var url = URL.createObjectURL(file);
 
       if (file.name) {
         url = {
@@ -1906,8 +1923,8 @@ function webViewerZoomOut() {
   PDFViewerApplication.zoomOut();
 }
 
-function webViewerZoomReset(evt) {
-  PDFViewerApplication.zoomReset(evt && evt.ignoreDuplicate);
+function webViewerZoomReset() {
+  PDFViewerApplication.zoomReset();
 }
 
 function webViewerPageNumberChanged(evt) {
@@ -2042,19 +2059,14 @@ function setZoomDisabledTimeout() {
 }
 
 function webViewerWheel(evt) {
-  var pdfViewer = PDFViewerApplication.pdfViewer;
+  var pdfViewer = PDFViewerApplication.pdfViewer,
+      supportedMouseWheelZoomModifierKeys = PDFViewerApplication.supportedMouseWheelZoomModifierKeys;
 
   if (pdfViewer.isInPresentationMode) {
     return;
   }
 
-  if (evt.ctrlKey || evt.metaKey) {
-    var support = PDFViewerApplication.supportedMouseWheelZoomModifierKeys;
-
-    if (evt.ctrlKey && !support.ctrlKey || evt.metaKey && !support.metaKey) {
-      return;
-    }
-
+  if (evt.ctrlKey && supportedMouseWheelZoomModifierKeys.ctrlKey || evt.metaKey && supportedMouseWheelZoomModifierKeys.metaKey) {
     evt.preventDefault();
 
     if (zoomDisabledTimeout || document.visibilityState === 'hidden') {

+ 4 - 4
lib/web/app_options.js

@@ -164,6 +164,10 @@ var defaultOptions = {
     value: false,
     kind: OptionKind.API + OptionKind.PREFERENCE
   },
+  docBaseUrl: {
+    value: '',
+    kind: OptionKind.API
+  },
   isEvalSupported: {
     value: true,
     kind: OptionKind.API
@@ -176,10 +180,6 @@ var defaultOptions = {
     value: false,
     kind: OptionKind.API
   },
-  postMessageTransfers: {
-    value: true,
-    kind: OptionKind.API
-  },
   verbosity: {
     value: 1,
     kind: OptionKind.API

+ 36 - 12
lib/web/base_viewer.js

@@ -138,6 +138,7 @@ function () {
 
     this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this));
     this.presentationModeState = _ui_utils.PresentationModeState.UNKNOWN;
+    this._onBeforeDraw = this._onAfterDraw = null;
 
     this._resetView();
 
@@ -221,21 +222,34 @@ function () {
       });
       var onePageRenderedCapability = (0, _pdf.createPromiseCapability)();
       this.onePageRendered = onePageRenderedCapability.promise;
+      var firstPagePromise = pdfDocument.getPage(1);
+      this.firstPagePromise = firstPagePromise;
 
-      var bindOnAfterAndBeforeDraw = function bindOnAfterAndBeforeDraw(pageView) {
-        pageView.onBeforeDraw = function () {
-          _this2._buffer.push(pageView);
-        };
+      this._onBeforeDraw = function (evt) {
+        var pageView = _this2._pages[evt.pageNumber - 1];
 
-        pageView.onAfterDraw = function () {
-          if (!onePageRenderedCapability.settled) {
-            onePageRenderedCapability.resolve();
-          }
-        };
+        if (!pageView) {
+          return;
+        }
+
+        _this2._buffer.push(pageView);
       };
 
-      var firstPagePromise = pdfDocument.getPage(1);
-      this.firstPagePromise = firstPagePromise;
+      this.eventBus.on('pagerender', this._onBeforeDraw);
+
+      this._onAfterDraw = function (evt) {
+        if (evt.cssTransform || onePageRenderedCapability.settled) {
+          return;
+        }
+
+        onePageRenderedCapability.resolve();
+
+        _this2.eventBus.off('pagerendered', _this2._onAfterDraw);
+
+        _this2._onAfterDraw = null;
+      };
+
+      this.eventBus.on('pagerendered', this._onAfterDraw);
       firstPagePromise.then(function (pdfPage) {
         var scale = _this2.currentScale;
         var viewport = pdfPage.getViewport({
@@ -267,7 +281,6 @@ function () {
             maxCanvasPixels: _this2.maxCanvasPixels,
             l10n: _this2.l10n
           });
-          bindOnAfterAndBeforeDraw(pageView);
 
           _this2._pages.push(pageView);
         }
@@ -363,6 +376,17 @@ function () {
       this._pageViewsReady = false;
       this._scrollMode = _ui_utils.ScrollMode.VERTICAL;
       this._spreadMode = _ui_utils.SpreadMode.NONE;
+
+      if (this._onBeforeDraw) {
+        this.eventBus.off('pagerender', this._onBeforeDraw);
+        this._onBeforeDraw = null;
+      }
+
+      if (this._onAfterDraw) {
+        this.eventBus.off('pagerendered', this._onAfterDraw);
+        this._onAfterDraw = null;
+      }
+
       this.viewer.textContent = '';
 
       this._updateScrollMode();

+ 1 - 3
lib/web/chromecom.js

@@ -38,8 +38,6 @@ var _download_manager = require("./download_manager");
 
 var _genericl10n = require("./genericl10n");
 
-var _pdf = require("../pdf");
-
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
 
 function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
@@ -265,7 +263,7 @@ function requestAccessToLocalFile(fileUrl, overlayManager, callback) {
           originalUrl = 'file:///fakepath/to/' + encodeURIComponent(file.name);
         }
 
-        callback(_pdf.URL.createObjectURL(file), file.size, originalUrl);
+        callback(URL.createObjectURL(file), file.size, originalUrl);
         overlayManager.close('chromeFileAccessOverlay');
       }
     };

+ 1 - 1
lib/web/download_manager.js

@@ -107,7 +107,7 @@ function () {
         return;
       }
 
-      var blobUrl = _pdf.URL.createObjectURL(blob);
+      var blobUrl = URL.createObjectURL(blob);
 
       _download(blobUrl, filename);
     }

+ 7 - 4
lib/web/firefox_print_service.js

@@ -85,17 +85,20 @@ function FirefoxPrintService(pdfDocument, pagesOverview, printContainer) {
 
 FirefoxPrintService.prototype = {
   layout: function layout() {
-    var pdfDocument = this.pdfDocument;
-    var printContainer = this.printContainer;
+    var pdfDocument = this.pdfDocument,
+        pagesOverview = this.pagesOverview,
+        printContainer = this.printContainer;
     var body = document.querySelector('body');
     body.setAttribute('data-pdfjsprinting', true);
 
-    for (var i = 0, ii = this.pagesOverview.length; i < ii; ++i) {
-      composePage(pdfDocument, i + 1, this.pagesOverview[i], printContainer);
+    for (var i = 0, ii = pagesOverview.length; i < ii; ++i) {
+      composePage(pdfDocument, i + 1, pagesOverview[i], printContainer);
     }
   },
   destroy: function destroy() {
     this.printContainer.textContent = '';
+    var body = document.querySelector('body');
+    body.removeAttribute('data-pdfjsprinting');
   }
 };
 _app.PDFPrintServiceFactory.instance = {

+ 10 - 5
lib/web/firefoxcom.js

@@ -34,6 +34,8 @@ var _pdf = require("../pdf");
 
 var _preferences = require("./preferences");
 
+var _ui_utils = require("./ui_utils");
+
 var _app = require("./app");
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
@@ -141,14 +143,14 @@ function () {
     value: function download(blob, url, filename) {
       var _this = this;
 
-      var blobUrl = _pdf.URL.createObjectURL(blob);
+      var blobUrl = URL.createObjectURL(blob);
 
       var onResponse = function onResponse(err) {
         if (err && _this.onerror) {
           _this.onerror(err);
         }
 
-        _pdf.URL.revokeObjectURL(blobUrl);
+        URL.revokeObjectURL(blobUrl);
       };
 
       FirefoxCom.request('download', {
@@ -369,7 +371,7 @@ function () {
     }
 
     if (type === 'findbarclose') {
-      _app.PDFViewerApplication.eventBus.dispatch('findbarclose', {
+      _app.PDFViewerApplication.eventBus.dispatch(type, {
         source: window
       });
 
@@ -405,9 +407,12 @@ function () {
       return;
     }
 
+    if (type === 'zoomreset' && _app.PDFViewerApplication.pdfViewer.currentScaleValue === _ui_utils.DEFAULT_SCALE_VALUE) {
+      return;
+    }
+
     _app.PDFViewerApplication.eventBus.dispatch(type, {
-      source: window,
-      ignoreDuplicate: type === 'zoomreset' ? true : undefined
+      source: window
     });
   };
 

+ 4 - 0
lib/web/interfaces.js

@@ -79,6 +79,10 @@ function () {
     key: "rotation",
     get: function get() {},
     set: function set(value) {}
+  }, {
+    key: "externalLinkEnabled",
+    get: function get() {},
+    set: function set(value) {}
   }]);
 
   return IPDFLinkService;

+ 1 - 1
lib/web/pdf_document_properties.js

@@ -42,7 +42,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 

+ 1 - 1
lib/web/pdf_history.js

@@ -36,7 +36,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 

+ 7 - 3
lib/web/pdf_link_service.js

@@ -45,13 +45,16 @@ function () {
         _ref$externalLinkTarg = _ref.externalLinkTarget,
         externalLinkTarget = _ref$externalLinkTarg === void 0 ? null : _ref$externalLinkTarg,
         _ref$externalLinkRel = _ref.externalLinkRel,
-        externalLinkRel = _ref$externalLinkRel === void 0 ? null : _ref$externalLinkRel;
+        externalLinkRel = _ref$externalLinkRel === void 0 ? null : _ref$externalLinkRel,
+        _ref$externalLinkEnab = _ref.externalLinkEnabled,
+        externalLinkEnabled = _ref$externalLinkEnab === void 0 ? true : _ref$externalLinkEnab;
 
     _classCallCheck(this, PDFLinkService);
 
     this.eventBus = eventBus || (0, _ui_utils.getGlobalEventBus)();
     this.externalLinkTarget = externalLinkTarget;
     this.externalLinkRel = externalLinkRel;
+    this.externalLinkEnabled = externalLinkEnabled;
     this.baseUrl = null;
     this.pdfDocument = null;
     this.pdfViewer = null;
@@ -325,13 +328,13 @@ function () {
         return;
       }
 
-      var refStr = pageRef.num + ' ' + pageRef.gen + ' R';
+      var refStr = pageRef.gen === 0 ? "".concat(pageRef.num, "R") : "".concat(pageRef.num, "R").concat(pageRef.gen);
       this._pagesRefCache[refStr] = pageNum;
     }
   }, {
     key: "_cachedPageNumber",
     value: function _cachedPageNumber(pageRef) {
-      var refStr = pageRef.num + ' ' + pageRef.gen + ' R';
+      var refStr = pageRef.gen === 0 ? "".concat(pageRef.num, "R") : "".concat(pageRef.num, "R").concat(pageRef.gen);
       return this._pagesRefCache && this._pagesRefCache[refStr] || null;
     }
   }, {
@@ -444,6 +447,7 @@ function () {
 
     this.externalLinkTarget = null;
     this.externalLinkRel = null;
+    this.externalLinkEnabled = true;
   }
 
   _createClass(SimpleLinkService, [{

+ 2 - 1
lib/web/pdf_outline_viewer.js

@@ -81,7 +81,8 @@ function () {
         (0, _pdf.addLinkAttributes)(element, {
           url: url,
           target: newWindow ? _pdf.LinkTarget.BLANK : linkService.externalLinkTarget,
-          rel: linkService.externalLinkRel
+          rel: linkService.externalLinkRel,
+          enabled: linkService.externalLinkEnabled
         });
         return;
       }

+ 12 - 16
lib/web/pdf_page_view.js

@@ -84,8 +84,6 @@ function () {
     this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
     this.resume = null;
     this.error = null;
-    this.onBeforeDraw = null;
-    this.onAfterDraw = null;
     this.annotationLayer = null;
     this.textLayer = null;
     this.zoomLayer = null;
@@ -213,7 +211,8 @@ function () {
         this.eventBus.dispatch('pagerendered', {
           source: this,
           pageNumber: this.id,
-          cssTransform: true
+          cssTransform: true,
+          timestamp: performance.now()
         });
         return;
       }
@@ -234,7 +233,8 @@ function () {
           this.eventBus.dispatch('pagerendered', {
             source: this,
             pageNumber: this.id,
-            cssTransform: true
+            cssTransform: true,
+            timestamp: performance.now()
           });
           return;
         }
@@ -447,24 +447,21 @@ function () {
                   _this.error = error;
                   _this.stats = pdfPage.stats;
 
-                  if (_this.onAfterDraw) {
-                    _this.onAfterDraw();
-                  }
-
                   _this.eventBus.dispatch('pagerendered', {
                     source: _this,
                     pageNumber: _this.id,
-                    cssTransform: false
+                    cssTransform: false,
+                    timestamp: performance.now()
                   });
 
                   if (!error) {
-                    _context.next = 13;
+                    _context.next = 12;
                     break;
                   }
 
                   throw error;
 
-                case 13:
+                case 12:
                 case "end":
                   return _context.stop();
               }
@@ -503,11 +500,10 @@ function () {
       }
 
       div.setAttribute('data-loaded', true);
-
-      if (this.onBeforeDraw) {
-        this.onBeforeDraw();
-      }
-
+      this.eventBus.dispatch('pagerender', {
+        source: this,
+        pageNumber: this.id
+      });
       return resultPromise;
     }
   }, {

+ 3 - 5
lib/web/pdf_print_service.js

@@ -32,8 +32,6 @@ var _app = require("./app");
 
 var _app_options = require("./app_options");
 
-var _pdf = require("../pdf");
-
 var activeService = null;
 var overlayManager = null;
 
@@ -103,6 +101,8 @@ PDFPrintService.prototype = {
     }
 
     this.printContainer.textContent = '';
+    var body = document.querySelector('body');
+    body.removeAttribute('data-pdfjsprinting');
 
     if (this.pageStyleSheet) {
       this.pageStyleSheet.remove();
@@ -152,7 +152,7 @@ PDFPrintService.prototype = {
 
     if ('toBlob' in scratchCanvas && !this.disableCreateObjectURL) {
       scratchCanvas.toBlob(function (blob) {
-        img.src = _pdf.URL.createObjectURL(blob);
+        img.src = URL.createObjectURL(blob);
       });
     } else {
       img.src = scratchCanvas.toDataURL();
@@ -273,8 +273,6 @@ window.addEventListener('keydown', function (event) {
     } else {
       event.stopPropagation();
     }
-
-    return;
   }
 }, true);
 

+ 3 - 0
lib/web/pdf_sidebar.js

@@ -355,6 +355,9 @@ function () {
           _this3.outerContainer.classList.remove('sidebarMoving');
         }
       });
+      this.toggleButton.addEventListener('click', function () {
+        _this3.toggle();
+      });
       this.thumbnailButton.addEventListener('click', function () {
         _this3.switchView(SidebarView.THUMBS);
       });

+ 2 - 2
lib/web/pdf_viewer.component.js

@@ -143,6 +143,6 @@ var _pdf_single_page_viewer = require("./pdf_single_page_viewer");
 
 var _pdf_viewer = require("./pdf_viewer.js");
 
-var pdfjsVersion = '2.2.228';
-var pdfjsBuild = 'd7afb74a';
+var pdfjsVersion = '2.3.200';
+var pdfjsBuild = '4ae3f9fc';
 (0, _ui_utils.getGlobalEventBus)(true);

+ 2 - 0
lib/web/toolbar.js

@@ -91,6 +91,8 @@ function () {
       this.pageScale = _ui_utils.DEFAULT_SCALE;
 
       this._updateUIState(true);
+
+      this.updateLoadingIndicatorState();
     }
   }, {
     key: "_bindListeners",

+ 1 - 1
lib/web/ui_utils.js

@@ -62,7 +62,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "pdfjs-dist",
-  "version": "2.2.228",
+  "version": "2.3.200",
   "main": "build/pdf.js",
   "description": "Generic build of Mozilla's PDF.js library.",
   "keywords": [

+ 5 - 9
web/pdf_viewer.css

@@ -29,8 +29,7 @@
   position: absolute;
   white-space: pre;
   cursor: text;
-  -webkit-transform-origin: 0% 0%;
-          transform-origin: 0% 0%;
+  transform-origin: 0% 0%;
 }
 
 .textLayer .highlight {
@@ -179,13 +178,11 @@
 }
 
 .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before {
-  -webkit-transform: rotate(45deg);
-          transform: rotate(45deg);
+  transform: rotate(45deg);
 }
 
 .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after {
-  -webkit-transform: rotate(-45deg);
-          transform: rotate(-45deg);
+  transform: rotate(-45deg);
 }
 
 .annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before {
@@ -289,9 +286,8 @@
   overflow: visible;
   border: 9px solid transparent;
   background-clip: content-box;
-  -webkit-border-image: url(images/shadow.png) 9 9 repeat;
-       -o-border-image: url(images/shadow.png) 9 9 repeat;
-          border-image: url(images/shadow.png) 9 9 repeat;
+  -o-border-image: url(images/shadow.png) 9 9 repeat;
+     border-image: url(images/shadow.png) 9 9 repeat;
   background-color: white;
 }
 

+ 60 - 45
web/pdf_viewer.js

@@ -245,8 +245,8 @@ var _pdf_single_page_viewer = __w_pdfjs_require__(18);
 
 var _pdf_viewer = __w_pdfjs_require__(20);
 
-var pdfjsVersion = '2.2.228';
-var pdfjsBuild = 'd7afb74a';
+var pdfjsVersion = '2.3.200';
+var pdfjsBuild = '4ae3f9fc';
 (0, _ui_utils.getGlobalEventBus)(true);
 
 /***/ }),
@@ -462,7 +462,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 
@@ -1949,13 +1949,16 @@ function () {
         _ref$externalLinkTarg = _ref.externalLinkTarget,
         externalLinkTarget = _ref$externalLinkTarg === void 0 ? null : _ref$externalLinkTarg,
         _ref$externalLinkRel = _ref.externalLinkRel,
-        externalLinkRel = _ref$externalLinkRel === void 0 ? null : _ref$externalLinkRel;
+        externalLinkRel = _ref$externalLinkRel === void 0 ? null : _ref$externalLinkRel,
+        _ref$externalLinkEnab = _ref.externalLinkEnabled,
+        externalLinkEnabled = _ref$externalLinkEnab === void 0 ? true : _ref$externalLinkEnab;
 
     _classCallCheck(this, PDFLinkService);
 
     this.eventBus = eventBus || (0, _ui_utils.getGlobalEventBus)();
     this.externalLinkTarget = externalLinkTarget;
     this.externalLinkRel = externalLinkRel;
+    this.externalLinkEnabled = externalLinkEnabled;
     this.baseUrl = null;
     this.pdfDocument = null;
     this.pdfViewer = null;
@@ -2229,13 +2232,13 @@ function () {
         return;
       }
 
-      var refStr = pageRef.num + ' ' + pageRef.gen + ' R';
+      var refStr = pageRef.gen === 0 ? "".concat(pageRef.num, "R") : "".concat(pageRef.num, "R").concat(pageRef.gen);
       this._pagesRefCache[refStr] = pageNum;
     }
   }, {
     key: "_cachedPageNumber",
     value: function _cachedPageNumber(pageRef) {
-      var refStr = pageRef.num + ' ' + pageRef.gen + ' R';
+      var refStr = pageRef.gen === 0 ? "".concat(pageRef.num, "R") : "".concat(pageRef.num, "R").concat(pageRef.gen);
       return this._pagesRefCache && this._pagesRefCache[refStr] || null;
     }
   }, {
@@ -2348,6 +2351,7 @@ function () {
 
     this.externalLinkTarget = null;
     this.externalLinkRel = null;
+    this.externalLinkEnabled = true;
   }
 
   _createClass(SimpleLinkService, [{
@@ -2913,7 +2917,7 @@ function () {
         return;
       }
 
-      var blobUrl = _pdfjsLib.URL.createObjectURL(blob);
+      var blobUrl = URL.createObjectURL(blob);
 
       _download(blobUrl, filename);
     }
@@ -3152,13 +3156,6 @@ document.webL10n = function (window, document, undefined) {
     };
   }
 
-  function fireL10nReadyEvent(lang) {
-    var evtObject = document.createEvent('Event');
-    evtObject.initEvent('localized', true, false);
-    evtObject.language = lang;
-    document.dispatchEvent(evtObject);
-  }
-
   function xhrLoadText(url, onSuccess, onFailure) {
     onSuccess = onSuccess || function _onSuccess(data) {};
 
@@ -3337,7 +3334,6 @@ document.webL10n = function (window, document, undefined) {
         console.log('no resource to load, early way out');
       }
 
-      fireL10nReadyEvent(lang);
       gReadyState = 'complete';
       return;
     }
@@ -3350,7 +3346,6 @@ document.webL10n = function (window, document, undefined) {
 
       if (gResourceCount >= langCount) {
         callback();
-        fireL10nReadyEvent(lang);
         gReadyState = 'complete';
       }
     };
@@ -4791,7 +4786,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
 
 function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
 
-function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
 
 function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 
@@ -5436,8 +5431,6 @@ function () {
     this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
     this.resume = null;
     this.error = null;
-    this.onBeforeDraw = null;
-    this.onAfterDraw = null;
     this.annotationLayer = null;
     this.textLayer = null;
     this.zoomLayer = null;
@@ -5565,7 +5558,8 @@ function () {
         this.eventBus.dispatch('pagerendered', {
           source: this,
           pageNumber: this.id,
-          cssTransform: true
+          cssTransform: true,
+          timestamp: performance.now()
         });
         return;
       }
@@ -5586,7 +5580,8 @@ function () {
           this.eventBus.dispatch('pagerendered', {
             source: this,
             pageNumber: this.id,
-            cssTransform: true
+            cssTransform: true,
+            timestamp: performance.now()
           });
           return;
         }
@@ -5799,24 +5794,21 @@ function () {
                   _this.error = error;
                   _this.stats = pdfPage.stats;
 
-                  if (_this.onAfterDraw) {
-                    _this.onAfterDraw();
-                  }
-
                   _this.eventBus.dispatch('pagerendered', {
                     source: _this,
                     pageNumber: _this.id,
-                    cssTransform: false
+                    cssTransform: false,
+                    timestamp: performance.now()
                   });
 
                   if (!error) {
-                    _context.next = 13;
+                    _context.next = 12;
                     break;
                   }
 
                   throw error;
 
-                case 13:
+                case 12:
                 case "end":
                   return _context.stop();
               }
@@ -5855,11 +5847,10 @@ function () {
       }
 
       div.setAttribute('data-loaded', true);
-
-      if (this.onBeforeDraw) {
-        this.onBeforeDraw();
-      }
-
+      this.eventBus.dispatch('pagerender', {
+        source: this,
+        pageNumber: this.id
+      });
       return resultPromise;
     }
   }, {
@@ -6499,6 +6490,7 @@ function () {
 
     this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this));
     this.presentationModeState = _ui_utils.PresentationModeState.UNKNOWN;
+    this._onBeforeDraw = this._onAfterDraw = null;
 
     this._resetView();
 
@@ -6582,21 +6574,34 @@ function () {
       });
       var onePageRenderedCapability = (0, _pdfjsLib.createPromiseCapability)();
       this.onePageRendered = onePageRenderedCapability.promise;
+      var firstPagePromise = pdfDocument.getPage(1);
+      this.firstPagePromise = firstPagePromise;
 
-      var bindOnAfterAndBeforeDraw = function bindOnAfterAndBeforeDraw(pageView) {
-        pageView.onBeforeDraw = function () {
-          _this2._buffer.push(pageView);
-        };
+      this._onBeforeDraw = function (evt) {
+        var pageView = _this2._pages[evt.pageNumber - 1];
 
-        pageView.onAfterDraw = function () {
-          if (!onePageRenderedCapability.settled) {
-            onePageRenderedCapability.resolve();
-          }
-        };
+        if (!pageView) {
+          return;
+        }
+
+        _this2._buffer.push(pageView);
       };
 
-      var firstPagePromise = pdfDocument.getPage(1);
-      this.firstPagePromise = firstPagePromise;
+      this.eventBus.on('pagerender', this._onBeforeDraw);
+
+      this._onAfterDraw = function (evt) {
+        if (evt.cssTransform || onePageRenderedCapability.settled) {
+          return;
+        }
+
+        onePageRenderedCapability.resolve();
+
+        _this2.eventBus.off('pagerendered', _this2._onAfterDraw);
+
+        _this2._onAfterDraw = null;
+      };
+
+      this.eventBus.on('pagerendered', this._onAfterDraw);
       firstPagePromise.then(function (pdfPage) {
         var scale = _this2.currentScale;
         var viewport = pdfPage.getViewport({
@@ -6628,7 +6633,6 @@ function () {
             maxCanvasPixels: _this2.maxCanvasPixels,
             l10n: _this2.l10n
           });
-          bindOnAfterAndBeforeDraw(pageView);
 
           _this2._pages.push(pageView);
         }
@@ -6724,6 +6728,17 @@ function () {
       this._pageViewsReady = false;
       this._scrollMode = _ui_utils.ScrollMode.VERTICAL;
       this._spreadMode = _ui_utils.SpreadMode.NONE;
+
+      if (this._onBeforeDraw) {
+        this.eventBus.off('pagerender', this._onBeforeDraw);
+        this._onBeforeDraw = null;
+      }
+
+      if (this._onAfterDraw) {
+        this.eventBus.off('pagerendered', this._onAfterDraw);
+        this._onAfterDraw = null;
+      }
+
       this.viewer.textContent = '';
 
       this._updateScrollMode();

ファイルの差分が大きいため隠しています
+ 0 - 0
web/pdf_viewer.js.map


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません