2
0

ui_utils_spec.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. /* Copyright 2017 Mozilla Foundation
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. 'use strict';
  16. var webUiUtils = require('../../web/ui_utils.js');
  17. var sharedUtil = require('../../shared/util.js');
  18. var binarySearchFirstItem = webUiUtils.binarySearchFirstItem;
  19. var getPDFFileNameFromURL = webUiUtils.getPDFFileNameFromURL;
  20. var EventBus = webUiUtils.EventBus;
  21. var createObjectURL = sharedUtil.createObjectURL;
  22. var isNodeJS = sharedUtil.isNodeJS;
  23. describe('ui_utils', function () {
  24. describe('binary search', function () {
  25. function isTrue(boolean) {
  26. return boolean;
  27. }
  28. function isGreater3(number) {
  29. return number > 3;
  30. }
  31. it('empty array', function () {
  32. expect(binarySearchFirstItem([], isTrue)).toEqual(0);
  33. });
  34. it('single boolean entry', function () {
  35. expect(binarySearchFirstItem([false], isTrue)).toEqual(1);
  36. expect(binarySearchFirstItem([true], isTrue)).toEqual(0);
  37. });
  38. it('three boolean entries', function () {
  39. expect(binarySearchFirstItem([true, true, true], isTrue)).toEqual(0);
  40. expect(binarySearchFirstItem([false, true, true], isTrue)).toEqual(1);
  41. expect(binarySearchFirstItem([false, false, true], isTrue)).toEqual(2);
  42. expect(binarySearchFirstItem([false, false, false], isTrue)).toEqual(3);
  43. });
  44. it('three numeric entries', function () {
  45. expect(binarySearchFirstItem([0, 1, 2], isGreater3)).toEqual(3);
  46. expect(binarySearchFirstItem([2, 3, 4], isGreater3)).toEqual(2);
  47. expect(binarySearchFirstItem([4, 5, 6], isGreater3)).toEqual(0);
  48. });
  49. });
  50. describe('getPDFFileNameFromURL', function () {
  51. it('gets PDF filename', function () {
  52. expect(getPDFFileNameFromURL('/pdfs/file1.pdf')).toEqual('file1.pdf');
  53. expect(getPDFFileNameFromURL('http://www.example.com/pdfs/file2.pdf')).toEqual('file2.pdf');
  54. });
  55. it('gets fallback filename', function () {
  56. expect(getPDFFileNameFromURL('/pdfs/file1.txt')).toEqual('document.pdf');
  57. expect(getPDFFileNameFromURL('http://www.example.com/pdfs/file2.txt')).toEqual('document.pdf');
  58. });
  59. it('gets custom fallback filename', function () {
  60. expect(getPDFFileNameFromURL('/pdfs/file1.txt', 'qwerty1.pdf')).toEqual('qwerty1.pdf');
  61. expect(getPDFFileNameFromURL('http://www.example.com/pdfs/file2.txt', 'qwerty2.pdf')).toEqual('qwerty2.pdf');
  62. expect(getPDFFileNameFromURL('/pdfs/file3.txt', '')).toEqual('');
  63. });
  64. it('gets PDF filename from URL containing leading/trailing whitespace', function () {
  65. expect(getPDFFileNameFromURL(' /pdfs/file1.pdf ')).toEqual('file1.pdf');
  66. expect(getPDFFileNameFromURL(' http://www.example.com/pdfs/file2.pdf ')).toEqual('file2.pdf');
  67. });
  68. it('gets PDF filename from query string', function () {
  69. expect(getPDFFileNameFromURL('/pdfs/pdfs.html?name=file1.pdf')).toEqual('file1.pdf');
  70. expect(getPDFFileNameFromURL('http://www.example.com/pdfs/pdf.html?file2.pdf')).toEqual('file2.pdf');
  71. });
  72. it('gets PDF filename from hash string', function () {
  73. expect(getPDFFileNameFromURL('/pdfs/pdfs.html#name=file1.pdf')).toEqual('file1.pdf');
  74. expect(getPDFFileNameFromURL('http://www.example.com/pdfs/pdf.html#file2.pdf')).toEqual('file2.pdf');
  75. });
  76. it('gets correct PDF filename when multiple ones are present', function () {
  77. expect(getPDFFileNameFromURL('/pdfs/file1.pdf?name=file.pdf')).toEqual('file1.pdf');
  78. expect(getPDFFileNameFromURL('http://www.example.com/pdfs/file2.pdf#file.pdf')).toEqual('file2.pdf');
  79. });
  80. it('gets PDF filename from URI-encoded data', function () {
  81. var encodedUrl = encodeURIComponent('http://www.example.com/pdfs/file1.pdf');
  82. expect(getPDFFileNameFromURL(encodedUrl)).toEqual('file1.pdf');
  83. var encodedUrlWithQuery = encodeURIComponent('http://www.example.com/pdfs/file.txt?file2.pdf');
  84. expect(getPDFFileNameFromURL(encodedUrlWithQuery)).toEqual('file2.pdf');
  85. });
  86. it('gets PDF filename from data mistaken for URI-encoded', function () {
  87. expect(getPDFFileNameFromURL('/pdfs/%AA.pdf')).toEqual('%AA.pdf');
  88. expect(getPDFFileNameFromURL('/pdfs/%2F.pdf')).toEqual('%2F.pdf');
  89. });
  90. it('gets PDF filename from (some) standard protocols', function () {
  91. expect(getPDFFileNameFromURL('http://www.example.com/file1.pdf')).toEqual('file1.pdf');
  92. expect(getPDFFileNameFromURL('https://www.example.com/file2.pdf')).toEqual('file2.pdf');
  93. expect(getPDFFileNameFromURL('file:///path/to/files/file3.pdf')).toEqual('file3.pdf');
  94. expect(getPDFFileNameFromURL('ftp://www.example.com/file4.pdf')).toEqual('file4.pdf');
  95. });
  96. it('gets PDF filename from query string appended to "blob:" URL', function () {
  97. if (isNodeJS()) {
  98. pending('Blob in not supported in Node.js.');
  99. }
  100. var typedArray = new Uint8Array([1, 2, 3, 4, 5]);
  101. var blobUrl = createObjectURL(typedArray, 'application/pdf');
  102. expect(blobUrl.indexOf('blob:') === 0).toEqual(true);
  103. expect(getPDFFileNameFromURL(blobUrl + '?file.pdf')).toEqual('file.pdf');
  104. });
  105. it('gets fallback filename from query string appended to "data:" URL', function () {
  106. var typedArray = new Uint8Array([1, 2, 3, 4, 5]);
  107. var dataUrl = createObjectURL(typedArray, 'application/pdf', true);
  108. expect(dataUrl.indexOf('data:') === 0).toEqual(true);
  109. expect(getPDFFileNameFromURL(dataUrl + '?file1.pdf')).toEqual('document.pdf');
  110. expect(getPDFFileNameFromURL(' ' + dataUrl + '?file2.pdf')).toEqual('document.pdf');
  111. });
  112. });
  113. describe('EventBus', function () {
  114. it('dispatch event', function () {
  115. var eventBus = new EventBus();
  116. var count = 0;
  117. eventBus.on('test', function () {
  118. count++;
  119. });
  120. eventBus.dispatch('test');
  121. expect(count).toEqual(1);
  122. });
  123. it('dispatch different event', function () {
  124. var eventBus = new EventBus();
  125. var count = 0;
  126. eventBus.on('test', function () {
  127. count++;
  128. });
  129. eventBus.dispatch('nottest');
  130. expect(count).toEqual(0);
  131. });
  132. it('dispatch event multiple times', function () {
  133. var eventBus = new EventBus();
  134. var count = 0;
  135. eventBus.dispatch('test');
  136. eventBus.on('test', function () {
  137. count++;
  138. });
  139. eventBus.dispatch('test');
  140. eventBus.dispatch('test');
  141. expect(count).toEqual(2);
  142. });
  143. it('dispatch event to multiple handlers', function () {
  144. var eventBus = new EventBus();
  145. var count = 0;
  146. eventBus.on('test', function () {
  147. count++;
  148. });
  149. eventBus.on('test', function () {
  150. count++;
  151. });
  152. eventBus.dispatch('test');
  153. expect(count).toEqual(2);
  154. });
  155. it('dispatch to detached', function () {
  156. var eventBus = new EventBus();
  157. var count = 0;
  158. var listener = function listener() {
  159. count++;
  160. };
  161. eventBus.on('test', listener);
  162. eventBus.dispatch('test');
  163. eventBus.off('test', listener);
  164. eventBus.dispatch('test');
  165. expect(count).toEqual(1);
  166. });
  167. it('dispatch to wrong detached', function () {
  168. var eventBus = new EventBus();
  169. var count = 0;
  170. eventBus.on('test', function () {
  171. count++;
  172. });
  173. eventBus.dispatch('test');
  174. eventBus.off('test', function () {
  175. count++;
  176. });
  177. eventBus.dispatch('test');
  178. expect(count).toEqual(2);
  179. });
  180. it('dispatch to detached during handling', function () {
  181. var eventBus = new EventBus();
  182. var count = 0;
  183. var listener1 = function listener1() {
  184. eventBus.off('test', listener2);
  185. count++;
  186. };
  187. var listener2 = function listener2() {
  188. eventBus.off('test', listener1);
  189. count++;
  190. };
  191. eventBus.on('test', listener1);
  192. eventBus.on('test', listener2);
  193. eventBus.dispatch('test');
  194. eventBus.dispatch('test');
  195. expect(count).toEqual(2);
  196. });
  197. });
  198. });