lady_josephine 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (304) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +32 -0
  4. data/app/assets/fonts/lady_josephine/icons/icons.eot +0 -0
  5. data/app/assets/fonts/lady_josephine/icons/icons.svg +215 -0
  6. data/app/assets/fonts/lady_josephine/icons/icons.ttf +0 -0
  7. data/app/assets/fonts/lady_josephine/icons/icons.woff +0 -0
  8. data/app/assets/javascripts/lady_josephine/blocks/facebook.js +25 -0
  9. data/app/assets/javascripts/lady_josephine/blocks/instagram.js +22 -0
  10. data/app/assets/javascripts/lady_josephine/blocks/soundcloud.js +24 -0
  11. data/app/assets/javascripts/lady_josephine/blocks/twitter.js +25 -0
  12. data/app/assets/javascripts/lady_josephine/blocks/vimeo.js +55 -0
  13. data/app/assets/javascripts/lady_josephine/blocks/youtube.js +64 -0
  14. data/app/assets/javascripts/lady_josephine/editor.js +40 -0
  15. data/app/assets/javascripts/lady_josephine/lady_josephine.js +4 -0
  16. data/app/assets/javascripts/lady_josephine/lady_josephine_view.js +6 -0
  17. data/app/assets/stylesheets/lady_josephine/content.sass +33 -0
  18. data/app/assets/stylesheets/lady_josephine/icons.sass +175 -0
  19. data/app/assets/stylesheets/lady_josephine/lady_josephine.sass +6 -0
  20. data/app/assets/stylesheets/lady_josephine/sir_trevor.sass +619 -0
  21. data/app/assets/stylesheets/lady_josephine/vars.sass +36 -0
  22. data/app/controllers/lady_josephine/application_controller.rb +4 -0
  23. data/app/controllers/lady_josephine/editor_controller.rb +40 -0
  24. data/app/controllers/lady_josephine/images_controller.rb +26 -0
  25. data/app/helpers/lady_josephine/helper.rb +25 -0
  26. data/app/helpers/lady_josephine/sir_trevor_helper.rb +172 -0
  27. data/app/models/lady_josephine/concerns/model.rb +29 -0
  28. data/app/models/lady_josephine/concerns/pingable.rb +28 -0
  29. data/app/models/lady_josephine/concerns/server_uuid.rb +24 -0
  30. data/app/models/lady_josephine/concerns/sir_trevor_images.rb +38 -0
  31. data/app/models/lady_josephine/image.rb +41 -0
  32. data/app/uploader/lady_josephine/base_uploader.rb +47 -0
  33. data/app/uploader/lady_josephine/image_uploader.rb +149 -0
  34. data/app/views/lady_josephine/blocks/_audio_block.haml +2 -0
  35. data/app/views/lady_josephine/blocks/_definition_block.haml +4 -0
  36. data/app/views/lady_josephine/blocks/_divider_block.haml +2 -0
  37. data/app/views/lady_josephine/blocks/_extended_image_block.haml +63 -0
  38. data/app/views/lady_josephine/blocks/_extended_quote_block.haml +5 -0
  39. data/app/views/lady_josephine/blocks/_extended_tweet_block.haml +2 -0
  40. data/app/views/lady_josephine/blocks/_facebook_post_block.haml +2 -0
  41. data/app/views/lady_josephine/blocks/_heading_block.haml +2 -0
  42. data/app/views/lady_josephine/blocks/_html_block.haml +1 -0
  43. data/app/views/lady_josephine/blocks/_instagram_block.haml +2 -0
  44. data/app/views/lady_josephine/blocks/_list_block.haml +3 -0
  45. data/app/views/lady_josephine/blocks/_quote_block.haml +5 -0
  46. data/app/views/lady_josephine/blocks/_text_block.html.haml +2 -0
  47. data/app/views/lady_josephine/blocks/_video_block.haml +9 -0
  48. data/config/routes.rb +9 -0
  49. data/db/migrate/20160222151500_lady_josephine_image.rb +18 -0
  50. data/lib/generators/lady_josephine_migration/USAGE +9 -0
  51. data/lib/generators/lady_josephine_migration/lady_josephine_migration_generator.rb +17 -0
  52. data/lib/generators/lady_josephine_migration/templates/migration.rb +9 -0
  53. data/lib/lady_josephine.rb +18 -0
  54. data/lib/lady_josephine/engine.rb +18 -0
  55. data/lib/lady_josephine/redcarpet/custom_markdown_formatter.rb +63 -0
  56. data/lib/lady_josephine/renderer/sir_trevor_renderer.rb +16 -0
  57. data/lib/lady_josephine/version.rb +3 -0
  58. data/lib/lady_josephine/whitelist.rb +26 -0
  59. data/lib/tasks/lady_josephine_tasks.rake +4 -0
  60. data/spec/controllers/lady_josephine/editor_controller_spec.rb +58 -0
  61. data/spec/dummy/README.rdoc +28 -0
  62. data/spec/dummy/Rakefile +6 -0
  63. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  64. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  65. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  66. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  67. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  68. data/spec/dummy/bin/bundle +3 -0
  69. data/spec/dummy/bin/rails +4 -0
  70. data/spec/dummy/bin/rake +4 -0
  71. data/spec/dummy/bin/setup +29 -0
  72. data/spec/dummy/config.ru +4 -0
  73. data/spec/dummy/config/application.rb +26 -0
  74. data/spec/dummy/config/boot.rb +5 -0
  75. data/spec/dummy/config/database.yml +25 -0
  76. data/spec/dummy/config/environment.rb +5 -0
  77. data/spec/dummy/config/environments/development.rb +41 -0
  78. data/spec/dummy/config/environments/production.rb +79 -0
  79. data/spec/dummy/config/environments/test.rb +42 -0
  80. data/spec/dummy/config/initializers/assets.rb +11 -0
  81. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  82. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  83. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  84. data/spec/dummy/config/initializers/inflections.rb +16 -0
  85. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  86. data/spec/dummy/config/initializers/session_store.rb +3 -0
  87. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  88. data/spec/dummy/config/locales/en.yml +23 -0
  89. data/spec/dummy/config/routes.rb +4 -0
  90. data/spec/dummy/config/secrets.yml +22 -0
  91. data/spec/dummy/db/development.sqlite3 +0 -0
  92. data/spec/dummy/db/schema.rb +16 -0
  93. data/spec/dummy/db/test.sqlite3 +0 -0
  94. data/spec/dummy/log/bla +0 -0
  95. data/spec/dummy/public/404.html +67 -0
  96. data/spec/dummy/public/422.html +67 -0
  97. data/spec/dummy/public/500.html +66 -0
  98. data/spec/dummy/public/favicon.ico +0 -0
  99. data/spec/spec_helper.rb +17 -0
  100. data/vendor/assets/components/Eventable/README.md +12 -0
  101. data/vendor/assets/components/Eventable/bower.json +10 -0
  102. data/vendor/assets/components/Eventable/component.json +11 -0
  103. data/vendor/assets/components/Eventable/eventable.js +207 -0
  104. data/vendor/assets/components/Eventable/package.json +15 -0
  105. data/vendor/assets/components/jquery-autosize/bower.json +30 -0
  106. data/vendor/assets/components/jquery-autosize/demo.html +36 -0
  107. data/vendor/assets/components/jquery-autosize/jquery.autosize.js +273 -0
  108. data/vendor/assets/components/jquery-autosize/jquery.autosize.min.js +6 -0
  109. data/vendor/assets/components/jquery-autosize/package.json +32 -0
  110. data/vendor/assets/components/jquery-autosize/readme.md +216 -0
  111. data/vendor/assets/components/jquery/AUTHORS.txt +163 -0
  112. data/vendor/assets/components/jquery/CONTRIBUTING.md +216 -0
  113. data/vendor/assets/components/jquery/Gruntfile.js +496 -0
  114. data/vendor/assets/components/jquery/MIT-LICENSE.txt +21 -0
  115. data/vendor/assets/components/jquery/README.md +415 -0
  116. data/vendor/assets/components/jquery/build/release-notes.js +59 -0
  117. data/vendor/assets/components/jquery/build/release.js +246 -0
  118. data/vendor/assets/components/jquery/component.json +13 -0
  119. data/vendor/assets/components/jquery/composer.json +35 -0
  120. data/vendor/assets/components/jquery/jquery-migrate.js +496 -0
  121. data/vendor/assets/components/jquery/jquery-migrate.min.js +3 -0
  122. data/vendor/assets/components/jquery/jquery.js +9597 -0
  123. data/vendor/assets/components/jquery/jquery.min.js +5 -0
  124. data/vendor/assets/components/jquery/jquery.min.map +1 -0
  125. data/vendor/assets/components/jquery/package.json +39 -0
  126. data/vendor/assets/components/jquery/speed/benchmark.js +15 -0
  127. data/vendor/assets/components/jquery/speed/benchmarker.css +65 -0
  128. data/vendor/assets/components/jquery/speed/benchmarker.js +181 -0
  129. data/vendor/assets/components/jquery/speed/closest.html +39 -0
  130. data/vendor/assets/components/jquery/speed/css.html +82 -0
  131. data/vendor/assets/components/jquery/speed/event.html +58 -0
  132. data/vendor/assets/components/jquery/speed/filter.html +183 -0
  133. data/vendor/assets/components/jquery/speed/find.html +179 -0
  134. data/vendor/assets/components/jquery/speed/index.html +72 -0
  135. data/vendor/assets/components/jquery/speed/jquery-basis.js +6238 -0
  136. data/vendor/assets/components/jquery/speed/slice.vs.concat.html +47 -0
  137. data/vendor/assets/components/jquery/src/ajax.js +851 -0
  138. data/vendor/assets/components/jquery/src/ajax/jsonp.js +80 -0
  139. data/vendor/assets/components/jquery/src/ajax/script.js +86 -0
  140. data/vendor/assets/components/jquery/src/ajax/xhr.js +207 -0
  141. data/vendor/assets/components/jquery/src/attributes.js +661 -0
  142. data/vendor/assets/components/jquery/src/callbacks.js +196 -0
  143. data/vendor/assets/components/jquery/src/core.js +949 -0
  144. data/vendor/assets/components/jquery/src/css.js +679 -0
  145. data/vendor/assets/components/jquery/src/data.js +340 -0
  146. data/vendor/assets/components/jquery/src/deferred.js +141 -0
  147. data/vendor/assets/components/jquery/src/deprecated.js +4 -0
  148. data/vendor/assets/components/jquery/src/dimensions.js +41 -0
  149. data/vendor/assets/components/jquery/src/effects.js +730 -0
  150. data/vendor/assets/components/jquery/src/event-alias.js +15 -0
  151. data/vendor/assets/components/jquery/src/event.js +991 -0
  152. data/vendor/assets/components/jquery/src/exports.js +18 -0
  153. data/vendor/assets/components/jquery/src/intro.js +20 -0
  154. data/vendor/assets/components/jquery/src/manipulation.js +796 -0
  155. data/vendor/assets/components/jquery/src/offset.js +169 -0
  156. data/vendor/assets/components/jquery/src/outro.js +2 -0
  157. data/vendor/assets/components/jquery/src/queue.js +147 -0
  158. data/vendor/assets/components/jquery/src/serialize.js +99 -0
  159. data/vendor/assets/components/jquery/src/sizzle-jquery.js +9 -0
  160. data/vendor/assets/components/jquery/src/support.js +241 -0
  161. data/vendor/assets/components/jquery/src/traversing.js +275 -0
  162. data/vendor/assets/components/jquery/test/csp.php +16 -0
  163. data/vendor/assets/components/jquery/test/data/1x1.jpg +0 -0
  164. data/vendor/assets/components/jquery/test/data/ajax/unreleasedXHR.html +25 -0
  165. data/vendor/assets/components/jquery/test/data/atom+xml.php +4 -0
  166. data/vendor/assets/components/jquery/test/data/badcall.js +1 -0
  167. data/vendor/assets/components/jquery/test/data/badjson.js +1 -0
  168. data/vendor/assets/components/jquery/test/data/cleanScript.html +10 -0
  169. data/vendor/assets/components/jquery/test/data/core/cc_on.html +22 -0
  170. data/vendor/assets/components/jquery/test/data/dashboard.xml +11 -0
  171. data/vendor/assets/components/jquery/test/data/dimensions/documentLarge.html +17 -0
  172. data/vendor/assets/components/jquery/test/data/dimensions/documentSmall.html +21 -0
  173. data/vendor/assets/components/jquery/test/data/echoData.php +1 -0
  174. data/vendor/assets/components/jquery/test/data/echoQuery.php +1 -0
  175. data/vendor/assets/components/jquery/test/data/errorWithText.php +5 -0
  176. data/vendor/assets/components/jquery/test/data/etag.php +21 -0
  177. data/vendor/assets/components/jquery/test/data/evalScript.php +1 -0
  178. data/vendor/assets/components/jquery/test/data/event/longLoadScript.php +4 -0
  179. data/vendor/assets/components/jquery/test/data/event/promiseReady.html +17 -0
  180. data/vendor/assets/components/jquery/test/data/event/syncReady.html +23 -0
  181. data/vendor/assets/components/jquery/test/data/headers.php +18 -0
  182. data/vendor/assets/components/jquery/test/data/if_modified_since.php +20 -0
  183. data/vendor/assets/components/jquery/test/data/iframe.html +8 -0
  184. data/vendor/assets/components/jquery/test/data/jquery-1.8.2.ajax_xhr.min.js +2 -0
  185. data/vendor/assets/components/jquery/test/data/json.php +13 -0
  186. data/vendor/assets/components/jquery/test/data/json_obj.js +1 -0
  187. data/vendor/assets/components/jquery/test/data/jsonp.php +14 -0
  188. data/vendor/assets/components/jquery/test/data/manipulation/iframe-denied.html +36 -0
  189. data/vendor/assets/components/jquery/test/data/name.html +1 -0
  190. data/vendor/assets/components/jquery/test/data/name.php +24 -0
  191. data/vendor/assets/components/jquery/test/data/nocontent.php +5 -0
  192. data/vendor/assets/components/jquery/test/data/offset/absolute.html +41 -0
  193. data/vendor/assets/components/jquery/test/data/offset/body.html +26 -0
  194. data/vendor/assets/components/jquery/test/data/offset/fixed.html +34 -0
  195. data/vendor/assets/components/jquery/test/data/offset/relative.html +31 -0
  196. data/vendor/assets/components/jquery/test/data/offset/scroll.html +39 -0
  197. data/vendor/assets/components/jquery/test/data/offset/static.html +31 -0
  198. data/vendor/assets/components/jquery/test/data/offset/table.html +43 -0
  199. data/vendor/assets/components/jquery/test/data/params_html.php +12 -0
  200. data/vendor/assets/components/jquery/test/data/readywaitasset.js +1 -0
  201. data/vendor/assets/components/jquery/test/data/readywaitloader.js +25 -0
  202. data/vendor/assets/components/jquery/test/data/script.php +11 -0
  203. data/vendor/assets/components/jquery/test/data/selector/html5_selector.html +114 -0
  204. data/vendor/assets/components/jquery/test/data/selector/sizzle_cache.html +21 -0
  205. data/vendor/assets/components/jquery/test/data/statusText.php +5 -0
  206. data/vendor/assets/components/jquery/test/data/support/bodyBackground.html +28 -0
  207. data/vendor/assets/components/jquery/test/data/support/shrinkWrapBlocks.html +23 -0
  208. data/vendor/assets/components/jquery/test/data/support/testElementCrash.html +17 -0
  209. data/vendor/assets/components/jquery/test/data/test.html +7 -0
  210. data/vendor/assets/components/jquery/test/data/test.js +3 -0
  211. data/vendor/assets/components/jquery/test/data/test.php +7 -0
  212. data/vendor/assets/components/jquery/test/data/test2.html +5 -0
  213. data/vendor/assets/components/jquery/test/data/test3.html +3 -0
  214. data/vendor/assets/components/jquery/test/data/testinit.js +269 -0
  215. data/vendor/assets/components/jquery/test/data/testrunner.js +368 -0
  216. data/vendor/assets/components/jquery/test/data/testsuite.css +155 -0
  217. data/vendor/assets/components/jquery/test/data/text.php +12 -0
  218. data/vendor/assets/components/jquery/test/data/ua.txt +272 -0
  219. data/vendor/assets/components/jquery/test/data/with_fries.xml +25 -0
  220. data/vendor/assets/components/jquery/test/data/with_fries_over_jsonp.php +7 -0
  221. data/vendor/assets/components/jquery/test/delegatetest.html +228 -0
  222. data/vendor/assets/components/jquery/test/hovertest.html +158 -0
  223. data/vendor/assets/components/jquery/test/index.html +330 -0
  224. data/vendor/assets/components/jquery/test/localfile.html +75 -0
  225. data/vendor/assets/components/jquery/test/networkerror.html +84 -0
  226. data/vendor/assets/components/jquery/test/polluted.php +110 -0
  227. data/vendor/assets/components/jquery/test/readywait.html +70 -0
  228. data/vendor/assets/components/jquery/test/unit/ajax.js +1971 -0
  229. data/vendor/assets/components/jquery/test/unit/attributes.js +1332 -0
  230. data/vendor/assets/components/jquery/test/unit/callbacks.js +326 -0
  231. data/vendor/assets/components/jquery/test/unit/core.js +1332 -0
  232. data/vendor/assets/components/jquery/test/unit/css.js +1036 -0
  233. data/vendor/assets/components/jquery/test/unit/data.js +636 -0
  234. data/vendor/assets/components/jquery/test/unit/deferred.js +440 -0
  235. data/vendor/assets/components/jquery/test/unit/deprecated.js +1 -0
  236. data/vendor/assets/components/jquery/test/unit/dimensions.js +461 -0
  237. data/vendor/assets/components/jquery/test/unit/effects.js +2050 -0
  238. data/vendor/assets/components/jquery/test/unit/event.js +2690 -0
  239. data/vendor/assets/components/jquery/test/unit/exports.js +7 -0
  240. data/vendor/assets/components/jquery/test/unit/manipulation.js +2242 -0
  241. data/vendor/assets/components/jquery/test/unit/offset.js +549 -0
  242. data/vendor/assets/components/jquery/test/unit/queue.js +316 -0
  243. data/vendor/assets/components/jquery/test/unit/selector.js +185 -0
  244. data/vendor/assets/components/jquery/test/unit/serialize.js +146 -0
  245. data/vendor/assets/components/jquery/test/unit/support.js +384 -0
  246. data/vendor/assets/components/jquery/test/unit/traversing.js +667 -0
  247. data/vendor/assets/components/jquery/test/xhtml.php +5 -0
  248. data/vendor/assets/components/sir-trevor-js/CHANGELOG.md +44 -0
  249. data/vendor/assets/components/sir-trevor-js/Gemfile +3 -0
  250. data/vendor/assets/components/sir-trevor-js/Gemfile.lock +10 -0
  251. data/vendor/assets/components/sir-trevor-js/Gruntfile.js +109 -0
  252. data/vendor/assets/components/sir-trevor-js/MIT-LICENCE +20 -0
  253. data/vendor/assets/components/sir-trevor-js/Readme.md +84 -0
  254. data/vendor/assets/components/sir-trevor-js/bower.json +21 -0
  255. data/vendor/assets/components/sir-trevor-js/component.json +42 -0
  256. data/vendor/assets/components/sir-trevor-js/contributing.md +74 -0
  257. data/vendor/assets/components/sir-trevor-js/examples-component/component.json +14 -0
  258. data/vendor/assets/components/sir-trevor-js/examples-component/index.html +33 -0
  259. data/vendor/assets/components/sir-trevor-js/examples-component/index.js +29 -0
  260. data/vendor/assets/components/sir-trevor-js/examples-component/javascript/example_block.js +203 -0
  261. data/vendor/assets/components/sir-trevor-js/examples-component/javascript/limit_chars.js +46 -0
  262. data/vendor/assets/components/sir-trevor-js/examples-component/sir-trevor.gif +0 -0
  263. data/vendor/assets/components/sir-trevor-js/locales/cn.js +51 -0
  264. data/vendor/assets/components/sir-trevor-js/locales/de.js +51 -0
  265. data/vendor/assets/components/sir-trevor-js/locales/es.js +51 -0
  266. data/vendor/assets/components/sir-trevor-js/locales/fi.js +51 -0
  267. data/vendor/assets/components/sir-trevor-js/locales/fr.js +51 -0
  268. data/vendor/assets/components/sir-trevor-js/locales/pt.js +52 -0
  269. data/vendor/assets/components/sir-trevor-js/package.json +23 -0
  270. data/vendor/assets/components/sir-trevor-js/sir-trevor-icons.css +6 -0
  271. data/vendor/assets/components/sir-trevor-js/sir-trevor.css +393 -0
  272. data/vendor/assets/components/sir-trevor-js/sir-trevor.css.map +7 -0
  273. data/vendor/assets/components/sir-trevor-js/sir-trevor.js +5481 -0
  274. data/vendor/assets/components/sir-trevor-js/sir-trevor.min.js +13 -0
  275. data/vendor/assets/components/underscore/CNAME +1 -0
  276. data/vendor/assets/components/underscore/CONTRIBUTING.md +9 -0
  277. data/vendor/assets/components/underscore/LICENSE +22 -0
  278. data/vendor/assets/components/underscore/README.md +19 -0
  279. data/vendor/assets/components/underscore/Rakefile +10 -0
  280. data/vendor/assets/components/underscore/docs/docco.css +192 -0
  281. data/vendor/assets/components/underscore/docs/favicon.ico +0 -0
  282. data/vendor/assets/components/underscore/docs/images/background.png +0 -0
  283. data/vendor/assets/components/underscore/docs/images/underscore.png +0 -0
  284. data/vendor/assets/components/underscore/docs/underscore.html +823 -0
  285. data/vendor/assets/components/underscore/favicon.ico +0 -0
  286. data/vendor/assets/components/underscore/index.html +2467 -0
  287. data/vendor/assets/components/underscore/index.js +1 -0
  288. data/vendor/assets/components/underscore/package.json +16 -0
  289. data/vendor/assets/components/underscore/test/arrays.js +200 -0
  290. data/vendor/assets/components/underscore/test/chaining.js +59 -0
  291. data/vendor/assets/components/underscore/test/collections.js +453 -0
  292. data/vendor/assets/components/underscore/test/functions.js +265 -0
  293. data/vendor/assets/components/underscore/test/index.html +44 -0
  294. data/vendor/assets/components/underscore/test/objects.js +570 -0
  295. data/vendor/assets/components/underscore/test/speed.js +75 -0
  296. data/vendor/assets/components/underscore/test/utility.js +266 -0
  297. data/vendor/assets/components/underscore/test/vendor/jquery.js +9404 -0
  298. data/vendor/assets/components/underscore/test/vendor/jslitmus.js +670 -0
  299. data/vendor/assets/components/underscore/test/vendor/qunit.css +235 -0
  300. data/vendor/assets/components/underscore/test/vendor/qunit.js +1977 -0
  301. data/vendor/assets/components/underscore/test/vendor/runner.js +98 -0
  302. data/vendor/assets/components/underscore/underscore-min.js +1 -0
  303. data/vendor/assets/components/underscore/underscore.js +1226 -0
  304. metadata +473 -0
