praxis 0.16.1 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +0 -1
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +2 -1
  5. data/CHANGELOG.md +41 -0
  6. data/CONTRIBUTING.md +3 -0
  7. data/lib/api_browser/Gruntfile.js +20 -4
  8. data/lib/api_browser/app/bower_components/angular-mocks/.bower.json +6 -6
  9. data/lib/api_browser/app/bower_components/angular-mocks/README.md +11 -5
  10. data/lib/api_browser/app/bower_components/angular-mocks/angular-mocks.js +475 -216
  11. data/lib/api_browser/app/bower_components/angular-mocks/bower.json +2 -2
  12. data/lib/api_browser/app/bower_components/angular-mocks/ngAnimateMock.js +2 -0
  13. data/lib/api_browser/app/bower_components/angular-mocks/ngMock.js +2 -0
  14. data/lib/api_browser/app/bower_components/angular-mocks/ngMockE2E.js +2 -0
  15. data/lib/api_browser/app/bower_components/angular-mocks/package.json +1 -1
  16. data/lib/api_browser/app/bower_components/angular-sanitize/.bower.json +8 -8
  17. data/lib/api_browser/app/bower_components/angular-sanitize/README.md +19 -5
  18. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.js +186 -127
  19. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js +12 -10
  20. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js.map +3 -3
  21. data/lib/api_browser/app/bower_components/angular-sanitize/bower.json +3 -2
  22. data/lib/api_browser/app/bower_components/angular-sanitize/index.js +2 -0
  23. data/lib/api_browser/app/bower_components/angular-sanitize/package.json +26 -0
  24. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/.bower.json +15 -8
  25. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/bower.json +11 -3
  26. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-csp.css +6 -0
  27. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js +1177 -453
  28. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js +4 -4
  29. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.js +1066 -404
  30. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.min.js +3 -3
  31. data/lib/api_browser/app/bower_components/angular-ui-router/.bower.json +5 -6
  32. data/lib/api_browser/app/bower_components/angular-ui-router/CHANGELOG.md +208 -3
  33. data/lib/api_browser/app/bower_components/angular-ui-router/CONTRIBUTING.md +65 -0
  34. data/lib/api_browser/app/bower_components/angular-ui-router/LICENSE +1 -1
  35. data/lib/api_browser/app/bower_components/angular-ui-router/README.md +36 -71
  36. data/lib/api_browser/app/bower_components/angular-ui-router/api/angular-ui-router.d.ts +126 -0
  37. data/lib/api_browser/app/bower_components/angular-ui-router/bower.json +1 -1
  38. data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.js +1902 -755
  39. data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.min.js +2 -2
  40. data/lib/api_browser/app/bower_components/angular-ui-router/src/common.js +69 -23
  41. data/lib/api_browser/app/bower_components/angular-ui-router/src/resolve.js +15 -5
  42. data/lib/api_browser/app/bower_components/angular-ui-router/src/state.js +556 -295
  43. data/lib/api_browser/app/bower_components/angular-ui-router/src/stateDirectives.js +101 -42
  44. data/lib/api_browser/app/bower_components/angular-ui-router/src/stateFilters.js +6 -2
  45. data/lib/api_browser/app/bower_components/angular-ui-router/src/templateFactory.js +2 -2
  46. data/lib/api_browser/app/bower_components/angular-ui-router/src/urlMatcherFactory.js +822 -97
  47. data/lib/api_browser/app/bower_components/angular-ui-router/src/urlRouter.js +274 -120
  48. data/lib/api_browser/app/bower_components/angular-ui-router/src/viewDirective.js +33 -20
  49. data/lib/api_browser/app/bower_components/angular-ui-router/src/viewScroll.js +1 -1
  50. data/lib/api_browser/app/bower_components/angular/.bower.json +5 -5
  51. data/lib/api_browser/app/bower_components/angular/README.md +2 -5
  52. data/lib/api_browser/app/bower_components/angular/angular-csp.css +5 -8
  53. data/lib/api_browser/app/bower_components/angular/angular.js +12975 -6996
  54. data/lib/api_browser/app/bower_components/angular/angular.min.js +285 -213
  55. data/lib/api_browser/app/bower_components/angular/angular.min.js.gzip +0 -0
  56. data/lib/api_browser/app/bower_components/angular/angular.min.js.map +3 -3
  57. data/lib/api_browser/app/bower_components/angular/bower.json +1 -1
  58. data/lib/api_browser/app/bower_components/angular/index.js +2 -0
  59. data/lib/api_browser/app/bower_components/angular/package.json +2 -2
  60. data/lib/api_browser/app/bower_components/bootstrap-sass/.bower.json +31 -16
  61. data/lib/api_browser/app/bower_components/bootstrap-sass/CHANGELOG.md +108 -0
  62. data/lib/api_browser/app/bower_components/bootstrap-sass/CONTRIBUTING.md +55 -37
  63. data/lib/api_browser/app/bower_components/bootstrap-sass/README.md +147 -206
  64. data/lib/api_browser/app/bower_components/bootstrap-sass/bower.json +19 -8
  65. data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.eot +0 -0
  66. data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.svg +0 -0
  67. data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.ttf +0 -0
  68. data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.woff +0 -0
  69. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap.js +12 -0
  70. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/affix.js +1 -1
  71. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/alert.js +1 -1
  72. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/button.js +11 -5
  73. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/carousel.js +5 -5
  74. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/collapse.js +1 -1
  75. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/dropdown.js +5 -5
  76. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/modal.js +1 -1
  77. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/popover.js +1 -1
  78. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/scrollspy.js +2 -2
  79. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/tab.js +1 -1
  80. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/tooltip.js +1 -1
  81. data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/transition.js +1 -1
  82. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap.scss +1 -0
  83. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_alerts.scss +0 -0
  84. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_badges.scss +6 -6
  85. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_breadcrumbs.scss +0 -0
  86. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_button-groups.scss +7 -33
  87. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_buttons.scss +2 -5
  88. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_carousel.scss +1 -0
  89. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_close.scss +0 -0
  90. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_code.scss +0 -0
  91. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_component-animations.scss +0 -0
  92. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_dropdowns.scss +3 -8
  93. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_forms.scss +11 -0
  94. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_glyphicons.scss +5 -5
  95. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_grid.scss +12 -26
  96. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_input-groups.scss +1 -1
  97. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_jumbotron.scss +8 -2
  98. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_labels.scss +6 -0
  99. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_list-group.scss +0 -0
  100. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_media.scss +0 -0
  101. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_mixins.scss +38 -51
  102. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_modals.scss +2 -5
  103. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_navbar.scss +41 -53
  104. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_navs.scss +0 -20
  105. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_normalize.scss +0 -0
  106. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_pager.scss +0 -0
  107. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_pagination.scss +0 -0
  108. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_panels.scss +11 -1
  109. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_popovers.scss +0 -0
  110. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_print.scss +0 -0
  111. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_progress-bars.scss +0 -12
  112. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_responsive-utilities.scss +0 -0
  113. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_scaffolding.scss +0 -0
  114. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_tables.scss +5 -18
  115. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_theme.scss +2 -2
  116. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_thumbnails.scss +9 -3
  117. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_tooltip.scss +0 -0
  118. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_type.scss +54 -52
  119. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_utilities.scss +0 -0
  120. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_variables.scss +20 -11
  121. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_wells.scss +0 -0
  122. data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/bootstrap.scss +0 -0
  123. data/lib/api_browser/app/bower_components/lodash/.bower.json +9 -13
  124. data/lib/api_browser/app/bower_components/lodash/LICENSE.txt +3 -3
  125. data/lib/api_browser/app/bower_components/lodash/bower.json +4 -7
  126. data/lib/api_browser/app/bower_components/lodash/lodash.js +12235 -0
  127. data/lib/api_browser/app/bower_components/lodash/lodash.min.js +98 -0
  128. data/lib/api_browser/app/index.html +0 -1
  129. data/lib/api_browser/app/js/app.js +2 -5
  130. data/lib/api_browser/app/js/controllers/action.js +21 -37
  131. data/lib/api_browser/app/js/controllers/controller.js +23 -1
  132. data/lib/api_browser/app/js/controllers/menu.js +46 -14
  133. data/lib/api_browser/app/js/controllers/type.js +2 -9
  134. data/lib/api_browser/app/js/directives/attribute_description.js +15 -5
  135. data/lib/api_browser/app/js/directives/attribute_table.js +6 -6
  136. data/lib/api_browser/app/js/directives/fixed_if_fits.js +20 -0
  137. data/lib/api_browser/app/js/directives/no_container.js +6 -6
  138. data/lib/api_browser/app/js/directives/type_placeholder.js +21 -0
  139. data/lib/api_browser/app/js/factories/Configuration.js +13 -0
  140. data/lib/api_browser/app/js/factories/Documentation.js +0 -3
  141. data/lib/api_browser/app/js/factories/normalize_attributes.js +19 -0
  142. data/lib/api_browser/app/js/factories/template_for.js +113 -0
  143. data/lib/api_browser/app/sass/modules/_body.scss +26 -4
  144. data/lib/api_browser/app/sass/modules/_sidebar.scss +68 -1
  145. data/lib/api_browser/app/sass/praxis.scss +1 -5
  146. data/lib/api_browser/app/sass/variables/_bootstrap-variables.scss +13 -4
  147. data/lib/api_browser/app/views/action.html +13 -17
  148. data/lib/api_browser/app/views/controller.html +32 -4
  149. data/lib/api_browser/app/views/directives/attribute_description.html +1 -1
  150. data/lib/api_browser/app/views/directives/attribute_description/{_default.html → default.html} +0 -0
  151. data/lib/api_browser/app/views/directives/attribute_description/example.html +13 -0
  152. data/lib/api_browser/app/views/directives/attribute_description/headers.html +8 -0
  153. data/lib/api_browser/app/views/directives/attribute_description/member_options.html +4 -0
  154. data/lib/api_browser/app/views/directives/attribute_description/values.html +14 -0
  155. data/lib/api_browser/app/views/directives/attribute_table.html +2 -2
  156. data/lib/api_browser/app/views/home.html +1 -3
  157. data/lib/api_browser/app/views/layout.html +3 -36
  158. data/lib/api_browser/app/views/menu.html +45 -0
  159. data/lib/api_browser/app/views/navbar.html +1 -1
  160. data/lib/api_browser/app/views/type.html +2 -2
  161. data/lib/api_browser/app/views/type/{_details.html → details.html} +6 -6
  162. data/lib/api_browser/app/views/types/embedded/default.html +10 -0
  163. data/lib/api_browser/app/views/types/embedded/links.html +11 -0
  164. data/lib/api_browser/app/views/types/embedded/struct.html +2 -0
  165. data/lib/api_browser/app/views/types/label/link.html +1 -0
  166. data/lib/api_browser/app/views/types/label/primitive.html +1 -0
  167. data/lib/api_browser/app/views/types/label/primitive_collection.html +1 -0
  168. data/lib/api_browser/app/views/types/label/type.html +1 -0
  169. data/lib/api_browser/app/views/types/label/type_collection.html +1 -0
  170. data/lib/api_browser/app/views/{directives/request_body/_default.html → types/standalone/default.html} +1 -1
  171. data/lib/api_browser/app/views/types/standalone/struct.html +1 -0
  172. data/lib/api_browser/bower.json +9 -9
  173. data/lib/api_browser/package.json +1 -1
  174. data/lib/praxis.rb +10 -4
  175. data/lib/praxis/action_definition.rb +16 -4
  176. data/lib/praxis/action_definition/headers_dsl_compiler.rb +5 -2
  177. data/lib/praxis/api_definition.rb +3 -1
  178. data/lib/praxis/api_general_info.rb +49 -5
  179. data/lib/praxis/application.rb +12 -4
  180. data/lib/praxis/bootloader.rb +1 -0
  181. data/lib/praxis/bootloader_stages/environment.rb +2 -0
  182. data/lib/praxis/bootloader_stages/routing.rb +1 -1
  183. data/lib/praxis/bootloader_stages/subgroup_loader.rb +1 -0
  184. data/lib/praxis/exceptions/validation.rb +7 -0
  185. data/lib/praxis/handlers/plain.rb +16 -0
  186. data/lib/praxis/handlers/xml.rb +4 -4
  187. data/lib/praxis/links.rb +13 -3
  188. data/lib/praxis/media_type_identifier.rb +3 -0
  189. data/lib/praxis/multipart/parser.rb +41 -48
  190. data/lib/praxis/multipart/part.rb +196 -3
  191. data/lib/praxis/request.rb +14 -11
  192. data/lib/praxis/request_stages/request_stage.rb +4 -0
  193. data/lib/praxis/request_stages/response.rb +10 -9
  194. data/lib/praxis/request_stages/validate.rb +1 -7
  195. data/lib/praxis/request_stages/validate_params_and_headers.rb +30 -5
  196. data/lib/praxis/request_stages/validate_payload.rb +14 -5
  197. data/lib/praxis/resource_definition.rb +117 -15
  198. data/lib/praxis/response.rb +6 -5
  199. data/lib/praxis/response_definition.rb +51 -5
  200. data/lib/praxis/responses/http.rb +5 -0
  201. data/lib/praxis/responses/multipart_ok.rb +51 -0
  202. data/lib/praxis/responses/validation_error.rb +7 -7
  203. data/lib/praxis/restful_doc_generator.rb +9 -4
  204. data/lib/praxis/route.rb +3 -2
  205. data/lib/praxis/router.rb +26 -16
  206. data/lib/praxis/router/rack.rb +51 -0
  207. data/lib/praxis/router/simple.rb +146 -0
  208. data/lib/praxis/routing_config.rb +2 -2
  209. data/lib/praxis/trait.rb +1 -1
  210. data/lib/praxis/types/fuzzy_hash.rb +49 -0
  211. data/lib/praxis/types/media_type_common.rb +1 -1
  212. data/lib/praxis/types/multipart.rb +47 -12
  213. data/lib/praxis/types/multipart_array.rb +320 -0
  214. data/lib/praxis/types/multipart_array/part_definition.rb +52 -0
  215. data/lib/praxis/validation_handler.rb +10 -0
  216. data/lib/praxis/version.rb +2 -2
  217. data/praxis.gemspec +3 -3
  218. data/spec/api_browser/directives/type_placeholder_spec.js +134 -0
  219. data/spec/api_browser/factories/normalize_attributes_spec.js +97 -0
  220. data/spec/api_browser/factories/template_for_spec.js +67 -0
  221. data/spec/functional_spec.rb +111 -45
  222. data/spec/praxis/action_definition_spec.rb +31 -7
  223. data/spec/praxis/api_definition_spec.rb +2 -2
  224. data/spec/praxis/api_general_info_spec.rb +25 -0
  225. data/spec/praxis/application_spec.rb +24 -11
  226. data/spec/praxis/handlers/xml_spec.rb +55 -33
  227. data/spec/praxis/links_spec.rb +18 -1
  228. data/spec/praxis/media_type_collection_spec.rb +1 -1
  229. data/spec/praxis/media_type_spec.rb +2 -2
  230. data/spec/praxis/multipart/parser_spec.rb +21 -13
  231. data/spec/praxis/plugins/praxis_mapper_plugin_spec.rb +1 -1
  232. data/spec/praxis/request_spec.rb +52 -24
  233. data/spec/praxis/{request_stages_action_spec.rb → request_stages/action_spec.rb} +1 -1
  234. data/spec/praxis/{request_stage_spec.rb → request_stages/request_stage_spec.rb} +0 -0
  235. data/spec/praxis/{request_stages_validate_spec.rb → request_stages/validate_spec.rb} +1 -1
  236. data/spec/praxis/resource_definition_spec.rb +30 -4
  237. data/spec/praxis/response_definition_spec.rb +60 -19
  238. data/spec/praxis/response_spec.rb +2 -2
  239. data/spec/praxis/responses/validation_error_spec.rb +33 -16
  240. data/spec/praxis/route_spec.rb +4 -2
  241. data/spec/praxis/router_spec.rb +28 -12
  242. data/spec/praxis/routing_config_spec.rb +11 -5
  243. data/spec/praxis/types/collection_spec.rb +1 -1
  244. data/spec/praxis/types/fuzzy_hash_spec.rb +20 -0
  245. data/spec/praxis/types/multipart_array/part_definition_spec.rb +5 -0
  246. data/spec/praxis/types/multipart_array_spec.rb +334 -0
  247. data/spec/praxis/types/multipart_spec.rb +14 -5
  248. data/spec/spec_app/app/controllers/instances.rb +20 -10
  249. data/spec/spec_app/app/controllers/volumes.rb +8 -4
  250. data/spec/spec_app/app/responses/bulk_response.rb +0 -6
  251. data/spec/spec_app/config/environment.rb +13 -0
  252. data/spec/spec_app/design/api.rb +7 -10
  253. data/spec/spec_app/design/media_types/instance.rb +3 -1
  254. data/spec/spec_app/design/resources/instances.rb +50 -41
  255. data/spec/spec_app/design/resources/volume_snapshots.rb +39 -0
  256. data/spec/spec_app/design/resources/volumes.rb +11 -6
  257. data/spec/spec_helper.rb +3 -1
  258. metadata +125 -218
  259. data/lib/api_browser/app/bower_components/angular-ui-router/src/compat.js +0 -146
  260. data/lib/api_browser/app/bower_components/bootstrap-sass/CNAME +0 -1
  261. data/lib/api_browser/app/bower_components/bootstrap-sass/DOCS-LICENSE +0 -319
  262. data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile +0 -5
  263. data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile.lock +0 -14
  264. data/lib/api_browser/app/bower_components/bootstrap-sass/Gruntfile.js +0 -244
  265. data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE +0 -176
  266. data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE-MIT +0 -21
  267. data/lib/api_browser/app/bower_components/bootstrap-sass/Rakefile +0 -44
  268. data/lib/api_browser/app/bower_components/bootstrap-sass/_config.yml +0 -25
  269. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/ads.html +0 -1
  270. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/footer.html +0 -34
  271. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/header.html +0 -42
  272. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-about.html +0 -12
  273. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-components.html +0 -137
  274. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-css.html +0 -99
  275. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-customize.html +0 -40
  276. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-getting-started.html +0 -44
  277. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-javascript.html +0 -88
  278. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-main.html +0 -37
  279. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/old-bs-docs.html +0 -8
  280. data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/social-buttons.html +0 -16
  281. data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/default.html +0 -79
  282. data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/home.html +0 -47
  283. data/lib/api_browser/app/bower_components/bootstrap-sass/about.html +0 -93
  284. data/lib/api_browser/app/bower_components/bootstrap-sass/browserstack.json +0 -37
  285. data/lib/api_browser/app/bower_components/bootstrap-sass/components.html +0 -3689
  286. data/lib/api_browser/app/bower_components/bootstrap-sass/composer.json +0 -28
  287. data/lib/api_browser/app/bower_components/bootstrap-sass/css.html +0 -2674
  288. data/lib/api_browser/app/bower_components/bootstrap-sass/customize.html +0 -1715
  289. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.css +0 -427
  290. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.min.css +0 -1
  291. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.css +0 -6350
  292. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.min.css +0 -1
  293. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.js +0 -2002
  294. data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.min.js +0 -9
  295. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/docs.css +0 -1195
  296. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/pygments-manni.css +0 -66
  297. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/apple-touch-icon-144-precomposed.png +0 -0
  298. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/favicon.png +0 -0
  299. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/application.js +0 -103
  300. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/customizer.js +0 -332
  301. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/filesaver.js +0 -169
  302. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/holder.js +0 -404
  303. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/ie8-responsive-file-warning.js +0 -12
  304. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/jszip.js +0 -1467
  305. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/less.js +0 -9
  306. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/raw-files.js +0 -3
  307. data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/uglify.js +0 -14
  308. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/carousel.css +0 -148
  309. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/index.html +0 -206
  310. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/grid.css +0 -28
  311. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/index.html +0 -148
  312. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/index.html +0 -82
  313. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/jumbotron-narrow.css +0 -79
  314. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/index.html +0 -99
  315. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/jumbotron.css +0 -5
  316. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/index.html +0 -83
  317. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/justified-nav.css +0 -88
  318. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/index.html +0 -91
  319. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/navbar-fixed-top.css +0 -4
  320. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/index.html +0 -92
  321. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/navbar-static-top.css +0 -7
  322. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/index.html +0 -88
  323. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/navbar.css +0 -8
  324. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/index.html +0 -101
  325. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/non-responsive.css +0 -116
  326. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/index.html +0 -130
  327. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.css +0 -50
  328. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.js +0 -5
  329. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/carousel.jpg +0 -0
  330. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/grid.jpg +0 -0
  331. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron-narrow.jpg +0 -0
  332. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron.jpg +0 -0
  333. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/justified-nav.jpg +0 -0
  334. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-fixed.jpg +0 -0
  335. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-static.jpg +0 -0
  336. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar.jpg +0 -0
  337. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/non-responsive.jpg +0 -0
  338. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/offcanvas.jpg +0 -0
  339. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sign-in.jpg +0 -0
  340. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/starter-template.jpg +0 -0
  341. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer-navbar.jpg +0 -0
  342. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer.jpg +0 -0
  343. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/theme.jpg +0 -0
  344. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/index.html +0 -50
  345. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/signin.css +0 -40
  346. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/index.html +0 -68
  347. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/starter-template.css +0 -7
  348. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/index.html +0 -91
  349. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/sticky-footer-navbar.css +0 -45
  350. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/index.html +0 -55
  351. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/sticky-footer.css +0 -38
  352. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/index.html +0 -384
  353. data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/theme.css +0 -14
  354. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.eot +0 -0
  355. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.svg +0 -229
  356. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.ttf +0 -0
  357. data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.woff +0 -0
  358. data/lib/api_browser/app/bower_components/bootstrap-sass/getting-started.html +0 -1021
  359. data/lib/api_browser/app/bower_components/bootstrap-sass/index.html +0 -16
  360. data/lib/api_browser/app/bower_components/bootstrap-sass/javascript.html +0 -1983
  361. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/index.html +0 -52
  362. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/affix.js +0 -25
  363. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/alert.js +0 -62
  364. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/button.js +0 -116
  365. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/carousel.js +0 -87
  366. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/collapse.js +0 -164
  367. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/dropdown.js +0 -219
  368. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/modal.js +0 -196
  369. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/phantom.js +0 -69
  370. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/popover.js +0 -133
  371. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/scrollspy.js +0 -37
  372. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tab.js +0 -86
  373. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tooltip.js +0 -437
  374. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/transition.js +0 -13
  375. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/jquery.js +0 -6
  376. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.css +0 -232
  377. data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.js +0 -1510
  378. data/lib/api_browser/app/bower_components/bootstrap-sass/package.json +0 -40
  379. data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.js +0 -7157
  380. data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.min.js +0 -61
  381. data/lib/api_browser/app/bower_components/lodash/dist/lodash.js +0 -6785
  382. data/lib/api_browser/app/bower_components/lodash/dist/lodash.min.js +0 -56
  383. data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.js +0 -4979
  384. data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.min.js +0 -39
  385. data/lib/api_browser/app/js/directives/attribute_table_row.js +0 -17
  386. data/lib/api_browser/app/js/directives/request_body.js +0 -25
  387. data/lib/api_browser/app/js/directives/request_headers.js +0 -17
  388. data/lib/api_browser/app/js/directives/request_parameters.js +0 -17
  389. data/lib/api_browser/app/js/directives/type_label.js +0 -52
  390. data/lib/api_browser/app/js/factories/PayloadTemplates.js +0 -10
  391. data/lib/api_browser/app/js/factories/TemplateProvider.js +0 -45
  392. data/lib/api_browser/app/js/factories/TypeTemplates.js +0 -11
  393. data/lib/api_browser/app/views/directives/attribute_description/_example.html +0 -13
  394. data/lib/api_browser/app/views/directives/attribute_description/_headers.html +0 -8
  395. data/lib/api_browser/app/views/directives/attribute_table_row/_default.html +0 -10
  396. data/lib/api_browser/app/views/directives/attribute_table_row/_links.html +0 -11
  397. data/lib/api_browser/app/views/directives/attribute_table_row/_struct.html +0 -2
  398. data/lib/api_browser/app/views/directives/request_body/_struct.html +0 -1
  399. data/lib/api_browser/app/views/resource/_actions.html +0 -27
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "angular-mocks",
3
- "version": "1.2.28",
3
+ "version": "1.4.0",
4
4
  "main": "./angular-mocks.js",
