2
0

cmap_spec.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. /**
  2. * @licstart The following is the entire license notice for the
  3. * Javascript code in this page
  4. *
  5. * Copyright 2017 Mozilla Foundation
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. *
  19. * @licend The above is the entire license notice for the
  20. * Javascript code in this page
  21. */
  22. 'use strict';
  23. var _cmap = require('../../core/cmap');
  24. var _dom_utils = require('../../display/dom_utils');
  25. var _is_node = require('../../shared/is_node');
  26. var _is_node2 = _interopRequireDefault(_is_node);
  27. var _primitives = require('../../core/primitives');
  28. var _test_utils = require('./test_utils');
  29. var _stream = require('../../core/stream');
  30. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  31. var cMapUrl = {
  32. dom: '../../external/bcmaps/',
  33. node: './external/bcmaps/'
  34. };
  35. var cMapPacked = true;
  36. describe('cmap', function () {
  37. var fetchBuiltInCMap;
  38. beforeAll(function (done) {
  39. var CMapReaderFactory;
  40. if ((0, _is_node2.default)()) {
  41. CMapReaderFactory = new _test_utils.NodeCMapReaderFactory({
  42. baseUrl: cMapUrl.node,
  43. isCompressed: cMapPacked
  44. });
  45. } else {
  46. CMapReaderFactory = new _dom_utils.DOMCMapReaderFactory({
  47. baseUrl: cMapUrl.dom,
  48. isCompressed: cMapPacked
  49. });
  50. }
  51. fetchBuiltInCMap = function fetchBuiltInCMap(name) {
  52. return CMapReaderFactory.fetch({ name: name });
  53. };
  54. done();
  55. });
  56. afterAll(function () {
  57. fetchBuiltInCMap = null;
  58. });
  59. it('parses beginbfchar', function (done) {
  60. var str = '2 beginbfchar\n' + '<03> <00>\n' + '<04> <01>\n' + 'endbfchar\n';
  61. var stream = new _stream.StringStream(str);
  62. var cmapPromise = _cmap.CMapFactory.create({ encoding: stream });
  63. cmapPromise.then(function (cmap) {
  64. expect(cmap.lookup(0x03)).toEqual(String.fromCharCode(0x00));
  65. expect(cmap.lookup(0x04)).toEqual(String.fromCharCode(0x01));
  66. expect(cmap.lookup(0x05)).toBeUndefined();
  67. done();
  68. }).catch(function (reason) {
  69. done.fail(reason);
  70. });
  71. });
  72. it('parses beginbfrange with range', function (done) {
  73. var str = '1 beginbfrange\n' + '<06> <0B> 0\n' + 'endbfrange\n';
  74. var stream = new _stream.StringStream(str);
  75. var cmapPromise = _cmap.CMapFactory.create({ encoding: stream });
  76. cmapPromise.then(function (cmap) {
  77. expect(cmap.lookup(0x05)).toBeUndefined();
  78. expect(cmap.lookup(0x06)).toEqual(String.fromCharCode(0x00));
  79. expect(cmap.lookup(0x0B)).toEqual(String.fromCharCode(0x05));
  80. expect(cmap.lookup(0x0C)).toBeUndefined();
  81. done();
  82. }).catch(function (reason) {
  83. done.fail(reason);
  84. });
  85. });
  86. it('parses beginbfrange with array', function (done) {
  87. var str = '1 beginbfrange\n' + '<0D> <12> [ 0 1 2 3 4 5 ]\n' + 'endbfrange\n';
  88. var stream = new _stream.StringStream(str);
  89. var cmapPromise = _cmap.CMapFactory.create({ encoding: stream });
  90. cmapPromise.then(function (cmap) {
  91. expect(cmap.lookup(0x0C)).toBeUndefined();
  92. expect(cmap.lookup(0x0D)).toEqual(0x00);
  93. expect(cmap.lookup(0x12)).toEqual(0x05);
  94. expect(cmap.lookup(0x13)).toBeUndefined();
  95. done();
  96. }).catch(function (reason) {
  97. done.fail(reason);
  98. });
  99. });
  100. it('parses begincidchar', function (done) {
  101. var str = '1 begincidchar\n' + '<14> 0\n' + 'endcidchar\n';
  102. var stream = new _stream.StringStream(str);
  103. var cmapPromise = _cmap.CMapFactory.create({ encoding: stream });
  104. cmapPromise.then(function (cmap) {
  105. expect(cmap.lookup(0x14)).toEqual(0x00);
  106. expect(cmap.lookup(0x15)).toBeUndefined();
  107. done();
  108. }).catch(function (reason) {
  109. done.fail(reason);
  110. });
  111. });
  112. it('parses begincidrange', function (done) {
  113. var str = '1 begincidrange\n' + '<0016> <001B> 0\n' + 'endcidrange\n';
  114. var stream = new _stream.StringStream(str);
  115. var cmapPromise = _cmap.CMapFactory.create({ encoding: stream });
  116. cmapPromise.then(function (cmap) {
  117. expect(cmap.lookup(0x15)).toBeUndefined();
  118. expect(cmap.lookup(0x16)).toEqual(0x00);
  119. expect(cmap.lookup(0x1B)).toEqual(0x05);
  120. expect(cmap.lookup(0x1C)).toBeUndefined();
  121. done();
  122. }).catch(function (reason) {
  123. done.fail(reason);
  124. });
  125. });
  126. it('decodes codespace ranges', function (done) {
  127. var str = '1 begincodespacerange\n' + '<01> <02>\n' + '<00000003> <00000004>\n' + 'endcodespacerange\n';
  128. var stream = new _stream.StringStream(str);
  129. var cmapPromise = _cmap.CMapFactory.create({ encoding: stream });
  130. cmapPromise.then(function (cmap) {
  131. var c = {};
  132. cmap.readCharCode(String.fromCharCode(1), 0, c);
  133. expect(c.charcode).toEqual(1);
  134. expect(c.length).toEqual(1);
  135. cmap.readCharCode(String.fromCharCode(0, 0, 0, 3), 0, c);
  136. expect(c.charcode).toEqual(3);
  137. expect(c.length).toEqual(4);
  138. done();
  139. }).catch(function (reason) {
  140. done.fail(reason);
  141. });
  142. });
  143. it('decodes 4 byte codespace ranges', function (done) {
  144. var str = '1 begincodespacerange\n' + '<8EA1A1A1> <8EA1FEFE>\n' + 'endcodespacerange\n';
  145. var stream = new _stream.StringStream(str);
  146. var cmapPromise = _cmap.CMapFactory.create({ encoding: stream });
  147. cmapPromise.then(function (cmap) {
  148. var c = {};
  149. cmap.readCharCode(String.fromCharCode(0x8E, 0xA1, 0xA1, 0xA1), 0, c);
  150. expect(c.charcode).toEqual(0x8EA1A1A1);
  151. expect(c.length).toEqual(4);
  152. done();
  153. }).catch(function (reason) {
  154. done.fail(reason);
  155. });
  156. });
  157. it('read usecmap', function (done) {
  158. var str = '/Adobe-Japan1-1 usecmap\n';
  159. var stream = new _stream.StringStream(str);
  160. var cmapPromise = _cmap.CMapFactory.create({
  161. encoding: stream,
  162. fetchBuiltInCMap: fetchBuiltInCMap,
  163. useCMap: null
  164. });
  165. cmapPromise.then(function (cmap) {
  166. expect(cmap instanceof _cmap.CMap).toEqual(true);
  167. expect(cmap.useCMap).not.toBeNull();
  168. expect(cmap.builtInCMap).toBeFalsy();
  169. expect(cmap.length).toEqual(0x20A7);
  170. expect(cmap.isIdentityCMap).toEqual(false);
  171. done();
  172. }).catch(function (reason) {
  173. done.fail(reason);
  174. });
  175. });
  176. it('parses cmapname', function (done) {
  177. var str = '/CMapName /Identity-H def\n';
  178. var stream = new _stream.StringStream(str);
  179. var cmapPromise = _cmap.CMapFactory.create({ encoding: stream });
  180. cmapPromise.then(function (cmap) {
  181. expect(cmap.name).toEqual('Identity-H');
  182. done();
  183. }).catch(function (reason) {
  184. done.fail(reason);
  185. });
  186. });
  187. it('parses wmode', function (done) {
  188. var str = '/WMode 1 def\n';
  189. var stream = new _stream.StringStream(str);
  190. var cmapPromise = _cmap.CMapFactory.create({ encoding: stream });
  191. cmapPromise.then(function (cmap) {
  192. expect(cmap.vertical).toEqual(true);
  193. done();
  194. }).catch(function (reason) {
  195. done.fail(reason);
  196. });
  197. });
  198. it('loads built in cmap', function (done) {
  199. var cmapPromise = _cmap.CMapFactory.create({
  200. encoding: _primitives.Name.get('Adobe-Japan1-1'),
  201. fetchBuiltInCMap: fetchBuiltInCMap,
  202. useCMap: null
  203. });
  204. cmapPromise.then(function (cmap) {
  205. expect(cmap instanceof _cmap.CMap).toEqual(true);
  206. expect(cmap.useCMap).toBeNull();
  207. expect(cmap.builtInCMap).toBeTruthy();
  208. expect(cmap.length).toEqual(0x20A7);
  209. expect(cmap.isIdentityCMap).toEqual(false);
  210. done();
  211. }).catch(function (reason) {
  212. done.fail(reason);
  213. });
  214. });
  215. it('loads built in identity cmap', function (done) {
  216. var cmapPromise = _cmap.CMapFactory.create({
  217. encoding: _primitives.Name.get('Identity-H'),
  218. fetchBuiltInCMap: fetchBuiltInCMap,
  219. useCMap: null
  220. });
  221. cmapPromise.then(function (cmap) {
  222. expect(cmap instanceof _cmap.IdentityCMap).toEqual(true);
  223. expect(cmap.vertical).toEqual(false);
  224. expect(cmap.length).toEqual(0x10000);
  225. expect(function () {
  226. return cmap.isIdentityCMap;
  227. }).toThrow(new Error('should not access .isIdentityCMap'));
  228. done();
  229. }).catch(function (reason) {
  230. done.fail(reason);
  231. });
  232. });
  233. it('attempts to load a non-existent built-in CMap', function (done) {
  234. var cmapPromise = _cmap.CMapFactory.create({
  235. encoding: _primitives.Name.get('null'),
  236. fetchBuiltInCMap: fetchBuiltInCMap,
  237. useCMap: null
  238. });
  239. cmapPromise.then(function () {
  240. done.fail('No CMap should be loaded');
  241. }, function (reason) {
  242. expect(reason instanceof Error).toEqual(true);
  243. expect(reason.message).toEqual('Unknown CMap name: null');
  244. done();
  245. });
  246. });
  247. it('attempts to load a built-in CMap without the necessary API parameters', function (done) {
  248. function tmpFetchBuiltInCMap(name) {
  249. var CMapReaderFactory = (0, _is_node2.default)() ? new _test_utils.NodeCMapReaderFactory({}) : new _dom_utils.DOMCMapReaderFactory({});
  250. return CMapReaderFactory.fetch({ name: name });
  251. }
  252. var cmapPromise = _cmap.CMapFactory.create({
  253. encoding: _primitives.Name.get('Adobe-Japan1-1'),
  254. fetchBuiltInCMap: tmpFetchBuiltInCMap,
  255. useCMap: null
  256. });
  257. cmapPromise.then(function () {
  258. done.fail('No CMap should be loaded');
  259. }, function (reason) {
  260. expect(reason instanceof Error).toEqual(true);
  261. expect(reason.message).toEqual('CMap baseUrl must be specified, ' + 'see "PDFJS.cMapUrl" (and also "PDFJS.cMapPacked").');
  262. done();
  263. });
  264. });
  265. it('attempts to load a built-in CMap with inconsistent API parameters', function (done) {
  266. function tmpFetchBuiltInCMap(name) {
  267. var CMapReaderFactory = void 0;
  268. if ((0, _is_node2.default)()) {
  269. CMapReaderFactory = new _test_utils.NodeCMapReaderFactory({
  270. baseUrl: cMapUrl.node,
  271. isCompressed: false
  272. });
  273. } else {
  274. CMapReaderFactory = new _dom_utils.DOMCMapReaderFactory({
  275. baseUrl: cMapUrl.dom,
  276. isCompressed: false
  277. });
  278. }
  279. return CMapReaderFactory.fetch({ name: name });
  280. }
  281. var cmapPromise = _cmap.CMapFactory.create({
  282. encoding: _primitives.Name.get('Adobe-Japan1-1'),
  283. fetchBuiltInCMap: tmpFetchBuiltInCMap,
  284. useCMap: null
  285. });
  286. cmapPromise.then(function () {
  287. done.fail('No CMap should be loaded');
  288. }, function (reason) {
  289. expect(reason instanceof Error).toEqual(true);
  290. var message = reason.message;
  291. expect(message.startsWith('Unable to load CMap at: ')).toEqual(true);
  292. expect(message.endsWith('/external/bcmaps/Adobe-Japan1-1')).toEqual(true);
  293. done();
  294. });
  295. });
  296. });