@@ -0,0 +1,636 @@
1
+ module("data", { teardown: moduleTeardown });
2
+
3
+ test("expando", function(){
4
+ expect(1);
5
+
6
+ equal(jQuery.expando !== undefined, true, "jQuery is exposing the expando");
7
+ });
8
+
9
+ function dataTests (elem) {
10
+ var oldCacheLength, dataObj, internalDataObj, expected, actual;
11
+
12
+ equal( jQuery.data(elem, "foo"), undefined, "No data exists initially" );
13
+ strictEqual( jQuery.hasData(elem), false, "jQuery.hasData agrees no data exists initially" );
14
+
15
+ dataObj = jQuery.data(elem);
16
+ equal( typeof dataObj, "object", "Calling data with no args gives us a data object reference" );
17
+ strictEqual( jQuery.data(elem), dataObj, "Calling jQuery.data returns the same data object when called multiple times" );
18
+
19
+ strictEqual( jQuery.hasData(elem), false, "jQuery.hasData agrees no data exists even when an empty data obj exists" );
20
+
21
+ dataObj["foo"] = "bar";
22
+ equal( jQuery.data(elem, "foo"), "bar", "Data is readable by jQuery.data when set directly on a returned data object" );
23
+
24
+ strictEqual( jQuery.hasData(elem), true, "jQuery.hasData agrees data exists when data exists" );
25
+
26
+ jQuery.data(elem, "foo", "baz");
27
+ equal( jQuery.data(elem, "foo"), "baz", "Data can be changed by jQuery.data" );
28
+ equal( dataObj["foo"], "baz", "Changes made through jQuery.data propagate to referenced data object" );
29
+
30
+ jQuery.data(elem, "foo", undefined);
31
+ equal( jQuery.data(elem, "foo"), "baz", "Data is not unset by passing undefined to jQuery.data" );
32
+
33
+ jQuery.data(elem, "foo", null);
34
+ strictEqual( jQuery.data(elem, "foo"), null, "Setting null using jQuery.data works OK" );
35
+
36
+ jQuery.data(elem, "foo", "foo1");
37
+
38
+ jQuery.data(elem, { "bar" : "baz", "boom" : "bloz" });
39
+ strictEqual( jQuery.data(elem, "foo"), "foo1", "Passing an object extends the data object instead of replacing it" );
40
+ equal( jQuery.data(elem, "boom"), "bloz", "Extending the data object works" );
41
+
42
+ jQuery._data(elem, "foo", "foo2", true);
43
+ equal( jQuery._data(elem, "foo"), "foo2", "Setting internal data works" );
44
+ equal( jQuery.data(elem, "foo"), "foo1", "Setting internal data does not override user data" );
45
+
46
+ internalDataObj = jQuery._data( elem );
47
+ ok( internalDataObj, "Internal data object exists" );
48
+ notStrictEqual( dataObj, internalDataObj, "Internal data object is not the same as user data object" );
49
+
50
+ strictEqual( elem.boom, undefined, "Data is never stored directly on the object" );
51
+
52
+ jQuery.removeData(elem, "foo");
53
+ strictEqual( jQuery.data(elem, "foo"), undefined, "jQuery.removeData removes single properties" );
54
+
55
+ jQuery.removeData(elem);
56
+ strictEqual( jQuery._data(elem), internalDataObj, "jQuery.removeData does not remove internal data if it exists" );
57
+
58
+ jQuery.data(elem, "foo", "foo1");
59
+ jQuery._data(elem, "foo", "foo2");
60
+
61
+ equal( jQuery.data(elem, "foo"), "foo1", "(sanity check) Ensure data is set in user data object" );
62
+ equal( jQuery._data(elem, "foo"), "foo2", "(sanity check) Ensure data is set in internal data object" );
63
+
64
+ strictEqual( jQuery._data(elem, jQuery.expando), undefined, "Removing the last item in internal data destroys the internal data object" );
65
+
66
+ jQuery._data(elem, "foo", "foo2");
67
+ equal( jQuery._data(elem, "foo"), "foo2", "(sanity check) Ensure data is set in internal data object" );
68
+
69
+ jQuery.removeData(elem, "foo");
70
+ equal( jQuery._data(elem, "foo"), "foo2", "(sanity check) jQuery.removeData for user data does not remove internal data" );
71
+ }
72
+
73
+ test("jQuery.data(div)", 25, function() {
74
+ var div = document.createElement("div");
75
+
76
+ dataTests(div);
77
+
78
+ // We stored one key in the private data
79
+ // assert that nothing else was put in there, and that that
80
+ // one stayed there.
81
+ QUnit.expectJqData(div, "foo");
82
+ });
83
+
84
+ test("jQuery.data({})", 25, function() {
85
+ dataTests({});
86
+ });
87
+
88
+ test("jQuery.data(window)", 25, function() {
89
+ // remove bound handlers from window object to stop potential false positives caused by fix for #5280 in
90
+ // transports/xhr.js
91
+ jQuery(window).unbind("unload");
92
+
93
+ dataTests(window);
94
+ });
95
+
96
+ test("jQuery.data(document)", 25, function() {
97
+ dataTests(document);
98
+
99
+ QUnit.expectJqData(document, "foo");
100
+ });
101
+
102
+ test("Expando cleanup", 4, function() {
103
+ var expected, actual,
104
+ div = document.createElement("div");
105
+
106
+ function assertExpandoAbsent(message) {
107
+ if (jQuery.support.deleteExpando) {
108
+ expected = false;
109
+ actual = jQuery.expando in div;
110
+ } else {
111
+ expected = null;
112
+ actual = div[ jQuery.expando ];
113
+ }
114
+ equal( actual, expected, message );
115
+ }
116
+
117
+ assertExpandoAbsent("There is no expando on new elements");
118
+
119
+ jQuery.data(div, "foo", 100);
120
+ jQuery.data(div, "bar", 200);
121
+
122
+ ok(jQuery.expando in div, "There is an expando on the element after using $.data()");
123
+
124
+ jQuery.removeData(div, "foo");
125
+
126
+ ok(jQuery.expando in div, "There is still an expando on the element after removing (some) of the data");
127
+
128
+ jQuery.removeData(div, "bar");
129
+
130
+ assertExpandoAbsent("Removing the last item in the data store deletes the expando");
131
+
132
+ // Clean up unattached element
133
+ jQuery(div).remove();
134
+ });
135
+
136
+ test("Data is not being set on comment and text nodes", function() {
137
+ expect(2);
138
+
139
+ ok( !jQuery.hasData( jQuery("<!-- comment -->").data("foo", 0) ) );
140
+ ok( !jQuery.hasData( jQuery("<span>text</span>").contents().data("foo", 0) ) );
141
+
142
+ });
143
+
144
+ test("jQuery.acceptData", function() {
145
+ expect(9);
146
+
147
+ ok( jQuery.acceptData( document ), "document" );
148
+ ok( jQuery.acceptData( document.documentElement ), "documentElement" );
149
+ ok( jQuery.acceptData( {} ), "object" );
150
+ ok( !jQuery.acceptData( document.createElement("embed") ), "embed" );
151
+ ok( !jQuery.acceptData( document.createElement("applet") ), "applet" );
152
+
153
+ var flash = document.createElement("object");
154
+ flash.setAttribute("classid", "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000");
155
+ ok( jQuery.acceptData( flash ), "flash" );
156
+
157
+ var applet = document.createElement("object");
158
+ applet.setAttribute("classid", "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93");
159
+ ok( !jQuery.acceptData( applet ), "applet" );
160
+
161
+ ok( !jQuery.acceptData( document.createComment("") ), "comment" );
162
+ ok( !jQuery.acceptData( document.createTextNode("") ), "text" );
163
+ });
164
+
165
+ test(".data()", function() {
166
+ expect(5);
167
+
168
+ var div = jQuery("#foo");
169
+ strictEqual( div.data("foo"), undefined, "Make sure that missing result is undefined" );
170
+ div.data("test", "success");
171
+
172
+ var dataObj = div.data();
173
+
174
+ deepEqual( dataObj, {test: "success"}, "data() returns entire data object with expected properties" );
175
+ strictEqual( div.data("foo"), undefined, "Make sure that missing result is still undefined" );
176
+
177
+ var nodiv = jQuery("#unfound");
178
+ equal( nodiv.data(), null, "data() on empty set returns null" );
179
+
180
+ var obj = { foo: "bar" };
181
+ jQuery(obj).data("foo", "baz");
182
+
183
+ dataObj = jQuery.extend(true, {}, jQuery(obj).data());
184
+
185
+ deepEqual( dataObj, { "foo": "baz" }, "Retrieve data object from a wrapped JS object (#7524)" );
186
+ });
187
+
188
+ var testDataTypes = function( $obj ) {
189
+ jQuery.each({
190
+ "null": null,
191
+ "true": true,
192
+ "false": false,
193
+ "zero": 0,
194
+ "one": 1,
195
+ "empty string": "",
196
+ "empty array": [],
197
+ "array": [1],
198
+ "empty object": {},
199
+ "object": { foo: "bar" },
200
+ "date": new Date(),
201
+ "regex": /test/,
202
+ "function": function() {}
203
+ }, function( type, value ) {
204
+ strictEqual( $obj.data( "test", value ).data("test"), value, "Data set to " + type );
205
+ });
206
+ };
207
+
208
+ test("jQuery(Element).data(String, Object).data(String)", function() {
209
+ expect( 18 );
210
+ var parent = jQuery("<div><div></div></div>"),
211
+ div = parent.children();
212
+
213
+ strictEqual( div.data("test"), undefined, "No data exists initially" );
214
+ strictEqual( div.data("test", "success").data("test"), "success", "Data added" );
215
+ strictEqual( div.data("test", "overwritten").data("test"), "overwritten", "Data overwritten" );
216
+ strictEqual( div.data("test", undefined).data("test"), "overwritten", ".data(key,undefined) does nothing but is chainable (#5571)");
217
+ strictEqual( div.data("notexist"), undefined, "No data exists for unset key" );
218
+ testDataTypes( div );
219
+
220
+ parent.remove();
221
+ });
222
+
223
+ test("jQuery(plain Object).data(String, Object).data(String)", function() {
224
+ expect( 16 );
225
+
226
+ // #3748
227
+ var $obj = jQuery({ exists: true });
228
+ strictEqual( $obj.data("nothing"), undefined, "Non-existent data returns undefined");
229
+ strictEqual( $obj.data("exists"), undefined, "Object properties are not returned as data" );
230
+ testDataTypes( $obj );
231
+
232
+ // Clean up
233
+ $obj.removeData();
234
+ deepEqual( $obj[0], { exists: true }, "removeData does not clear the object" );
235
+ });
236
+
237
+ test("data-* attributes", function() {
238
+ expect(40);
239
+ var div = jQuery("<div>"),
240
+ child = jQuery("<div data-myobj='old data' data-ignored=\"DOM\" data-other='test'></div>"),
241
+ dummy = jQuery("<div data-myobj='old data' data-ignored=\"DOM\" data-other='test'></div>");
242
+
243
+ equal( div.data("attr"), undefined, "Check for non-existing data-attr attribute" );
244
+
245
+ div.attr("data-attr", "exists");
246
+ equal( div.data("attr"), "exists", "Check for existing data-attr attribute" );
247
+
248
+ div.attr("data-attr", "exists2");
249
+ equal( div.data("attr"), "exists", "Check that updates to data- don't update .data()" );
250
+
251
+ div.data("attr", "internal").attr("data-attr", "external");
252
+ equal( div.data("attr"), "internal", "Check for .data('attr') precedence (internal > external data-* attribute)" );
253
+
254
+ div.remove();
255
+
256
+ child.appendTo("#qunit-fixture");
257
+ equal( child.data("myobj"), "old data", "Value accessed from data-* attribute");
258
+
259
+ child.data("myobj", "replaced");
260
+ equal( child.data("myobj"), "replaced", "Original data overwritten");
261
+
262
+ child.data("ignored", "cache");
263
+ equal( child.data("ignored"), "cache", "Cached data used before DOM data-* fallback");
264
+
265
+ var prop,
266
+ obj = child.data(),
267
+ obj2 = dummy.data(),
268
+ check = [ "myobj", "ignored", "other" ],
269
+ num = 0,
270
+ num2 = 0;
271
+
272
+ dummy.remove();
273
+
274
+ for ( var i = 0, l = check.length; i < l; i++ ) {
275
+ ok( obj[ check[i] ], "Make sure data- property exists when calling data-." );
276
+ ok( obj2[ check[i] ], "Make sure data- property exists when calling data-." );
277
+ }
278
+
279
+ for ( prop in obj ) {
280
+ num++;
281
+ }
282
+
283
+ equal( num, check.length, "Make sure that the right number of properties came through." );
284
+
285
+ for ( prop in obj2 ) {
286
+ num2++;
287
+ }
288
+
289
+ equal( num2, check.length, "Make sure that the right number of properties came through." );
290
+
291
+ child.attr("data-other", "newvalue");
292
+
293
+ equal( child.data("other"), "test", "Make sure value was pulled in properly from a .data()." );
294
+
295
+ child
296
+ .attr("data-true", "true")
297
+ .attr("data-false", "false")
298
+ .attr("data-five", "5")
299
+ .attr("data-point", "5.5")
300
+ .attr("data-pointe", "5.5E3")
301
+ .attr("data-grande", "5.574E9")
302
+ .attr("data-hexadecimal", "0x42")
303
+ .attr("data-pointbad", "5..5")
304
+ .attr("data-pointbad2", "-.")
305
+ .attr("data-bigassnum", "123456789123456789123456789")
306
+ .attr("data-badjson", "{123}")
307
+ .attr("data-badjson2", "[abc]")
308
+ .attr("data-empty", "")
309
+ .attr("data-space", " ")
310
+ .attr("data-null", "null")
311
+ .attr("data-string", "test");
312
+
313
+ strictEqual( child.data("true"), true, "Primitive true read from attribute");
314
+ strictEqual( child.data("false"), false, "Primitive false read from attribute");
315
+ strictEqual( child.data("five"), 5, "Primitive number read from attribute");
316
+ strictEqual( child.data("point"), 5.5, "Primitive number read from attribute");
317
+ strictEqual( child.data("pointe"), "5.5E3", "Floating point exponential number read from attribute");
318
+ strictEqual( child.data("grande"), "5.574E9", "Big exponential number read from attribute");
319
+ strictEqual( child.data("hexadecimal"), "0x42", "Hexadecimal number read from attribute");
320
+ strictEqual( child.data("pointbad"), "5..5", "Bad number read from attribute");
321
+ strictEqual( child.data("pointbad2"), "-.", "Bad number read from attribute");
322
+ strictEqual( child.data("bigassnum"), "123456789123456789123456789", "Bad bigass number read from attribute");
323
+ strictEqual( child.data("badjson"), "{123}", "Bad number read from attribute");
324
+ strictEqual( child.data("badjson2"), "[abc]", "Bad number read from attribute");
325
+ strictEqual( child.data("empty"), "", "Empty string read from attribute");
326
+ strictEqual( child.data("space"), " ", "Empty string read from attribute");
327
+ strictEqual( child.data("null"), null, "Primitive null read from attribute");
328
+ strictEqual( child.data("string"), "test", "Typical string read from attribute");
329
+
330
+ child.remove();
331
+
332
+ // tests from metadata plugin
333
+ function testData(index, elem) {
334
+ switch (index) {
335
+ case 0:
336
+ equal(jQuery(elem).data("foo"), "bar", "Check foo property");
337
+ equal(jQuery(elem).data("bar"), "baz", "Check baz property");
338
+ break;
339
+ case 1:
340
+ equal(jQuery(elem).data("test"), "bar", "Check test property");
341
+ equal(jQuery(elem).data("bar"), "baz", "Check bar property");
342
+ break;
343
+ case 2:
344
+ equal(jQuery(elem).data("zoooo"), "bar", "Check zoooo property");
345
+ deepEqual(jQuery(elem).data("bar"), {"test":"baz"}, "Check bar property");
346
+ break;
347
+ case 3:
348
+ equal(jQuery(elem).data("number"), true, "Check number property");
349
+ deepEqual(jQuery(elem).data("stuff"), [2,8], "Check stuff property");
350
+ break;
351
+ default:
352
+ ok(false, ["Assertion failed on index ", index, ", with data"].join(""));
353
+ }
354
+ }
355
+
356
+ var metadata = "<ol><li class='test test2' data-foo='bar' data-bar='baz' data-arr='[1,2]'>Some stuff</li><li class='test test2' data-test='bar' data-bar='baz'>Some stuff</li><li class='test test2' data-zoooo='bar' data-bar='{\"test\":\"baz\"}'>Some stuff</li><li class='test test2' data-number=true data-stuff='[2,8]'>Some stuff</li></ol>",
357
+ elem = jQuery(metadata).appendTo("#qunit-fixture");
358
+
359
+ elem.find("li").each(testData);
360
+ elem.remove();
361
+ });
362
+
363
+ test(".data(Object)", function() {
364
+ expect(4);
365
+
366
+ var div = jQuery("<div/>");
367
+
368
+ div.data({ "test": "in", "test2": "in2" });
369
+ equal( div.data("test"), "in", "Verify setting an object in data" );
370
+ equal( div.data("test2"), "in2", "Verify setting an object in data" );
371
+
372
+ var obj = {test:"unset"},
373
+ jqobj = jQuery(obj);
374
+ jqobj.data("test", "unset");
375
+ jqobj.data({ "test": "in", "test2": "in2" });
376
+ equal( jQuery.data(obj)["test"], "in", "Verify setting an object on an object extends the data object" );
377
+ equal( obj["test2"], undefined, "Verify setting an object on an object does not extend the object" );
378
+
379
+ // manually clean up detached elements
380
+ div.remove();
381
+ });
382
+
383
+ test("jQuery.removeData", function() {
384
+ expect(10);
385
+ var div = jQuery("#foo")[0];
386
+ jQuery.data(div, "test", "testing");
387
+ jQuery.removeData(div, "test");
388
+ equal( jQuery.data(div, "test"), undefined, "Check removal of data" );
389
+
390
+ jQuery.data(div, "test2", "testing");
391
+ jQuery.removeData( div );
392
+ ok( !jQuery.data(div, "test2"), "Make sure that the data property no longer exists." );
393
+ ok( !div[ jQuery.expando ], "Make sure the expando no longer exists, as well." );
394
+
395
+ jQuery.data(div, {
396
+ test3: "testing",
397
+ test4: "testing"
398
+ });
399
+ jQuery.removeData( div, "test3 test4" );
400
+ ok( !jQuery.data(div, "test3") || jQuery.data(div, "test4"), "Multiple delete with spaces." );
401
+
402
+ jQuery.data(div, {
403
+ test3: "testing",
404
+ test4: "testing"
405
+ });
406
+ jQuery.removeData( div, [ "test3", "test4" ] );
407
+ ok( !jQuery.data(div, "test3") || jQuery.data(div, "test4"), "Multiple delete by array." );
408
+
409
+ jQuery.data(div, {
410
+ "test3 test4": "testing",
411
+ "test3": "testing"
412
+ });
413
+ jQuery.removeData( div, "test3 test4" );
414
+ ok( !jQuery.data(div, "test3 test4"), "Multiple delete with spaces deleted key with exact name" );
415
+ ok( jQuery.data(div, "test3"), "Left the partial matched key alone" );
416
+
417
+ var obj = {};
418
+ jQuery.data(obj, "test", "testing");
419
+ equal( jQuery(obj).data("test"), "testing", "verify data on plain object");
420
+ jQuery.removeData(obj, "test");
421
+ equal( jQuery.data(obj, "test"), undefined, "Check removal of data on plain object" );
422
+
423
+ jQuery.data( window, "BAD", true );
424
+ jQuery.removeData( window, "BAD" );
425
+ ok( !jQuery.data( window, "BAD" ), "Make sure that the value was not still set." );
426
+ });
427
+
428
+ test(".removeData()", function() {
429
+ expect(6);
430
+ var div = jQuery("#foo");
431
+ div.data("test", "testing");
432
+ div.removeData("test");
433
+ equal( div.data("test"), undefined, "Check removal of data" );
434
+
435
+ div.data("test", "testing");
436
+ div.data("test.foo", "testing2");
437
+ div.removeData("test.bar");
438
+ equal( div.data("test.foo"), "testing2", "Make sure data is intact" );
439
+ equal( div.data("test"), "testing", "Make sure data is intact" );
440
+
441
+ div.removeData("test");
442
+ equal( div.data("test.foo"), "testing2", "Make sure data is intact" );
443
+ equal( div.data("test"), undefined, "Make sure data is intact" );
444
+
445
+ div.removeData("test.foo");
446
+ equal( div.data("test.foo"), undefined, "Make sure data is intact" );
447
+ });
448
+
449
+ if (window.JSON && window.JSON.stringify) {
450
+ test("JSON serialization (#8108)", function () {
451
+ expect(1);
452
+
453
+ var obj = { "foo": "bar" };
454
+ jQuery.data(obj, "hidden", true);
455
+
456
+ equal( JSON.stringify(obj), "{\"foo\":\"bar\"}", "Expando is hidden from JSON.stringify" );
457
+ });
458
+ }
459
+
460
+ test("jQuery.data should follow html5 specification regarding camel casing", function() {
461
+ expect(10);
462
+
463
+ var div = jQuery("<div id='myObject' data-w-t-f='ftw' data-big-a-little-a='bouncing-b' data-foo='a' data-foo-bar='b' data-foo-bar-baz='c'></div>")
464
+ .prependTo("body");
465
+
466
+ equal( div.data()["wTF"], "ftw", "Verify single letter data-* key" );
467
+ equal( div.data()["bigALittleA"], "bouncing-b", "Verify single letter mixed data-* key" );
468
+
469
+ equal( div.data()["foo"], "a", "Verify single word data-* key" );
470
+ equal( div.data()["fooBar"], "b", "Verify multiple word data-* key" );
471
+ equal( div.data()["fooBarBaz"], "c", "Verify multiple word data-* key" );
472
+
473
+ equal( div.data("foo"), "a", "Verify single word data-* key" );
474
+ equal( div.data("fooBar"), "b", "Verify multiple word data-* key" );
475
+ equal( div.data("fooBarBaz"), "c", "Verify multiple word data-* key" );
476
+
477
+ div.data("foo-bar", "d");
478
+
479
+ equal( div.data("fooBar"), "d", "Verify updated data-* key" );
480
+ equal( div.data("foo-bar"), "d", "Verify updated data-* key" );
481
+
482
+ div.remove();
483
+ });
484
+
485
+ test("jQuery.data should not miss data with preset hyphenated property names", function() {
486
+
487
+ expect(2);
488
+
489
+ var div = jQuery("<div/>", { id: "hyphened" }).appendTo("#qunit-fixture"),
490
+ test = {
491
+ "camelBar": "camelBar",
492
+ "hyphen-foo": "hyphen-foo"
493
+ };
494
+
495
+ div.data( test );
496
+
497
+ jQuery.each( test , function(i, k) {
498
+ equal( div.data(k), k, "data with property '"+k+"' was correctly found");
499
+ });
500
+ });
501
+
502
+ test("jQuery.data supports interoperable hyphenated/camelCase get/set of properties with arbitrary non-null|NaN|undefined values", function() {
503
+
504
+ var div = jQuery("<div/>", { id: "hyphened" }).appendTo("#qunit-fixture"),
505
+ datas = {
506
+ "non-empty": "a string",
507
+ "empty-string": "",
508
+ "one-value": 1,
509
+ "zero-value": 0,
510
+ "an-array": [],
511
+ "an-object": {},
512
+ "bool-true": true,
513
+ "bool-false": false,
514
+ // JSHint enforces double quotes,
515
+ // but JSON strings need double quotes to parse
516
+ // so we need escaped double quotes here
517
+ "some-json": "{ \"foo\": \"bar\" }",
518
+ "num-1-middle": true,
519
+ "num-end-2": true,
520
+ "2-num-start": true
521
+ };
522
+
523
+ expect( 24 );
524
+
525
+ jQuery.each( datas, function( key, val ) {
526
+ div.data( key, val );
527
+
528
+ deepEqual( div.data( key ), val, "get: " + key );
529
+ deepEqual( div.data( jQuery.camelCase( key ) ), val, "get: " + jQuery.camelCase( key ) );
530
+ });
531
+ });
532
+
533
+ test("jQuery.data supports interoperable removal of hyphenated/camelCase properties", function() {
534
+ var div = jQuery("<div/>", { id: "hyphened" }).appendTo("#qunit-fixture"),
535
+ datas = {
536
+ "non-empty": "a string",
537
+ "empty-string": "",
538
+ "one-value": 1,
539
+ "zero-value": 0,
540
+ "an-array": [],
541
+ "an-object": {},
542
+ "bool-true": true,
543
+ "bool-false": false,
544
+ // JSHint enforces double quotes,
545
+ // but JSON strings need double quotes to parse
546
+ // so we need escaped double quotes here
547
+ "some-json": "{ \"foo\": \"bar\" }"
548
+ };
549
+
550
+ expect( 27 );
551
+
552
+ jQuery.each( datas, function( key, val ) {
553
+ div.data( key, val );
554
+
555
+ deepEqual( div.data( key ), val, "get: " + key );
556
+ deepEqual( div.data( jQuery.camelCase( key ) ), val, "get: " + jQuery.camelCase( key ) );
557
+
558
+ div.removeData( key );
559
+
560
+ equal( div.data( key ), undefined, "get: " + key );
561
+
562
+ });
563
+ });
564
+
565
+ test( "jQuery.fn.removeData supports removal of hyphenated properties via array (#12786)", function( assert ) {
566
+ expect( 4 );
567
+
568
+ var div, plain, compare;
569
+
570
+ div = jQuery("<div>").appendTo("#qunit-fixture");
571
+ plain = jQuery({});
572
+
573
+ // When data is batch assigned (via plain object), the properties
574
+ // are not camel cased as they are with (property, value) calls
575
+ compare = {
576
+ // From batch assignment .data({ "a-a": 1 })
577
+ "a-a": 1,
578
+ // From property, value assignment .data( "b-b", 1 )
579
+ "bB": 1
580
+ };
581
+
582
+ // Mixed assignment
583
+ div.data({ "a-a": 1 }).data( "b-b", 1 );
584
+ plain.data({ "a-a": 1 }).data( "b-b", 1 );
585
+
586
+ deepEqual( div.data(), compare, "Data appears as expected. (div)" );
587
+ deepEqual( plain.data(), compare, "Data appears as expected. (plain)" );
588
+
589
+ div.removeData([ "a-a", "b-b" ]);
590
+ plain.removeData([ "a-a", "b-b" ]);
591
+
592
+ // NOTE: Timo's proposal for "propEqual" (or similar) would be nice here
593
+ deepEqual( div.data(), {}, "Data is empty. (div)" );
594
+ deepEqual( plain.data(), {}, "Data is empty. (plain)" );
595
+ });
596
+
597
+ // Test originally by Moschel
598
+ test("Triggering the removeData should not throw exceptions. (#10080)", function() {
599
+ expect(1);
600
+ stop();
601
+ var frame = jQuery("#loadediframe");
602
+ jQuery(frame[0].contentWindow).bind("unload", function() {
603
+ ok(true, "called unload");
604
+ start();
605
+ });
606
+ // change the url to trigger unload
607
+ frame.attr("src", "data/iframe.html?param=true");
608
+ });
609
+
610
+ test( "Only check element attributes once when calling .data() - #8909", function() {
611
+ expect( 2 );
612
+ var testing = {
613
+ "test": "testing",
614
+ "test2": "testing"
615
+ },
616
+ element = jQuery( "<div data-test='testing'>" ),
617
+ node = element[ 0 ];
618
+
619
+ // set an attribute using attr to ensure it
620
+ node.setAttribute( "data-test2", "testing" );
621
+ deepEqual( element.data(), testing, "Sanity Check" );
622
+
623
+ node.setAttribute( "data-test3", "testing" );
624
+ deepEqual( element.data(), testing, "The data didn't change even though the data-* attrs did" );
625
+
626
+ // clean up data cache
627
+ element.remove();
628
+ });
629
+
630
+ test( "JSON data- attributes can have newlines", function() {
631
+ expect(1);
632
+
633
+ var x = jQuery("<div data-some='{\n\"foo\":\n\t\"bar\"\n}'></div>");
634
+ equal( x.data("some").foo, "bar", "got a JSON data- attribute with spaces" );
635
+ x.remove();
636
+ });