5
5
  "ignore": [],
6
6
  "dependencies": {
7
- "angular": "1.2.28"
7
+ "angular": "1.4.0"
8
8
  }
9
9
  }
@@ -0,0 +1,2 @@
1
+ require('./angular-mocks');
2
+ module.exports = 'ngAnimateMock';
@@ -0,0 +1,2 @@
1
+ require('./angular-mocks');
2
+ module.exports = 'ngMock';
@@ -0,0 +1,2 @@
1
+ require('./angular-mocks');
2
+ module.exports = 'ngMockE2E';
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "angular-mocks",
3
- "version": "1.2.28",
3
+ "version": "1.4.0",
4
4
  "description": "AngularJS mocks for testing",
5
5
  "main": "angular-mocks.js",
6
6
  "scripts": {
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "angular-sanitize",
3
- "version": "1.2.16",
3
+ "version": "1.4.0",
4
4
  "main": "./angular-sanitize.js",
5
+ "ignore": [],
5
6
  "dependencies": {
6
- "angular": "1.2.16"
7
+ "angular": "1.4.0"
7
8
  },
8
9
  "homepage": "https://github.com/angular/bower-angular-sanitize",
9
- "_release": "1.2.16",
10
+ "_release": "1.4.0",
10
11
  "_resolution": {
11
12
  "type": "version",
12
- "tag": "v1.2.16",
13
- "commit": "0534ccd6bb2b7b6e5d0fa6c27fd3277f312a4347"
13
+ "tag": "v1.4.0",
14
+ "commit": "a64d96eff0b9f15db70322e77bc20c2e64bd8e07"
14
15
  },
15
16
  "_source": "git://github.com/angular/bower-angular-sanitize.git",
16
- "_target": "~1.2.16",
17
- "_originalSource": "angular-sanitize",
18
- "_direct": true
17
+ "_target": "~1.4",
18
+ "_originalSource": "angular-sanitize"
19
19
  }
