api.tests.js 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132
  1. /*global ZeroClipboard, _currentElement:true, _flashState:true, _extend, _clipData, _clipDataFormatMap */
  2. (function(module, test) {
  3. "use strict";
  4. var originalFlashState, originalConfig, originalFlashDetect;
  5. module("client/api.js unit tests - constructor and bridge", {
  6. setup: function() {
  7. // Store
  8. originalFlashDetect = ZeroClipboard.isFlashUnusable;
  9. originalConfig = ZeroClipboard.config();
  10. // Modify
  11. ZeroClipboard.isFlashUnusable = function() {
  12. return false;
  13. };
  14. ZeroClipboard.config({ swfPath: originalConfig.swfPath.replace(/\/(?:src|test)\/.*$/i, "/dist/ZeroClipboard.swf") });
  15. },
  16. teardown: function() {
  17. // Restore
  18. ZeroClipboard.destroy();
  19. ZeroClipboard.isFlashUnusable = originalFlashDetect;
  20. ZeroClipboard.config(originalConfig);
  21. }
  22. });
  23. test("Client is created properly by `ZeroClipboard`", function(assert) {
  24. assert.expect(3);
  25. // Arrange & Act
  26. var client = new ZeroClipboard();
  27. // Assert
  28. assert.ok(client);
  29. assert.ok(client.id);
  30. assert.strictEqual(client instanceof ZeroClipboard, true);
  31. });
  32. test("New client is not the same client (no singleton) but does share the same bridge", function(assert) {
  33. assert.expect(6);
  34. // Arrange
  35. var containerClass = "." + ZeroClipboard.config("containerClass");
  36. // Assert, arrange, assert, act, assert
  37. assert.strictEqual($(containerClass).length, 0);
  38. var client1 = new ZeroClipboard();
  39. assert.ok(client1.id);
  40. assert.strictEqual($(containerClass).length, 1);
  41. var client2 = new ZeroClipboard();
  42. assert.strictEqual($(containerClass).length, 1);
  43. assert.notEqual(client2.id, client1.id);
  44. assert.notEqual(client2, client1);
  45. });
  46. test("No more client singleton!", function(assert) {
  47. assert.expect(7);
  48. // Arrange
  49. ZeroClipboard.isFlashUnusable = function() {
  50. return false;
  51. };
  52. // Assert, arrange, assert, act, assert
  53. assert.ok(!ZeroClipboard.prototype._singleton, "The client singleton does not exist on the prototype before creating a client");
  54. var client1 = new ZeroClipboard();
  55. assert.ok(!ZeroClipboard.prototype._singleton, "The client singleton does not exist on the prototype after creating a client");
  56. assert.ok(!client1._singleton, "The client singleton does not exist on the client instance after creating a client");
  57. var client2 = new ZeroClipboard();
  58. assert.ok(!ZeroClipboard.prototype._singleton, "The client singleton does not exist on the prototype after creating a second client");
  59. assert.ok(!client1._singleton, "The client singleton does not exist on the first client instance after creating a second client");
  60. assert.ok(!client2._singleton, "The client singleton does not exist on the second client instance after creating a second client");
  61. ZeroClipboard.destroy();
  62. assert.ok(!ZeroClipboard.prototype._singleton, "The client singleton does not exist on the prototype after calling `destroy`");
  63. });
  64. test("`destroy` clears up the client", function(assert) {
  65. assert.expect(6);
  66. // Arrange
  67. var containerId = "#" + ZeroClipboard.config("containerId");
  68. ZeroClipboard.isFlashUnusable = function() {
  69. return false;
  70. };
  71. // Assert, arrange, assert, act, assert
  72. assert.ok(!ZeroClipboard.prototype._singleton, "The client singleton does not exist before creating a client");
  73. assert.equal($(containerId)[0], null, "The HTML bridge does not exist before creating a client");
  74. /*jshint nonew:false */
  75. new ZeroClipboard();
  76. assert.ok(!ZeroClipboard.prototype._singleton, "The client singleton does exist after creating a client");
  77. assert.notEqual($(containerId)[0], null, "The HTML bridge does exist after creating a client");
  78. ZeroClipboard.destroy();
  79. assert.ok(!ZeroClipboard.prototype._singleton, "The client singleton does not exist after calling `destroy`");
  80. assert.equal($(containerId)[0], null, "The HTML bridge does not exist after calling `destroy`");
  81. });
  82. module("client/api.js unit tests - clipboard", {
  83. setup: function() {
  84. // Store
  85. originalConfig = ZeroClipboard.config();
  86. // Modify
  87. ZeroClipboard.config({ swfPath: originalConfig.swfPath.replace(/\/(?:src|test)\/.*$/i, "/dist/ZeroClipboard.swf") });
  88. },
  89. teardown: function() {
  90. ZeroClipboard.destroy();
  91. ZeroClipboard.config(originalConfig);
  92. }
  93. });
  94. test("`setText` works", function(assert) {
  95. assert.expect(4);
  96. // Arrange
  97. var client = new ZeroClipboard();
  98. // Assert, Act, repeat ad nauseam
  99. assert.deepEqual(_clipData, {}, "`_clipData` is empty");
  100. client.setText("zc4evar");
  101. assert.deepEqual(_clipData, { "text/plain": "zc4evar" }, "`_clipData` contains expected text");
  102. client.setText("ZeroClipboard");
  103. assert.deepEqual(_clipData, { "text/plain": "ZeroClipboard" }, "`_clipData` contains expected updated text");
  104. _clipData["text/html"] = "<b>Win</b>";
  105. client.setText("goodbye");
  106. assert.deepEqual(_clipData, { "text/plain": "goodbye", "text/html": "<b>Win</b>" }, "`_clipData` contains expected updated text AND the other data");
  107. });
  108. test("`setHtml` works", function(assert) {
  109. assert.expect(4);
  110. // Arrange
  111. var client = new ZeroClipboard();
  112. // Assert, Act, repeat ad nauseam
  113. assert.deepEqual(_clipData, {}, "`_clipData` is empty");
  114. client.setHtml("zc4evar");
  115. assert.deepEqual(_clipData, { "text/html": "zc4evar" }, "`_clipData` contains expected HTML");
  116. client.setHtml("<b>ZeroClipboard</b>");
  117. assert.deepEqual(_clipData, { "text/html": "<b>ZeroClipboard</b>" }, "`_clipData` contains expected updated HTML");
  118. _clipData["text/plain"] = "blah";
  119. client.setHtml("<i>goodbye</i>");
  120. assert.deepEqual(_clipData, { "text/html": "<i>goodbye</i>", "text/plain": "blah" }, "`_clipData` contains expected updated HTML AND the other data");
  121. });
  122. test("`setRichText` works", function(assert) {
  123. assert.expect(4);
  124. // Arrange
  125. var client = new ZeroClipboard();
  126. // Assert, Act, repeat ad nauseam
  127. assert.deepEqual(_clipData, {}, "`_clipData` is empty");
  128. client.setRichText("zc4evar");
  129. assert.deepEqual(_clipData, { "application/rtf": "zc4evar" }, "`_clipData` contains expected RTF");
  130. client.setRichText("{\\rtf1\\ansi\n{\\b ZeroClipboard}}");
  131. assert.deepEqual(_clipData, { "application/rtf": "{\\rtf1\\ansi\n{\\b ZeroClipboard}}" }, "`_clipData` contains expected updated RTF");
  132. _clipData["text/plain"] = "blah";
  133. client.setRichText("{\\rtf1\\ansi\n{\\i Foo}}");
  134. assert.deepEqual(_clipData, { "application/rtf": "{\\rtf1\\ansi\n{\\i Foo}}", "text/plain": "blah" }, "`_clipData` contains expected updated RTF AND the other data");
  135. });
  136. test("`setData` works", function(assert) {
  137. assert.expect(4);
  138. // Arrange
  139. var client = new ZeroClipboard();
  140. // Assert, Act, repeat ad nauseam
  141. assert.deepEqual(_clipData, {}, "`_clipData` is empty");
  142. client.setData("text/plain", "zc4evar");
  143. assert.deepEqual(_clipData, { "text/plain": "zc4evar" }, "`_clipData` contains expected text");
  144. client.setData("text/html", "<i>ZeroClipboard</i>");
  145. assert.deepEqual(_clipData, { "text/plain": "zc4evar", "text/html": "<i>ZeroClipboard</i>" }, "`_clipData` contains expected text and custom format");
  146. client.setData({ "text/html": "<b>Win</b>" });
  147. assert.deepEqual(_clipData, { "text/html": "<b>Win</b>" }, "`_clipData` contains expected HTML and cleared out old data because an object was passed in");
  148. });
  149. test("`clearData` works", function(assert) {
  150. assert.expect(4);
  151. // Arrange
  152. var client = new ZeroClipboard();
  153. // Assert
  154. assert.deepEqual(_clipData, {}, "`_clipData` is empty");
  155. // Arrange & Assert
  156. _clipData["text/plain"] = "zc4evar";
  157. _clipData["application/rtf"] = "{\\rtf1\\ansi\n{\\i Foo}}";
  158. _clipData["text/html"] = "<b>Win</b>";
  159. assert.deepEqual(_clipData, {
  160. "text/plain": "zc4evar",
  161. "application/rtf": "{\\rtf1\\ansi\n{\\i Foo}}",
  162. "text/html": "<b>Win</b>"
  163. }, "`_clipData` contains all expected data");
  164. // Act & Assert
  165. client.clearData("application/rtf");
  166. assert.deepEqual(_clipData, {
  167. "text/plain": "zc4evar",
  168. "text/html": "<b>Win</b>"
  169. }, "`_clipData` had 'application/rtf' successfully removed");
  170. // Act & Assert
  171. client.clearData();
  172. assert.deepEqual(_clipData, {}, "`_clipData` had all data successfully removed");
  173. });
  174. test("`setText` overrides the data-clipboard-text attribute", function(assert) {
  175. assert.expect(3);
  176. // Arrange
  177. var client = new ZeroClipboard();
  178. var currentEl = document.getElementById("d_clip_button");
  179. // Act
  180. client.clip(currentEl);
  181. client.setText("This is the new text");
  182. ZeroClipboard.activate(currentEl);
  183. var pendingText = ZeroClipboard.emit("copy");
  184. // Assert
  185. assert.deepEqual(_clipData, { "text/plain": "This is the new text" });
  186. assert.deepEqual(pendingText, { "text": "This is the new text" });
  187. assert.deepEqual(_clipDataFormatMap, { "text": "text/plain" });
  188. });
  189. test("`setText` overrides data-clipboard-target pre", function(assert) {
  190. assert.expect(3);
  191. // Arrange
  192. var client = new ZeroClipboard();
  193. var currentEl = document.getElementById("d_clip_button_pre_text");
  194. // Act
  195. client.clip(currentEl);
  196. client.setText("This is the new text");
  197. ZeroClipboard.activate(currentEl);
  198. var pendingText = ZeroClipboard.emit("copy");
  199. // Assert
  200. assert.deepEqual(_clipData, { "text/plain": "This is the new text" });
  201. assert.deepEqual(pendingText, { "text": "This is the new text" });
  202. assert.deepEqual(_clipDataFormatMap, { "text": "text/plain" });
  203. });
  204. test("`setHtml` overrides data-clipboard-target pre", function(assert) {
  205. assert.expect(3);
  206. // Arrange
  207. var client = new ZeroClipboard();
  208. var currentEl = document.getElementById("d_clip_button_pre_text");
  209. // Act
  210. client.clip(currentEl);
  211. client.setHtml("This is the new HTML");
  212. ZeroClipboard.activate(currentEl);
  213. var pendingText = ZeroClipboard.emit("copy");
  214. // Assert
  215. assert.deepEqual(_clipData, { "text/html": "This is the new HTML" });
  216. assert.deepEqual(pendingText, { "html": "This is the new HTML" });
  217. assert.deepEqual(_clipDataFormatMap, { "html": "text/html" });
  218. });
  219. test("`setText` AND `setHtml` override data-clipboard-target pre", function(assert) {
  220. assert.expect(3);
  221. // Arrange
  222. var client = new ZeroClipboard();
  223. var currentEl = document.getElementById("d_clip_button_pre_text");
  224. // Act
  225. client.clip(currentEl);
  226. client.setText("This is the new text");
  227. client.setHtml("This is the new HTML");
  228. ZeroClipboard.activate(currentEl);
  229. var pendingText = ZeroClipboard.emit("copy");
  230. // Assert
  231. assert.deepEqual(_clipData, {
  232. "text/plain": "This is the new text",
  233. "text/html": "This is the new HTML"
  234. });
  235. assert.deepEqual(pendingText, {
  236. "text": "This is the new text",
  237. "html": "This is the new HTML"
  238. });
  239. assert.deepEqual(_clipDataFormatMap, { "text": "text/plain", "html": "text/html" });
  240. });
  241. module("client/api.js unit tests - event", {
  242. setup: function() {
  243. // Store
  244. originalFlashState = _extend({}, _flashState);
  245. originalConfig = ZeroClipboard.config();
  246. originalFlashDetect = ZeroClipboard.isFlashUnusable;
  247. // Modify
  248. _currentElement = null;
  249. _flashState = {
  250. bridge: null,
  251. version: "0.0.0",
  252. disabled: null,
  253. outdated: null,
  254. unavailable: null,
  255. deactivated: null,
  256. ready: null
  257. };
  258. //ZeroClipboard.config({ swfPath: originalConfig.swfPath.replace(/\/(?:src|test)\/.*$/i, "/dist/ZeroClipboard.swf") });
  259. },
  260. teardown: function() {
  261. ZeroClipboard.destroy();
  262. _currentElement = null;
  263. _flashState = originalFlashState;
  264. ZeroClipboard.config(originalConfig);
  265. ZeroClipboard.isFlashUnusable = originalFlashDetect;
  266. }
  267. });
  268. test("Clip element after new client", function(assert) {
  269. assert.expect(4);
  270. // Arrange
  271. var client = new ZeroClipboard();
  272. var target = document.getElementById("d_clip_button");
  273. // Assert, Act, Assert
  274. assert.strictEqual("zcClippingId" in target, false);
  275. assert.deepEqual(client.elements(), []);
  276. client.clip(target);
  277. assert.strictEqual("zcClippingId" in target, true);
  278. assert.deepEqual(client.elements(), [target]);
  279. });
  280. test("unclip element removes items", function(assert) {
  281. assert.expect(12);
  282. // Arrange
  283. var client = new ZeroClipboard();
  284. var targets = [
  285. document.getElementById("d_clip_button"),
  286. document.getElementById("d_clip_button2"),
  287. document.getElementById("d_clip_button3")
  288. ];
  289. // Assert pre-conditions
  290. assert.strictEqual("zcClippingId" in targets[0], false);
  291. assert.strictEqual("zcClippingId" in targets[1], false);
  292. assert.strictEqual("zcClippingId" in targets[2], false);
  293. assert.deepEqual(client.elements(), []);
  294. // Act
  295. client.clip(targets);
  296. // Assert initial state
  297. assert.strictEqual("zcClippingId" in targets[0], true);
  298. assert.strictEqual("zcClippingId" in targets[1], true);
  299. assert.strictEqual("zcClippingId" in targets[2], true);
  300. assert.deepEqual(client.elements(), targets);
  301. // Act more
  302. client.unclip([
  303. document.getElementById("d_clip_button3"),
  304. document.getElementById("d_clip_button2")
  305. ]);
  306. // Assert end state
  307. assert.strictEqual("zcClippingId" in targets[0], true);
  308. assert.strictEqual("zcClippingId" in targets[1], false);
  309. assert.strictEqual("zcClippingId" in targets[2], false);
  310. assert.deepEqual(client.elements(), [targets[0]]);
  311. });
  312. test("Element won't be clipped twice", function(assert) {
  313. assert.expect(3);
  314. // Arrange
  315. var client = new ZeroClipboard();
  316. var currentEl = document.getElementById("d_clip_button");
  317. // Assert, act, assert
  318. assert.deepEqual(client.elements(), []);
  319. client.clip(currentEl);
  320. assert.deepEqual(client.elements(), [currentEl]);
  321. client.clip(currentEl);
  322. assert.deepEqual(client.elements(), [currentEl]);
  323. });
  324. test("Registering Events", function(assert) {
  325. assert.expect(6);
  326. // Arrange
  327. var client = new ZeroClipboard();
  328. // Act
  329. client.on("ready", function(){});
  330. client.on("onError", function(){});
  331. client.on("onCustomEvent", function(){});
  332. // Assert
  333. assert.ok(client.handlers().ready);
  334. assert.ok(client.handlers().error);
  335. assert.ok(client.handlers().customevent);
  336. assert.strictEqual(client.handlers().ready.length, 1);
  337. assert.strictEqual(client.handlers().error.length, 1);
  338. assert.strictEqual(client.handlers().customevent.length, 1);
  339. });
  340. test("Registering Events with Maps", function(assert) {
  341. assert.expect(6);
  342. // Arrange
  343. var client = new ZeroClipboard();
  344. // Act
  345. client.on({
  346. "ready": function(){},
  347. "onError": function(){},
  348. "onCustomEvent": function(){}
  349. });
  350. // Assert
  351. assert.ok(client.handlers().ready);
  352. assert.ok(client.handlers().error);
  353. assert.ok(client.handlers().customevent);
  354. assert.strictEqual(client.handlers().ready.length, 1);
  355. assert.strictEqual(client.handlers().error.length, 1);
  356. assert.strictEqual(client.handlers().customevent.length, 1);
  357. });
  358. test("Unregistering Events", function(assert) {
  359. assert.expect(6);
  360. // Arrange
  361. var client = new ZeroClipboard();
  362. var ready = function(){};
  363. var onError = function(){};
  364. var onCustomEvent = function(){};
  365. // Act
  366. client.on("ready", ready);
  367. client.on("onError", onError);
  368. client.on("onCustomEvent", onCustomEvent);
  369. // Assert
  370. assert.deepEqual(client.handlers().ready, [ready]);
  371. assert.deepEqual(client.handlers().error, [onError]);
  372. assert.deepEqual(client.handlers().customevent, [onCustomEvent]);
  373. // Act & Assert
  374. client.off("ready", ready);
  375. assert.deepEqual(client.handlers().ready, []);
  376. // Act & Assert
  377. client.off("onError", onError);
  378. assert.deepEqual(client.handlers().error, []);
  379. // Act & Assert
  380. client.off("onCustomEvent", onCustomEvent);
  381. assert.deepEqual(client.handlers().customevent, []);
  382. });
  383. test("Unregistering Events with Maps", function(assert) {
  384. assert.expect(6);
  385. // Arrange
  386. var client = new ZeroClipboard();
  387. var ready = function(){};
  388. var onError = function(){};
  389. var onCustomEvent = function(){};
  390. // Act
  391. client.on("ready", ready);
  392. client.on("onError", onError);
  393. client.on("onCustomEvent", onCustomEvent);
  394. // Assert
  395. assert.deepEqual(client.handlers().ready, [ready]);
  396. assert.deepEqual(client.handlers().error, [onError]);
  397. assert.deepEqual(client.handlers().customevent, [onCustomEvent]);
  398. // Act & Assert
  399. client.off({ "ready": ready });
  400. assert.deepEqual(client.handlers().ready, []);
  401. // Act & Assert
  402. client.off({ "onError": onError });
  403. assert.deepEqual(client.handlers().error, []);
  404. // Act & Assert
  405. client.off({ "onCustomEvent": onCustomEvent });
  406. assert.deepEqual(client.handlers().customevent, []);
  407. });
  408. test("Registering two events works", function(assert) {
  409. assert.expect(6);
  410. // Arrange
  411. var client = new ZeroClipboard();
  412. // Assert
  413. assert.ok(!client.handlers().ready);
  414. assert.ok(!client.handlers().aftercopy);
  415. // Act
  416. client.on("ready onaftercopy", function(){});
  417. // Assert more
  418. assert.ok(client.handlers().ready);
  419. assert.ok(client.handlers().aftercopy);
  420. assert.strictEqual(client.handlers().ready.length, 1);
  421. assert.strictEqual(client.handlers().aftercopy.length, 1);
  422. });
  423. test("Registering two events with a map works", function(assert) {
  424. assert.expect(6);
  425. // Arrange
  426. var client = new ZeroClipboard();
  427. // Assert
  428. assert.ok(!client.handlers().ready);
  429. assert.ok(!client.handlers().aftercopy);
  430. // Act
  431. client.on({
  432. "ready onaftercopy": function(){}
  433. });
  434. // Assert more
  435. assert.ok(client.handlers().ready);
  436. assert.ok(client.handlers().aftercopy);
  437. assert.strictEqual(client.handlers().ready.length, 1);
  438. assert.strictEqual(client.handlers().aftercopy.length, 1);
  439. });
  440. test("Unregistering two events works", function(assert) {
  441. assert.expect(6);
  442. // Arrange
  443. var client = new ZeroClipboard();
  444. var func = function() {};
  445. // Assert
  446. assert.ok(!client.handlers().ready);
  447. assert.ok(!client.handlers().aftercopy);
  448. // Act
  449. client.on("ready onaftercopy", func);
  450. // Assert more
  451. assert.deepEqual(client.handlers().ready, [func]);
  452. assert.deepEqual(client.handlers().aftercopy, [func]);
  453. // Act more
  454. client.off("ready onaftercopy", func);
  455. // Assert even more
  456. assert.deepEqual(client.handlers().ready, []);
  457. assert.deepEqual(client.handlers().aftercopy, []);
  458. });
  459. test("Unregistering two events with a map works", function(assert) {
  460. assert.expect(6);
  461. // Arrange
  462. var client = new ZeroClipboard();
  463. var func = function() {};
  464. // Assert
  465. assert.ok(!client.handlers().ready);
  466. assert.ok(!client.handlers().aftercopy);
  467. // Act
  468. client.on("ready onaftercopy", func);
  469. // Assert more
  470. assert.deepEqual(client.handlers().ready, [func]);
  471. assert.deepEqual(client.handlers().aftercopy, [func]);
  472. // Act more
  473. client.off({
  474. "ready onaftercopy": func
  475. });
  476. // Assert even more
  477. assert.deepEqual(client.handlers().ready, []);
  478. assert.deepEqual(client.handlers().aftercopy, []);
  479. });
  480. test("`on` can add multiple handlers for the same event", function(assert) {
  481. assert.expect(3);
  482. // Arrange
  483. var client = new ZeroClipboard();
  484. var func1 = function() {};
  485. var func2 = function() {};
  486. // Assert
  487. assert.ok(!client.handlers().ready);
  488. // Act
  489. client.on("ready", func1);
  490. // Assert more
  491. assert.deepEqual(client.handlers().ready, [func1]);
  492. // Act more
  493. client.on("ready", func2);
  494. // Assert even more
  495. assert.deepEqual(client.handlers().ready, [func1, func2]);
  496. });
  497. test("`off` can remove multiple handlers for the same event", function(assert) {
  498. assert.expect(5);
  499. // Arrange
  500. var client = new ZeroClipboard();
  501. var func1 = function() {};
  502. var func2 = function() {};
  503. var func3 = function() {};
  504. // Assert
  505. assert.ok(!client.handlers().ready);
  506. // Act
  507. client.on("ready", func1);
  508. client.on("ready", func2);
  509. client.on("ready", func3);
  510. // Assert more
  511. assert.deepEqual(client.handlers().ready, [func1, func2, func3]);
  512. // Act and assert even more
  513. client.off("ready", func3); // Remove from the end
  514. assert.deepEqual(client.handlers().ready, [func1, func2]);
  515. client.off("ready", func1); // Remove from the start
  516. assert.deepEqual(client.handlers().ready, [func2]);
  517. client.off("ready", func2); // Remove the last one
  518. assert.deepEqual(client.handlers().ready, []);
  519. });
  520. test("`on` can add more than one entry of the same handler function for the same event", function(assert) {
  521. assert.expect(2);
  522. // Arrange
  523. var client = new ZeroClipboard();
  524. var func1 = function() {};
  525. // Assert
  526. assert.ok(!client.handlers().ready);
  527. // Act
  528. client.on("ready", func1);
  529. client.on("ready", func1);
  530. // Assert more
  531. assert.deepEqual(client.handlers().ready, [func1, func1]);
  532. });
  533. test("`off` will remove all entries of the same handler function for the same event", function(assert) {
  534. assert.expect(3);
  535. // Arrange
  536. var client = new ZeroClipboard();
  537. var func1 = function() {};
  538. // Assert
  539. assert.ok(!client.handlers().ready);
  540. // Act
  541. client.on("ready", func1);
  542. client.on("ready", func1);
  543. // Assert more
  544. assert.deepEqual(client.handlers().ready, [func1, func1]);
  545. // Act more
  546. client.off("ready", func1);
  547. // Assert even more
  548. assert.deepEqual(client.handlers().ready, []);
  549. });
  550. test("`off` will remove all handler functions for an event if no function is specified", function(assert) {
  551. assert.expect(3);
  552. // Arrange
  553. var client = new ZeroClipboard();
  554. var func1 = function() {};
  555. var func2 = function() {};
  556. var func3 = function() {};
  557. // Assert
  558. assert.ok(!client.handlers().ready);
  559. // Act
  560. client.on("ready", func1);
  561. client.on("ready", func2);
  562. client.on("ready", func3);
  563. client.on("ready", func1);
  564. // Assert more
  565. assert.deepEqual(client.handlers().ready, [func1, func2, func3, func1]);
  566. // Act and assert even more
  567. client.off("ready"); // Remove all
  568. assert.deepEqual(client.handlers().ready, []);
  569. });
  570. test("`off` will remove all handler functions for all events if no event type is specified", function(assert) {
  571. assert.expect(6);
  572. // Arrange
  573. var client = new ZeroClipboard();
  574. var func1 = function() {};
  575. var func2 = function() {};
  576. var func3 = function() {};
  577. // Assert
  578. assert.ok(!client.handlers().ready);
  579. assert.ok(!client.handlers().error);
  580. // Act
  581. client.on("ready", func1);
  582. client.on("ready", func2);
  583. client.on("error", func3);
  584. // Assert more
  585. assert.deepEqual(client.handlers().ready, [func1, func2]);
  586. assert.deepEqual(client.handlers().error, [func3]);
  587. // Act and assert even more
  588. client.off(); // Remove all handlers for all types
  589. assert.deepEqual(client.handlers().ready, []);
  590. assert.deepEqual(client.handlers().error, []);
  591. });
  592. test("Test disabledFlash Event", function(assert) {
  593. assert.expect(6);
  594. // Arrange
  595. _flashState.disabled = true;
  596. var client = new ZeroClipboard();
  597. var id = client.id;
  598. // Act (should auto-fire immediately but the handler will be invoked asynchronously)
  599. client.on( "error", function(event) {
  600. // Assert
  601. assert.strictEqual(this, client);
  602. assert.strictEqual(this.id, id);
  603. assert.strictEqual(_flashState.disabled, true);
  604. assert.strictEqual(event.type, "error");
  605. assert.strictEqual(event.name, "flash-disabled");
  606. assert.strictEqual(event.target, null);
  607. QUnit.start();
  608. } );
  609. QUnit.stop();
  610. });
  611. test("Test outdatedFlash Event", function(assert) {
  612. assert.expect(8);
  613. // Arrange
  614. _flashState.disabled = false;
  615. _flashState.outdated = true;
  616. _flashState.version = "10.0.0";
  617. var client = new ZeroClipboard();
  618. var id = client.id;
  619. // Act
  620. client.on( "ready", function(/* event */) {
  621. assert.ok(false, "The `ready` event should NOT have fired!");
  622. } );
  623. client.on( "error", function(event) {
  624. // Assert
  625. assert.strictEqual(this, client);
  626. assert.strictEqual(this.id, id);
  627. assert.strictEqual(_flashState.outdated, true);
  628. assert.strictEqual(event.type, "error");
  629. assert.strictEqual(event.name, "flash-outdated");
  630. assert.strictEqual(event.target, null);
  631. assert.strictEqual(event.version, "10.0.0");
  632. assert.strictEqual(event.minimumVersion, "11.0.0");
  633. QUnit.start();
  634. } );
  635. QUnit.stop();
  636. });
  637. test("Test deactivatedFlash Event", function(assert) {
  638. assert.expect(10);
  639. // Arrange
  640. _flashState.disabled = false;
  641. _flashState.outdated = false;
  642. _flashState.version = "11.0.0";
  643. ZeroClipboard.config({ flashLoadTimeout: 2000 });
  644. var client = new ZeroClipboard();
  645. var id = client.id;
  646. client.on( "ready", function(/* event */) {
  647. assert.ok(false, "The `ready` event should NOT have fired!");
  648. } );
  649. client.on( "error", function(event) {
  650. // Assert
  651. assert.strictEqual(this, client);
  652. assert.strictEqual(this.id, id);
  653. assert.strictEqual(_flashState.deactivated, true);
  654. assert.strictEqual(_flashState.ready, false);
  655. assert.strictEqual(event.type, "error");
  656. assert.strictEqual(event.name, "flash-deactivated");
  657. assert.strictEqual(event.target, null);
  658. assert.strictEqual(event.version, "11.0.0");
  659. assert.strictEqual(event.minimumVersion, "11.0.0");
  660. QUnit.start();
  661. } );
  662. // Act
  663. setTimeout(function() {
  664. assert.strictEqual(_flashState.deactivated, null);
  665. }, 500);
  666. QUnit.stop();
  667. // The "deactivatedFlash" event will automatically fire in 2 seconds if the `ready` event does not fire first
  668. });
  669. test("Test deactivatedFlash Event after first resolution", function(assert) {
  670. assert.expect(8);
  671. // Arrange
  672. _flashState.disabled = false;
  673. _flashState.outdated = false;
  674. _flashState.version = "11.0.0";
  675. _flashState.deactivated = true;
  676. var client = new ZeroClipboard();
  677. var id = client.id;
  678. client.on( "ready", function(/* event */) {
  679. assert.ok(false, "The `ready` event should NOT have fired!");
  680. } );
  681. client.on( "error", function(event) {
  682. // Assert
  683. assert.strictEqual(this, client);
  684. assert.strictEqual(this.id, id);
  685. assert.strictEqual(_flashState.deactivated, true);
  686. assert.strictEqual(event.type, "error");
  687. assert.strictEqual(event.name, "flash-deactivated");
  688. assert.strictEqual(event.target, null);
  689. assert.strictEqual(event.version, "11.0.0");
  690. assert.strictEqual(event.minimumVersion, "11.0.0");
  691. QUnit.start();
  692. } );
  693. // Act
  694. QUnit.stop();
  695. // The "deactivatedFlash" event will automatically fire in 0 seconds (when the event loop gets to it)
  696. });
  697. test("Test ready Event", function(assert) {
  698. assert.expect(6);
  699. // Arrange
  700. _flashState.disabled = false;
  701. _flashState.outdated = false;
  702. _flashState.version = "11.9.0";
  703. var client = new ZeroClipboard();
  704. var currentEl = document.getElementById("d_clip_button");
  705. var id = client.id;
  706. client.clip(currentEl);
  707. client.on( "ready", function(event) {
  708. // Assert
  709. assert.strictEqual(this, client);
  710. assert.strictEqual(this.id, id);
  711. assert.strictEqual(event.type, "ready");
  712. assert.strictEqual(event.target, null);
  713. assert.strictEqual(_flashState.deactivated, false);
  714. assert.strictEqual(event.version, "11.9.0");
  715. QUnit.start();
  716. } );
  717. // Act
  718. QUnit.stop();
  719. ZeroClipboard.emit("ready");
  720. });
  721. test("Test ready Event after first load", function(assert) {
  722. assert.expect(6);
  723. // Arrange
  724. _flashState.disabled = false;
  725. _flashState.outdated = false;
  726. _flashState.deactivated = false;
  727. _flashState.version = "11.9.0";
  728. _flashState.ready = true;
  729. _flashState.bridge = {};
  730. var client = new ZeroClipboard();
  731. var id = client.id;
  732. // Act (should auto-fire immediately but the handler will be invoked asynchronously)
  733. client.on( "ready", function(event) {
  734. // Assert
  735. assert.strictEqual(this, client);
  736. assert.strictEqual(this.id, id);
  737. assert.strictEqual(event.type, "ready");
  738. assert.strictEqual(event.target, null);
  739. assert.strictEqual(_flashState.deactivated, false);
  740. assert.strictEqual(event.version, "11.9.0");
  741. QUnit.start();
  742. } );
  743. QUnit.stop();
  744. });
  745. test("Test overdueFlash Event", function(assert) {
  746. assert.expect(15);
  747. // Arrange
  748. _flashState.disabled = false;
  749. _flashState.outdated = false;
  750. _flashState.version = "11.0.0";
  751. _flashState.deactivated = true;
  752. var client = new ZeroClipboard();
  753. var id = client.id;
  754. client.on( "ready", function(/* event */) {
  755. assert.ok(false, "The `ready` event should NOT have fired!");
  756. } );
  757. client.on( "error", function(event) {
  758. // Assert
  759. assert.strictEqual(this, client);
  760. assert.strictEqual(this.id, id);
  761. if (event.name === "flash-deactivated") {
  762. assert.strictEqual(event.type, "error");
  763. assert.strictEqual(event.name, "flash-deactivated");
  764. assert.strictEqual(_flashState.deactivated, true);
  765. assert.strictEqual(event.version, "11.0.0");
  766. assert.strictEqual(event.minimumVersion, "11.0.0");
  767. }
  768. else if (event.name === "flash-overdue") {
  769. assert.strictEqual(event.type, "error");
  770. assert.strictEqual(event.name, "flash-overdue");
  771. assert.strictEqual(_flashState.deactivated, false);
  772. assert.strictEqual(_flashState.overdue, true);
  773. assert.strictEqual(event.version, "11.0.0");
  774. assert.strictEqual(event.minimumVersion, "11.0.0");
  775. QUnit.start();
  776. }
  777. } );
  778. // Act
  779. QUnit.stop();
  780. // The "deactivatedFlash" event will automatically fire in 0 seconds (when the event loop gets to it)
  781. setTimeout(function() {
  782. // Emit a "ready" event (as if from the SWF) to trigger an "overdueFlash" event
  783. ZeroClipboard.emit("ready");
  784. }, 1000);
  785. });
  786. test("Test string function name as handler", function(assert) {
  787. assert.expect(2);
  788. // Arrange
  789. var client = new ZeroClipboard();
  790. var currentEl = document.getElementById("d_clip_button");
  791. var id = client.id;
  792. client.clip(currentEl);
  793. window.zcLoadCallback = function(event) {
  794. // Assert
  795. assert.strictEqual(this.id, id);
  796. assert.strictEqual(event.type, "ready");
  797. QUnit.start();
  798. delete window.zcLoadCallback;
  799. };
  800. client.on( "ready", "zcLoadCallback" );
  801. // Act
  802. QUnit.stop();
  803. ZeroClipboard.emit("ready");
  804. });
  805. test("Test EventListener object as handler", function(assert) {
  806. assert.expect(4);
  807. // Arrange
  808. var client = new ZeroClipboard();
  809. var currentEl = document.getElementById("d_clip_button");
  810. var id = client.id;
  811. client.clip(currentEl);
  812. var eventListenerObj = {
  813. handleEvent: function(event) {
  814. // Assert
  815. assert.strictEqual(event.type, "ready");
  816. assert.strictEqual(event.client, client);
  817. assert.strictEqual(event.client.id, id);
  818. assert.strictEqual(this, eventListenerObj);
  819. QUnit.start();
  820. }
  821. };
  822. client.on( "ready", eventListenerObj );
  823. // Act
  824. QUnit.stop();
  825. ZeroClipboard.emit("ready");
  826. });
  827. test("Test for appropriate context inside of invoked event handlers", function(assert) {
  828. assert.expect(12);
  829. // Arrange
  830. var client = new ZeroClipboard();
  831. var currentEl = document.getElementById("d_clip_button");
  832. assert.ok(currentEl);
  833. assert.strictEqual(currentEl.id, "d_clip_button");
  834. client.clip(currentEl);
  835. ZeroClipboard.activate(currentEl);
  836. client.on( "ready error", function(/* event */) {
  837. // Assert
  838. assert.strictEqual(this, client);
  839. } );
  840. client.on( "beforecopy", function(event) {
  841. // Assert
  842. assert.strictEqual(event.target, currentEl);
  843. } );
  844. client.on( "copy", function(event) {
  845. // Assert
  846. assert.strictEqual(event.target, currentEl);
  847. assert.ok(_clipData["text/plain"]);
  848. } );
  849. client.on( "aftercopy", function(event) {
  850. // Assert
  851. assert.strictEqual(event.target, currentEl);
  852. assert.ok(!_clipData["text/plain"]);
  853. QUnit.start();
  854. } );
  855. // Act
  856. QUnit.stop();
  857. ZeroClipboard.emit("ready");
  858. ZeroClipboard.emit({"type":"error", "name":"flash-disabled"});
  859. ZeroClipboard.emit({"type":"error", "name":"flash-outdated"});
  860. ZeroClipboard.emit({"type":"error", "name":"flash-deactivated"});
  861. ZeroClipboard.emit({"type":"error", "name":"flash-overdue"});
  862. ZeroClipboard.emit("beforecopy");
  863. ZeroClipboard.emit("copy");
  864. ZeroClipboard.emit("aftercopy");
  865. });
  866. module("client/api.js unit tests - element clipping", {
  867. setup: function() {
  868. // Store
  869. originalConfig = ZeroClipboard.config();
  870. // Modify
  871. ZeroClipboard.config({ swfPath: originalConfig.swfPath.replace(/\/(?:src|test)\/.*$/i, "/dist/ZeroClipboard.swf") });
  872. },
  873. teardown: function() {
  874. ZeroClipboard.destroy();
  875. ZeroClipboard.config(originalConfig);
  876. }
  877. });
  878. test("Client without selector doesn't have elements", function(assert) {
  879. assert.expect(2);
  880. // Arrange & Act
  881. var client = new ZeroClipboard();
  882. // Assert
  883. assert.ok(client);
  884. assert.deepEqual(client.elements(), []);
  885. });
  886. })(QUnit.module, QUnit.test);