range.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. module('range');
  2. test('range', function() {
  3. var p = K.query('#test-data-01 p');
  4. var strong = K.query('#test-data-01 strong');
  5. var range, nativeRange;
  6. range = K.range(document);
  7. ok(range.startContainer === document);
  8. ok(range.startOffset === 0);
  9. ok(range.endContainer === document);
  10. ok(range.endOffset === 0);
  11. ok(range.collapsed === true);
  12. ok(range.commonAncestor() === document);
  13. range = K.range(document);
  14. range.selectNodeContents(strong);
  15. nativeRange = range.get();
  16. var newRange = K.range(nativeRange);
  17. same(range.toString(), newRange.toString());
  18. });
  19. test('range.setStart', function() {
  20. expect(6);
  21. var p = K.query('#test-data-01 p');
  22. var strong = K.query('#test-data-01 strong');
  23. var range = K.range(document);
  24. range.setStart(strong.previousSibling, 3);
  25. ok(range.startContainer === strong.previousSibling);
  26. ok(range.startOffset === 3);
  27. ok(range.endContainer === strong.previousSibling);
  28. ok(range.endOffset === 3);
  29. ok(range.collapsed === true);
  30. ok(range.commonAncestor() === strong.previousSibling);
  31. });
  32. test('range.setEnd', function() {
  33. expect(6);
  34. var p = K.query('#test-data-01 p');
  35. var strong = K.query('#test-data-01 strong');
  36. var range = K.range(document);
  37. range.setStart(strong.previousSibling, 3);
  38. range.setEnd(p, 4);
  39. ok(range.startContainer === strong.previousSibling);
  40. ok(range.startOffset === 3);
  41. ok(range.endContainer === p);
  42. ok(range.endOffset === 4);
  43. ok(range.collapsed === false);
  44. ok(range.commonAncestor() === p);
  45. });
  46. test('range.setStartBefore', function() {
  47. expect(6);
  48. var p = K.query('#test-data-01 p');
  49. var strong = K.query('#test-data-01 strong');
  50. var range = K.range(document);
  51. range.setStartBefore(strong);
  52. ok(range.startContainer === p);
  53. ok(range.startOffset === 1);
  54. ok(range.endContainer === p);
  55. ok(range.endOffset === 1);
  56. ok(range.collapsed === true);
  57. ok(range.commonAncestor() === p);
  58. });
  59. test('range.setStartAfter', function() {
  60. expect(6);
  61. var p = K.query('#test-data-01 p');
  62. var strong = K.query('#test-data-01 strong');
  63. var range = K.range(document);
  64. range.setStartAfter(strong);
  65. ok(range.startContainer === p);
  66. ok(range.startOffset === 2);
  67. ok(range.endContainer === p);
  68. ok(range.endOffset === 2);
  69. ok(range.collapsed === true);
  70. ok(range.commonAncestor() === p);
  71. });
  72. test('range.setEndBefore', function() {
  73. expect(6);
  74. var p = K.query('#test-data-01 p');
  75. var strong = K.query('#test-data-01 strong');
  76. var range = K.range(document);
  77. range.setEndBefore(strong);
  78. ok(range.startContainer === p);
  79. ok(range.startOffset === 1);
  80. ok(range.endContainer === p);
  81. ok(range.endOffset === 1);
  82. ok(range.collapsed === true);
  83. ok(range.commonAncestor() === p);
  84. });
  85. test('range.setEndAfter', function() {
  86. expect(6);
  87. var p = K.query('#test-data-01 p');
  88. var strong = K.query('#test-data-01 strong');
  89. var range = K.range(document);
  90. range.setStartAfter(strong);
  91. range.setEndAfter(strong);
  92. ok(range.startContainer === p);
  93. ok(range.startOffset === 2);
  94. ok(range.endContainer === p);
  95. ok(range.endOffset === 2);
  96. ok(range.collapsed === true);
  97. ok(range.commonAncestor() === p);
  98. });
  99. test('range.selectNode', function() {
  100. expect(6);
  101. var p = K.query('#test-data-01 p');
  102. var strong = K.query('#test-data-01 strong');
  103. var range = K.range(document);
  104. range.selectNode(strong);
  105. ok(range.startContainer === p);
  106. ok(range.startOffset === 1);
  107. ok(range.endContainer === p);
  108. ok(range.endOffset === 2);
  109. ok(range.collapsed === false);
  110. ok(range.commonAncestor() === p);
  111. });
  112. test('range.selectNodeContents', function() {
  113. var range, strong, img, p;
  114. //1
  115. strong = K.query('#test-data-01 strong');
  116. range = K.range(document);
  117. range.selectNodeContents(strong);
  118. ok(range.startContainer === strong);
  119. ok(range.startOffset === 0);
  120. ok(range.endContainer === strong);
  121. ok(range.endOffset === 1);
  122. ok(range.collapsed === false);
  123. ok(range.commonAncestor() === strong);
  124. //2
  125. img = K.query('#test-data-01 img');
  126. range = K.range(document);
  127. range.selectNodeContents(img);
  128. ok(range.startContainer === img.parentNode);
  129. ok(range.startOffset === 3);
  130. ok(range.endContainer === img.parentNode);
  131. ok(range.endOffset === 4);
  132. ok(range.collapsed === false);
  133. ok(range.commonAncestor() === img.parentNode);
  134. //3
  135. strong = K.query('#test-data-02 strong');
  136. range = K.range(document);
  137. range.selectNodeContents(strong);
  138. ok(range.startContainer === strong);
  139. ok(range.startOffset === 0);
  140. ok(range.endContainer === strong);
  141. ok(range.endOffset === 0);
  142. ok(range.collapsed === true);
  143. ok(range.commonAncestor() === strong);
  144. //4
  145. p = K.query('#test-data-02 p');
  146. range = K.range(document);
  147. range.selectNodeContents(p);
  148. ok(range.startContainer === p);
  149. ok(range.endContainer === p);
  150. ok(range.startOffset === 0);
  151. ok(range.endOffset === 7);
  152. ok(range.collapsed === false);
  153. ok(range.commonAncestor() === p);
  154. });
  155. test('range.collapse', function() {
  156. var p = K.query('#test-data-01 p');
  157. var strong = K.query('#test-data-01 strong');
  158. var range;
  159. range = K.range(document);
  160. range.setStart(p.childNodes[2], 0);
  161. range.setEnd(p.childNodes[4], 2);
  162. range.collapse(true);
  163. ok(range.startContainer === range.endContainer);
  164. ok(range.startOffset === range.endOffset);
  165. ok(range.collapsed === true);
  166. range = K.range(document);
  167. range.setStart(p.childNodes[2], 0);
  168. range.setEnd(p.childNodes[4], 2);
  169. range.collapse(false);
  170. ok(range.startContainer === range.endContainer);
  171. ok(range.startOffset === range.endOffset);
  172. ok(range.collapsed === true);
  173. });
  174. test('range.compareBoundaryPoints', function() {
  175. var p = K.query('#test-data-01 p');
  176. var strong = K.query('#test-data-01 strong');
  177. var cmp, rangeA, rangeB;
  178. //1
  179. rangeA = K.range(document);
  180. rangeB = K.range(document);
  181. rangeA.setStart(p.childNodes[0], 0);
  182. rangeA.setEnd(p.childNodes[0], 2);
  183. rangeB.setStart(p.childNodes[4], 0);
  184. rangeB.setEnd(p.childNodes[4], 2);
  185. cmp = rangeA.compareBoundaryPoints(K.START_TO_START, rangeB);
  186. ok(cmp === -1);
  187. cmp = rangeA.compareBoundaryPoints(K.START_TO_END, rangeB);
  188. ok(cmp === -1);
  189. cmp = rangeA.compareBoundaryPoints(K.END_TO_END, rangeB);
  190. ok(cmp === -1);
  191. cmp = rangeA.compareBoundaryPoints(K.END_TO_START, rangeB);
  192. ok(cmp === -1);
  193. //2
  194. rangeA = K.range(document);
  195. rangeB = K.range(document);
  196. rangeA.setStart(p.childNodes[0], 0);
  197. rangeA.setEnd(p.childNodes[4], 3);
  198. rangeB.setStart(p.childNodes[4], 0);
  199. rangeB.setEnd(p.childNodes[4], 2);
  200. cmp = rangeA.compareBoundaryPoints(K.START_TO_START, rangeB);
  201. ok(cmp === -1);
  202. cmp = rangeA.compareBoundaryPoints(K.START_TO_END, rangeB);
  203. ok(cmp === 1);
  204. cmp = rangeA.compareBoundaryPoints(K.END_TO_END, rangeB);
  205. ok(cmp === 1);
  206. cmp = rangeA.compareBoundaryPoints(K.END_TO_START, rangeB);
  207. ok(cmp === -1);
  208. //3
  209. rangeA = K.range(document);
  210. rangeB = K.range(document);
  211. rangeA.setStart(p.childNodes[0], 0);
  212. rangeA.setEnd(p.childNodes[2], 3);
  213. rangeB.setStart(p.childNodes[2], 0);
  214. rangeB.setEnd(p.childNodes[4], 2);
  215. cmp = rangeA.compareBoundaryPoints(K.START_TO_START, rangeB);
  216. ok(cmp === -1);
  217. cmp = rangeA.compareBoundaryPoints(K.START_TO_END, rangeB);
  218. ok(cmp === 1);
  219. cmp = rangeA.compareBoundaryPoints(K.END_TO_END, rangeB);
  220. ok(cmp === -1);
  221. cmp = rangeA.compareBoundaryPoints(K.END_TO_START, rangeB);
  222. ok(cmp === -1);
  223. //4
  224. rangeA = K.range(document);
  225. rangeB = K.range(document);
  226. rangeA.selectNode(strong);
  227. rangeB.selectNode(p);
  228. cmp = rangeA.compareBoundaryPoints(K.START_TO_START, rangeB);
  229. ok(cmp === 1);
  230. cmp = rangeA.compareBoundaryPoints(K.START_TO_END, rangeB);
  231. ok(cmp === 1);
  232. cmp = rangeA.compareBoundaryPoints(K.END_TO_END, rangeB);
  233. ok(cmp === -1);
  234. cmp = rangeA.compareBoundaryPoints(K.END_TO_START, rangeB);
  235. ok(cmp === -1);
  236. //5
  237. rangeA = K.range(document);
  238. rangeB = K.range(document);
  239. rangeA.setStart(p.childNodes[0], 0);
  240. rangeA.setEnd(p.childNodes[0], 2);
  241. rangeB.setStart(p.childNodes[0], 0);
  242. rangeB.setEnd(p.childNodes[0], 2);
  243. cmp = rangeA.compareBoundaryPoints(K.START_TO_START, rangeB);
  244. ok(cmp === 0);
  245. cmp = rangeA.compareBoundaryPoints(K.START_TO_END, rangeB);
  246. ok(cmp === 1);
  247. cmp = rangeA.compareBoundaryPoints(K.END_TO_END, rangeB);
  248. ok(cmp === 0);
  249. cmp = rangeA.compareBoundaryPoints(K.END_TO_START, rangeB);
  250. ok(cmp === -1);
  251. //6
  252. rangeA = K.range(document);
  253. rangeB = K.range(document);
  254. rangeA.selectNode(strong);
  255. rangeB.selectNode(strong.firstChild);
  256. cmp = rangeA.compareBoundaryPoints(K.START_TO_START, rangeB);
  257. ok(cmp === -1);
  258. cmp = rangeA.compareBoundaryPoints(K.START_TO_END, rangeB);
  259. ok(cmp === 1);
  260. cmp = rangeA.compareBoundaryPoints(K.END_TO_END, rangeB);
  261. ok(cmp === 1);
  262. cmp = rangeA.compareBoundaryPoints(K.END_TO_START, rangeB);
  263. ok(cmp === -1);
  264. //7
  265. rangeA = K.range(document);
  266. rangeB = K.range(document);
  267. rangeA.selectNode(strong.firstChild);
  268. rangeB.setStart(strong.firstChild, 0);
  269. rangeB.setEnd(strong.firstChild, 2);
  270. cmp = rangeA.compareBoundaryPoints(K.START_TO_START, rangeB);
  271. ok(cmp === -1);
  272. cmp = rangeA.compareBoundaryPoints(K.START_TO_END, rangeB);
  273. ok(cmp === 1);
  274. cmp = rangeA.compareBoundaryPoints(K.END_TO_END, rangeB);
  275. ok(cmp === 1);
  276. cmp = rangeA.compareBoundaryPoints(K.END_TO_START, rangeB);
  277. ok(cmp === -1);
  278. //8
  279. rangeA = K.range(document);
  280. rangeB = K.range(document);
  281. rangeA.selectNode(p.childNodes[3]);
  282. rangeB.selectNode(strong.firstChild);
  283. rangeB.setEnd(strong.nextSibling, 4);
  284. cmp = rangeA.compareBoundaryPoints(K.START_TO_START, rangeB);
  285. ok(cmp === 1);
  286. cmp = rangeA.compareBoundaryPoints(K.START_TO_END, rangeB);
  287. ok(cmp === 1);
  288. cmp = rangeA.compareBoundaryPoints(K.END_TO_END, rangeB);
  289. ok(cmp === 1);
  290. cmp = rangeA.compareBoundaryPoints(K.END_TO_START, rangeB);
  291. ok(cmp === 1);
  292. //9
  293. rangeA = K.range(document);
  294. rangeB = K.range(document);
  295. rangeA.selectNode(strong.previousSibling);
  296. rangeB.setStart(p, 1);
  297. rangeB.setEnd(strong.firstChild, 3);
  298. cmp = rangeA.compareBoundaryPoints(K.START_TO_START, rangeB);
  299. ok(cmp === -1);
  300. cmp = rangeA.compareBoundaryPoints(K.START_TO_END, rangeB);
  301. ok(cmp === 0);
  302. cmp = rangeA.compareBoundaryPoints(K.END_TO_END, rangeB);
  303. ok(cmp === -1);
  304. cmp = rangeA.compareBoundaryPoints(K.END_TO_START, rangeB);
  305. ok(cmp === -1);
  306. //10
  307. rangeA = K.range(document);
  308. rangeB = K.range(document);
  309. rangeA.selectNode(strong.previousSibling);
  310. rangeB.selectNode(strong.firstChild);
  311. rangeB.setEnd(strong.nextSibling, 4);
  312. cmp = rangeA.compareBoundaryPoints(K.START_TO_START, rangeB);
  313. ok(cmp === -1);
  314. cmp = rangeA.compareBoundaryPoints(K.START_TO_END, rangeB);
  315. ok(cmp === -1);
  316. cmp = rangeA.compareBoundaryPoints(K.END_TO_END, rangeB);
  317. ok(cmp === -1);
  318. cmp = rangeA.compareBoundaryPoints(K.END_TO_START, rangeB);
  319. ok(cmp === -1);
  320. //10
  321. rangeA = K.range(document);
  322. rangeB = K.range(document);
  323. rangeA.setStart(strong.previousSibling, 4);
  324. rangeB.setStart(strong.firstChild, 0);
  325. cmp = rangeA.compareBoundaryPoints(K.START_TO_END, rangeB);
  326. ok(cmp === -1);
  327. });
  328. test('range.cloneRange', function() {
  329. expect(6);
  330. var p = K.query('#test-data-01 p');
  331. var strong = K.query('#test-data-01 strong');
  332. var range = K.range(document);
  333. range.setStart(p.childNodes[2], 0);
  334. range.setEnd(p.childNodes[4], 2);
  335. var cloneRange = range.cloneRange();
  336. ok(range.startContainer === cloneRange.startContainer);
  337. ok(range.startOffset === cloneRange.startOffset);
  338. ok(range.endContainer === cloneRange.endContainer);
  339. ok(range.endOffset === cloneRange.endOffset);
  340. ok(range.collapsed === cloneRange.collapsed);
  341. ok(range.commonAncestor() === cloneRange.commonAncestor());
  342. });
  343. test('range.toString', function() {
  344. var p = K.query('#test-data-01 p');
  345. var strong = K.query('#test-data-01 strong');
  346. var range;
  347. //1
  348. range = K.range(document);
  349. range.selectNode(strong);
  350. same(range.toString(), 'efg');
  351. //2
  352. range = K.range(document);
  353. range.selectNode(strong);
  354. range.setStart(strong.firstChild, 1);
  355. same(range.toString(), 'fg');
  356. //3
  357. range = K.range(document);
  358. range.setStart(strong.firstChild, 1);
  359. range.setEnd(strong.firstChild, 2);
  360. same(range.toString(), 'f');
  361. //4
  362. range = K.range(document);
  363. range.setStart(p.childNodes[0], 0);
  364. range.setEnd(p.childNodes[4], 2);
  365. same(range.toString(), 'abcdefghijkxy');
  366. //5
  367. range = K.range(document);
  368. range.setStart(p.childNodes[4], 1);
  369. range.setEnd(p.childNodes[4], 2);
  370. same(range.toString(), 'y');
  371. //6
  372. range = K.range(document);
  373. range.selectNode(p);
  374. same(range.toString(), 'abcdefghijkxyz0123456789');
  375. //7
  376. range = K.range(document);
  377. range.selectNode(strong.firstChild);
  378. same(range.toString(), 'efg');
  379. //8
  380. range = K.range(document);
  381. range.selectNode(strong);
  382. same(range.toString(), 'efg');
  383. //9
  384. range = K.range(document);
  385. same(range.toString(), '');
  386. //10
  387. range = K.range(document);
  388. range.selectNode(document.body);
  389. ok(range.toString().length > 100);
  390. });
  391. test('range.cloneContents', function() {
  392. var p = K.query('#test-data-01 p');
  393. var strong = K.query('#test-data-01 strong');
  394. var range, frag;
  395. //1
  396. range = K.range(document);
  397. range.selectNode(strong);
  398. frag = range.cloneContents();
  399. same(K(frag).outer().toLowerCase(), '<strong>efg</strong>');
  400. ok(!range.collapsed);
  401. //2
  402. range = K.range(document);
  403. range.setStart(strong.firstChild, 1);
  404. range.setEnd(strong.firstChild, 2);
  405. frag = range.cloneContents();
  406. same(K(frag).outer().toLowerCase(), 'f');
  407. //3
  408. range = K.range(document);
  409. range.setStart(strong.firstChild, 0);
  410. range.setEnd(strong.firstChild, 3);
  411. frag = range.cloneContents();
  412. same(K(frag).outer().toLowerCase(), 'efg');
  413. //4
  414. range = K.range(document);
  415. range.setStart(strong.firstChild, 1);
  416. range.setEnd(strong.nextSibling, 1);
  417. frag = range.cloneContents();
  418. same(K(frag).outer().toLowerCase(), '<strong>fg</strong>h');
  419. //5
  420. range = K.range(document);
  421. range.setStart(strong.firstChild, 1);
  422. range.setEnd(strong.nextSibling, 0);
  423. frag = range.cloneContents();
  424. same(K(frag).outer().toLowerCase(), '<strong>fg</strong>');
  425. //6
  426. range = K.range(document);
  427. range.setStart(p, 0);
  428. range.setEnd(p, 4);
  429. frag = range.cloneContents();
  430. ok(K(frag).children().length === 4);
  431. //7
  432. range = K.range(document);
  433. range.selectNode(strong.firstChild);
  434. range.setEnd(strong.nextSibling, 4);
  435. frag = range.cloneContents();
  436. same(K(frag).outer().toLowerCase(), '<strong>efg</strong>hijk');
  437. //8
  438. range = K.range(document);
  439. range.setStart(strong.nextSibling, 4);
  440. range.setEnd(p, 4);
  441. frag = range.cloneContents();
  442. ok(K(frag).children().length === 1);
  443. same(K(frag).first().name, 'img');
  444. });
  445. test('range.extractContents', function() {
  446. var p = K.query('#test-data-01 p'),
  447. cloneP, strong, range, frag, div;
  448. //1
  449. cloneP = p.cloneNode(true);
  450. document.body.appendChild(cloneP);
  451. strong = K.query('strong', cloneP);
  452. range = K.range(document);
  453. range.selectNode(strong);
  454. frag = range.extractContents();
  455. same(K(frag).outer().toLowerCase(), '<strong>efg</strong>');
  456. ok(range.collapsed);
  457. document.body.removeChild(cloneP);
  458. //2
  459. cloneP = p.cloneNode(true);
  460. document.body.appendChild(cloneP);
  461. strong = K.query('strong', cloneP);
  462. range = K.range(document);
  463. range.setStart(strong.firstChild, 1);
  464. range.setEnd(strong.firstChild, 2);
  465. frag = range.extractContents();
  466. same(K(frag).outer().toLowerCase(), 'f');
  467. document.body.removeChild(cloneP);
  468. //3
  469. cloneP = p.cloneNode(true);
  470. document.body.appendChild(cloneP);
  471. strong = K.query('strong', cloneP);
  472. range = K.range(document);
  473. range.setStart(strong.firstChild, 0);
  474. range.setEnd(strong.firstChild, 3);
  475. frag = range.extractContents();
  476. same(K(frag).outer().toLowerCase(), 'efg');
  477. document.body.removeChild(cloneP);
  478. //4
  479. cloneP = p.cloneNode(true);
  480. document.body.appendChild(cloneP);
  481. strong = K.query('strong', cloneP);
  482. range = K.range(document);
  483. range.setStart(strong.firstChild, 1);
  484. range.setEnd(strong.nextSibling, 1);
  485. frag = range.extractContents();
  486. same(K(frag).outer().toLowerCase(), '<strong>fg</strong>h');
  487. document.body.removeChild(cloneP);
  488. //5
  489. cloneP = p.cloneNode(true);
  490. document.body.appendChild(cloneP);
  491. strong = K.query('strong', cloneP);
  492. range = K.range(document);
  493. range.setStart(strong.firstChild, 1);
  494. range.setEnd(strong.nextSibling, 0);
  495. frag = range.extractContents();
  496. same(K(frag).outer().toLowerCase(), '<strong>fg</strong>');
  497. document.body.removeChild(cloneP);
  498. //6
  499. cloneP = p.cloneNode(true);
  500. document.body.appendChild(cloneP);
  501. strong = K.query('strong', cloneP);
  502. range = K.range(document);
  503. range.setStart(cloneP, 0);
  504. range.setEnd(cloneP, 4);
  505. frag = range.extractContents();
  506. ok(K(frag).children().length === 4);
  507. document.body.removeChild(cloneP);
  508. //7
  509. cloneP = p.cloneNode(true);
  510. document.body.appendChild(cloneP);
  511. strong = K.query('strong', cloneP);
  512. range = K.range(document);
  513. range.selectNode(strong.firstChild);
  514. range.setEnd(strong.nextSibling, 4);
  515. frag = range.extractContents();
  516. same(K(frag).outer().toLowerCase(), '<strong>efg</strong>hijk');
  517. document.body.removeChild(cloneP);
  518. //8
  519. cloneP = p.cloneNode(true);
  520. document.body.appendChild(cloneP);
  521. strong = K.query('strong', cloneP);
  522. range = K.range(document);
  523. range.setStart(cloneP, 3);
  524. range.setEnd(cloneP, 4);
  525. frag = range.extractContents();
  526. ok(K(frag).children().length === 1);
  527. same(K(frag).first().name, 'img');
  528. document.body.removeChild(cloneP);
  529. //9
  530. cloneP = p.cloneNode(true);
  531. document.body.appendChild(cloneP);
  532. strong = K.query('strong', cloneP);
  533. range = K.range(document);
  534. range.setStart(cloneP, 1);
  535. range.setEnd(strong.firstChild, 3);
  536. frag = range.extractContents();
  537. same(K(frag).outer().toLowerCase(), '<strong>efg</strong>');
  538. document.body.removeChild(cloneP);
  539. //10
  540. cloneP = p.cloneNode(true);
  541. document.body.appendChild(cloneP);
  542. strong = K.query('strong', cloneP);
  543. range = K.range(document);
  544. range.setStart(cloneP, 0);
  545. range.setEnd(strong.firstChild, 1);
  546. frag = range.extractContents();
  547. same(K(frag).outer(), 'abcd<strong>e</strong>');
  548. document.body.removeChild(cloneP);
  549. //11
  550. div = K('<div><strong>e</strong><strong>fg</strong></div>');
  551. document.body.appendChild(div[0]);
  552. range = K.range(document);
  553. range.setStart(div[0], 1);
  554. range.setEnd(div.last().first()[0], 1);
  555. frag = range.extractContents();
  556. same(div.outer().toLowerCase(), '<div><strong>e</strong><strong>g</strong></div>');
  557. same(K(frag).outer().toLowerCase(), '<strong>f</strong>');
  558. document.body.removeChild(div[0]);
  559. //12
  560. div = K('<div>abcd<strong></strong><strong>efg</strong>hijk</div>');
  561. document.body.appendChild(div[0]);
  562. range = K.range(document);
  563. range.setStart(div[0], 2);
  564. range.setEnd(div.children()[2], 1);
  565. frag = range.extractContents();
  566. same(div.outer().toLowerCase(), '<div>abcd<strong></strong><strong></strong>hijk</div>');
  567. same(K(frag).outer().toLowerCase(), '<strong>efg</strong>');
  568. document.body.removeChild(div[0]);
  569. //13
  570. div = K('<div>abcd<strong><strong></strong></strong><strong><strong>efg</strong></strong>hijk</div>');
  571. document.body.appendChild(div[0]);
  572. range = K.range(document);
  573. range.setStart(div.children().eq(2).first()[0], 1);
  574. range.setEnd(div[0], 4);
  575. frag = range.extractContents();
  576. same(div.outer().toLowerCase(), '<div>abcd<strong><strong></strong></strong><strong><strong>efg</strong></strong></div>');
  577. same(K(frag).outer().toLowerCase(), '<strong><strong></strong></strong>hijk');
  578. document.body.removeChild(div[0]);
  579. //14
  580. div = K('<div>\n<span></span><span><span style="font-size:18px;">abcd</span><span style="font-size:18px;"></span><span style="font-size:18px;"></span></span>\n</div>');
  581. document.body.appendChild(div[0]);
  582. range = K.range(document);
  583. range.setStart(div.first().next()[0], 1);
  584. range.setEnd(div[0], 3);
  585. frag = range.extractContents();
  586. same(div.html().toLowerCase(), '<span></span><span><span style="font-size:18px;">abcd</span></span>');
  587. same(K(frag).outer().toLowerCase(), '<span><span style="font-size:18px;"></span><span style="font-size:18px;"></span></span>');
  588. document.body.removeChild(div[0]);
  589. });
  590. test('range.deleteContents', function() {
  591. var p = K.query('#test-data-01 p'),
  592. cloneP, strong, range, frag;
  593. //1
  594. cloneP = p.cloneNode(true);
  595. document.body.appendChild(cloneP);
  596. strong = K.query('strong', cloneP);
  597. range = K.range(document);
  598. range.selectNode(strong);
  599. frag = range.deleteContents();
  600. ok(range.collapsed);
  601. ok(frag === range);
  602. document.body.removeChild(cloneP);
  603. });
  604. test('range.insertNode', function() {
  605. var p = K.query('#test-data-01 p'),
  606. cloneP, strong, range, frag;
  607. //1
  608. cloneP = p.cloneNode(true);
  609. document.body.appendChild(cloneP);
  610. strong = K.query('strong', cloneP);
  611. range = K.range(document);
  612. range.selectNode(strong);
  613. range.insertNode(K('<span>abc</span>').get());
  614. same(range.toString(), 'abcefg');
  615. document.body.removeChild(cloneP);
  616. //2
  617. cloneP = p.cloneNode(true);
  618. document.body.appendChild(cloneP);
  619. strong = K.query('strong', cloneP);
  620. range = K.range(document);
  621. range.selectNode(strong.firstChild);
  622. range.insertNode(K('<span>123</span>').get());
  623. same(range.toString(), '123efg');
  624. document.body.removeChild(cloneP);
  625. //3
  626. cloneP = p.cloneNode(true);
  627. document.body.appendChild(cloneP);
  628. strong = K.query('strong', cloneP);
  629. range = K.range(document);
  630. range.setStart(strong.firstChild, 0);
  631. range.setEnd(strong.firstChild, 3);
  632. range.insertNode(K('<span>123</span>').get());
  633. same(range.toString(), '123efg');
  634. document.body.removeChild(cloneP);
  635. //4
  636. cloneP = p.cloneNode(true);
  637. document.body.appendChild(cloneP);
  638. strong = K.query('strong', cloneP);
  639. range = K.range(document);
  640. range.setStart(strong.firstChild, 1);
  641. range.setEnd(strong.firstChild, 2);
  642. range.insertNode(K('<span>123</span>').get());
  643. same(range.toString(), '123f');
  644. document.body.removeChild(cloneP);
  645. //5
  646. cloneP = p.cloneNode(true);
  647. document.body.appendChild(cloneP);
  648. strong = K.query('strong', cloneP);
  649. var frag = document.createDocumentFragment();
  650. frag.appendChild(K('<span>1</span>').get());
  651. frag.appendChild(K('<span>2</span>').get());
  652. range = K.range(document);
  653. range.selectNode(strong);
  654. range.insertNode(frag);
  655. same(range.toString(), '12efg');
  656. document.body.removeChild(cloneP);
  657. });
  658. test('range.surroundContents', function() {
  659. var p = K.query('#test-data-01 p'),
  660. cloneP, strong, range;
  661. //1
  662. cloneP = p.cloneNode(true);
  663. document.body.appendChild(cloneP);
  664. strong = K.query('strong', cloneP);
  665. range = K.range(document);
  666. range.selectNode(strong);
  667. range.surroundContents(K('<span></span>').get());
  668. same(range.html(), '<span><strong>efg</strong></span>');
  669. document.body.removeChild(cloneP);
  670. //2
  671. cloneP = p.cloneNode(true);
  672. document.body.appendChild(cloneP);
  673. strong = K.query('strong', cloneP);
  674. range = K.range(document);
  675. range.selectNode(strong.firstChild);
  676. range.surroundContents(K('<span></span>').get());
  677. same(range.html(), '<span>efg</span>');
  678. document.body.removeChild(cloneP);
  679. //3
  680. cloneP = p.cloneNode(true);
  681. document.body.appendChild(cloneP);
  682. strong = K.query('strong', cloneP);
  683. range = K.range(document);
  684. range.setStart(strong.firstChild, 1);
  685. range.setEnd(strong.firstChild, 2);
  686. range.surroundContents(K('<span></span>').get());
  687. same(range.html(), '<span>f</span>');
  688. document.body.removeChild(cloneP);
  689. //4
  690. cloneP = p.cloneNode(true);
  691. document.body.appendChild(cloneP);
  692. strong = K.query('strong', cloneP);
  693. range = K.range(document);
  694. range.setStart(strong.firstChild, 0);
  695. range.setEnd(strong.firstChild, 3);
  696. range.surroundContents(K('<span></span>').get());
  697. same(range.html(), '<span>efg</span>');
  698. document.body.removeChild(cloneP);
  699. //5
  700. cloneP = p.cloneNode(true);
  701. document.body.appendChild(cloneP);
  702. strong = K.query('strong', cloneP);
  703. range = K.range(document);
  704. range.setStart(strong.firstChild, 1);
  705. range.setEnd(cloneP, 3);
  706. range.surroundContents(K('<span></span>').get());
  707. same(range.html(), '<span><strong>fg</strong>hijk</span>');
  708. document.body.removeChild(cloneP);
  709. });
  710. test('range.enlarge', function() {
  711. var div = K('<div></div>');
  712. K(document.body.firstChild).before(div);
  713. //1
  714. div.html('<strong><span>123</span>abc</strong>def');
  715. range = K.range(document);
  716. range.setStart(div.first().first().first()[0], 0);
  717. range.setEnd(div.first().first().next()[0], 3);
  718. range.enlarge();
  719. same(range.html(), '<strong><span>123</span>abc</strong>');
  720. div.html('');
  721. });
  722. test('range.shrink', function() {
  723. var div = K('<div></div>');
  724. K(document.body.firstChild).before(div);
  725. //1
  726. div.html('<p><strong><span>123</span>abc</strong></p>');
  727. range = K.range(document);
  728. range.setStart(div[0], 0);
  729. range.setEnd(div[0], 1);
  730. range.shrink();
  731. same(range.html(), '<span>123</span>abc');
  732. div.html('');
  733. });
  734. test('range.moveToBookmark', function() {
  735. var div = K('<div></div>');
  736. K(document.body.firstChild).before(div);
  737. //1
  738. div.html('<p>1234<strong>5678</strong>9</p>');
  739. range = K.range(document);
  740. range.setStart(div.first().first()[0], 3);
  741. range.setEnd(div.first().first().next()[0], 1);
  742. var bookmark = range.createBookmark();
  743. range.moveToBookmark(bookmark);
  744. same(range.html(), '4<strong>5678</strong>');
  745. div.html('');
  746. //2
  747. div.html('<p>1234<strong>5678</strong>9</p>');
  748. range = K.range(document);
  749. range.setStart(div.first()[0], 1);
  750. range.setEnd(div.first().last()[0], 0);
  751. var bookmark = range.createBookmark(true);
  752. range.moveToBookmark(bookmark);
  753. same(range.html(), '<strong>5678</strong>');
  754. div.html('');
  755. });
  756. test('range.get', function() {
  757. var div = K('<div></div>');
  758. K(document.body.firstChild).before(div);
  759. //1
  760. div.html('0123456789<table><tr><td>123</td></tr></table>');
  761. range = K.range(document);
  762. range.setStart(div.first()[0], 7);
  763. range.setEnd(div.first()[0], 8); // "7"
  764. var nativeRange = range.get();
  765. newRange = K.range(nativeRange);
  766. equals(range.html(), newRange.html());
  767. div.html('');
  768. });