@@ -1,12 +1,26 @@
1
- # bower-angular-sanitize
1
+ # packaged angular-sanitize
2
2
 
3
- This repo is for distribution on `bower`. The source for this module is in the
3
+ This repo is for distribution on `npm` and `bower`. The source for this module is in the
4
4
  [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngSanitize).
5
5
  Please file issues and pull requests against that repo.
6
6
 
7
7
  ## Install
8
8
 
9
- Install with `bower`:
9
+ You can install this package either with `npm` or with `bower`.
10
+
11
+ ### npm
12
+
13
+ ```shell
14
+ npm install angular-sanitize
15
+ ```
16
+
17
+ Then add `ngSanitize` as a dependency for your app:
18
+
19
+ ```javascript
20
+ angular.module('myApp', [require('angular-sanitize')]);
21
+ ```
22
+
23
+ ### bower
10
24
 
11
25
  ```shell
12
26
  bower install angular-sanitize
@@ -18,7 +32,7 @@ Add a `<script>` to your `index.html`:
18
32
  <script src="/bower_components/angular-sanitize/angular-sanitize.js"></script>
19
33
  ```
20
34
 
21
- And add `ngSanitize` as a dependency for your app:
35
+ Then add `ngSanitize` as a dependency for your app:
22
36
 
23
37
  ```javascript
24
38
  angular.module('myApp', ['ngSanitize']);
@@ -33,7 +47,7 @@ Documentation is available on the
33
47
 
34
48
  The MIT License
35
49
 
36
- Copyright (c) 2010-2012 Google, Inc. http://angularjs.org
50
+ Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
37
51
 
38
52
  Permission is hereby granted, free of charge, to any person obtaining a copy
39
53
  of this software and associated documentation files (the "Software"), to deal
@@ -1,10 +1,21 @@
1
1
  /**
2
- * @license AngularJS v1.2.16
3
- * (c) 2010-2014 Google, Inc. http://angularjs.org
2
+ * @license AngularJS v1.4.0
3
+ * (c) 2010-2015 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
6
6
  (function(window, angular, undefined) {'use strict';
7
7
 
8
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
9
+ * Any commits to this file should be reviewed with security in mind. *
10
+ * Changes to this file can potentially create security vulnerabilities. *
11
+ * An approval from 2 Core members with history of modifying *
12
+ * this file is required. *
13
+ * *
14
+ * Does the change somehow allow for arbitrary javascript to be executed? *
15
+ * Or allows for someone to change the prototype of built-in objects? *
16
+ * Or gives undesired access to variables likes document or window? *
17
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
18
+
8
19
  var $sanitizeMinErr = angular.$$minErr('$sanitize');
9
20
 
10
21
  /**
@@ -42,35 +53,36 @@ var $sanitizeMinErr = angular.$$minErr('$sanitize');
42
53
  /**
43
54
  * @ngdoc service
44
55
  * @name $sanitize
45
- * @function
56
+ * @kind function
46
57
  *
47
58
  * @description
48
- * The input is sanitized by parsing the html into tokens. All safe tokens (from a whitelist) are
59
+ * The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are
49
60
  * then serialized back to properly escaped html string. This means that no unsafe input can make
50
61
  * it into the returned string, however, since our parser is more strict than a typical browser
51
62
  * parser, it's possible that some obscure input, which would be recognized as valid HTML by a
52
- * browser, won't make it through the sanitizer.
63
+ * browser, won't make it through the sanitizer. The input may also contain SVG markup.
53
64
  * The whitelist is configured using the functions `aHrefSanitizationWhitelist` and
54
65
  * `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider `$compileProvider`}.
55
66
  *
56
- * @param {string} html Html input.
57
- * @returns {string} Sanitized html.
67
+ * @param {string} html HTML input.
68
+ * @returns {string} Sanitized HTML.
58
69
  *
59
70
  * @example
60
- <example module="ngSanitize" deps="angular-sanitize.js">
71
+ <example module="sanitizeExample" deps="angular-sanitize.js">
61
72
  <file name="index.html">
62
73
  <script>
63
- function Ctrl($scope, $sce) {
64
- $scope.snippet =
65
- '<p style="color:blue">an html\n' +
66
- '<em onmouseover="this.textContent=\'PWN3D!\'">click here</em>\n' +
67
- 'snippet</p>';
68
- $scope.deliberatelyTrustDangerousSnippet = function() {
69
- return $sce.trustAsHtml($scope.snippet);
70
- };
71
- }
74
+ angular.module('sanitizeExample', ['ngSanitize'])
75
+ .controller('ExampleController', ['$scope', '$sce', function($scope, $sce) {
76
+ $scope.snippet =
77
+ '<p style="color:blue">an html\n' +
78
+ '<em onmouseover="this.textContent=\'PWN3D!\'">click here</em>\n' +
79
+ 'snippet</p>';
80
+ $scope.deliberatelyTrustDangerousSnippet = function() {
81
+ return $sce.trustAsHtml($scope.snippet);
82
+ };
83
+ }]);
72
84
  </script>
73
- <div ng-controller="Ctrl">
85
+ <div ng-controller="ExampleController">
74
86
  Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
75
87
  <table>
76
88
  <tr>
@@ -158,14 +170,15 @@ function sanitizeText(chars) {
158
170
 
159
171
  // Regular Expressions for parsing tags and attributes
160
172
  var START_TAG_REGEXP =
161
- /^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,
162
- END_TAG_REGEXP = /^<\s*\/\s*([\w:-]+)[^>]*>/,
173
+ /^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,
174
+ END_TAG_REGEXP = /^<\/\s*([\w:-]+)[^>]*>/,
163
175
  ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,
164
176
  BEGIN_TAG_REGEXP = /^</,
165
- BEGING_END_TAGE_REGEXP = /^<\s*\//,
177
+ BEGING_END_TAGE_REGEXP = /^<\//,
166
178
  COMMENT_REGEXP = /<!--(.*?)-->/g,
167
179
  DOCTYPE_REGEXP = /<!DOCTYPE([^>]*?)>/i,
168
180
  CDATA_REGEXP = /<!\[CDATA\[(.*?)]]>/g,
181
+ SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
169
182
  // Match everything outside of normal chars and " (quote character)
170
183
  NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g;
171
184
 
@@ -196,6 +209,13 @@ var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("a
196
209
  "bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s," +
197
210
  "samp,small,span,strike,strong,sub,sup,time,tt,u,var"));
198
211
 
212
+ // SVG Elements
213
+ // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements
214
+ // Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted.
215
+ // They can potentially allow for arbitrary javascript to be executed. See #11290
216
+ var svgElements = makeMap("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph," +
217
+ "hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline," +
218
+ "radialGradient,rect,stop,svg,switch,text,title,tspan,use");
199
219
 
200
220
  // Special Elements (can contain anything)
201
221
  var specialElements = makeMap("script,style");
@@ -204,20 +224,46 @@ var validElements = angular.extend({},
204
224
  voidElements,
205
225
  blockElements,
206
226
  inlineElements,
207
- optionalEndTagElements);
227
+ optionalEndTagElements,
228
+ svgElements);
208
229
 
209
230
  //Attributes that have href and hence need to be sanitized
210
- var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap");
211
- var validAttrs = angular.extend({}, uriAttrs, makeMap(
212
- 'abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+
213
- 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+
214
- 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+
215
- 'scope,scrolling,shape,size,span,start,summary,target,title,type,'+
216
- 'valign,value,vspace,width'));
217
-
218
- function makeMap(str) {
231
+ var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap,xlink:href");
232
+
233
+ var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' +
234
+ 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' +
235
+ 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' +
236
+ 'scope,scrolling,shape,size,span,start,summary,target,title,type,' +
237
+ 'valign,value,vspace,width');
238
+
239
+ // SVG attributes (without "id" and "name" attributes)
240
+ // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes
241
+ var svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +
242
+ 'baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,' +
243
+ 'cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,' +
244
+ 'font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,' +
245
+ 'height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,' +
246
+ 'marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,' +
247
+ 'max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,' +
248
+ 'path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,' +
249
+ 'requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,' +
250
+ 'stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,' +
251
+ 'stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,' +
252
+ 'stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,' +
253
+ 'underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,' +
254
+ 'width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,' +
255
+ 'xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan', true);
256
+
257
+ var validAttrs = angular.extend({},
258
+ uriAttrs,
259
+ svgAttrs,
260
+ htmlAttrs);
261
+
262
+ function makeMap(str, lowercaseKeys) {
219
263
  var obj = {}, items = str.split(','), i;
220
- for (i = 0; i < items.length; i++) obj[items[i]] = true;
264
+ for (i = 0; i < items.length; i++) {
265
+ obj[lowercaseKeys ? angular.lowercase(items[i]) : items[i]] = true;
266
+ }
221
267
  return obj;
222
268
  }
223
269
 
@@ -234,78 +280,94 @@ function makeMap(str) {
234
280
  * @param {string} html string
235
281
  * @param {object} handler
236
282
  */
237
- function htmlParser( html, handler ) {
238
- var index, chars, match, stack = [], last = html;
239
- stack.last = function() { return stack[ stack.length - 1 ]; };
283
+ function htmlParser(html, handler) {
284
+ if (typeof html !== 'string') {
285
+ if (html === null || typeof html === 'undefined') {
286
+ html = '';
287
+ } else {
288
+ html = '' + html;
289
+ }
290
+ }
291
+ var index, chars, match, stack = [], last = html, text;
292
+ stack.last = function() { return stack[stack.length - 1]; };
240
293
 
241
- while ( html ) {
294
+ while (html) {
295
+ text = '';
242
296
  chars = true;
243
297
 
244
298
  // Make sure we're not in a script or style element
245
- if ( !stack.last() || !specialElements[ stack.last() ] ) {
299
+ if (!stack.last() || !specialElements[stack.last()]) {
246
300
 
247
301
  // Comment
248
- if ( html.indexOf("<!--") === 0 ) {
302
+ if (html.indexOf("<!--") === 0) {
249
303
  // comments containing -- are not allowed unless they terminate the comment
250
304
  index = html.indexOf("--", 4);
251
305
 
252
- if ( index >= 0 && html.lastIndexOf("-->", index) === index) {
253
- if (handler.comment) handler.comment( html.substring( 4, index ) );
254
- html = html.substring( index + 3 );
306
+ if (index >= 0 && html.lastIndexOf("-->", index) === index) {
307
+ if (handler.comment) handler.comment(html.substring(4, index));
308
+ html = html.substring(index + 3);
255
309
  chars = false;
256
310
  }
257
311
  // DOCTYPE
258
- } else if ( DOCTYPE_REGEXP.test(html) ) {
259
- match = html.match( DOCTYPE_REGEXP );
312
+ } else if (DOCTYPE_REGEXP.test(html)) {
313
+ match = html.match(DOCTYPE_REGEXP);
260
314
 
261
- if ( match ) {
262
- html = html.replace( match[0], '');
315
+ if (match) {
316
+ html = html.replace(match[0], '');
263
317
  chars = false;
264
318
  }
265
319
  // end tag
266
- } else if ( BEGING_END_TAGE_REGEXP.test(html) ) {
267
- match = html.match( END_TAG_REGEXP );
320
+ } else if (BEGING_END_TAGE_REGEXP.test(html)) {
321
+ match = html.match(END_TAG_REGEXP);
268
322
 
269
- if ( match ) {
270
- html = html.substring( match[0].length );
271
- match[0].replace( END_TAG_REGEXP, parseEndTag );
323
+ if (match) {
324
+ html = html.substring(match[0].length);
325
+ match[0].replace(END_TAG_REGEXP, parseEndTag);
272
326
  chars = false;
273
327
  }
274
328
 
275
329
  // start tag
276
- } else if ( BEGIN_TAG_REGEXP.test(html) ) {
277
- match = html.match( START_TAG_REGEXP );
278
-
279
- if ( match ) {
280
- html = html.substring( match[0].length );
281
- match[0].replace( START_TAG_REGEXP, parseStartTag );
330
+ } else if (BEGIN_TAG_REGEXP.test(html)) {
331
+ match = html.match(START_TAG_REGEXP);
332
+
333
+ if (match) {
334
+ // We only have a valid start-tag if there is a '>'.
335
+ if (match[4]) {
336
+ html = html.substring(match[0].length);
337
+ match[0].replace(START_TAG_REGEXP, parseStartTag);
338
+ }
282
339
  chars = false;
340
+ } else {
341
+ // no ending tag found --- this piece should be encoded as an entity.
342
+ text += '<';
343
+ html = html.substring(1);
283
344
  }
284
345
  }
285
346
 
286
- if ( chars ) {
347
+ if (chars) {
287
348
  index = html.indexOf("<");
288
349
 
289
- var text = index < 0 ? html : html.substring( 0, index );
290
- html = index < 0 ? "" : html.substring( index );
350
+ text += index < 0 ? html : html.substring(0, index);
351
+ html = index < 0 ? "" : html.substring(index);
291
352
 
292
- if (handler.chars) handler.chars( decodeEntities(text) );
353
+ if (handler.chars) handler.chars(decodeEntities(text));
293
354
  }
294
355
 
295
356
  } else {
296
- html = html.replace(new RegExp("(.*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'),
297
- function(all, text){
357
+ // IE versions 9 and 10 do not understand the regex '[^]', so using a workaround with [\W\w].
358
+ html = html.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'),
359
+ function(all, text) {
298
360
  text = text.replace(COMMENT_REGEXP, "$1").replace(CDATA_REGEXP, "$1");
299
361
 
300
- if (handler.chars) handler.chars( decodeEntities(text) );
362
+ if (handler.chars) handler.chars(decodeEntities(text));
301
363
 
302
364
  return "";
303
365
  });
304
366
 
305
- parseEndTag( "", stack.last() );
367
+ parseEndTag("", stack.last());
306
368
  }
307
369
 
308
- if ( html == last ) {
370
+ if (html == last) {
309
371
  throw $sanitizeMinErr('badparse', "The sanitizer was unable to parse the following block " +
310
372
  "of html: {0}", html);
311
373
  }
@@ -315,22 +377,23 @@ function htmlParser( html, handler ) {
315
377
  // Clean up any remaining tags
316
378
  parseEndTag();
317
379
 
318
- function parseStartTag( tag, tagName, rest, unary ) {
380
+ function parseStartTag(tag, tagName, rest, unary) {
319
381
  tagName = angular.lowercase(tagName);
320
- if ( blockElements[ tagName ] ) {
321
- while ( stack.last() && inlineElements[ stack.last() ] ) {
322
- parseEndTag( "", stack.last() );
382
+ if (blockElements[tagName]) {
383
+ while (stack.last() && inlineElements[stack.last()]) {
384
+ parseEndTag("", stack.last());
323
385
  }
324
386
  }
325
387
 
326
- if ( optionalEndTagElements[ tagName ] && stack.last() == tagName ) {
327
- parseEndTag( "", tagName );
388
+ if (optionalEndTagElements[tagName] && stack.last() == tagName) {
389
+ parseEndTag("", tagName);
328
390
  }
329
391
 
330
- unary = voidElements[ tagName ] || !!unary;
392
+ unary = voidElements[tagName] || !!unary;
331
393
 
332
- if ( !unary )
333
- stack.push( tagName );
394
+ if (!unary) {
395
+ stack.push(tagName);
396
+ }
334
397
 
335
398
  var attrs = {};
336
399
 
@@ -343,22 +406,23 @@ function htmlParser( html, handler ) {
343
406
 
344
407
  attrs[name] = decodeEntities(value);
345
408
  });
346
- if (handler.start) handler.start( tagName, attrs, unary );
409
+ if (handler.start) handler.start(tagName, attrs, unary);
347
410
  }
348
411
 
349
- function parseEndTag( tag, tagName ) {
412
+ function parseEndTag(tag, tagName) {
350
413
  var pos = 0, i;
351
414
  tagName = angular.lowercase(tagName);
352
- if ( tagName )
415
+ if (tagName) {
353
416
  // Find the closest opened tag of the same type
354
- for ( pos = stack.length - 1; pos >= 0; pos-- )
355
- if ( stack[ pos ] == tagName )
356
- break;
417
+ for (pos = stack.length - 1; pos >= 0; pos--) {
418
+ if (stack[pos] == tagName) break;
419
+ }
420
+ }
357
421
 
358
- if ( pos >= 0 ) {
422
+ if (pos >= 0) {
359
423
  // Close all the open elements, up the stack
360
- for ( i = stack.length - 1; i >= pos; i-- )
361
- if (handler.end) handler.end( stack[ i ] );
424
+ for (i = stack.length - 1; i >= pos; i--)
425
+ if (handler.end) handler.end(stack[i]);
362
426
 
363
427
  // Remove the open elements from the stack
364
428
  stack.length = pos;
@@ -367,7 +431,6 @@ function htmlParser( html, handler ) {
367
431
  }
368
432
 
369
433
  var hiddenPre=document.createElement("pre");
370
- var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/;
371
434
  /**
372
435
  * decodes all entities into regular string
373
436
  * @param value
@@ -376,22 +439,10 @@ var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/;
376
439
  function decodeEntities(value) {
377
440
  if (!value) { return ''; }
378
441
 
379
- // Note: IE8 does not preserve spaces at the start/end of innerHTML
380
- // so we must capture them and reattach them afterward
381
- var parts = spaceRe.exec(value);
382
- var spaceBefore = parts[1];
383
- var spaceAfter = parts[3];
384
- var content = parts[2];
385
- if (content) {
386
- hiddenPre.innerHTML=content.replace(/</g,"&lt;");
387
- // innerText depends on styling as it doesn't display hidden elements.
388
- // Therefore, it's better to use textContent not to cause unnecessary
389
- // reflows. However, IE<9 don't support textContent so the innerText
390
- // fallback is necessary.
391
- content = 'textContent' in hiddenPre ?
392
- hiddenPre.textContent : hiddenPre.innerText;
393
- }
394
- return spaceBefore + content + spaceAfter;
442
+ hiddenPre.innerHTML = value.replace(/</g,"&lt;");
443
+ // innerText depends on styling as it doesn't display hidden elements.
444
+ // Therefore, it's better to use textContent not to cause unnecessary reflows.
445
+ return hiddenPre.textContent;
395
446
  }
396
447
 
397
448
  /**
@@ -404,7 +455,12 @@ function decodeEntities(value) {
404
455
  function encodeEntities(value) {
405
456
  return value.
406
457
  replace(/&/g, '&amp;').
407
- replace(NON_ALPHANUMERIC_REGEXP, function(value){
458
+ replace(SURROGATE_PAIR_REGEXP, function(value) {
459
+ var hi = value.charCodeAt(0);
460
+ var low = value.charCodeAt(1);
461
+ return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';
462
+ }).
463
+ replace(NON_ALPHANUMERIC_REGEXP, function(value) {
408
464
  return '&#' + value.charCodeAt(0) + ';';
409
465
  }).
410
466
  replace(/</g, '&lt;').
@@ -421,11 +477,11 @@ function encodeEntities(value) {
421
477
  * comment: function(text) {}
422
478
  * }
423
479
  */
424
- function htmlSanitizeWriter(buf, uriValidator){
480
+ function htmlSanitizeWriter(buf, uriValidator) {
425
481
  var ignore = false;
426
482
  var out = angular.bind(buf, buf.push);
427
483
  return {
428
- start: function(tag, attrs, unary){
484
+ start: function(tag, attrs, unary) {
429
485
  tag = angular.lowercase(tag);
430
486
  if (!ignore && specialElements[tag]) {
431
487
  ignore = tag;
@@ -433,7 +489,7 @@ function htmlSanitizeWriter(buf, uriValidator){
433
489
  if (!ignore && validElements[tag] === true) {
434
490
  out('<');
435
491
  out(tag);
436
- angular.forEach(attrs, function(value, key){
492
+ angular.forEach(attrs, function(value, key) {
437
493
  var lkey=angular.lowercase(key);
438
494
  var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background');
439
495
  if (validAttrs[lkey] === true &&
@@ -448,7 +504,7 @@ function htmlSanitizeWriter(buf, uriValidator){
448
504
  out(unary ? '/>' : '>');
449
505
  }
450
506
  },
451
- end: function(tag){
507
+ end: function(tag) {
452
508
  tag = angular.lowercase(tag);
453
509
  if (!ignore && validElements[tag] === true) {
454
510
  out('</');
@@ -459,7 +515,7 @@ function htmlSanitizeWriter(buf, uriValidator){
459
515
  ignore = false;
460
516
  }
461
517
  },
462
- chars: function(chars){
518
+ chars: function(chars) {
463
519
  if (!ignore) {
464
520
  out(encodeEntities(chars));
465
521
  }
@@ -476,7 +532,7 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
476
532
  /**
477
533
  * @ngdoc filter
478
534
  * @name linky
479
- * @function
535
+ * @kind function
480
536
  *
481
537
  * @description
482
538
  * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and
@@ -492,20 +548,21 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
492
548
  <span ng-bind-html="linky_expression | linky"></span>
493
549
  *
494
550
  * @example
495
- <example module="ngSanitize" deps="angular-sanitize.js">
551
+ <example module="linkyExample" deps="angular-sanitize.js">
496
552
  <file name="index.html">
497
553
  <script>
498
- function Ctrl($scope) {
499
- $scope.snippet =
500
- 'Pretty text with some links:\n'+
501
- 'http://angularjs.org/,\n'+
502
- 'mailto:us@somewhere.org,\n'+
503
- 'another@somewhere.org,\n'+
504
- 'and one more: ftp://127.0.0.1/.';
505
- $scope.snippetWithTarget = 'http://angularjs.org/';
506
- }
554
+ angular.module('linkyExample', ['ngSanitize'])
555
+ .controller('ExampleController', ['$scope', function($scope) {
556
+ $scope.snippet =
557
+ 'Pretty text with some links:\n'+
558
+ 'http://angularjs.org/,\n'+
559
+ 'mailto:us@somewhere.org,\n'+
560
+ 'another@somewhere.org,\n'+
561
+ 'and one more: ftp://127.0.0.1/.';
562
+ $scope.snippetWithTarget = 'http://angularjs.org/';
563
+ }]);
507
564
  </script>
508
- <div ng-controller="Ctrl">
565
+ <div ng-controller="ExampleController">
509
566
  Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
510
567
  <table>
511
568
  <tr>
@@ -574,7 +631,7 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
574
631
  */
575
632
  angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
576
633
  var LINKY_URL_REGEXP =
577
- /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/,
634
+ /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"”’]/,
578
635
  MAILTO_REGEXP = /^mailto:/;
579
636
 
580
637
  return function(text, target) {
@@ -587,8 +644,10 @@ angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
587
644
  while ((match = raw.match(LINKY_URL_REGEXP))) {
588
645
  // We can not end in these as they are sometimes found at the end of the sentence
589
646
  url = match[0];
590
- // if we did not match ftp/http/mailto then assume mailto
591
- if (match[2] == match[3]) url = 'mailto:' + url;
647
+ // if we did not match ftp/http/www/mailto then assume mailto
648
+ if (!match[2] && !match[4]) {
649
+ url = (match[3] ? 'http://' : 'mailto:') + url;
650
+ }
592
651
  i = match.index;
593
652
  addText(raw.substr(0, i));
594
653
  addLink(url, match[0].replace(MAILTO_REGEXP, ''));
@@ -607,13 +666,13 @@ angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
607
666
  function addLink(url, text) {
608
667
  html.push('<a ');
609
668
  if (angular.isDefined(target)) {
610
- html.push('target="');
611
- html.push(target);
612
- html.push('" ');
669
+ html.push('target="',
670
+ target,
671
+ '" ');
613
672
  }
614
- html.push('href="');
615
- html.push(url);
616
- html.push('">');
673
+ html.push('href="',
674
+ url.replace(/"/g, '&quot;'),
675
+ '">');
617
676
  addText(text);
618
677
  html.push('</a>');
619
678
  }