From 5f8de423f190bbb79a62f804151bc24824fa32d8 Mon Sep 17 00:00:00 2001
From: "Matt A. Tobin"
Date: Fri, 2 Feb 2018 04:16:08 -0500
Subject: Add m-esr52 at 52.6.0
---
layout/style/test/BitPattern.woff | Bin 0 -> 6248 bytes
layout/style/test/ListCSSProperties.cpp | 193 +
layout/style/test/ParseCSS.cpp | 89 +
layout/style/test/TestCSSPropertyLookup.cpp | 172 +
layout/style/test/additional_sheets_helper.html | 7 +
layout/style/test/animation_utils.js | 707 ++
layout/style/test/browser.ini | 8 +
layout/style/test/browser_bug453896.js | 13 +
.../test/browser_newtab_share_rule_processors.js | 38 +
layout/style/test/bug453896_iframe.html | 66 +
layout/style/test/bug517224.sjs | 24 +
layout/style/test/bug732209-css.sjs | 19 +
layout/style/test/ccd-quirks.html | 124 +
layout/style/test/ccd-standards.html | 123 +
layout/style/test/ccd.sjs | 73 +
layout/style/test/chrome/bug418986-2.js | 314 +
layout/style/test/chrome/bug535806-css.css | 1 +
layout/style/test/chrome/bug535806-html.html | 8 +
layout/style/test/chrome/bug535806-xul.xul | 8 +
layout/style/test/chrome/chrome.ini | 21 +
layout/style/test/chrome/hover_empty.html | 4 +
layout/style/test/chrome/hover_helper.html | 270 +
layout/style/test/chrome/match.png | Bin 0 -> 1210 bytes
layout/style/test/chrome/mismatch.png | Bin 0 -> 1573 bytes
layout/style/test/chrome/moz_document_helper.html | 2 +
.../test/chrome/test_author_specified_style.html | 55 +
layout/style/test/chrome/test_bug1157097.html | 31 +
layout/style/test/chrome/test_bug1160724.xul | 76 +
layout/style/test/chrome/test_bug418986-2.xul | 30 +
layout/style/test/chrome/test_bug535806.xul | 43 +
layout/style/test/chrome/test_display_mode.html | 94 +
.../test/chrome/test_display_mode_reflow.html | 74 +
layout/style/test/chrome/test_hover.html | 29 +
.../style/test/chrome/test_moz_document_rules.html | 97 +
layout/style/test/css_properties_like_longhand.js | 3 +
layout/style/test/descriptor_database.js | 72 +
layout/style/test/display_mode_reflow_iframe.html | 23 +
layout/style/test/empty.html | 1 +
layout/style/test/file_animations_async_tests.html | 77 +
.../file_animations_effect_timing_duration.html | 86 +
.../file_animations_effect_timing_enddelay.html | 146 +
.../file_animations_effect_timing_iterations.html | 73 +
.../style/test/file_animations_iterationstart.html | 60 +
layout/style/test/file_animations_pausing.html | 85 +
.../style/test/file_animations_playbackrate.html | 102 +
.../test/file_animations_styles_on_event.html | 70 +
.../file_animations_with_disabled_properties.html | 50 +
layout/style/test/file_bug1055933_circle-xxl.png | Bin 0 -> 4857 bytes
layout/style/test/file_bug1089417_iframe.html | 17 +
layout/style/test/file_bug645998-1.css | 1 +
layout/style/test/file_bug645998-2.css | 1 +
layout/style/test/file_bug829816.css | Bin 0 -> 76 bytes
.../style/test/file_font_loading_api_vframe.html | 2 +
...file_transitions_replacement_on_busy_frame.html | 93 +
.../file_transitions_with_disabled_properties.html | 46 +
layout/style/test/flexbox_layout_testcases.js | 1398 ++++
layout/style/test/gen-css-properties.py | 24 +
.../test/media_queries_dynamic_xbl_binding.xml | 13 +
.../test/media_queries_dynamic_xbl_iframe.html | 5 +
.../style/test/media_queries_dynamic_xbl_style.css | 6 +
layout/style/test/media_queries_iframe.html | 15 +
layout/style/test/mochitest.ini | 312 +
layout/style/test/moz.build | 126 +
layout/style/test/neverending_font_load.sjs | 6 +
layout/style/test/neverending_stylesheet_load.sjs | 6 +
.../style/test/newtab_share_rule_processors.html | 22 +
layout/style/test/post-redirect-1.css | 1 +
layout/style/test/post-redirect-2.css | 1 +
layout/style/test/post-redirect-3.css | 1 +
layout/style/test/property_database.js | 7917 ++++++++++++++++++++
layout/style/test/redirect.sjs | 5 +
layout/style/test/redundant_font_download.sjs | 60 +
layout/style/test/style_attribute_tests.js | 27 +
.../style/test/support/external-variable-url.css | 3 +
layout/style/test/test_acid3_test46.html | 141 +
layout/style/test/test_addSheet.html | 46 +
layout/style/test/test_additional_sheets.html | 314 +
.../test/test_align_justify_computed_values.html | 529 ++
.../test/test_align_shorthand_serialization.html | 123 +
layout/style/test/test_all_shorthand.html | 159 +
layout/style/test/test_animations.html | 2047 +++++
layout/style/test/test_animations_async_tests.html | 26 +
.../test/test_animations_dynamic_changes.html | 65 +
.../test_animations_effect_timing_duration.html | 24 +
.../test_animations_effect_timing_enddelay.html | 24 +
.../test_animations_effect_timing_iterations.html | 24 +
.../test_animations_event_handler_attribute.html | 147 +
layout/style/test/test_animations_event_order.html | 585 ++
.../style/test/test_animations_iterationstart.html | 28 +
layout/style/test/test_animations_omta.html | 2392 ++++++
layout/style/test/test_animations_omta_start.html | 189 +
layout/style/test/test_animations_pausing.html | 28 +
.../style/test/test_animations_playbackrate.html | 28 +
.../test/test_animations_styles_on_event.html | 28 +
.../test_animations_with_disabled_properties.html | 34 +
layout/style/test/test_any_dynamic.html | 49 +
layout/style/test/test_asyncopen2.html | 54 +
.../style/test/test_at_rule_parse_serialize.html | 43 +
.../test/test_attribute_selector_eof_behavior.html | 18 +
layout/style/test/test_background_blend_mode.html | 58 +
layout/style/test/test_box_size_keywords.html | 172 +
layout/style/test/test_bug1055933.html | 42 +
layout/style/test/test_bug1089417.html | 47 +
layout/style/test/test_bug1112014.html | 127 +
layout/style/test/test_bug1203766.html | 112 +
layout/style/test/test_bug1232829.html | 38 +
layout/style/test/test_bug1292447.html | 377 +
layout/style/test/test_bug160403.html | 73 +
layout/style/test/test_bug200089.html | 30 +
layout/style/test/test_bug221428.html | 68 +
layout/style/test/test_bug229915.html | 95 +
layout/style/test/test_bug302186.html | 508 ++
layout/style/test/test_bug319381.html | 89 +
layout/style/test/test_bug357614.html | 73 +
layout/style/test/test_bug363146.html | 62 +
layout/style/test/test_bug372770.html | 91 +
layout/style/test/test_bug373293.html | 29 +
layout/style/test/test_bug377947.html | 107 +
layout/style/test/test_bug379440.html | 72 +
layout/style/test/test_bug379741.html | 43 +
layout/style/test/test_bug382027.html | 37 +
layout/style/test/test_bug383075.html | 84 +
layout/style/test/test_bug387615.html | 53 +
layout/style/test/test_bug389464.html | 48 +
layout/style/test/test_bug391034.html | 71 +
layout/style/test/test_bug391221.html | 43 +
layout/style/test/test_bug397427.html | 91 +
layout/style/test/test_bug399349.html | 80 +
layout/style/test/test_bug401046.html | 82 +
layout/style/test/test_bug405818.html | 72 +
layout/style/test/test_bug412901.html | 42 +
layout/style/test/test_bug413958.html | 78 +
layout/style/test/test_bug418986-2.html | 33 +
layout/style/test/test_bug437915.html | 70 +
layout/style/test/test_bug450191.html | 64 +
layout/style/test/test_bug453896_deck.html | 42 +
layout/style/test/test_bug470769.html | 31 +
layout/style/test/test_bug499655.html | 45 +
layout/style/test/test_bug499655.xhtml | 48 +
layout/style/test/test_bug511909.html | 205 +
layout/style/test/test_bug517224.html | 45 +
layout/style/test/test_bug524175.html | 28 +
layout/style/test/test_bug525952.html | 46 +
layout/style/test/test_bug534804.html | 89 +
layout/style/test/test_bug573255.html | 32 +
layout/style/test/test_bug580685.html | 41 +
layout/style/test/test_bug621351.html | 35 +
layout/style/test/test_bug635286.html | 52 +
layout/style/test/test_bug645998.html | 29 +
layout/style/test/test_bug652486.html | 212 +
layout/style/test/test_bug657143.html | 132 +
layout/style/test/test_bug664955.html | 37 +
layout/style/test/test_bug667520.html | 50 +
layout/style/test/test_bug716226.html | 52 +
layout/style/test/test_bug732153.html | 22 +
layout/style/test/test_bug732209.html | 95 +
layout/style/test/test_bug73586.html | 192 +
layout/style/test/test_bug74880.html | 125 +
layout/style/test/test_bug765590.html | 21 +
layout/style/test/test_bug771043.html | 69 +
layout/style/test/test_bug795520.html | 39 +
layout/style/test/test_bug798567.html | 26 +
layout/style/test/test_bug798843_pref.html | 57 +
layout/style/test/test_bug829816.html | 56 +
layout/style/test/test_bug874919.html | 55 +
...st_bug887741_at-rules_in_declaration_lists.html | 75 +
layout/style/test/test_bug892929.html | 74 +
layout/style/test/test_bug98997.html | 144 +
layout/style/test/test_cascade.html | 91 +
layout/style/test/test_ch_ex_no_infloops.html | 61 +
.../style/test/test_change_hint_optimizations.html | 57 +
layout/style/test/test_clip-path_polygon.html | 41 +
.../test/test_compute_data_with_start_struct.html | 109 +
layout/style/test/test_computed_style.html | 413 +
.../test/test_computed_style_min_size_auto.html | 133 +
.../style/test/test_computed_style_no_pseudo.html | 44 +
layout/style/test/test_computed_style_prefs.html | 99 +
layout/style/test/test_condition_text.html | 93 +
.../style/test/test_condition_text_assignment.html | 59 +
.../test/test_contain_formatting_context.html | 40 +
.../test/test_counter_descriptor_storage.html | 267 +
layout/style/test/test_counter_style.html | 121 +
layout/style/test/test_css_cross_domain.html | 99 +
layout/style/test/test_css_eof_handling.html | 278 +
layout/style/test/test_css_escape_api.html | 94 +
.../test_css_function_mismatched_parenthesis.html | 63 +
.../test/test_css_loader_crossorigin_data_url.html | 17 +
layout/style/test/test_css_supports.html | 134 +
layout/style/test/test_css_supports_variables.html | 247 +
layout/style/test/test_csslexer.js | 171 +
layout/style/test/test_default_bidi_css.html | 79 +
layout/style/test/test_default_computed_style.html | 58 +
layout/style/test/test_descriptor_storage.html | 119 +
.../style/test/test_descriptor_syntax_errors.html | 53 +
.../style/test/test_dont_use_document_colors.html | 186 +
.../test/test_dynamic_change_causing_reflow.html | 173 +
layout/style/test/test_exposed_prop_accessors.html | 41 +
layout/style/test/test_extra_inherit_initial.html | 109 +
.../test/test_flexbox_child_display_values.xhtml | 189 +
.../test/test_flexbox_flex_grow_and_shrink.html | 154 +
layout/style/test/test_flexbox_flex_shorthand.html | 280 +
layout/style/test/test_flexbox_layout.html | 184 +
layout/style/test/test_flexbox_order.html | 194 +
layout/style/test/test_flexbox_order_abspos.html | 217 +
layout/style/test/test_flexbox_order_table.html | 198 +
layout/style/test/test_flexbox_reflow_counts.html | 137 +
layout/style/test/test_font_face_parser.html | 382 +
layout/style/test/test_font_family_parsing.html | 276 +
.../test/test_font_feature_values_parsing.html | 356 +
layout/style/test/test_font_loading_api.html | 1897 +++++
.../test/test_garbage_at_end_of_declarations.html | 151 +
layout/style/test/test_grid_computed_values.html | 106 +
.../style/test/test_grid_container_shorthands.html | 282 +
layout/style/test/test_grid_item_shorthands.html | 153 +
.../test/test_grid_shorthand_serialization.html | 236 +
layout/style/test/test_group_insertRule.html | 243 +
layout/style/test/test_hover_quirk.html | 82 +
.../test/test_html_attribute_computed_values.html | 84 +
layout/style/test/test_ident_escaping.html | 56 +
layout/style/test/test_inherit_computation.html | 159 +
layout/style/test/test_inherit_storage.html | 116 +
layout/style/test/test_initial_computation.html | 163 +
layout/style/test/test_initial_storage.html | 130 +
layout/style/test/test_keyframes_rules.html | 134 +
.../test/test_load_events_on_stylesheets.html | 152 +
layout/style/test/test_logical_properties.html | 422 ++
layout/style/test/test_media_queries.html | 845 +++
layout/style/test/test_media_queries_dynamic.html | 213 +
.../style/test/test_media_queries_dynamic_xbl.html | 40 +
layout/style/test/test_media_query_list.html | 367 +
layout/style/test/test_moz_device_pixel_ratio.html | 77 +
layout/style/test/test_namespace_rule.html | 462 ++
layout/style/test/test_of_type_selectors.xhtml | 98 +
layout/style/test/test_page_parser.html | 107 +
layout/style/test/test_parse_eof.html | 69 +
layout/style/test/test_parse_ident.html | 56 +
layout/style/test/test_parse_rule.html | 256 +
layout/style/test/test_parse_url.html | 195 +
.../test/test_parser_diagnostics_unprintables.html | 220 +
layout/style/test/test_pixel_lengths.html | 75 +
layout/style/test/test_pointer-events.html | 114 +
layout/style/test/test_position_float_display.html | 107 +
layout/style/test/test_position_sticky.html | 89 +
layout/style/test/test_priority_preservation.html | 141 +
layout/style/test/test_property_database.html | 170 +
layout/style/test/test_property_syntax_errors.html | 153 +
layout/style/test/test_pseudoelement_parsing.html | 43 +
layout/style/test/test_pseudoelement_state.html | 164 +
.../style/test/test_redundant_font_download.html | 130 +
layout/style/test/test_rem_unit.html | 80 +
.../test/test_restyles_in_smil_animation.html | 113 +
layout/style/test/test_root_node_display.html | 67 +
layout/style/test/test_rule_insertion.html | 240 +
layout/style/test/test_rule_serialization.html | 53 +
layout/style/test/test_rules_out_of_sheets.html | 115 +
layout/style/test/test_selectors.html | 1297 ++++
.../test/test_selectors_on_anonymous_content.html | 78 +
layout/style/test/test_setPropertyWithNull.html | 47 +
.../test/test_shorthand_property_getters.html | 268 +
.../test/test_specified_value_serialization.html | 105 +
layout/style/test/test_style_attribute_quirks.html | 18 +
.../style/test/test_style_attribute_standards.html | 19 +
.../test/test_style_struct_copy_constructors.html | 93 +
layout/style/test/test_supports_rules.html | 88 +
.../style/test/test_system_font_serialization.html | 59 +
.../test/test_text_decoration_shorthands.html | 93 +
layout/style/test/test_transitions.html | 787 ++
.../style/test/test_transitions_and_reframes.html | 298 +
.../style/test/test_transitions_and_restyles.html | 48 +
layout/style/test/test_transitions_and_zoom.html | 49 +
layout/style/test/test_transitions_bug537151.html | 51 +
.../test/test_transitions_cancel_near_end.html | 82 +
...st_transitions_computed_value_combinations.html | 170 +
.../test/test_transitions_computed_values.html | 113 +
.../test/test_transitions_dynamic_changes.html | 106 +
layout/style/test/test_transitions_events.html | 282 +
.../style/test/test_transitions_per_property.html | 2565 +++++++
...test_transitions_replacement_on_busy_frame.html | 30 +
.../test/test_transitions_step_functions.html | 93 +
.../test_transitions_with_disabled_properties.html | 28 +
layout/style/test/test_unclosed_parentheses.html | 289 +
layout/style/test/test_unicode_range_loading.html | 366 +
layout/style/test/test_units_angle.html | 52 +
layout/style/test/test_units_frequency.html | 56 +
layout/style/test/test_units_length.html | 59 +
layout/style/test/test_units_time.html | 47 +
layout/style/test/test_unprefixing_service.html | 93 +
.../style/test/test_unprefixing_service_prefs.html | 132 +
layout/style/test/test_value_cloning.html | 182 +
layout/style/test/test_value_computation.html | 249 +
layout/style/test/test_value_storage.html | 352 +
.../test/test_variable_serialization_computed.html | 82 +
.../test_variable_serialization_specified.html | 117 +
layout/style/test/test_variables.html | 125 +
layout/style/test/test_video_object_fit.html | 53 +
layout/style/test/test_viewport_units.html | 66 +
layout/style/test/test_visited_image_loading.html | 67 +
.../test/test_visited_image_loading_empty.html | 67 +
layout/style/test/test_visited_lying.html | 97 +
layout/style/test/test_visited_pref.html | 112 +
layout/style/test/test_visited_reftests.html | 210 +
.../style/test/test_webkit_device_pixel_ratio.html | 77 +
layout/style/test/test_webkit_flex_display.html | 48 +
layout/style/test/unprefixing_service_iframe.html | 394 +
layout/style/test/unprefixing_service_utils.js | 87 +
layout/style/test/unstyled-frame.css | 0
layout/style/test/unstyled-frame.xml | 4 +
layout/style/test/unstyled.css | 2 +
layout/style/test/unstyled.xml | 3 +
layout/style/test/viewport_units_iframe.html | 6 +
layout/style/test/visited-lying-inner.html | 8 +
layout/style/test/visited-pref-iframe.html | 7 +
layout/style/test/visited_image_loading.sjs | 60 +
layout/style/test/visited_image_loading_frame.html | 15 +
.../test/visited_image_loading_frame_empty.html | 15 +
layout/style/test/xbl_bindings.xml | 9 +
layout/style/test/xpcshell.ini | 5 +
317 files changed, 52497 insertions(+)
create mode 100644 layout/style/test/BitPattern.woff
create mode 100644 layout/style/test/ListCSSProperties.cpp
create mode 100644 layout/style/test/ParseCSS.cpp
create mode 100644 layout/style/test/TestCSSPropertyLookup.cpp
create mode 100644 layout/style/test/additional_sheets_helper.html
create mode 100644 layout/style/test/animation_utils.js
create mode 100644 layout/style/test/browser.ini
create mode 100644 layout/style/test/browser_bug453896.js
create mode 100644 layout/style/test/browser_newtab_share_rule_processors.js
create mode 100644 layout/style/test/bug453896_iframe.html
create mode 100644 layout/style/test/bug517224.sjs
create mode 100644 layout/style/test/bug732209-css.sjs
create mode 100644 layout/style/test/ccd-quirks.html
create mode 100644 layout/style/test/ccd-standards.html
create mode 100644 layout/style/test/ccd.sjs
create mode 100644 layout/style/test/chrome/bug418986-2.js
create mode 100644 layout/style/test/chrome/bug535806-css.css
create mode 100644 layout/style/test/chrome/bug535806-html.html
create mode 100644 layout/style/test/chrome/bug535806-xul.xul
create mode 100644 layout/style/test/chrome/chrome.ini
create mode 100644 layout/style/test/chrome/hover_empty.html
create mode 100644 layout/style/test/chrome/hover_helper.html
create mode 100644 layout/style/test/chrome/match.png
create mode 100644 layout/style/test/chrome/mismatch.png
create mode 100644 layout/style/test/chrome/moz_document_helper.html
create mode 100644 layout/style/test/chrome/test_author_specified_style.html
create mode 100644 layout/style/test/chrome/test_bug1157097.html
create mode 100644 layout/style/test/chrome/test_bug1160724.xul
create mode 100644 layout/style/test/chrome/test_bug418986-2.xul
create mode 100644 layout/style/test/chrome/test_bug535806.xul
create mode 100644 layout/style/test/chrome/test_display_mode.html
create mode 100644 layout/style/test/chrome/test_display_mode_reflow.html
create mode 100644 layout/style/test/chrome/test_hover.html
create mode 100644 layout/style/test/chrome/test_moz_document_rules.html
create mode 100644 layout/style/test/css_properties_like_longhand.js
create mode 100644 layout/style/test/descriptor_database.js
create mode 100644 layout/style/test/display_mode_reflow_iframe.html
create mode 100644 layout/style/test/empty.html
create mode 100644 layout/style/test/file_animations_async_tests.html
create mode 100644 layout/style/test/file_animations_effect_timing_duration.html
create mode 100644 layout/style/test/file_animations_effect_timing_enddelay.html
create mode 100644 layout/style/test/file_animations_effect_timing_iterations.html
create mode 100644 layout/style/test/file_animations_iterationstart.html
create mode 100644 layout/style/test/file_animations_pausing.html
create mode 100644 layout/style/test/file_animations_playbackrate.html
create mode 100644 layout/style/test/file_animations_styles_on_event.html
create mode 100644 layout/style/test/file_animations_with_disabled_properties.html
create mode 100644 layout/style/test/file_bug1055933_circle-xxl.png
create mode 100644 layout/style/test/file_bug1089417_iframe.html
create mode 100644 layout/style/test/file_bug645998-1.css
create mode 100644 layout/style/test/file_bug645998-2.css
create mode 100644 layout/style/test/file_bug829816.css
create mode 100644 layout/style/test/file_font_loading_api_vframe.html
create mode 100644 layout/style/test/file_transitions_replacement_on_busy_frame.html
create mode 100644 layout/style/test/file_transitions_with_disabled_properties.html
create mode 100644 layout/style/test/flexbox_layout_testcases.js
create mode 100644 layout/style/test/gen-css-properties.py
create mode 100644 layout/style/test/media_queries_dynamic_xbl_binding.xml
create mode 100644 layout/style/test/media_queries_dynamic_xbl_iframe.html
create mode 100644 layout/style/test/media_queries_dynamic_xbl_style.css
create mode 100644 layout/style/test/media_queries_iframe.html
create mode 100644 layout/style/test/mochitest.ini
create mode 100644 layout/style/test/moz.build
create mode 100644 layout/style/test/neverending_font_load.sjs
create mode 100644 layout/style/test/neverending_stylesheet_load.sjs
create mode 100644 layout/style/test/newtab_share_rule_processors.html
create mode 100644 layout/style/test/post-redirect-1.css
create mode 100644 layout/style/test/post-redirect-2.css
create mode 100644 layout/style/test/post-redirect-3.css
create mode 100644 layout/style/test/property_database.js
create mode 100644 layout/style/test/redirect.sjs
create mode 100644 layout/style/test/redundant_font_download.sjs
create mode 100644 layout/style/test/style_attribute_tests.js
create mode 100644 layout/style/test/support/external-variable-url.css
create mode 100644 layout/style/test/test_acid3_test46.html
create mode 100644 layout/style/test/test_addSheet.html
create mode 100644 layout/style/test/test_additional_sheets.html
create mode 100644 layout/style/test/test_align_justify_computed_values.html
create mode 100644 layout/style/test/test_align_shorthand_serialization.html
create mode 100644 layout/style/test/test_all_shorthand.html
create mode 100644 layout/style/test/test_animations.html
create mode 100644 layout/style/test/test_animations_async_tests.html
create mode 100644 layout/style/test/test_animations_dynamic_changes.html
create mode 100644 layout/style/test/test_animations_effect_timing_duration.html
create mode 100644 layout/style/test/test_animations_effect_timing_enddelay.html
create mode 100644 layout/style/test/test_animations_effect_timing_iterations.html
create mode 100644 layout/style/test/test_animations_event_handler_attribute.html
create mode 100644 layout/style/test/test_animations_event_order.html
create mode 100644 layout/style/test/test_animations_iterationstart.html
create mode 100644 layout/style/test/test_animations_omta.html
create mode 100644 layout/style/test/test_animations_omta_start.html
create mode 100644 layout/style/test/test_animations_pausing.html
create mode 100644 layout/style/test/test_animations_playbackrate.html
create mode 100644 layout/style/test/test_animations_styles_on_event.html
create mode 100644 layout/style/test/test_animations_with_disabled_properties.html
create mode 100644 layout/style/test/test_any_dynamic.html
create mode 100644 layout/style/test/test_asyncopen2.html
create mode 100644 layout/style/test/test_at_rule_parse_serialize.html
create mode 100644 layout/style/test/test_attribute_selector_eof_behavior.html
create mode 100644 layout/style/test/test_background_blend_mode.html
create mode 100644 layout/style/test/test_box_size_keywords.html
create mode 100644 layout/style/test/test_bug1055933.html
create mode 100644 layout/style/test/test_bug1089417.html
create mode 100644 layout/style/test/test_bug1112014.html
create mode 100644 layout/style/test/test_bug1203766.html
create mode 100644 layout/style/test/test_bug1232829.html
create mode 100644 layout/style/test/test_bug1292447.html
create mode 100644 layout/style/test/test_bug160403.html
create mode 100644 layout/style/test/test_bug200089.html
create mode 100644 layout/style/test/test_bug221428.html
create mode 100644 layout/style/test/test_bug229915.html
create mode 100644 layout/style/test/test_bug302186.html
create mode 100644 layout/style/test/test_bug319381.html
create mode 100644 layout/style/test/test_bug357614.html
create mode 100644 layout/style/test/test_bug363146.html
create mode 100644 layout/style/test/test_bug372770.html
create mode 100644 layout/style/test/test_bug373293.html
create mode 100644 layout/style/test/test_bug377947.html
create mode 100644 layout/style/test/test_bug379440.html
create mode 100644 layout/style/test/test_bug379741.html
create mode 100644 layout/style/test/test_bug382027.html
create mode 100644 layout/style/test/test_bug383075.html
create mode 100644 layout/style/test/test_bug387615.html
create mode 100644 layout/style/test/test_bug389464.html
create mode 100644 layout/style/test/test_bug391034.html
create mode 100644 layout/style/test/test_bug391221.html
create mode 100644 layout/style/test/test_bug397427.html
create mode 100644 layout/style/test/test_bug399349.html
create mode 100644 layout/style/test/test_bug401046.html
create mode 100644 layout/style/test/test_bug405818.html
create mode 100644 layout/style/test/test_bug412901.html
create mode 100644 layout/style/test/test_bug413958.html
create mode 100644 layout/style/test/test_bug418986-2.html
create mode 100644 layout/style/test/test_bug437915.html
create mode 100644 layout/style/test/test_bug450191.html
create mode 100644 layout/style/test/test_bug453896_deck.html
create mode 100644 layout/style/test/test_bug470769.html
create mode 100644 layout/style/test/test_bug499655.html
create mode 100644 layout/style/test/test_bug499655.xhtml
create mode 100644 layout/style/test/test_bug511909.html
create mode 100644 layout/style/test/test_bug517224.html
create mode 100644 layout/style/test/test_bug524175.html
create mode 100644 layout/style/test/test_bug525952.html
create mode 100644 layout/style/test/test_bug534804.html
create mode 100644 layout/style/test/test_bug573255.html
create mode 100644 layout/style/test/test_bug580685.html
create mode 100644 layout/style/test/test_bug621351.html
create mode 100644 layout/style/test/test_bug635286.html
create mode 100644 layout/style/test/test_bug645998.html
create mode 100644 layout/style/test/test_bug652486.html
create mode 100644 layout/style/test/test_bug657143.html
create mode 100644 layout/style/test/test_bug664955.html
create mode 100644 layout/style/test/test_bug667520.html
create mode 100644 layout/style/test/test_bug716226.html
create mode 100644 layout/style/test/test_bug732153.html
create mode 100644 layout/style/test/test_bug732209.html
create mode 100644 layout/style/test/test_bug73586.html
create mode 100644 layout/style/test/test_bug74880.html
create mode 100644 layout/style/test/test_bug765590.html
create mode 100644 layout/style/test/test_bug771043.html
create mode 100644 layout/style/test/test_bug795520.html
create mode 100644 layout/style/test/test_bug798567.html
create mode 100644 layout/style/test/test_bug798843_pref.html
create mode 100644 layout/style/test/test_bug829816.html
create mode 100644 layout/style/test/test_bug874919.html
create mode 100644 layout/style/test/test_bug887741_at-rules_in_declaration_lists.html
create mode 100644 layout/style/test/test_bug892929.html
create mode 100644 layout/style/test/test_bug98997.html
create mode 100644 layout/style/test/test_cascade.html
create mode 100644 layout/style/test/test_ch_ex_no_infloops.html
create mode 100644 layout/style/test/test_change_hint_optimizations.html
create mode 100644 layout/style/test/test_clip-path_polygon.html
create mode 100644 layout/style/test/test_compute_data_with_start_struct.html
create mode 100644 layout/style/test/test_computed_style.html
create mode 100644 layout/style/test/test_computed_style_min_size_auto.html
create mode 100644 layout/style/test/test_computed_style_no_pseudo.html
create mode 100644 layout/style/test/test_computed_style_prefs.html
create mode 100644 layout/style/test/test_condition_text.html
create mode 100644 layout/style/test/test_condition_text_assignment.html
create mode 100644 layout/style/test/test_contain_formatting_context.html
create mode 100644 layout/style/test/test_counter_descriptor_storage.html
create mode 100644 layout/style/test/test_counter_style.html
create mode 100644 layout/style/test/test_css_cross_domain.html
create mode 100644 layout/style/test/test_css_eof_handling.html
create mode 100644 layout/style/test/test_css_escape_api.html
create mode 100644 layout/style/test/test_css_function_mismatched_parenthesis.html
create mode 100644 layout/style/test/test_css_loader_crossorigin_data_url.html
create mode 100644 layout/style/test/test_css_supports.html
create mode 100644 layout/style/test/test_css_supports_variables.html
create mode 100644 layout/style/test/test_csslexer.js
create mode 100644 layout/style/test/test_default_bidi_css.html
create mode 100644 layout/style/test/test_default_computed_style.html
create mode 100644 layout/style/test/test_descriptor_storage.html
create mode 100644 layout/style/test/test_descriptor_syntax_errors.html
create mode 100644 layout/style/test/test_dont_use_document_colors.html
create mode 100644 layout/style/test/test_dynamic_change_causing_reflow.html
create mode 100644 layout/style/test/test_exposed_prop_accessors.html
create mode 100644 layout/style/test/test_extra_inherit_initial.html
create mode 100644 layout/style/test/test_flexbox_child_display_values.xhtml
create mode 100644 layout/style/test/test_flexbox_flex_grow_and_shrink.html
create mode 100644 layout/style/test/test_flexbox_flex_shorthand.html
create mode 100644 layout/style/test/test_flexbox_layout.html
create mode 100644 layout/style/test/test_flexbox_order.html
create mode 100644 layout/style/test/test_flexbox_order_abspos.html
create mode 100644 layout/style/test/test_flexbox_order_table.html
create mode 100644 layout/style/test/test_flexbox_reflow_counts.html
create mode 100644 layout/style/test/test_font_face_parser.html
create mode 100644 layout/style/test/test_font_family_parsing.html
create mode 100644 layout/style/test/test_font_feature_values_parsing.html
create mode 100644 layout/style/test/test_font_loading_api.html
create mode 100644 layout/style/test/test_garbage_at_end_of_declarations.html
create mode 100644 layout/style/test/test_grid_computed_values.html
create mode 100644 layout/style/test/test_grid_container_shorthands.html
create mode 100644 layout/style/test/test_grid_item_shorthands.html
create mode 100644 layout/style/test/test_grid_shorthand_serialization.html
create mode 100644 layout/style/test/test_group_insertRule.html
create mode 100644 layout/style/test/test_hover_quirk.html
create mode 100644 layout/style/test/test_html_attribute_computed_values.html
create mode 100644 layout/style/test/test_ident_escaping.html
create mode 100644 layout/style/test/test_inherit_computation.html
create mode 100644 layout/style/test/test_inherit_storage.html
create mode 100644 layout/style/test/test_initial_computation.html
create mode 100644 layout/style/test/test_initial_storage.html
create mode 100644 layout/style/test/test_keyframes_rules.html
create mode 100644 layout/style/test/test_load_events_on_stylesheets.html
create mode 100644 layout/style/test/test_logical_properties.html
create mode 100644 layout/style/test/test_media_queries.html
create mode 100644 layout/style/test/test_media_queries_dynamic.html
create mode 100644 layout/style/test/test_media_queries_dynamic_xbl.html
create mode 100644 layout/style/test/test_media_query_list.html
create mode 100644 layout/style/test/test_moz_device_pixel_ratio.html
create mode 100644 layout/style/test/test_namespace_rule.html
create mode 100644 layout/style/test/test_of_type_selectors.xhtml
create mode 100644 layout/style/test/test_page_parser.html
create mode 100644 layout/style/test/test_parse_eof.html
create mode 100644 layout/style/test/test_parse_ident.html
create mode 100644 layout/style/test/test_parse_rule.html
create mode 100644 layout/style/test/test_parse_url.html
create mode 100644 layout/style/test/test_parser_diagnostics_unprintables.html
create mode 100644 layout/style/test/test_pixel_lengths.html
create mode 100644 layout/style/test/test_pointer-events.html
create mode 100644 layout/style/test/test_position_float_display.html
create mode 100644 layout/style/test/test_position_sticky.html
create mode 100644 layout/style/test/test_priority_preservation.html
create mode 100644 layout/style/test/test_property_database.html
create mode 100644 layout/style/test/test_property_syntax_errors.html
create mode 100644 layout/style/test/test_pseudoelement_parsing.html
create mode 100644 layout/style/test/test_pseudoelement_state.html
create mode 100644 layout/style/test/test_redundant_font_download.html
create mode 100644 layout/style/test/test_rem_unit.html
create mode 100644 layout/style/test/test_restyles_in_smil_animation.html
create mode 100644 layout/style/test/test_root_node_display.html
create mode 100644 layout/style/test/test_rule_insertion.html
create mode 100644 layout/style/test/test_rule_serialization.html
create mode 100644 layout/style/test/test_rules_out_of_sheets.html
create mode 100644 layout/style/test/test_selectors.html
create mode 100644 layout/style/test/test_selectors_on_anonymous_content.html
create mode 100644 layout/style/test/test_setPropertyWithNull.html
create mode 100644 layout/style/test/test_shorthand_property_getters.html
create mode 100644 layout/style/test/test_specified_value_serialization.html
create mode 100644 layout/style/test/test_style_attribute_quirks.html
create mode 100644 layout/style/test/test_style_attribute_standards.html
create mode 100644 layout/style/test/test_style_struct_copy_constructors.html
create mode 100644 layout/style/test/test_supports_rules.html
create mode 100644 layout/style/test/test_system_font_serialization.html
create mode 100644 layout/style/test/test_text_decoration_shorthands.html
create mode 100644 layout/style/test/test_transitions.html
create mode 100644 layout/style/test/test_transitions_and_reframes.html
create mode 100644 layout/style/test/test_transitions_and_restyles.html
create mode 100644 layout/style/test/test_transitions_and_zoom.html
create mode 100644 layout/style/test/test_transitions_bug537151.html
create mode 100644 layout/style/test/test_transitions_cancel_near_end.html
create mode 100644 layout/style/test/test_transitions_computed_value_combinations.html
create mode 100644 layout/style/test/test_transitions_computed_values.html
create mode 100644 layout/style/test/test_transitions_dynamic_changes.html
create mode 100644 layout/style/test/test_transitions_events.html
create mode 100644 layout/style/test/test_transitions_per_property.html
create mode 100644 layout/style/test/test_transitions_replacement_on_busy_frame.html
create mode 100644 layout/style/test/test_transitions_step_functions.html
create mode 100644 layout/style/test/test_transitions_with_disabled_properties.html
create mode 100644 layout/style/test/test_unclosed_parentheses.html
create mode 100644 layout/style/test/test_unicode_range_loading.html
create mode 100644 layout/style/test/test_units_angle.html
create mode 100644 layout/style/test/test_units_frequency.html
create mode 100644 layout/style/test/test_units_length.html
create mode 100644 layout/style/test/test_units_time.html
create mode 100644 layout/style/test/test_unprefixing_service.html
create mode 100644 layout/style/test/test_unprefixing_service_prefs.html
create mode 100644 layout/style/test/test_value_cloning.html
create mode 100644 layout/style/test/test_value_computation.html
create mode 100644 layout/style/test/test_value_storage.html
create mode 100644 layout/style/test/test_variable_serialization_computed.html
create mode 100644 layout/style/test/test_variable_serialization_specified.html
create mode 100644 layout/style/test/test_variables.html
create mode 100644 layout/style/test/test_video_object_fit.html
create mode 100644 layout/style/test/test_viewport_units.html
create mode 100644 layout/style/test/test_visited_image_loading.html
create mode 100644 layout/style/test/test_visited_image_loading_empty.html
create mode 100644 layout/style/test/test_visited_lying.html
create mode 100644 layout/style/test/test_visited_pref.html
create mode 100644 layout/style/test/test_visited_reftests.html
create mode 100644 layout/style/test/test_webkit_device_pixel_ratio.html
create mode 100644 layout/style/test/test_webkit_flex_display.html
create mode 100644 layout/style/test/unprefixing_service_iframe.html
create mode 100644 layout/style/test/unprefixing_service_utils.js
create mode 100644 layout/style/test/unstyled-frame.css
create mode 100644 layout/style/test/unstyled-frame.xml
create mode 100644 layout/style/test/unstyled.css
create mode 100644 layout/style/test/unstyled.xml
create mode 100644 layout/style/test/viewport_units_iframe.html
create mode 100644 layout/style/test/visited-lying-inner.html
create mode 100644 layout/style/test/visited-pref-iframe.html
create mode 100644 layout/style/test/visited_image_loading.sjs
create mode 100644 layout/style/test/visited_image_loading_frame.html
create mode 100644 layout/style/test/visited_image_loading_frame_empty.html
create mode 100644 layout/style/test/xbl_bindings.xml
create mode 100644 layout/style/test/xpcshell.ini
(limited to 'layout/style/test')
diff --git a/layout/style/test/BitPattern.woff b/layout/style/test/BitPattern.woff
new file mode 100644
index 000000000..e4e824405
Binary files /dev/null and b/layout/style/test/BitPattern.woff differ
diff --git a/layout/style/test/ListCSSProperties.cpp b/layout/style/test/ListCSSProperties.cpp
new file mode 100644
index 000000000..718032f61
--- /dev/null
+++ b/layout/style/test/ListCSSProperties.cpp
@@ -0,0 +1,193 @@
+/* vim: set shiftwidth=4 tabstop=8 autoindent cindent expandtab: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* build (from code) lists of all supported CSS properties */
+
+#include
+#include
+#include
+#include "mozilla/ArrayUtils.h"
+
+struct PropertyInfo {
+ const char *propName;
+ const char *domName;
+ const char *pref;
+};
+
+const PropertyInfo gLonghandProperties[] = {
+
+#define CSS_PROP_PUBLIC_OR_PRIVATE(publicname_, privatename_) publicname_
+#define CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, \
+ stylestruct_, stylestructoffset_, animtype_) \
+ { #name_, #method_, pref_ },
+#define CSS_PROP_LIST_INCLUDE_LOGICAL
+
+#include "nsCSSPropList.h"
+
+#undef CSS_PROP_LIST_INCLUDE_LOGICAL
+#undef CSS_PROP
+#undef CSS_PROP_PUBLIC_OR_PRIVATE
+
+};
+
+/*
+ * These are the properties for which domName in the above list should
+ * be used. They're in the same order as the above list, with some
+ * items skipped.
+ */
+const char* gLonghandPropertiesWithDOMProp[] = {
+
+#define CSS_PROP_LIST_EXCLUDE_INTERNAL
+#define CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, \
+ stylestruct_, stylestructoffset_, animtype_) \
+ #name_,
+#define CSS_PROP_LIST_INCLUDE_LOGICAL
+
+#include "nsCSSPropList.h"
+
+#undef CSS_PROP_LIST_INCLUDE_LOGICAL
+#undef CSS_PROP
+#undef CSS_PROP_LIST_EXCLUDE_INTERNAL
+
+};
+
+const PropertyInfo gShorthandProperties[] = {
+
+#define CSS_PROP_PUBLIC_OR_PRIVATE(publicname_, privatename_) publicname_
+// Need an extra level of macro nesting to force expansion of method_
+// params before they get pasted.
+#define LISTCSSPROPERTIES_INNER_MACRO(method_) #method_
+#define CSS_PROP_SHORTHAND(name_, id_, method_, flags_, pref_) \
+ { #name_, LISTCSSPROPERTIES_INNER_MACRO(method_), pref_ },
+
+#include "nsCSSPropList.h"
+
+#undef CSS_PROP_SHORTHAND
+#undef LISTCSSPROPERTIES_INNER_MACRO
+#undef CSS_PROP_PUBLIC_OR_PRIVATE
+
+#define CSS_PROP_ALIAS(name_, id_, method_, pref_) \
+ { #name_, #method_, pref_ },
+
+#include "nsCSSPropAliasList.h"
+
+#undef CSS_PROP_ALIAS
+
+};
+
+/* see gLonghandPropertiesWithDOMProp */
+const char* gShorthandPropertiesWithDOMProp[] = {
+
+#define CSS_PROP_LIST_EXCLUDE_INTERNAL
+#define CSS_PROP_SHORTHAND(name_, id_, method_, flags_, pref_) \
+ #name_,
+
+#include "nsCSSPropList.h"
+
+#undef CSS_PROP_SHORTHAND
+#undef CSS_PROP_LIST_EXCLUDE_INTERNAL
+
+#define CSS_PROP_ALIAS(name_, id_, method_, pref_) \
+ #name_,
+
+#include "nsCSSPropAliasList.h"
+
+#undef CSS_PROP_ALIAS
+
+};
+
+const char *gInaccessibleProperties[] = {
+ // Don't print the properties that aren't accepted by the parser, per
+ // CSSParserImpl::ParseProperty
+ "-x-cols",
+ "-x-lang",
+ "-x-span",
+ "-x-system-font",
+ "-x-text-zoom",
+ "-moz-control-character-visibility",
+ "-moz-script-level", // parsed by UA sheets only
+ "-moz-script-size-multiplier",
+ "-moz-script-min-size",
+ "-moz-math-variant",
+ "-moz-math-display", // parsed by UA sheets only
+ "-moz-top-layer", // parsed by UA sheets only
+ "-moz-min-font-size-ratio", // parsed by UA sheets only
+ "-moz-window-shadow" // chrome-only internal properties
+};
+
+inline int
+is_inaccessible(const char* aPropName)
+{
+ for (unsigned j = 0; j < MOZ_ARRAY_LENGTH(gInaccessibleProperties); ++j) {
+ if (strcmp(aPropName, gInaccessibleProperties[j]) == 0)
+ return 1;
+ }
+ return 0;
+}
+
+void
+print_array(const char *aName,
+ const PropertyInfo *aProps, unsigned aPropsLength,
+ const char * const * aDOMProps, unsigned aDOMPropsLength)
+{
+ printf("var %s = [\n", aName);
+
+ int first = 1;
+ unsigned j = 0; // index into DOM prop list
+ for (unsigned i = 0; i < aPropsLength; ++i) {
+ const PropertyInfo *p = aProps + i;
+
+ if (is_inaccessible(p->propName))
+ // inaccessible properties never have DOM props, so don't
+ // worry about incrementing j. The assertion below will
+ // catch if they do.
+ continue;
+
+ if (first)
+ first = 0;
+ else
+ printf(",\n");
+
+ printf("\t{ name: \"%s\", prop: ", p->propName);
+ if (j >= aDOMPropsLength || strcmp(p->propName, aDOMProps[j]) != 0)
+ printf("null");
+ else {
+ ++j;
+ if (strncmp(p->domName, "Moz", 3) == 0)
+ printf("\"%s\"", p->domName);
+ else
+ // lowercase the first letter
+ printf("\"%c%s\"", p->domName[0] + 32, p->domName + 1);
+ }
+ if (p->pref[0]) {
+ printf(", pref: \"%s\"", p->pref);
+ }
+ printf(" }");
+ }
+
+ if (j != aDOMPropsLength) {
+ fprintf(stderr, "Assertion failure %s:%d\n", __FILE__, __LINE__);
+ fprintf(stderr, "j==%d, aDOMPropsLength == %d\n", j, aDOMPropsLength);
+ exit(1);
+ }
+
+ printf("\n];\n\n");
+}
+
+int
+main()
+{
+ print_array("gLonghandProperties",
+ gLonghandProperties,
+ MOZ_ARRAY_LENGTH(gLonghandProperties),
+ gLonghandPropertiesWithDOMProp,
+ MOZ_ARRAY_LENGTH(gLonghandPropertiesWithDOMProp));
+ print_array("gShorthandProperties",
+ gShorthandProperties,
+ MOZ_ARRAY_LENGTH(gShorthandProperties),
+ gShorthandPropertiesWithDOMProp,
+ MOZ_ARRAY_LENGTH(gShorthandPropertiesWithDOMProp));
+ return 0;
+}
diff --git a/layout/style/test/ParseCSS.cpp b/layout/style/test/ParseCSS.cpp
new file mode 100644
index 000000000..3f407c6f0
--- /dev/null
+++ b/layout/style/test/ParseCSS.cpp
@@ -0,0 +1,89 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+// vim:cindent:ts=8:et:sw=4:
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * This file is meant to be used with |#define CSS_REPORT_PARSE_ERRORS|
+ * in mozilla/dom/html/style/src/nsCSSScanner.h uncommented, and the
+ * |#ifdef DEBUG| block in nsCSSScanner::OutputError (in
+ * nsCSSScanner.cpp in the same directory) used (even if not a debug
+ * build).
+ */
+
+#include "nsXPCOM.h"
+#include "nsCOMPtr.h"
+
+#include "nsIFile.h"
+#include "nsNetUtil.h"
+
+#include "nsContentCID.h"
+#include "mozilla/StyleSheetInlines.h"
+#include "mozilla/css/Loader.h"
+
+using namespace mozilla;
+
+static already_AddRefed
+FileToURI(const char *aFilename, nsresult *aRv = 0)
+{
+ nsCOMPtr lf(do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, aRv));
+ NS_ENSURE_TRUE(lf, nullptr);
+ // XXX Handle relative paths somehow.
+ lf->InitWithNativePath(nsDependentCString(aFilename));
+
+ nsIURI *uri = nullptr;
+ nsresult rv = NS_NewFileURI(&uri, lf);
+ if (aRv)
+ *aRv = rv;
+ return uri;
+}
+
+static int
+ParseCSSFile(nsIURI *aSheetURI)
+{
+ RefPtr = new mozilla::css::Loader();
+ RefPtr sheet;
+ loader->LoadSheetSync(aSheetURI, getter_AddRefs(sheet));
+ NS_ASSERTION(sheet, "sheet load failed");
+ /* This can happen if the file can't be found (e.g. you
+ * ask for a relative path and xpcom/io rejects it)
+ */
+ if (!sheet)
+ return -1;
+ bool complete;
+ sheet->GetComplete(complete);
+ NS_ASSERTION(complete, "synchronous load did not complete");
+ if (!complete)
+ return -2;
+ return 0;
+}
+
+int main(int argc, char** argv)
+{
+ if (argc < 2) {
+ fprintf(stderr, "%s [FILE]...\n", argv[0]);
+ }
+ nsresult rv = NS_InitXPCOM2(nullptr, nullptr, nullptr);
+ if (NS_FAILED(rv))
+ return (int)rv;
+
+ int res = 0;
+ for (int i = 1; i < argc; ++i) {
+ const char *filename = argv[i];
+
+ printf("\nParsing %s.\n", filename);
+
+ nsCOMPtr uri = FileToURI(filename, &rv);
+ if (rv == NS_ERROR_OUT_OF_MEMORY) {
+ fprintf(stderr, "Out of memory.\n");
+ return 1;
+ }
+ if (uri)
+ res = ParseCSSFile(uri);
+ }
+
+ NS_ShutdownXPCOM(nullptr);
+
+ return res;
+}
diff --git a/layout/style/test/TestCSSPropertyLookup.cpp b/layout/style/test/TestCSSPropertyLookup.cpp
new file mode 100644
index 000000000..60a15311c
--- /dev/null
+++ b/layout/style/test/TestCSSPropertyLookup.cpp
@@ -0,0 +1,172 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include
+#include "plstr.h"
+#include "nsCSSProps.h"
+#include "nsCSSKeywords.h"
+#include "nsString.h"
+#include "nsXPCOM.h"
+
+using namespace mozilla;
+
+static const char* const kJunkNames[] = {
+ nullptr,
+ "",
+ "123",
+ "backgroundz",
+ "zzzzzz",
+ "#@$&@#*@*$@$#"
+};
+
+static bool
+TestProps()
+{
+ bool success = true;
+ nsCSSPropertyID id;
+ nsCSSPropertyID index;
+
+ // Everything appears to assert if we don't do this first...
+ nsCSSProps::AddRefTable();
+
+ // First make sure we can find all of the tags that are supposed to
+ // be in the table. Futz with the case to make sure any case will
+ // work
+ extern const char* const kCSSRawProperties[];
+ const char*const* et = &kCSSRawProperties[0];
+ const char*const* end = &kCSSRawProperties[eCSSProperty_COUNT];
+ index = eCSSProperty_UNKNOWN;
+ while (et < end) {
+ char tagName[100];
+ PL_strcpy(tagName, *et);
+ index = nsCSSPropertyID(int32_t(index) + 1);
+
+ id = nsCSSProps::LookupProperty(nsCString(tagName),
+ CSSEnabledState::eIgnoreEnabledState);
+ if (id == eCSSProperty_UNKNOWN) {
+ printf("bug: can't find '%s'\n", tagName);
+ success = false;
+ }
+ if (id != index) {
+ printf("bug: name='%s' id=%d index=%d\n", tagName, id, index);
+ success = false;
+ }
+
+ // fiddle with the case to make sure we can still find it
+ if (('a' <= tagName[0]) && (tagName[0] <= 'z')) {
+ tagName[0] = tagName[0] - 32;
+ }
+ id = nsCSSProps::LookupProperty(NS_ConvertASCIItoUTF16(tagName),
+ CSSEnabledState::eIgnoreEnabledState);
+ if (id < 0) {
+ printf("bug: can't find '%s'\n", tagName);
+ success = false;
+ }
+ if (index != id) {
+ printf("bug: name='%s' id=%d index=%d\n", tagName, id, index);
+ success = false;
+ }
+ et++;
+ }
+
+ // Now make sure we don't find some garbage
+ for (int i = 0; i < (int) (sizeof(kJunkNames) / sizeof(const char*)); i++) {
+ const char* const tag = kJunkNames[i];
+ id = nsCSSProps::LookupProperty(nsAutoCString(tag),
+ CSSEnabledState::eIgnoreEnabledState);
+ if (id >= 0) {
+ printf("bug: found '%s'\n", tag ? tag : "(null)");
+ success = false;
+ }
+ }
+
+ nsCSSProps::ReleaseTable();
+ return success;
+}
+
+bool
+TestKeywords()
+{
+ nsCSSKeywords::AddRefTable();
+
+ bool success = true;
+ nsCSSKeyword id;
+ nsCSSKeyword index;
+
+ extern const char* const kCSSRawKeywords[];
+
+ // First make sure we can find all of the tags that are supposed to
+ // be in the table. Futz with the case to make sure any case will
+ // work
+ const char*const* et = &kCSSRawKeywords[0];
+ const char*const* end = &kCSSRawKeywords[eCSSKeyword_COUNT - 1];
+ index = eCSSKeyword_UNKNOWN;
+ while (et < end) {
+ char tagName[512];
+ char* underscore = &(tagName[0]);
+
+ PL_strcpy(tagName, *et);
+ while (*underscore) {
+ if (*underscore == '_') {
+ *underscore = '-';
+ }
+ underscore++;
+ }
+ index = nsCSSKeyword(int32_t(index) + 1);
+
+ id = nsCSSKeywords::LookupKeyword(nsCString(tagName));
+ if (id <= eCSSKeyword_UNKNOWN) {
+ printf("bug: can't find '%s'\n", tagName);
+ success = false;
+ }
+ if (id != index) {
+ printf("bug: name='%s' id=%d index=%d\n", tagName, id, index);
+ success = false;
+ }
+
+ // fiddle with the case to make sure we can still find it
+ if (('a' <= tagName[0]) && (tagName[0] <= 'z')) {
+ tagName[0] = tagName[0] - 32;
+ }
+ id = nsCSSKeywords::LookupKeyword(nsCString(tagName));
+ if (id <= eCSSKeyword_UNKNOWN) {
+ printf("bug: can't find '%s'\n", tagName);
+ success = false;
+ }
+ if (id != index) {
+ printf("bug: name='%s' id=%d index=%d\n", tagName, id, index);
+ success = false;
+ }
+ et++;
+ }
+
+ // Now make sure we don't find some garbage
+ for (int i = 0; i < (int) (sizeof(kJunkNames) / sizeof(const char*)); i++) {
+ const char* const tag = kJunkNames[i];
+ id = nsCSSKeywords::LookupKeyword(nsAutoCString(tag));
+ if (eCSSKeyword_UNKNOWN < id) {
+ printf("bug: found '%s'\n", tag ? tag : "(null)");
+ success = false;
+ }
+ }
+
+ nsCSSKeywords::ReleaseTable();
+ return success;
+}
+
+int
+main(void)
+{
+ nsresult rv = NS_InitXPCOM2(nullptr, nullptr, nullptr);
+ NS_ENSURE_SUCCESS(rv, 2);
+
+ bool testOK = true;
+ testOK &= TestProps();
+ testOK &= TestKeywords();
+
+ rv = NS_ShutdownXPCOM(nullptr);
+ NS_ENSURE_SUCCESS(rv, 2);
+
+ return testOK ? 0 : 1;
+}
diff --git a/layout/style/test/additional_sheets_helper.html b/layout/style/test/additional_sheets_helper.html
new file mode 100644
index 000000000..306ddbf5b
--- /dev/null
+++ b/layout/style/test/additional_sheets_helper.html
@@ -0,0 +1,7 @@
+
+
+
+
+ some text
+
+
diff --git a/layout/style/test/animation_utils.js b/layout/style/test/animation_utils.js
new file mode 100644
index 000000000..131e9b755
--- /dev/null
+++ b/layout/style/test/animation_utils.js
@@ -0,0 +1,707 @@
+//----------------------------------------------------------------------
+//
+// Common testing functions
+//
+//----------------------------------------------------------------------
+
+function advance_clock(milliseconds) {
+ SpecialPowers.DOMWindowUtils.advanceTimeAndRefresh(milliseconds);
+}
+
+// Test-element creation/destruction and event checking
+(function() {
+ var gElem;
+ var gEventsReceived = [];
+
+ function new_div(style) {
+ return new_element("div", style);
+ }
+
+ // Creates a new |tagname| element with inline style |style| and appends
+ // it as a child of the element with ID 'display'.
+ // The element will also be given the class 'target' which can be used
+ // for additional styling.
+ function new_element(tagname, style) {
+ if (gElem) {
+ ok(false, "test author forgot to call done_div/done_elem");
+ }
+ if (typeof(style) != "string") {
+ ok(false, "test author forgot to pass argument");
+ }
+ if (!document.getElementById("display")) {
+ ok(false, "no 'display' element to append to");
+ }
+ gElem = document.createElement(tagname);
+ gElem.setAttribute("style", style);
+ gElem.classList.add("target");
+ document.getElementById("display").appendChild(gElem);
+ return [ gElem, getComputedStyle(gElem, "") ];
+ }
+
+ function listen() {
+ if (!gElem) {
+ ok(false, "test author forgot to call new_div before listen");
+ }
+ gEventsReceived = [];
+ function listener(event) {
+ gEventsReceived.push(event);
+ }
+ gElem.addEventListener("animationstart", listener, false);
+ gElem.addEventListener("animationiteration", listener, false);
+ gElem.addEventListener("animationend", listener, false);
+ }
+
+ function check_events(eventsExpected, desc) {
+ // This function checks that the list of eventsExpected matches
+ // the received events -- but it only checks the properties that
+ // are present on eventsExpected.
+ is(gEventsReceived.length, eventsExpected.length,
+ "number of events received for " + desc);
+ for (var i = 0,
+ i_end = Math.min(eventsExpected.length, gEventsReceived.length);
+ i != i_end; ++i) {
+ var exp = eventsExpected[i];
+ var rec = gEventsReceived[i];
+ for (var prop in exp) {
+ if (prop == "elapsedTime") {
+ // Allow floating point error.
+ ok(Math.abs(rec.elapsedTime - exp.elapsedTime) < 0.000002,
+ "events[" + i + "]." + prop + " for " + desc +
+ " received=" + rec.elapsedTime + " expected=" + exp.elapsedTime);
+ } else {
+ is(rec[prop], exp[prop],
+ "events[" + i + "]." + prop + " for " + desc);
+ }
+ }
+ }
+ for (var i = eventsExpected.length; i < gEventsReceived.length; ++i) {
+ ok(false, "unexpected " + gEventsReceived[i].type + " event for " + desc);
+ }
+ gEventsReceived = [];
+ }
+
+ function done_element() {
+ if (!gElem) {
+ ok(false, "test author called done_element/done_div without matching"
+ + " call to new_element/new_div");
+ }
+ gElem.remove();
+ gElem = null;
+ if (gEventsReceived.length) {
+ ok(false, "caller should have called check_events");
+ }
+ }
+
+ [ new_div
+ , new_element
+ , listen
+ , check_events
+ , done_element ]
+ .forEach(function(fn) {
+ window[fn.name] = fn;
+ });
+ window.done_div = done_element;
+})();
+
+function px_to_num(str)
+{
+ return Number(String(str).match(/^([\d.]+)px$/)[1]);
+}
+
+function bezier(x1, y1, x2, y2) {
+ // Cubic bezier with control points (0, 0), (x1, y1), (x2, y2), and (1, 1).
+ function x_for_t(t) {
+ var omt = 1-t;
+ return 3 * omt * omt * t * x1 + 3 * omt * t * t * x2 + t * t * t;
+ }
+ function y_for_t(t) {
+ var omt = 1-t;
+ return 3 * omt * omt * t * y1 + 3 * omt * t * t * y2 + t * t * t;
+ }
+ function t_for_x(x) {
+ // Binary subdivision.
+ var mint = 0, maxt = 1;
+ for (var i = 0; i < 30; ++i) {
+ var guesst = (mint + maxt) / 2;
+ var guessx = x_for_t(guesst);
+ if (x < guessx)
+ maxt = guesst;
+ else
+ mint = guesst;
+ }
+ return (mint + maxt) / 2;
+ }
+ return function bezier_closure(x) {
+ if (x == 0) return 0;
+ if (x == 1) return 1;
+ return y_for_t(t_for_x(x));
+ }
+}
+
+function step_end(nsteps) {
+ return function step_end_closure(x) {
+ return Math.floor(x * nsteps) / nsteps;
+ }
+}
+
+function step_start(nsteps) {
+ var stepend = step_end(nsteps);
+ return function step_start_closure(x) {
+ return 1.0 - stepend(1.0 - x);
+ }
+}
+
+var gTF = {
+ "ease": bezier(0.25, 0.1, 0.25, 1),
+ "linear": function(x) { return x; },
+ "ease_in": bezier(0.42, 0, 1, 1),
+ "ease_out": bezier(0, 0, 0.58, 1),
+ "ease_in_out": bezier(0.42, 0, 0.58, 1),
+ "step_start": step_start(1),
+ "step_end": step_end(1),
+};
+
+function is_approx(float1, float2, error, desc) {
+ ok(Math.abs(float1 - float2) < error,
+ desc + ": " + float1 + " and " + float2 + " should be within " + error);
+}
+
+function findKeyframesRule(name) {
+ for (var i = 0; i < document.styleSheets.length; i++) {
+ var match = [].find.call(document.styleSheets[i].cssRules, function(rule) {
+ return rule.type == CSSRule.KEYFRAMES_RULE &&
+ rule.name == name;
+ });
+ if (match) {
+ return match;
+ }
+ }
+ return undefined;
+}
+
+// Checks if off-main thread animation (OMTA) is available, and if it is, runs
+// the provided callback function. If OMTA is not available or is not
+// functioning correctly, the second callback, aOnSkip, is run instead.
+//
+// This function also does an internal test to verify that OMTA is working at
+// all so that if OMTA is not functioning correctly when it is expected to
+// function only a single failure is produced.
+//
+// Since this function relies on various asynchronous operations, the caller is
+// responsible for calling SimpleTest.waitForExplicitFinish() before calling
+// this and SimpleTest.finish() within aTestFunction and aOnSkip.
+//
+// specialPowersForPrefs exists because some SpecialPowers objects apparently
+// can get prefs and some can't; callers that would normally have one of the
+// latter but can get their hands on one of the former can pass it in
+// explicitly.
+function runOMTATest(aTestFunction, aOnSkip, specialPowersForPrefs) {
+ const OMTAPrefKey = "layers.offmainthreadcomposition.async-animations";
+ var utils = SpecialPowers.DOMWindowUtils;
+ if (!specialPowersForPrefs) {
+ specialPowersForPrefs = SpecialPowers;
+ }
+ var expectOMTA = utils.layerManagerRemote &&
+ // ^ Off-main thread animation cannot be used if off-main
+ // thread composition (OMTC) is not available
+ specialPowersForPrefs.getBoolPref(OMTAPrefKey);
+
+ isOMTAWorking().then(function(isWorking) {
+ if (expectOMTA) {
+ if (isWorking) {
+ aTestFunction();
+ } else {
+ // We only call this when we know it will fail as otherwise in the
+ // regular success case we will end up inflating the "passed tests"
+ // count by 1
+ ok(isWorking, "OMTA should work");
+ aOnSkip();
+ }
+ } else {
+ todo(isWorking,
+ "OMTA should ideally work, though we don't expect it to work on " +
+ "this platform/configuration");
+ aOnSkip();
+ }
+ }).catch(function(err) {
+ ok(false, err);
+ aOnSkip();
+ });
+
+ function isOMTAWorking() {
+ // Create keyframes rule
+ const animationName = "a6ce3091ed85"; // Random name to avoid clashes
+ var ruleText = "@keyframes " + animationName +
+ " { from { opacity: 0.5 } to { opacity: 0.5 } }";
+ var style = document.createElement("style");
+ style.appendChild(document.createTextNode(ruleText));
+ document.head.appendChild(style);
+
+ // Create animation target
+ var div = document.createElement("div");
+ document.body.appendChild(div);
+
+ // Give the target geometry so it is eligible for layerization
+ div.style.width = "100px";
+ div.style.height = "100px";
+ div.style.backgroundColor = "white";
+
+ // Common clean up code
+ var cleanUp = function() {
+ div.parentNode.removeChild(div);
+ style.parentNode.removeChild(style);
+ if (utils.isTestControllingRefreshes) {
+ utils.restoreNormalRefresh();
+ }
+ };
+
+ return waitForDocumentLoad()
+ .then(loadPaintListener)
+ .then(function() {
+ // Put refresh driver under test control and trigger animation
+ utils.advanceTimeAndRefresh(0);
+ div.style.animation = animationName + " 10s";
+
+ // Trigger style flush
+ div.clientTop;
+ return waitForPaints();
+ }).then(function() {
+ var opacity = utils.getOMTAStyle(div, "opacity");
+ cleanUp();
+ return Promise.resolve(opacity == 0.5);
+ }).catch(function(err) {
+ cleanUp();
+ return Promise.reject(err);
+ });
+ }
+
+ function waitForDocumentLoad() {
+ return new Promise(function(resolve, reject) {
+ if (document.readyState === "complete") {
+ resolve();
+ } else {
+ window.addEventListener("load", resolve);
+ }
+ });
+ }
+
+ function waitForPaints() {
+ return new Promise(function(resolve, reject) {
+ waitForAllPaintsFlushed(resolve);
+ });
+ }
+
+ function loadPaintListener() {
+ return new Promise(function(resolve, reject) {
+ if (typeof(window.waitForAllPaints) !== "function") {
+ var script = document.createElement("script");
+ script.onload = resolve;
+ script.onerror = function() {
+ reject(new Error("Failed to load paint listener"));
+ };
+ script.src = "/tests/SimpleTest/paint_listener.js";
+ var firstScript = document.scripts[0];
+ firstScript.parentNode.insertBefore(script, firstScript);
+ } else {
+ resolve();
+ }
+ });
+ }
+}
+
+// Common architecture for setting up a series of asynchronous animation tests
+//
+// Usage example:
+//
+// addAsyncAnimTest(function *() {
+// .. do work ..
+// yield functionThatReturnsAPromise();
+// .. do work ..
+// });
+// runAllAsyncAnimTests().then(SimpleTest.finish());
+//
+(function() {
+ var tests = [];
+
+ window.addAsyncAnimTest = function(generator) {
+ tests.push(generator);
+ };
+
+ // Returns a promise when all tests have run
+ window.runAllAsyncAnimTests = function(aOnAbort) {
+ // runAsyncAnimTest returns a Promise that is resolved when the
+ // test is finished so we can chain them together
+ return tests.reduce(function(sequence, test) {
+ return sequence.then(function() {
+ return runAsyncAnimTest(test, aOnAbort);
+ });
+ }, Promise.resolve() /* the start of the sequence */);
+ };
+
+ // Takes a generator function that represents a test case. Each point in the
+ // test case that waits asynchronously for some result yields a Promise that
+ // is resolved when the asynchronous action has completed. By chaining these
+ // intermediate results together we run the test to completion.
+ //
+ // This method itself returns a Promise that is resolved when the generator
+ // function has completed.
+ //
+ // This arrangement is based on add_task() which is currently only available
+ // in mochitest-chrome (bug 872229). If add_task becomes available in
+ // mochitest-plain, we can remove this function and use add_task instead.
+ function runAsyncAnimTest(aTestFunc, aOnAbort) {
+ var generator;
+
+ function step(arg) {
+ var next;
+ try {
+ next = generator.next(arg);
+ } catch (e) {
+ return Promise.reject(e);
+ }
+ if (next.done) {
+ return Promise.resolve(next.value);
+ } else {
+ return Promise.resolve(next.value)
+ .then(step, function(err) { throw err; });
+ }
+ }
+
+ // Put refresh driver under test control
+ SpecialPowers.DOMWindowUtils.advanceTimeAndRefresh(0);
+
+ // Run test
+ generator = aTestFunc();
+ return step()
+ .catch(function(err) {
+ ok(false, err.message);
+ if (typeof aOnAbort == "function") {
+ aOnAbort();
+ }
+ }).then(function() {
+ // Restore clock
+ SpecialPowers.DOMWindowUtils.restoreNormalRefresh();
+ });
+ }
+})();
+
+//----------------------------------------------------------------------
+//
+// Helper functions for testing animated values on the compositor
+//
+//----------------------------------------------------------------------
+
+const RunningOn = {
+ MainThread: 0,
+ Compositor: 1,
+ Either: 2,
+ TodoMainThread: 3
+};
+
+const ExpectComparisonTo = {
+ Pass: 1,
+ Fail: 2
+};
+
+(function() {
+ window.omta_todo_is = function(elem, property, expected, runningOn, desc,
+ pseudo) {
+ return omta_is_approx(elem, property, expected, 0, runningOn, desc,
+ ExpectComparisonTo.Fail, pseudo);
+ };
+
+ window.omta_is = function(elem, property, expected, runningOn, desc,
+ pseudo) {
+ return omta_is_approx(elem, property, expected, 0, runningOn, desc,
+ ExpectComparisonTo.Pass, pseudo);
+ };
+
+ // Many callers of this method will pass 'undefined' for
+ // expectedComparisonResult.
+ window.omta_is_approx = function(elem, property, expected, tolerance,
+ runningOn, desc, expectedComparisonResult,
+ pseudo) {
+ // Check input
+ const omtaProperties = [ "transform", "opacity" ];
+ if (omtaProperties.indexOf(property) === -1) {
+ ok(false, property + " is not an OMTA property");
+ return;
+ }
+ var isTransform = property == "transform";
+ var normalize = isTransform ? convertTo3dMatrix : parseFloat;
+ var compare = isTransform ?
+ matricesRoughlyEqual :
+ function(a, b, error) { return Math.abs(a - b) <= error; };
+ var normalizedToString = isTransform ?
+ convert3dMatrixToString :
+ JSON.stringify;
+
+ // Get actual values
+ var compositorStr =
+ SpecialPowers.DOMWindowUtils.getOMTAStyle(elem, property, pseudo);
+ var computedStr = window.getComputedStyle(elem, pseudo)[property];
+
+ // Prepare expected value
+ var expectedValue = normalize(expected);
+ if (expectedValue === null) {
+ ok(false, desc + ": test author should provide a valid 'expected' value" +
+ " - got " + expected.toString());
+ return;
+ }
+
+ // Check expected value appears in the right place
+ var actualStr;
+ switch (runningOn) {
+ case RunningOn.Either:
+ runningOn = compositorStr !== "" ?
+ RunningOn.Compositor :
+ RunningOn.MainThread;
+ actualStr = compositorStr !== "" ? compositorStr : computedStr;
+ break;
+
+ case RunningOn.Compositor:
+ if (compositorStr === "") {
+ ok(false, desc + ": should be animating on compositor");
+ return;
+ }
+ actualStr = compositorStr;
+ break;
+
+ case RunningOn.TodoMainThread:
+ todo(compositorStr === "",
+ desc + ": should NOT be animating on compositor");
+ actualStr = compositorStr === "" ? computedStr : compositorStr;
+ break;
+
+ default:
+ if (compositorStr !== "") {
+ ok(false, desc + ": should NOT be animating on compositor");
+ return;
+ }
+ actualStr = computedStr;
+ break;
+ }
+
+ var okOrTodo = expectedComparisonResult == ExpectComparisonTo.Fail ?
+ todo :
+ ok;
+
+ // Compare animated value with expected
+ var actualValue = normalize(actualStr);
+ if (actualValue === null) {
+ ok(false, desc + ": should return a valid result - got " + actualStr);
+ return;
+ }
+ okOrTodo(compare(expectedValue, actualValue, tolerance),
+ desc + " - got " + actualStr + ", expected " +
+ normalizedToString(expectedValue));
+
+ // For compositor animations do an additional check that they match
+ // the value calculated on the main thread
+ if (actualStr === compositorStr) {
+ var computedValue = normalize(computedStr);
+ if (computedValue === null) {
+ ok(false, desc + ": test framework should parse computed style" +
+ " - got " + computedStr);
+ return;
+ }
+ okOrTodo(compare(computedValue, actualValue, 0),
+ desc + ": OMTA style and computed style should be equal" +
+ " - OMTA " + actualStr + ", computed " + computedStr);
+ }
+ };
+
+ window.matricesRoughlyEqual = function(a, b, tolerance) {
+ tolerance = tolerance || 0.00011;
+ for (var i = 0; i < 4; i++) {
+ for (var j = 0; j < 4; j++) {
+ var diff = Math.abs(a[i][j] - b[i][j]);
+ if (diff > tolerance || isNaN(diff))
+ return false;
+ }
+ }
+ return true;
+ };
+
+ // Converts something representing an transform into a 3d matrix in
+ // column-major order.
+ // The following are supported:
+ // "matrix(...)"
+ // "matrix3d(...)"
+ // [ 1, 0, 0, ... ]
+ // { a: 1, ty: 23 } etc.
+ window.convertTo3dMatrix = function(matrixLike) {
+ if (typeof(matrixLike) == "string") {
+ return convertStringTo3dMatrix(matrixLike);
+ } else if (Array.isArray(matrixLike)) {
+ return convertArrayTo3dMatrix(matrixLike);
+ } else if (typeof(matrixLike) == "object") {
+ return convertObjectTo3dMatrix(matrixLike);
+ } else {
+ return null;
+ }
+ };
+
+ // In future most of these methods should be able to be replaced
+ // with DOMMatrix
+ window.isInvertible = function(matrix) {
+ return getDeterminant(matrix) != 0;
+ };
+
+ // Converts strings of the format "matrix(...)" and "matrix3d(...)" to a 3d
+ // matrix
+ function convertStringTo3dMatrix(str) {
+ if (str == "none")
+ return convertArrayTo3dMatrix([1, 0, 0, 1, 0, 0]);
+ var result = str.match("^matrix(3d)?\\(");
+ if (result === null)
+ return null;
+
+ return convertArrayTo3dMatrix(
+ str.substring(result[0].length, str.length-1)
+ .split(",")
+ .map(function(component) {
+ return Number(component);
+ })
+ );
+ }
+
+ // Takes an array of numbers of length 6 (2d matrix) or 16 (3d matrix)
+ // representing a matrix specified in column-major order and returns a 3d
+ // matrix represented as an array of arrays
+ function convertArrayTo3dMatrix(array) {
+ if (array.length == 6) {
+ return convertObjectTo3dMatrix(
+ { a: array[0], b: array[1],
+ c: array[2], d: array[3],
+ e: array[4], f: array[5] } );
+ } else if (array.length == 16) {
+ return [
+ array.slice(0, 4),
+ array.slice(4, 8),
+ array.slice(8, 12),
+ array.slice(12, 16)
+ ];
+ } else {
+ return null;
+ }
+ }
+
+ // Takes an object of the form { a: 1.1, e: 23 } and builds up a 3d matrix
+ // with unspecified values filled in with identity values.
+ function convertObjectTo3dMatrix(obj) {
+ return [
+ [
+ obj.a || obj.sx || obj.m11 || 1,
+ obj.b || obj.m12 || 0,
+ obj.m13 || 0,
+ obj.m14 || 0
+ ], [
+ obj.c || obj.m21 || 0,
+ obj.d || obj.sy || obj.m22 || 1,
+ obj.m23 || 0,
+ obj.m24 || 0
+ ], [
+ obj.m31 || 0,
+ obj.m32 || 0,
+ obj.sz || obj.m33 || 1,
+ obj.m34 || 0
+ ], [
+ obj.e || obj.tx || obj.m41 || 0,
+ obj.f || obj.ty || obj.m42 || 0,
+ obj.tz || obj.m43 || 0,
+ obj.m44 || 1
+ ]
+ ];
+ }
+
+ function convert3dMatrixToString(matrix) {
+ if (is2d(matrix)) {
+ return "matrix(" +
+ [ matrix[0][0], matrix[0][1],
+ matrix[1][0], matrix[1][1],
+ matrix[3][0], matrix[3][1] ].join(", ") + ")";
+ } else {
+ return "matrix3d(" +
+ matrix.reduce(function(outer, inner) {
+ return outer.concat(inner);
+ }).join(", ") + ")";
+ }
+ }
+
+ function is2d(matrix) {
+ return matrix[0][2] === 0 && matrix[0][3] === 0 &&
+ matrix[1][2] === 0 && matrix[1][3] === 0 &&
+ matrix[2][0] === 0 && matrix[2][1] === 0 &&
+ matrix[2][2] === 1 && matrix[2][3] === 0 &&
+ matrix[3][2] === 0 && matrix[3][3] === 1;
+ }
+
+ function getDeterminant(matrix) {
+ if (is2d(matrix)) {
+ return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
+ }
+
+ return matrix[0][3] * matrix[1][2] * matrix[2][1] * matrix[3][0]
+ - matrix[0][2] * matrix[1][3] * matrix[2][1] * matrix[3][0]
+ - matrix[0][3] * matrix[1][1] * matrix[2][2] * matrix[3][0]
+ + matrix[0][1] * matrix[1][3] * matrix[2][2] * matrix[3][0]
+ + matrix[0][2] * matrix[1][1] * matrix[2][3] * matrix[3][0]
+ - matrix[0][1] * matrix[1][2] * matrix[2][3] * matrix[3][0]
+ - matrix[0][3] * matrix[1][2] * matrix[2][0] * matrix[3][1]
+ + matrix[0][2] * matrix[1][3] * matrix[2][0] * matrix[3][1]
+ + matrix[0][3] * matrix[1][0] * matrix[2][2] * matrix[3][1]
+ - matrix[0][0] * matrix[1][3] * matrix[2][2] * matrix[3][1]
+ - matrix[0][2] * matrix[1][0] * matrix[2][3] * matrix[3][1]
+ + matrix[0][0] * matrix[1][2] * matrix[2][3] * matrix[3][1]
+ + matrix[0][3] * matrix[1][1] * matrix[2][0] * matrix[3][2]
+ - matrix[0][1] * matrix[1][3] * matrix[2][0] * matrix[3][2]
+ - matrix[0][3] * matrix[1][0] * matrix[2][1] * matrix[3][2]
+ + matrix[0][0] * matrix[1][3] * matrix[2][1] * matrix[3][2]
+ + matrix[0][1] * matrix[1][0] * matrix[2][3] * matrix[3][2]
+ - matrix[0][0] * matrix[1][1] * matrix[2][3] * matrix[3][2]
+ - matrix[0][2] * matrix[1][1] * matrix[2][0] * matrix[3][3]
+ + matrix[0][1] * matrix[1][2] * matrix[2][0] * matrix[3][3]
+ + matrix[0][2] * matrix[1][0] * matrix[2][1] * matrix[3][3]
+ - matrix[0][0] * matrix[1][2] * matrix[2][1] * matrix[3][3]
+ - matrix[0][1] * matrix[1][0] * matrix[2][2] * matrix[3][3]
+ + matrix[0][0] * matrix[1][1] * matrix[2][2] * matrix[3][3];
+ }
+})();
+
+//----------------------------------------------------------------------
+//
+// Promise wrappers for paint_listener.js
+//
+//----------------------------------------------------------------------
+
+// Returns a Promise that resolves once all paints have completed
+function waitForPaints() {
+ return new Promise(function(resolve, reject) {
+ waitForAllPaints(resolve);
+ });
+}
+
+// As with waitForPaints but also flushes pending style changes before waiting
+function waitForPaintsFlushed() {
+ return new Promise(function(resolve, reject) {
+ waitForAllPaintsFlushed(resolve);
+ });
+}
+
+function waitForVisitedLinkColoring(visitedLink, waitProperty, waitValue) {
+ function checkLink(resolve) {
+ if (SpecialPowers.DOMWindowUtils
+ .getVisitedDependentComputedStyle(visitedLink, "", waitProperty) ==
+ waitValue) {
+ // Our link has been styled as visited. Resolve.
+ resolve(true);
+ } else {
+ // Our link is not yet styled as visited. Poll for completion.
+ setTimeout(checkLink, 0, resolve);
+ }
+ }
+ return new Promise(function(resolve, reject) {
+ checkLink(resolve);
+ });
+}
diff --git a/layout/style/test/browser.ini b/layout/style/test/browser.ini
new file mode 100644
index 000000000..4e5e47aac
--- /dev/null
+++ b/layout/style/test/browser.ini
@@ -0,0 +1,8 @@
+[DEFAULT]
+support-files =
+ bug453896_iframe.html
+ media_queries_iframe.html
+ newtab_share_rule_processors.html
+
+[browser_bug453896.js]
+[browser_newtab_share_rule_processors.js]
diff --git a/layout/style/test/browser_bug453896.js b/layout/style/test/browser_bug453896.js
new file mode 100644
index 000000000..0084ae33d
--- /dev/null
+++ b/layout/style/test/browser_bug453896.js
@@ -0,0 +1,13 @@
+add_task(function* () {
+ let uri = getRootDirectory(gTestPath) + "bug453896_iframe.html";
+
+ yield BrowserTestUtils.withNewTab({
+ gBrowser,
+ url: uri
+ }, function*(browser) {
+ return ContentTask.spawn(browser, null, function* () {
+ var fake_window = { ok: ok };
+ content.wrappedJSObject.run(fake_window);
+ });
+ });
+});
diff --git a/layout/style/test/browser_newtab_share_rule_processors.js b/layout/style/test/browser_newtab_share_rule_processors.js
new file mode 100644
index 000000000..810f5f86e
--- /dev/null
+++ b/layout/style/test/browser_newtab_share_rule_processors.js
@@ -0,0 +1,38 @@
+var theTab;
+var theBrowser;
+
+function listener(evt) {
+ if (evt.target == theBrowser.contentDocument) {
+ doTest();
+ }
+}
+
+function test() {
+ waitForExplicitFinish();
+ var testURL = getRootDirectory(gTestPath) + "newtab_share_rule_processors.html";
+ theTab = gBrowser.addTab(testURL);
+ theBrowser = gBrowser.getBrowserForTab(theTab);
+ theBrowser.addEventListener("load", listener, true);
+}
+
+function doTest() {
+ theBrowser.removeEventListener("load", listener, true);
+ var winUtils = theBrowser.contentWindow
+ .QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindowUtils);
+ // The initial set of agent-level sheets should have a rule processor that's
+ // also being used by another document.
+ ok(winUtils.hasRuleProcessorUsedByMultipleStyleSets(Ci.nsIStyleSheetService.AGENT_SHEET),
+ "agent sheet rule processor is used by multiple style sets");
+ // Document-level sheets currently never get shared rule processors.
+ ok(!winUtils.hasRuleProcessorUsedByMultipleStyleSets(Ci.nsIStyleSheetService.AUTHOR_SHEET),
+ "author sheet rule processor is not used by multiple style sets");
+ // Adding a unique style sheet to the agent level will cause it to have a
+ // rule processor that is unique.
+ theBrowser.contentWindow.wrappedJSObject.addAgentSheet();
+ ok(!winUtils.hasRuleProcessorUsedByMultipleStyleSets(Ci.nsIStyleSheetService.AGENT_SHEET),
+ "agent sheet rule processor is not used by multiple style sets after " +
+ "having a unique sheet added to it");
+ gBrowser.removeTab(theTab);
+ finish();
+}
diff --git a/layout/style/test/bug453896_iframe.html b/layout/style/test/bug453896_iframe.html
new file mode 100644
index 000000000..c65388924
--- /dev/null
+++ b/layout/style/test/bug453896_iframe.html
@@ -0,0 +1,66 @@
+
+
+
+ Bug 453896 Test middle frame
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/bug517224.sjs b/layout/style/test/bug517224.sjs
new file mode 100644
index 000000000..5a730b055
--- /dev/null
+++ b/layout/style/test/bug517224.sjs
@@ -0,0 +1,24 @@
+function handleRequest(request, response)
+{
+ response.setHeader("Cache-Control", "no-cache", false);
+ switch (request.queryString) {
+ case "reset":
+ response.setHeader("Content-Type", "application/ecmascript", false);
+ setState("imageloaded", "");
+ break;
+ case "image":
+ setState("imageloaded", "imageloaded");
+ response.setStatusLine("1.1", 302, "Found");
+ // redirect to a solid blue image
+ response.setHeader("Location", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVQI12NgYPgPAAEDAQDZqt2zAAAAAElFTkSuQmCC");
+ response.setHeader("Content-Type", "text/plain", false);
+ break;
+ case "result":
+ response.setHeader("Content-Type", "application/ecmascript", false);
+ var state = getState("imageloaded");
+ response.write("is('" + state +
+ "', '', 'image should not have been loaded')\n");
+ response.write("SimpleTest.finish()");
+ break;
+ }
+}
diff --git a/layout/style/test/bug732209-css.sjs b/layout/style/test/bug732209-css.sjs
new file mode 100644
index 000000000..95dc612d5
--- /dev/null
+++ b/layout/style/test/bug732209-css.sjs
@@ -0,0 +1,19 @@
+function handleRequest(request, response)
+{
+ // First item will be the ID; other items are optional
+ var query = request.queryString.split(/&/);
+
+ response.setHeader("Content-Type", "text/css", false);
+
+ if (query.indexOf("cors-anonymous") != -1) {
+ response.setHeader("Access-Control-Allow-Origin", "*", false);
+ } else if (query.indexOf("cors-credentials") != -1 &&
+ request.hasHeader("Origin")) {
+ response.setHeader("Access-Control-Allow-Origin",
+ request.getHeader("Origin"), false)
+ response.setHeader("Access-Control-Allow-Credentials", "true", false);
+ }
+
+ response.write("#" + query[0] + " { color: green !important }" + "\n" +
+ "#" + query[0] + ".reverse { color: red !important }");
+}
diff --git a/layout/style/test/ccd-quirks.html b/layout/style/test/ccd-quirks.html
new file mode 100644
index 000000000..f12204a2d
--- /dev/null
+++ b/layout/style/test/ccd-quirks.html
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/ccd-standards.html b/layout/style/test/ccd-standards.html
new file mode 100644
index 000000000..ae6f443a2
--- /dev/null
+++ b/layout/style/test/ccd-standards.html
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/ccd.sjs b/layout/style/test/ccd.sjs
new file mode 100644
index 000000000..058393e82
--- /dev/null
+++ b/layout/style/test/ccd.sjs
@@ -0,0 +1,73 @@
+const DEBUG_all_valid = false;
+const DEBUG_all_stub = false;
+
+function handleRequest(request, response)
+{
+ // Decode the query string to know what test we're doing.
+
+ // character 1: 'I' = text/css response, 'J' = text/html response
+ let responseCSS = (request.queryString[0] == 'I');
+
+ // character 2: redirection type - we only care about whether we're
+ // ultimately same-origin with the requesting document ('A', 'D') or
+ // not ('B', 'C').
+ let sameOrigin = (request.queryString[1] == 'A' ||
+ request.queryString[1] == 'D');
+
+ // character 3: '1' = syntactically valid, '2' = invalid, '3' = http error
+ let malformed = (request.queryString[2] == '2');
+ let httpError = (request.queryString[2] == '3');
+
+ // character 4: loaded with or @import (no action required)
+
+ // character 5: loading document mode: 'q' = quirks, 's' = standards
+ let quirksMode = (request.queryString[4] == 'q');
+
+ // Our response contains a CSS rule that selects an element whose
+ // ID is the first four characters of the query string.
+ let selector = '#' + request.queryString.substring(0,4);
+
+ // "Malformed" responses wrap the CSS rule in the construct
+ // {} ...
+ // This mimics what the CSS parser might see if an actual HTML
+ // document were fed to it. Because CSS parsers recover from
+ // errors by skipping tokens until they find something
+ // recognizable, a style rule appearing where I wrote '...' above
+ // will be honored!
+ let leader = (malformed ? '{}' : '');
+ let trailer = (malformed ? '' : '');
+
+ // Standards mode documents will ignore the style sheet if it is being
+ // served as text/html (regardless of its contents). Quirks mode
+ // documents will ignore the style sheet if it is being served as
+ // text/html _and_ it is not same-origin. Regardless, style sheets
+ // are ignored if they come as the body of an HTTP error response.
+ //
+ // Style sheets that should be ignored paint the element red; those
+ // that should be honored paint it lime.
+ let color = ((responseCSS || (quirksMode && sameOrigin)) && !httpError
+ ? 'lime' : 'red');
+
+ // For debugging the test itself, we have the capacity to make every style
+ // sheet well-formed, or every style sheet do nothing.
+ if (DEBUG_all_valid) {
+ // In this mode, every test chip should turn blue.
+ response.setHeader('Content-Type', 'text/css');
+ response.write(selector + '{background-color:blue}\n');
+ } else if (DEBUG_all_stub) {
+ // In this mode, every test chip for a case where the true test
+ // sheet would be honored, should turn red.
+ response.setHeader('Content-Type', 'text/css');
+ response.write(selector + '{}\n');
+ } else {
+ // Normal operation.
+ if (httpError)
+ response.setStatusLine(request.httpVersion, 500,
+ "Internal Server Error");
+ response.setHeader('Content-Type',
+ responseCSS ? 'text/css' : 'text/html');
+ response.write(leader + selector +
+ '{background-color:' + color + '}' +
+ trailer + '\n');
+ }
+}
diff --git a/layout/style/test/chrome/bug418986-2.js b/layout/style/test/chrome/bug418986-2.js
new file mode 100644
index 000000000..4336f4abd
--- /dev/null
+++ b/layout/style/test/chrome/bug418986-2.js
@@ -0,0 +1,314 @@
+// # Bug 418986, part 2.
+
+/* jshint esnext:true */
+/* jshint loopfunc:true */
+/* global window, screen, ok, SpecialPowers, matchMedia */
+
+// Expected values. Format: [name, pref_off_value, pref_on_value]
+// If pref_*_value is an array with two values, then we will match
+// any value in between those two values. If a value is null, then
+// we skip the media query.
+var expected_values = [
+ ["color", null, 8],
+ ["color-index", null, 0],
+ ["aspect-ratio", null, window.innerWidth + "/" + window.innerHeight],
+ ["device-aspect-ratio", screen.width + "/" + screen.height,
+ window.innerWidth + "/" + window.innerHeight],
+ ["device-height", screen.height + "px", window.innerHeight + "px"],
+ ["device-width", screen.width + "px", window.innerWidth + "px"],
+ ["grid", null, 0],
+ ["height", window.innerHeight + "px", window.innerHeight + "px"],
+ ["monochrome", null, 0],
+ // Square is defined as portrait:
+ ["orientation", null,
+ window.innerWidth > window.innerHeight ?
+ "landscape" : "portrait"],
+ ["resolution", null, "96dpi"],
+ ["resolution", [0.999 * window.devicePixelRatio + "dppx",
+ 1.001 * window.devicePixelRatio + "dppx"], "1dppx"],
+ ["width", window.innerWidth + "px", window.innerWidth + "px"],
+ ["-moz-device-pixel-ratio", window.devicePixelRatio, 1],
+ ["-moz-device-orientation", screen.width > screen.height ?
+ "landscape" : "portrait",
+ window.innerWidth > window.innerHeight ?
+ "landscape" : "portrait"]
+];
+
+// These media queries return value 0 or 1 when the pref is off.
+// When the pref is on, they should not match.
+var suppressed_toggles = [
+ "-moz-mac-graphite-theme",
+ // Not available on most OSs.
+// "-moz-maemo-classic",
+ "-moz-scrollbar-end-backward",
+ "-moz-scrollbar-end-forward",
+ "-moz-scrollbar-start-backward",
+ "-moz-scrollbar-start-forward",
+ "-moz-scrollbar-thumb-proportional",
+ "-moz-touch-enabled",
+ "-moz-windows-compositor",
+ "-moz-windows-default-theme",
+ "-moz-windows-glass",
+];
+
+// Possible values for '-moz-os-version'
+var windows_versions = [
+ "windows-xp",
+ "windows-vista",
+ "windows-win7",
+ "windows-win8",
+ "windows-win10",
+];
+
+// Possible values for '-moz-windows-theme'
+var windows_themes = [
+ "aero",
+ "aero-lite",
+ "luna-blue",
+ "luna-olive",
+ "luna-silver",
+ "royale",
+ "generic",
+ "zune"
+];
+
+// Read the current OS.
+var OS = SpecialPowers.Services.appinfo.OS;
+
+// If we are using Windows, add an extra toggle only
+// available on that OS.
+if (OS === "WINNT") {
+ suppressed_toggles.push("-moz-windows-classic");
+}
+
+// __keyValMatches(key, val)__.
+// Runs a media query and returns true if key matches to val.
+var keyValMatches = (key, val) => matchMedia("(" + key + ":" + val +")").matches;
+
+// __testMatch(key, val)__.
+// Attempts to run a media query match for the given key and value.
+// If value is an array of two elements [min max], then matches any
+// value in-between.
+var testMatch = function (key, val) {
+ if (val === null) {
+ return;
+ } else if (Array.isArray(val)) {
+ ok(keyValMatches("min-" + key, val[0]) && keyValMatches("max-" + key, val[1]),
+ "Expected " + key + " between " + val[0] + " and " + val[1]);
+ } else {
+ ok(keyValMatches(key, val), "Expected " + key + ":" + val);
+ }
+};
+
+// __testToggles(resisting)__.
+// Test whether we are able to match the "toggle" media queries.
+var testToggles = function (resisting) {
+ suppressed_toggles.forEach(
+ function (key) {
+ var exists = keyValMatches(key, 0) || keyValMatches(key, 1);
+ if (resisting) {
+ ok(!exists, key + " should not exist.");
+ } else {
+ ok(exists, key + " should exist.");
+ }
+ });
+};
+
+// __testWindowsSpecific__.
+// Runs a media query on the queryName with the given possible matching values.
+var testWindowsSpecific = function (resisting, queryName, possibleValues) {
+ let foundValue = null;
+ possibleValues.forEach(function (val) {
+ if (keyValMatches(queryName, val)) {
+ foundValue = val;
+ }
+ });
+ if (resisting) {
+ ok(!foundValue, queryName + " should have no match");
+ } else {
+ ok(foundValue, foundValue ? ("Match found: '" + queryName + ":" + foundValue + "'")
+ : "Should have a match for '" + queryName + "'");
+ }
+};
+
+// __generateHtmlLines(resisting)__.
+// Create a series of div elements that look like:
+// `resolution
`,
+// where each line corresponds to a different media query.
+var generateHtmlLines = function (resisting) {
+ let lines = "";
+ expected_values.forEach(
+ function ([key, offVal, onVal]) {
+ let val = resisting ? onVal : offVal;
+ if (val) {
+ lines += "" + key + "
\n";
+ }
+ });
+ suppressed_toggles.forEach(
+ function (key) {
+ lines += "" + key + "
\n";
+ });
+ if (OS === "WINNT") {
+ lines += "-moz-os-version
";
+ lines += "-moz-windows-theme
";
+ }
+ return lines;
+};
+
+// __cssLine__.
+// Creates a line of css that looks something like
+// `@media (resolution: 1ppx) { .spoof#resolution { background-color: green; } }`.
+var cssLine = function (query, clazz, id, color) {
+ return "@media " + query + " { ." + clazz + "#" + id +
+ " { background-color: " + color + "; } }\n";
+};
+
+// __constructQuery(key, val)__.
+// Creates a CSS media query from key and val. If key is an array of
+// two elements, constructs a range query (using min- and max-).
+var constructQuery = function (key, val) {
+ return Array.isArray(val) ?
+ "(min-" + key + ": " + val[0] + ") and (max-" + key + ": " + val[1] + ")" :
+ "(" + key + ": " + val + ")";
+};
+
+// __mediaQueryCSSLine(key, val, color)__.
+// Creates a line containing a CSS media query and a CSS expression.
+var mediaQueryCSSLine = function (key, val, color) {
+ if (val === null) {
+ return "";
+ }
+ return cssLine(constructQuery(key, val), "spoof", key, color);
+};
+
+// __suppressedMediaQueryCSSLine(key, color)__.
+// Creates a CSS line that matches the existence of a
+// media query that is supposed to be suppressed.
+var suppressedMediaQueryCSSLine = function (key, color, suppressed) {
+ let query = "(" + key + ": 0), (" + key + ": 1)";
+ return cssLine(query, "suppress", key, color);
+};
+
+// __generateCSSLines(resisting)__.
+// Creates a series of lines of CSS, each of which corresponds to
+// a different media query. If the query produces a match to the
+// expected value, then the element will be colored green.
+var generateCSSLines = function (resisting) {
+ let lines = ".spoof { background-color: red;}\n";
+ expected_values.forEach(
+ function ([key, offVal, onVal]) {
+ lines += mediaQueryCSSLine(key, resisting ? onVal : offVal, "green");
+ });
+ lines += ".suppress { background-color: " + (resisting ? "green" : "red") + ";}\n";
+ suppressed_toggles.forEach(
+ function (key) {
+ lines += suppressedMediaQueryCSSLine(key, resisting ? "red" : "green");
+ });
+ if (OS === "WINNT") {
+ lines += ".windows { background-color: " + (resisting ? "green" : "red") + ";}\n";
+ lines += windows_versions.map(val => "(-moz-os-version: " + val + ")").join(", ") +
+ " { #-moz-os-version { background-color: " + (resisting ? "red" : "green") + ";} }\n";
+ lines += windows_themes.map(val => "(-moz-windows-theme: " + val + ")").join(",") +
+ " { #-moz-windows-theme { background-color: " + (resisting ? "red" : "green") + ";} }\n";
+ }
+ return lines;
+};
+
+// __green__.
+// Returns the computed color style corresponding to green.
+var green = (function () {
+ let temp = document.createElement("span");
+ temp.style.backgroundColor = "green";
+ return getComputedStyle(temp).backgroundColor;
+})();
+
+// __testCSS(resisting)__.
+// Creates a series of divs and CSS using media queries to set their
+// background color. If all media queries match as expected, then
+// all divs should have a green background color.
+var testCSS = function (resisting) {
+ document.getElementById("display").innerHTML = generateHtmlLines(resisting);
+ document.getElementById("test-css").innerHTML = generateCSSLines(resisting);
+ let cssTestDivs = document.querySelectorAll(".spoof,.suppress");
+ for (let div of cssTestDivs) {
+ let color = window.getComputedStyle(div).backgroundColor;
+ ok(color === green, "CSS for '" + div.id + "'");
+ }
+};
+
+// __testOSXFontSmoothing(resisting)__.
+// When fingerprinting resistance is enabled, the `getComputedStyle`
+// should always return `undefined` for `MozOSXFontSmoothing`.
+var testOSXFontSmoothing = function (resisting) {
+ let div = document.createElement("div");
+ div.style.MozOsxFontSmoothing = "unset";
+ let readBack = window.getComputedStyle(div).MozOsxFontSmoothing;
+ let smoothingPref = SpecialPowers.getBoolPref("layout.css.osx-font-smoothing.enabled", false);
+ is(readBack, resisting ? "" : (smoothingPref ? "auto" : ""),
+ "-moz-osx-font-smoothing");
+};
+
+// __sleep(timeoutMs)__.
+// Returns a promise that resolves after the given timeout.
+var sleep = function (timeoutMs) {
+ return new Promise(function(resolve, reject) {
+ window.setTimeout(resolve);
+ });
+};
+
+// __testMediaQueriesInPictureElements(resisting)__.
+// Test to see if media queries are properly spoofed in picture elements
+// when we are resisting fingerprinting. A generator function
+// to be used with SpawnTask.js.
+var testMediaQueriesInPictureElements = function* (resisting) {
+ let lines = "";
+ for (let [key, offVal, onVal] of expected_values) {
+ let expected = resisting ? onVal : offVal;
+ if (expected) {
+ let query = constructQuery(key, expected);
+ lines += "\n";
+ lines += " \n";
+ lines += " \n";
+ lines += " \n";
+ }
+ }
+ document.getElementById("pictures").innerHTML = lines;
+ var testImages = document.getElementsByClassName("testImage");
+ yield sleep(0);
+ for (let testImage of testImages) {
+ ok(testImage.currentSrc.endsWith("/match.png"), "Media query '" + testImage.title + "' in picture should match.");
+ }
+};
+
+// __pushPref(key, value)__.
+// Set a pref value asynchronously, returning a promise that resolves
+// when it succeeds.
+var pushPref = function (key, value) {
+ return new Promise(function(resolve, reject) {
+ SpecialPowers.pushPrefEnv({"set": [[key, value]]}, resolve);
+ });
+};
+
+// __test(isContent)__.
+// Run all tests. A generator function to be used
+// with SpawnTask.js.
+var test = function* (isContent) {
+ for (prefValue of [false, true]) {
+ yield pushPref("privacy.resistFingerprinting", prefValue);
+ let resisting = prefValue && isContent;
+ expected_values.forEach(
+ function ([key, offVal, onVal]) {
+ testMatch(key, resisting ? onVal : offVal);
+ });
+ testToggles(resisting);
+ if (OS === "WINNT") {
+ testWindowsSpecific(resisting, "-moz-os-version", windows_versions);
+ testWindowsSpecific(resisting, "-moz-windows-theme", windows_themes);
+ }
+ testCSS(resisting);
+ if (OS === "Darwin") {
+ testOSXFontSmoothing(resisting);
+ }
+ yield testMediaQueriesInPictureElements(resisting);
+ }
+};
diff --git a/layout/style/test/chrome/bug535806-css.css b/layout/style/test/chrome/bug535806-css.css
new file mode 100644
index 000000000..bda339f77
--- /dev/null
+++ b/layout/style/test/chrome/bug535806-css.css
@@ -0,0 +1 @@
+fooBar[fooBar] { color: green; }
diff --git a/layout/style/test/chrome/bug535806-html.html b/layout/style/test/chrome/bug535806-html.html
new file mode 100644
index 000000000..e4395da3f
--- /dev/null
+++ b/layout/style/test/chrome/bug535806-html.html
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/chrome/bug535806-xul.xul b/layout/style/test/chrome/bug535806-xul.xul
new file mode 100644
index 000000000..3d9a82b91
--- /dev/null
+++ b/layout/style/test/chrome/bug535806-xul.xul
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/layout/style/test/chrome/chrome.ini b/layout/style/test/chrome/chrome.ini
new file mode 100644
index 000000000..e34fce671
--- /dev/null
+++ b/layout/style/test/chrome/chrome.ini
@@ -0,0 +1,21 @@
+[DEFAULT]
+skip-if = os == 'android'
+support-files =
+ bug418986-2.js
+ bug535806-css.css
+ bug535806-html.html
+ bug535806-xul.xul
+ hover_helper.html
+ match.png
+ mismatch.png
+
+[test_author_specified_style.html]
+[test_bug418986-2.xul]
+[test_bug1157097.html]
+[test_bug1160724.xul]
+[test_bug535806.xul]
+[test_display_mode.html]
+[test_display_mode_reflow.html]
+tags = fullscreen
+[test_hover.html]
+[test_moz_document_rules.html]
diff --git a/layout/style/test/chrome/hover_empty.html b/layout/style/test/chrome/hover_empty.html
new file mode 100644
index 000000000..7879e1ce9
--- /dev/null
+++ b/layout/style/test/chrome/hover_empty.html
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/layout/style/test/chrome/hover_helper.html b/layout/style/test/chrome/hover_helper.html
new file mode 100644
index 000000000..37e50f69e
--- /dev/null
+++ b/layout/style/test/chrome/hover_helper.html
@@ -0,0 +1,270 @@
+
+
+
+ Test for :hover
+
+
+
+
+
+Mozilla Bug
+
+
+
+
+
+
diff --git a/layout/style/test/chrome/match.png b/layout/style/test/chrome/match.png
new file mode 100644
index 000000000..d3f299bf5
Binary files /dev/null and b/layout/style/test/chrome/match.png differ
diff --git a/layout/style/test/chrome/mismatch.png b/layout/style/test/chrome/mismatch.png
new file mode 100644
index 000000000..8f9da3f00
Binary files /dev/null and b/layout/style/test/chrome/mismatch.png differ
diff --git a/layout/style/test/chrome/moz_document_helper.html b/layout/style/test/chrome/moz_document_helper.html
new file mode 100644
index 000000000..8b331b19e
--- /dev/null
+++ b/layout/style/test/chrome/moz_document_helper.html
@@ -0,0 +1,2 @@
+
+
diff --git a/layout/style/test/chrome/test_author_specified_style.html b/layout/style/test/chrome/test_author_specified_style.html
new file mode 100644
index 000000000..6b5e4f30e
--- /dev/null
+++ b/layout/style/test/chrome/test_author_specified_style.html
@@ -0,0 +1,55 @@
+
+Test for CSSStyleDeclaration.getAuthoredPropertyValue()
+
+
+
diff --git a/layout/style/test/chrome/test_bug1157097.html b/layout/style/test/chrome/test_bug1157097.html
new file mode 100644
index 000000000..748a9eed2
--- /dev/null
+++ b/layout/style/test/chrome/test_bug1157097.html
@@ -0,0 +1,31 @@
+
+Test for bug 1157097
+
+
+
+
+
+
diff --git a/layout/style/test/chrome/test_bug1160724.xul b/layout/style/test/chrome/test_bug1160724.xul
new file mode 100644
index 000000000..8a2b48617
--- /dev/null
+++ b/layout/style/test/chrome/test_bug1160724.xul
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Mozilla Bug 1160724
+
+
+
+
+
+
+
+
+
+
+
+ this.firstChild
+
+
+
+
+
+
+
diff --git a/layout/style/test/chrome/test_bug418986-2.xul b/layout/style/test/chrome/test_bug418986-2.xul
new file mode 100644
index 000000000..2e5f8e687
--- /dev/null
+++ b/layout/style/test/chrome/test_bug418986-2.xul
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+ Mozilla Bug 418986
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/chrome/test_bug535806.xul b/layout/style/test/chrome/test_bug535806.xul
new file mode 100644
index 000000000..1c0b45c63
--- /dev/null
+++ b/layout/style/test/chrome/test_bug535806.xul
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+ Mozilla Bug 535806
+
+
+
+
+
+
+
diff --git a/layout/style/test/chrome/test_display_mode.html b/layout/style/test/chrome/test_display_mode.html
new file mode 100644
index 000000000..244eefea2
--- /dev/null
+++ b/layout/style/test/chrome/test_display_mode.html
@@ -0,0 +1,94 @@
+
+
+
+
+
+ Test for Display Mode
+
+
+
+
+
+
+
+
+Mozilla Bug 1104916
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/chrome/test_display_mode_reflow.html b/layout/style/test/chrome/test_display_mode_reflow.html
new file mode 100644
index 000000000..23546578f
--- /dev/null
+++ b/layout/style/test/chrome/test_display_mode_reflow.html
@@ -0,0 +1,74 @@
+
+
+
+
+
+ Test for Display Mode
+
+
+
+
+
+
+
+
+Mozilla Bug 1256084
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/chrome/test_hover.html b/layout/style/test/chrome/test_hover.html
new file mode 100644
index 000000000..192562a8b
--- /dev/null
+++ b/layout/style/test/chrome/test_hover.html
@@ -0,0 +1,29 @@
+
+
+
+ Test for :hover
+
+
+
+
+
+Mozilla Bug
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/chrome/test_moz_document_rules.html b/layout/style/test/chrome/test_moz_document_rules.html
new file mode 100644
index 000000000..87fba4055
--- /dev/null
+++ b/layout/style/test/chrome/test_moz_document_rules.html
@@ -0,0 +1,97 @@
+
+
+
+ Test for @-moz-document rules
+
+
+
+
+
+Mozilla Bug 398962
+
+
+
+
+
+
diff --git a/layout/style/test/css_properties_like_longhand.js b/layout/style/test/css_properties_like_longhand.js
new file mode 100644
index 000000000..60b8fd583
--- /dev/null
+++ b/layout/style/test/css_properties_like_longhand.js
@@ -0,0 +1,3 @@
+var gShorthandPropertiesLikeLonghand = [
+ { name: "overflow", prop: "overflow"},
+];
diff --git a/layout/style/test/descriptor_database.js b/layout/style/test/descriptor_database.js
new file mode 100644
index 000000000..da672d03b
--- /dev/null
+++ b/layout/style/test/descriptor_database.js
@@ -0,0 +1,72 @@
+/* -*- tab-width: 4; indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/* vim: set shiftwidth=4 tabstop=4 autoindent cindent noexpandtab: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Each property has the following fields:
+// domProp: The name of the relevant member of nsIDOM[NS]CSS2Properties
+// values: Strings that are values for the descriptor and should be accepted.
+// invalid_values: Things that are not values for the descriptor and
+// should be rejected.
+
+var gCSSFontFaceDescriptors = {
+ "font-family": {
+ domProp: "fontFamily",
+ values: [ "\"serif\"", "\"cursive\"", "seriff", "Times New Roman", "TimesRoman", "\"Times New Roman\"" ],
+ /* not clear that the generics are really invalid */
+ invalid_values: [ "sans-serif", "Times New Roman, serif", "'Times New Roman', serif", "cursive", "fantasy", "Times )", "Times !", "Times ! foo", "Times ! important" ]
+ },
+ "font-stretch": {
+ domProp: "fontStretch",
+ values: [ "normal", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded" ],
+ invalid_values: [ "wider", "narrower", "normal ! important", "normal )" ]
+ },
+ "font-style": {
+ domProp: "fontStyle",
+ values: [ "normal", "italic", "oblique" ],
+ invalid_values: []
+ },
+ "font-weight": {
+ domProp: "fontWeight",
+ values: [ "normal", "400", "bold", "100", "200", "300", "500", "600", "700", "800", "900" ],
+ invalid_values: [ "107", "399", "401", "699", "710", "bolder", "lighter" ]
+ },
+ "src": {
+ domProp: null,
+ values: [
+ "url(404.ttf)",
+ "url(\"404.eot\")",
+ "url(\'404.otf\')",
+ "url(404.ttf) format(\"truetype\")",
+ "url(404.ttf) format(\"truetype\", \"opentype\")",
+ "url(404.ttf) format(\"truetype\", \"opentype\"), url(\'404.eot\')",
+ "local(Times New Roman)",
+ "local(\'Times New Roman\')",
+ "local(\"Times New Roman\")",
+ "local(\"serif\")",
+ "url(404.ttf) format(\"truetype\", \"unknown\"), local(Times New Roman), url(\'404.eot\')",
+ ],
+ invalid_values: [
+ "url(404.ttf) format(truetype)",
+ "url(404.ttf) format(\"truetype\" \"opentype\")",
+ "url(404.ttf) format(\"truetype\",)",
+ "local(\"Times New\" Roman)",
+ "local(serif)", /* is this valid? */
+ "url(404.ttf) )",
+ "url(404.ttf) ) foo",
+ "url(404.ttf) ! important",
+ "url(404.ttf) ! hello",
+ ]
+ },
+ "unicode-range": {
+ domProp: null,
+ values: [ "U+0-10FFFF", "U+3-7B3", "U+3??", "U+6A", "U+3????", "U+???", "U+302-302", "U+0-7,U+A-C", "U+100-17F,U+200-17F", "U+3??, U+500-513 ,U+612 , U+4????", "U+1FFF,U+200-27F" ],
+ invalid_values: [ "U+1????-2????", "U+0-7,A-C", "U+100-17F,200-17F", "U+6A!important", "U+6A)" ]
+ },
+ "font-display": {
+ domProp: null,
+ values: [ "auto", "block", "swap", "fallback", "optional" ],
+ invalid_values: [ "normal", "initial" ]
+ }
+}
diff --git a/layout/style/test/display_mode_reflow_iframe.html b/layout/style/test/display_mode_reflow_iframe.html
new file mode 100644
index 000000000..c05880ce7
--- /dev/null
+++ b/layout/style/test/display_mode_reflow_iframe.html
@@ -0,0 +1,23 @@
+
+
+
+ Display Mode Reflow inner frame
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/empty.html b/layout/style/test/empty.html
new file mode 100644
index 000000000..734c5a1c0
--- /dev/null
+++ b/layout/style/test/empty.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/layout/style/test/file_animations_async_tests.html b/layout/style/test/file_animations_async_tests.html
new file mode 100644
index 000000000..9d4dfa1fe
--- /dev/null
+++ b/layout/style/test/file_animations_async_tests.html
@@ -0,0 +1,77 @@
+
+
+
+
+ Test for Bug 1086937
+
+
+
+
+
+
+Mozilla Bug 1086937
+
+
+
+
+
diff --git a/layout/style/test/file_animations_effect_timing_duration.html b/layout/style/test/file_animations_effect_timing_duration.html
new file mode 100644
index 000000000..545784665
--- /dev/null
+++ b/layout/style/test/file_animations_effect_timing_duration.html
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/file_animations_effect_timing_enddelay.html b/layout/style/test/file_animations_effect_timing_enddelay.html
new file mode 100644
index 000000000..bd7c5084f
--- /dev/null
+++ b/layout/style/test/file_animations_effect_timing_enddelay.html
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/file_animations_effect_timing_iterations.html b/layout/style/test/file_animations_effect_timing_iterations.html
new file mode 100644
index 000000000..1c1c63f90
--- /dev/null
+++ b/layout/style/test/file_animations_effect_timing_iterations.html
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/file_animations_iterationstart.html b/layout/style/test/file_animations_iterationstart.html
new file mode 100644
index 000000000..d1d8529ce
--- /dev/null
+++ b/layout/style/test/file_animations_iterationstart.html
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/file_animations_pausing.html b/layout/style/test/file_animations_pausing.html
new file mode 100644
index 000000000..ce4a639c5
--- /dev/null
+++ b/layout/style/test/file_animations_pausing.html
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/file_animations_playbackrate.html b/layout/style/test/file_animations_playbackrate.html
new file mode 100644
index 000000000..93206594e
--- /dev/null
+++ b/layout/style/test/file_animations_playbackrate.html
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/file_animations_styles_on_event.html b/layout/style/test/file_animations_styles_on_event.html
new file mode 100644
index 000000000..b9cdb430c
--- /dev/null
+++ b/layout/style/test/file_animations_styles_on_event.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/file_animations_with_disabled_properties.html b/layout/style/test/file_animations_with_disabled_properties.html
new file mode 100644
index 000000000..4b69c7f60
--- /dev/null
+++ b/layout/style/test/file_animations_with_disabled_properties.html
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/file_bug1055933_circle-xxl.png b/layout/style/test/file_bug1055933_circle-xxl.png
new file mode 100644
index 000000000..3223a5690
Binary files /dev/null and b/layout/style/test/file_bug1055933_circle-xxl.png differ
diff --git a/layout/style/test/file_bug1089417_iframe.html b/layout/style/test/file_bug1089417_iframe.html
new file mode 100644
index 000000000..95208dbc5
--- /dev/null
+++ b/layout/style/test/file_bug1089417_iframe.html
@@ -0,0 +1,17 @@
+
+
+
+ Bug 1089417
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/file_bug645998-1.css b/layout/style/test/file_bug645998-1.css
new file mode 100644
index 000000000..328e6ed79
--- /dev/null
+++ b/layout/style/test/file_bug645998-1.css
@@ -0,0 +1 @@
+@import url("file_bug645998-2.css");
diff --git a/layout/style/test/file_bug645998-2.css b/layout/style/test/file_bug645998-2.css
new file mode 100644
index 000000000..2d5edbe21
--- /dev/null
+++ b/layout/style/test/file_bug645998-2.css
@@ -0,0 +1 @@
+@import url("file_bug645998-1.css");
diff --git a/layout/style/test/file_bug829816.css b/layout/style/test/file_bug829816.css
new file mode 100644
index 000000000..8f12ba6f5
Binary files /dev/null and b/layout/style/test/file_bug829816.css differ
diff --git a/layout/style/test/file_font_loading_api_vframe.html b/layout/style/test/file_font_loading_api_vframe.html
new file mode 100644
index 000000000..51dbbbee9
--- /dev/null
+++ b/layout/style/test/file_font_loading_api_vframe.html
@@ -0,0 +1,2 @@
+
+
diff --git a/layout/style/test/file_transitions_replacement_on_busy_frame.html b/layout/style/test/file_transitions_replacement_on_busy_frame.html
new file mode 100644
index 000000000..c1678ab31
--- /dev/null
+++ b/layout/style/test/file_transitions_replacement_on_busy_frame.html
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/file_transitions_with_disabled_properties.html b/layout/style/test/file_transitions_with_disabled_properties.html
new file mode 100644
index 000000000..75305f09b
--- /dev/null
+++ b/layout/style/test/file_transitions_with_disabled_properties.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/flexbox_layout_testcases.js b/layout/style/test/flexbox_layout_testcases.js
new file mode 100644
index 000000000..719583630
--- /dev/null
+++ b/layout/style/test/flexbox_layout_testcases.js
@@ -0,0 +1,1398 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set ts=2 sw=2 sts=2 et: */
+
+/*
+ * This Source Code is subject to the terms of the Mozilla Public License
+ * version 2.0 (the "License"). You can obtain a copy of the License at
+ * http://mozilla.org/MPL/2.0/.
+ */
+
+/**
+ * For the purposes of this test, flex items are specified as a hash with a
+ * hash-entry for each CSS property that is to be set. In these per-property
+ * entries, the key is the property-name, and the value can be either of the
+ * following:
+ * (a) the property's specified value (which indicates that we don't need to
+ * bother checking the computed value of this particular property)
+ * ...OR...
+ * (b) an array with 2-3 entries...
+ * [specifiedValue, expectedComputedValue (, epsilon) ]
+ * ...which indicates that the property's computed value should be
+ * checked. The array's first entry (for the specified value) may be
+ * null; this means that no value should be explicitly specified for this
+ * property. The second entry is the property's expected computed
+ * value. The third (optional) entry is an epsilon value, which allows for
+ * fuzzy equality when testing the computed value.
+ *
+ * To allow these testcases to be re-used in both horizontal and vertical
+ * flex containers, we specify "width"/"min-width"/etc. using the aliases
+ * "_main-size", "_min-main-size", etc. The test code can map these
+ * placeholder names to their corresponding property-names using the maps
+ * defined below -- gRowPropertyMapping, gColumnPropertyMapping, etc.
+ *
+ * If the testcase needs to customize its flex container at all (e.g. by
+ * specifying a custom container-size), it can do so by including a hash
+ * called "container_properties", with propertyName:propertyValue mappings.
+ * (This hash can use aliased property-names like "_main-size" as well.)
+ */
+
+// The standard main-size we'll use for our flex container when setting up
+// the testcases defined below:
+var gDefaultFlexContainerSize = "200px";
+
+// Left-to-right versions of placeholder property-names used in
+// testcases below:
+var gRowPropertyMapping =
+{
+ "_main-size": "width",
+ "_min-main-size": "min-width",
+ "_max-main-size": "max-width",
+ "_border-main-start-width": "border-left-width",
+ "_border-main-end-width": "border-right-width",
+ "_padding-main-start": "padding-left",
+ "_padding-main-end": "padding-right",
+ "_margin-main-start": "margin-left",
+ "_margin-main-end": "margin-right"
+};
+
+// Right-to-left versions of placeholder property-names used in
+// testcases below:
+var gRowReversePropertyMapping =
+{
+ "_main-size": "width",
+ "_min-main-size": "min-width",
+ "_max-main-size": "max-width",
+ "_border-main-start-width": "border-right-width",
+ "_border-main-end-width": "border-left-width",
+ "_padding-main-start": "padding-right",
+ "_padding-main-end": "padding-left",
+ "_margin-main-start": "margin-right",
+ "_margin-main-end": "margin-left"
+};
+
+// Top-to-bottom versions of placeholder property-names used in
+// testcases below:
+var gColumnPropertyMapping =
+{
+ "_main-size": "height",
+ "_min-main-size": "min-height",
+ "_max-main-size": "max-height",
+ "_border-main-start-width": "border-top-width",
+ "_border-main-end-width": "border-bottom-width",
+ "_padding-main-start": "padding-top",
+ "_padding-main-end": "padding-bottom",
+ "_margin-main-start": "margin-top",
+ "_margin-main-end": "margin-bottom"
+};
+
+// Bottom-to-top versions of placeholder property-names used in
+// testcases below:
+var gColumnReversePropertyMapping =
+{
+ "_main-size": "height",
+ "_min-main-size": "min-height",
+ "_max-main-size": "max-height",
+ "_border-main-start-width": "border-bottom-width",
+ "_border-main-end-width": "border-top-width",
+ "_padding-main-start": "padding-bottom",
+ "_padding-main-end": "padding-top",
+ "_margin-main-start": "margin-bottom",
+ "_margin-main-end": "margin-top"
+};
+
+// The list of actual testcase definitions:
+var gFlexboxTestcases =
+[
+ // No flex properties specified --> should just use 'width' for sizing
+ {
+ items:
+ [
+ { "_main-size": [ "40px", "40px" ] },
+ { "_main-size": [ "65px", "65px" ] },
+ ]
+ },
+ // flex-basis is specified:
+ {
+ items:
+ [
+ { "flex-basis": "50px",
+ "_main-size": [ null, "50px" ]
+ },
+ {
+ "flex-basis": "20px",
+ "_main-size": [ null, "20px" ]
+ },
+ ]
+ },
+ // flex-basis is *large* -- sum of flex-basis values is > flex container size:
+ // (w/ 0 flex-shrink so we don't shrink):
+ {
+ items:
+ [
+ {
+ "flex": "0 0 150px",
+ "_main-size": [ null, "150px" ]
+ },
+ {
+ "flex": "0 0 90px",
+ "_main-size": [ null, "90px" ]
+ },
+ ]
+ },
+ // flex-basis is *large* -- each flex-basis value is > flex container size:
+ // (w/ 0 flex-shrink so we don't shrink):
+ {
+ items:
+ [
+ {
+ "flex": "0 0 250px",
+ "_main-size": [ null, "250px" ]
+ },
+ {
+ "flex": "0 0 400px",
+ "_main-size": [ null, "400px" ]
+ },
+ ]
+ },
+ // flex-basis has percentage value:
+ {
+ items:
+ [
+ {
+ "flex-basis": "30%",
+ "_main-size": [ null, "60px" ]
+ },
+ {
+ "flex-basis": "45%",
+ "_main-size": [ null, "90px" ]
+ },
+ ]
+ },
+ // flex-basis has calc(percentage) value:
+ {
+ items:
+ [
+ {
+ "flex-basis": "calc(20%)",
+ "_main-size": [ null, "40px" ]
+ },
+ {
+ "flex-basis": "calc(80%)",
+ "_main-size": [ null, "160px" ]
+ },
+ ]
+ },
+ // flex-basis has calc(percentage +/- length) value:
+ {
+ items:
+ [
+ {
+ "flex-basis": "calc(10px + 20%)",
+ "_main-size": [ null, "50px" ]
+ },
+ {
+ "flex-basis": "calc(60% - 1px)",
+ "_main-size": [ null, "119px" ]
+ },
+ ]
+ },
+ // flex-grow is specified:
+ {
+ items:
+ [
+ {
+ "flex": "1",
+ "_main-size": [ null, "60px" ]
+ },
+ {
+ "flex": "2",
+ "_main-size": [ null, "120px" ]
+ },
+ {
+ "flex": "0 20px",
+ "_main-size": [ null, "20px" ]
+ }
+ ]
+ },
+ // Same ratio as prev. testcase; making sure we handle float inaccuracy
+ {
+ items:
+ [
+ {
+ "flex": "100000",
+ "_main-size": [ null, "60px" ]
+ },
+ {
+ "flex": "200000",
+ "_main-size": [ null, "120px" ]
+ },
+ {
+ "flex": "0.000001 20px",
+ "_main-size": [ null, "20px" ]
+ }
+ ]
+ },
+ // Same ratio as prev. testcase, but with items cycled and w/
+ // "flex: none" & explicit size instead of "flex: 0 20px"
+ {
+ items:
+ [
+ {
+ "flex": "none",
+ "_main-size": [ "20px", "20px" ]
+ },
+ {
+ "flex": "1",
+ "_main-size": [ null, "60px" ]
+ },
+ {
+ "flex": "2",
+ "_main-size": [ null, "120px" ]
+ }
+ ]
+ },
+
+ // ...and now with flex-grow:[huge] to be sure we handle infinite float values
+ // gracefully.
+ {
+ items:
+ [
+ {
+ "flex": "9999999999999999999999999999999999999999999999999999999",
+ "_main-size": [ null, "200px" ]
+ },
+ ]
+ },
+ {
+ items:
+ [
+ {
+ "flex": "9999999999999999999999999999999999999999999999999999999",
+ "_main-size": [ null, "50px" ]
+ },
+ {
+ "flex": "9999999999999999999999999999999999999999999999999999999",
+ "_main-size": [ null, "50px" ]
+ },
+ {
+ "flex": "9999999999999999999999999999999999999999999999999999999",
+ "_main-size": [ null, "50px" ]
+ },
+ {
+ "flex": "9999999999999999999999999999999999999999999999999999999",
+ "_main-size": [ null, "50px" ]
+ },
+ ]
+ },
+ {
+ items:
+ [
+ {
+ "flex": "99999999999999999999999999999999999",
+ "_main-size": [ null, "50px" ]
+ },
+ {
+ "flex": "99999999999999999999999999999999999",
+ "_main-size": [ null, "50px" ]
+ },
+ {
+ "flex": "99999999999999999999999999999999999",
+ "_main-size": [ null, "50px" ]
+ },
+ {
+ "flex": "99999999999999999999999999999999999",
+ "_main-size": [ null, "50px" ]
+ },
+ ]
+ },
+
+ // And now, some testcases to check that we handle float accumulation error
+ // gracefully.
+
+ // First, a testcase with just a custom-sized huge container, to be sure we'll
+ // be able to handle content on that scale, in the subsequent more-complex
+ // testcases:
+ {
+ container_properties:
+ {
+ "_main-size": "9000000px"
+ },
+ items:
+ [
+ {
+ "flex": "1",
+ "_main-size": [ null, "9000000px" ]
+ },
+ ]
+ },
+ // ...and now with two flex items dividing up that container's huge size:
+ {
+ container_properties:
+ {
+ "_main-size": "9000000px"
+ },
+ items:
+ [
+ {
+ "flex": "2",
+ "_main-size": [ null, "6000000px" ]
+ },
+ {
+ "flex": "1",
+ "_main-size": [ null, "3000000px" ]
+ },
+ ]
+ },
+
+ // OK, now to actually test accumulation error. Below, we have six flex items
+ // splitting up the container's size, with huge differences between flex
+ // weights. For simplicity, I've set up the weights so that they sum exactly
+ // to the container's size in px. So 1 unit of flex *should* get you 1px.
+ //
+ // NOTE: The expected computed "_main-size" values for the flex items below
+ // appear to add up to more than their container's size, which would suggest
+ // that they overflow their container unnecessarily. But they don't actually
+ // overflow -- this discrepancy is simply because Gecko's code for reporting
+ // computed-sizes rounds to 6 significant figures (in particular, the method
+ // (nsTSubstring_CharT::AppendFloat() does this). Internally, in app-units,
+ // the child frames' main-sizes add up exactly to the container's main-size,
+ // as you'd hope & expect.
+ {
+ container_properties:
+ {
+ "_main-size": "9000000px"
+ },
+ items:
+ [
+ {
+ "flex": "3000000",
+ "_main-size": [ null, "3000000px" ]
+ },
+ {
+ "flex": "1",
+ "_main-size": [ null, "1px" ]
+ },
+ {
+ "flex": "1",
+ "_main-size": [ null, "1px" ]
+ },
+ {
+ "flex": "2999999",
+ // NOTE: Expected value is off slightly, from float error when
+ // resolving flexible lengths & when generating computed value string:
+ "_main-size": [ null, "3000000px" ]
+ },
+ {
+ "flex": "2999998",
+ // NOTE: Expected value is off slightly, from float error when
+ // resolving flexible lengths & when generating computed value string:
+ "_main-size": [ null, "3000000px" ]
+ },
+ {
+ "flex": "1",
+ "_main-size": [ null, "1px", 0.2 ]
+ },
+ ]
+ },
+ // Same flex items as previous testcase, but now reordered such that the items
+ // with tiny flex weights are all listed last:
+ {
+ container_properties:
+ {
+ "_main-size": "9000000px"
+ },
+ items:
+ [
+ {
+ "flex": "3000000",
+ "_main-size": [ null, "3000000px" ]
+ },
+ {
+ "flex": "2999999",
+ // NOTE: Expected value is off slightly, from float error when
+ // resolving flexible lengths & when generating computed value string:
+ "_main-size": [ null, "3000000px" ]
+ },
+ {
+ "flex": "2999998",
+ // NOTE: Expected value is off slightly, from float error when
+ // resolving flexible lengths & when generating computed value string:
+ "_main-size": [ null, "3000000px" ]
+ },
+ {
+ "flex": "1",
+ "_main-size": [ null, "1px", 0.2 ]
+ },
+ {
+ "flex": "1",
+ "_main-size": [ null, "1px", 0.2 ]
+ },
+ {
+ "flex": "1",
+ "_main-size": [ null, "1px", 0.2 ]
+ },
+ ]
+ },
+ // Same flex items as previous testcase, but now reordered such that the items
+ // with tiny flex weights are all listed first:
+ {
+ container_properties:
+ {
+ "_main-size": "9000000px"
+ },
+ items:
+ [
+ {
+ "flex": "1",
+ // NOTE: Expected value is off slightly, from float error when
+ // resolving flexible lengths:
+ "_main-size": [ null, "1px", 0.2 ]
+ },
+ {
+ "flex": "1",
+ // NOTE: Expected value is off slightly, from float error when
+ // resolving flexible lengths:
+ "_main-size": [ null, "1px", 0.2 ]
+ },
+ {
+ "flex": "1",
+ // NOTE: Expected value is off slightly, from float error when
+ // resolving flexible lengths:
+ "_main-size": [ null, "1px", 0.2 ]
+ },
+ {
+ "flex": "3000000",
+ "_main-size": [ null, "3000000px" ]
+ },
+ {
+ "flex": "2999999",
+ // NOTE: Expected value is off slightly, from float error when
+ // resolving flexible lengths & when generating computed value string:
+ "_main-size": [ null, "3000000px" ]
+ },
+ {
+ "flex": "2999998",
+ // NOTE: Expected value is off slightly, from float error when
+ // resolving flexible lengths & when generating computed value string:
+ "_main-size": [ null, "3000000px" ]
+ },
+ ]
+ },
+
+ // Trying "flex: auto" (== "1 1 auto") w/ a mix of flex-grow/flex-basis values
+ {
+ items:
+ [
+ {
+ "flex": "auto",
+ "_main-size": [ null, "45px" ]
+ },
+ {
+ "flex": "2",
+ "_main-size": [ null, "90px" ]
+ },
+ {
+ "flex": "20px 1 0",
+ "_main-size": [ null, "65px" ]
+ }
+ ]
+ },
+ // Same as previous, but with items cycled & different syntax
+ {
+ items:
+ [
+ {
+ "flex": "20px",
+ "_main-size": [ null, "65px" ]
+ },
+ {
+ "flex": "1",
+ "_main-size": [ null, "45px" ]
+ },
+ {
+ "flex": "2",
+ "_main-size": [ null, "90px" ]
+ }
+ ]
+ },
+ {
+ items:
+ [
+ {
+ "flex": "2",
+ "_main-size": [ null, "100px" ],
+ "border": "0px dashed",
+ "_border-main-start-width": [ "5px", "5px" ],
+ "_border-main-end-width": [ "15px", "15px" ],
+ "_margin-main-start": [ "22px", "22px" ],
+ "_margin-main-end": [ "8px", "8px" ]
+ },
+ {
+ "flex": "1",
+ "_main-size": [ null, "50px" ],
+ "_margin-main-start": [ "auto", "0px" ],
+ "_padding-main-end": [ "auto", "0px" ],
+ }
+ ]
+ },
+ // Test negative flexibility:
+
+ // Basic testcase: just 1 item (relying on initial "flex-shrink: 1") --
+ // should shrink to container size.
+ {
+ items:
+ [
+ { "_main-size": [ "400px", "200px" ] },
+ ],
+ },
+ // ...and now with a "flex" specification and a different flex-shrink value:
+ {
+ items:
+ [
+ {
+ "flex": "4 2 250px",
+ "_main-size": [ null, "200px" ]
+ },
+ ],
+ },
+ // ...and now with multiple items, which all shrink proportionally (by 50%)
+ // to fit to the container, since they have the same (initial) flex-shrink val
+ {
+ items:
+ [
+ { "_main-size": [ "80px", "40px" ] },
+ { "_main-size": [ "40px", "20px" ] },
+ { "_main-size": [ "30px", "15px" ] },
+ { "_main-size": [ "250px", "125px" ] },
+ ]
+ },
+ // ...and now with positive flexibility specified. (should have no effect, so
+ // everything still shrinks by the same proportion, since the flex-shrink
+ // values are all the same).
+ {
+ items:
+ [
+ {
+ "flex": "4 3 100px",
+ "_main-size": [ null, "80px" ]
+ },
+ {
+ "flex": "5 3 50px",
+ "_main-size": [ null, "40px" ]
+ },
+ {
+ "flex": "0 3 100px",
+ "_main-size": [ null, "80px" ]
+ }
+ ]
+ },
+ // ...and now with *different* flex-shrink values:
+ {
+ items:
+ [
+ {
+ "flex": "4 2 50px",
+ "_main-size": [ null, "30px" ]
+ },
+ {
+ "flex": "5 3 50px",
+ "_main-size": [ null, "20px" ]
+ },
+ {
+ "flex": "0 0 150px",
+ "_main-size": [ null, "150px" ]
+ }
+ ]
+ },
+ // Same ratio as prev. testcase; making sure we handle float inaccuracy
+ {
+ items:
+ [
+ {
+ "flex": "4 20000000 50px",
+ "_main-size": [ null, "30px" ]
+ },
+ {
+ "flex": "5 30000000 50px",
+ "_main-size": [ null, "20px" ]
+ },
+ {
+ "flex": "0 0.0000001 150px",
+ "_main-size": [ null, "150px" ]
+ }
+ ]
+ },
+ // Another "different flex-shrink values" testcase:
+ {
+ items:
+ [
+ {
+ "flex": "4 2 115px",
+ "_main-size": [ null, "69px" ]
+ },
+ {
+ "flex": "5 1 150px",
+ "_main-size": [ null, "120px" ]
+ },
+ {
+ "flex": "1 4 30px",
+ "_main-size": [ null, "6px" ]
+ },
+ {
+ "flex": "1 0 5px",
+ "_main-size": [ null, "5px" ]
+ },
+ ]
+ },
+
+ // ...and now with min-size (clamping the effects of flex-shrink on one item):
+ {
+ items:
+ [
+ {
+ "flex": "4 5 75px",
+ "_min-main-size": "50px",
+ "_main-size": [ null, "50px" ],
+ },
+ {
+ "flex": "5 5 100px",
+ "_main-size": [ null, "62.5px" ]
+ },
+ {
+ "flex": "0 4 125px",
+ "_main-size": [ null, "87.5px" ]
+ }
+ ]
+ },
+
+ // Test a min-size that's much larger than initial preferred size, but small
+ // enough that our flexed size pushes us over it:
+ {
+ items:
+ [
+ {
+ "flex": "auto",
+ "_min-main-size": "110px",
+ "_main-size": [ "50px", "125px" ]
+ },
+ {
+ "flex": "auto",
+ "_main-size": [ null, "75px" ]
+ }
+ ]
+ },
+
+ // Test a min-size that's much larger than initial preferred size, and is
+ // even larger than our positively-flexed size, so that we have to increase it
+ // (as a 'min violation') after we've flexed.
+ {
+ items:
+ [
+ {
+ "flex": "auto",
+ "_min-main-size": "150px",
+ "_main-size": [ "50px", "150px" ]
+ },
+ {
+ "flex": "auto",
+ "_main-size": [ null, "50px" ]
+ }
+ ]
+ },
+
+ // Test min-size on multiple items simultaneously:
+ {
+ items:
+ [
+ {
+ "flex": "auto",
+ "_min-main-size": "20px",
+ "_main-size": [ null, "20px" ]
+ },
+ {
+ "flex": "9 auto",
+ "_min-main-size": "150px",
+ "_main-size": [ "50px", "180px" ]
+ },
+ ]
+ },
+ {
+ items:
+ [
+ {
+ "flex": "1 1 0px",
+ "_min-main-size": "90px",
+ "_main-size": [ null, "90px" ]
+ },
+ {
+ "flex": "1 1 0px",
+ "_min-main-size": "80px",
+ "_main-size": [ null, "80px" ]
+ },
+ {
+ "flex": "1 1 40px",
+ "_main-size": [ null, "30px" ]
+ }
+ ]
+ },
+
+ // Test a case where _min-main-size will be violated on different items in
+ // successive iterations of the "resolve the flexible lengths" loop
+ {
+ items:
+ [
+ {
+ "flex": "1 2 100px",
+ "_min-main-size": "90px",
+ "_main-size": [ null, "90px" ]
+ },
+ {
+ "flex": "1 1 100px",
+ "_min-main-size": "70px",
+ "_main-size": [ null, "70px" ]
+ },
+ {
+ "flex": "1 1 100px",
+ "_main-size": [ null, "40px" ]
+ }
+ ]
+ },
+
+ // Test some cases that have a min-size violation on one item and a
+ // max-size violation on another:
+
+ // Here, both items initially grow to 100px. That violates both
+ // items' sizing constraints (it's smaller than the min-size and larger than
+ // the max-size), so we clamp both of them and sum the clamping-differences:
+ //
+ // (130px - 100px) + (50px - 100px) = (30px) + (-50px) = -20px
+ //
+ // This sum is negative, so (per spec) we freeze the item that had its
+ // max-size violated (the second one) and restart the algorithm. This time,
+ // all the available space (200px - 50px = 150px) goes to the not-yet-frozen
+ // first item, and that puts it above its min-size, so all is well.
+ {
+ items:
+ [
+ {
+ "flex": "auto",
+ "_min-main-size": "130px",
+ "_main-size": [ null, "150px" ]
+ },
+ {
+ "flex": "auto",
+ "_max-main-size": "50px",
+ "_main-size": [ null, "50px" ]
+ },
+ ]
+ },
+
+ // As above, both items initially grow to 100px, and that violates both items'
+ // constraints. However, now the sum of the clamping differences is:
+ //
+ // (130px - 100px) + (80px - 100px) = (30px) + (-20px) = 10px
+ //
+ // This sum is positive, so (per spec) we freeze the item that had its
+ // min-size violated (the first one) and restart the algorithm. This time,
+ // all the available space (200px - 130px = 70px) goes to the not-yet-frozen
+ // second item, and that puts it below its max-size, so all is well.
+ {
+ items:
+ [
+ {
+ "flex": "auto",
+ "_min-main-size": "130px",
+ "_main-size": [ null, "130px" ]
+ },
+ {
+ "flex": "auto",
+ "_max-main-size": "80px",
+ "_main-size": [ null, "70px" ]
+ },
+ ]
+ },
+
+ // As above, both items initially grow to 100px, and that violates both items'
+ // constraints. So we clamp both items and sum the clamping differences to
+ // see what to do next. The sum is:
+ //
+ // (80px - 100px) + (120px - 100px) = (-20px) + (20px) = 0px
+ //
+ // Per spec, if the sum is 0, we're done -- we leave both items at their
+ // clamped sizes.
+ {
+ items:
+ [
+ {
+ "flex": "auto",
+ "_max-main-size": "80px",
+ "_main-size": [ null, "80px" ]
+ },
+ {
+ "flex": "auto",
+ "_min-main-size": "120px",
+ "_main-size": [ null, "120px" ]
+ },
+ ]
+ },
+
+ // Test cases where flex-grow sums to less than 1:
+ // ===============================================
+ // This makes us treat the flexibilities like "fraction of free space"
+ // instead of weights, so that e.g. a single item with "flex-grow: 0.1"
+ // will only get 10% of the free space instead of all of the free space.
+
+ // Basic cases where flex-grow sum is less than 1:
+ {
+ items:
+ [
+ {
+ "flex": "0.1 100px",
+ "_main-size": [ null, "110px" ] // +10% of free space
+ },
+ ]
+ },
+ {
+ items:
+ [
+ {
+ "flex": "0.8 0px",
+ "_main-size": [ null, "160px" ] // +80% of free space
+ },
+ ]
+ },
+
+ // ... and now with two flex items:
+ {
+ items:
+ [
+ {
+ "flex": "0.4 70px",
+ "_main-size": [ null, "110px" ] // +40% of free space
+ },
+ {
+ "flex": "0.2 30px",
+ "_main-size": [ null, "50px" ] // +20% of free space
+ },
+ ]
+ },
+
+ // ...and now with max-size modifying how much free space one item can take:
+ {
+ items:
+ [
+ {
+ "flex": "0.4 70px",
+ "_main-size": [ null, "110px" ] // +40% of free space
+ },
+ {
+ "flex": "0.2 30px",
+ "_max-main-size": "35px",
+ "_main-size": [ null, "35px" ] // +20% free space, then clamped
+ },
+ ]
+ },
+ // ...and now with a max-size smaller than our flex-basis:
+ // (This makes us freeze the second item right away, before we compute
+ // the initial free space.)
+ {
+ items:
+ [
+ {
+ "flex": "0.4 70px",
+ "_main-size": [ null, "118px" ] // +40% of 200px-70px-10px
+ },
+ {
+ "flex": "0.2 30px",
+ "_max-main-size": "10px",
+ "_main-size": [ null, "10px" ] // immediately frozen
+ },
+ ]
+ },
+ // ...and now with a max-size and a huge flex-basis, such that we initially
+ // have negative free space, which makes the "% of [original] free space"
+ // calculations a bit more subtle. We set the "original free space" after
+ // we've clamped the second item (the first time the free space is positive).
+ {
+ items:
+ [
+ {
+ "flex": "0.4 70px",
+ "_main-size": [ null, "118px" ] // +40% of free space _after freezing
+ // the other item_
+ },
+ {
+ "flex": "0.2 150px",
+ "_max-main-size": "10px",
+ "_main-size": [ null, "10px" ] // clamped immediately
+ },
+ ]
+ },
+
+ // Now with min-size modifying how much free space our items take:
+ {
+ items:
+ [
+ {
+ "flex": "0.4 70px",
+ "_main-size": [ null, "110px" ] // +40% of free space
+ },
+ {
+ "flex": "0.2 30px",
+ "_min-main-size": "70px",
+ "_main-size": [ null, "70px" ] // +20% free space, then clamped
+ },
+ ]
+ },
+
+ // ...and now with a large enough min-size that it prevents the other flex
+ // item from taking its full desired portion of the original free space:
+ {
+ items:
+ [
+ {
+ "flex": "0.4 70px",
+ "_main-size": [ null, "80px" ] // (Can't take my full +40% of
+ // free space due to other item's
+ // large min-size.)
+ },
+ {
+ "flex": "0.2 30px",
+ "_min-main-size": "120px",
+ "_main-size": [ null, "120px" ] // +20% free space, then clamped
+ },
+ ]
+ },
+ // ...and now with a large-enough min-size that it pushes the other flex item
+ // to actually shrink a bit (with default "flex-shrink:1"):
+ {
+ items:
+ [
+ {
+ "flex": "0.3 30px",
+ "_main-size": [ null, "20px" ] // -10px, instead of desired +45px
+ },
+ {
+ "flex": "0.2 20px",
+ "_min-main-size": "180px",
+ "_main-size": [ null, "180px" ] // +160px, instead of desired +30px
+ },
+ ]
+ },
+
+ // In this case, the items' flexibilities don't initially sum to < 1, but they
+ // do after we freeze the third item for violating its max-size.
+ {
+ items:
+ [
+ {
+ "flex": "0.3 30px",
+ "_main-size": [ null, "75px" ]
+ // 1st loop: desires (0.3 / 5) * 150px = 9px. Tentatively granted.
+ // 2nd loop: desires 0.3 * 150px = 45px. Tentatively granted.
+ // 3rd loop: desires 0.3 * 150px = 45px. Granted +45px.
+ },
+ {
+ "flex": "0.2 20px",
+ "_max-main-size": "30px",
+ "_main-size": [ null, "30px" ]
+ // First loop: desires (0.2 / 5) * 150px = 6px. Tentatively granted.
+ // Second loop: desires 0.2 * 150px = 30px. Frozen at +10px.
+ },
+ {
+ "flex": "4.5 0px",
+ "_max-main-size": "20px",
+ "_main-size": [ null, "20px" ]
+ // First loop: desires (4.5 / 5) * 150px = 135px. Frozen at +20px.
+ },
+ ]
+ },
+
+ // Make sure we calculate "original free space" correctly when one of our
+ // flex items will be clamped right away, due to max-size preventing it from
+ // growing at all:
+ {
+ // Here, the second flex item is effectively inflexible; it's
+ // immediately frozen at 40px since we're growing & this item's max size
+ // trivially prevents it from growing. This leaves us with an "original
+ // free space" of 60px. The first flex item takes half of that, due to
+ // its flex-grow value of 0.5.
+ items:
+ [
+ {
+ "flex": "0.5 100px",
+ "_main-size": [ null, "130px" ]
+ },
+ {
+ "flex": "1 98px",
+ "_max-main-size": "40px",
+ "_main-size": [ null, "40px" ]
+ },
+ ]
+ },
+ {
+ // Same as previous example, but with a larger flex-basis on the second
+ // element (which shouldn't ultimately matter, because its max size clamps
+ // its size immediately anyway).
+ items:
+ [
+ {
+ "flex": "0.5 100px",
+ "_main-size": [ null, "130px" ]
+ },
+ {
+ "flex": "1 101px",
+ "_max-main-size": "40px",
+ "_main-size": [ null, "40px" ]
+ },
+ ]
+ },
+
+ {
+ // Here, the third flex item is effectively inflexible; it's immediately
+ // frozen at 0px since we're growing & this item's max size trivially
+ // prevents it from growing. This leaves us with an "original free space" of
+ // 100px. The first flex item takes 40px, and the third takes 50px, due to
+ // their flex values of 0.4 and 0.5.
+ items:
+ [
+ {
+ "flex": "0.4 50px",
+ "_main-size": [ null, "90px" ]
+ },
+ {
+ "flex": "0.5 50px",
+ "_main-size": [ null, "100px" ]
+ },
+ {
+ "flex": "0 90px",
+ "_max-main-size": "0px",
+ "_main-size": [ null, "0px" ]
+ },
+ ]
+ },
+ {
+ // Same as previous example, but with slightly larger flex-grow values on
+ // the first and second items, which sum to 1.0 and produce slightly larger
+ // main sizes. This demonstrates that there's no discontinuity between the
+ // "< 1.0 sum" to ">= 1.0 sum" behavior, in this situation at least.
+ items:
+ [
+ {
+ "flex": "0.45 50px",
+ "_main-size": [ null, "95px" ]
+ },
+ {
+ "flex": "0.55 50px",
+ "_main-size": [ null, "105px" ]
+ },
+ {
+ "flex": "0 90px",
+ "_max-main-size": "0px",
+ "_main-size": [ null, "0px" ]
+ },
+ ]
+ },
+
+ // Test cases where flex-shrink sums to less than 1:
+ // =================================================
+ // This makes us treat the flexibilities more like "fraction of (negative)
+ // free space" instead of weights, so that e.g. a single item with
+ // "flex-shrink: 0.1" will only shrink by 10% of amount that it overflows
+ // its container by.
+ //
+ // It gets a bit more complex when there are multiple flex items, because
+ // flex-shrink is scaled by the flex-basis before it's used as a weight. But
+ // even with that scaling, the general principal is that e.g. if the
+ // flex-shrink values *sum* to 0.6, then the items will collectively only
+ // shrink by 60% (and hence will still overflow).
+
+ // Basic cases where flex-grow sum is less than 1:
+ {
+ items:
+ [
+ {
+ "flex": "0 0.1 300px",
+ "_main-size": [ null, "290px" ] // +10% of (negative) free space
+ },
+ ]
+ },
+ {
+ items:
+ [
+ {
+ "flex": "0 0.8 400px",
+ "_main-size": [ null, "240px" ] // +80% of (negative) free space
+ },
+ ]
+ },
+
+ // ...now with two flex items, with the same flex-basis value:
+ {
+ items:
+ [
+ {
+ "flex": "0 0.4 150px",
+ "_main-size": [ null, "110px" ] // +40% of (negative) free space
+ },
+ {
+ "flex": "0 0.2 150px",
+ "_main-size": [ null, "130px" ] // +20% of (negative) free space
+ },
+ ]
+ },
+
+ // ...now with two flex items, with different flex-basis values (and hence
+ // differently-scaled flex factors):
+ {
+ items:
+ [
+ {
+ "flex": "0 0.3 100px",
+ "_main-size": [ null, "76px" ]
+ },
+ {
+ "flex": "0 0.1 200px",
+ "_main-size": [ null, "184px" ]
+ }
+ ]
+ // Notes:
+ // - Free space: -100px
+ // - Sum of flex-shrink factors: 0.3 + 0.1 = 0.4
+ // - Since that sum ^ is < 1, we'll only distribute that fraction of
+ // the free space. We'll distribute: -100px * 0.4 = -40px
+ //
+ // - 1st item's scaled flex factor: 0.3 * 100px = 30
+ // - 2nd item's scaled flex factor: 0.1 * 200px = 20
+ // - 1st item's share of distributed free space: 30/(30+20) = 60%
+ // - 2nd item's share of distributed free space: 20/(30+20) = 40%
+ //
+ // SO:
+ // - 1st item gets 60% * -40px = -24px. 100px-24px = 76px
+ // - 2nd item gets 40% * -40px = -16px. 200px-16px = 184px
+ },
+
+ // ...now with min-size modifying how much one item can shrink:
+ {
+ items:
+ [
+ {
+ "flex": "0 0.3 100px",
+ "_main-size": [ null, "70px" ]
+ },
+ {
+ "flex": "0 0.1 200px",
+ "_min-main-size": "190px",
+ "_main-size": [ null, "190px" ]
+ }
+ ]
+ // Notes:
+ // - We proceed as in previous testcase, but clamp the second flex item
+ // at its min main size.
+ // - After that point, we have a total flex-shrink of = 0.3, so we
+ // distribute 0.3 * -100px = -30px to the remaining unfrozen flex
+ // items. Since there's only one unfrozen item left, it gets all of it.
+ },
+
+ // ...now with min-size larger than our flex-basis:
+ // (This makes us freeze the second item right away, before we compute
+ // the initial free space.)
+ {
+ items:
+ [
+ {
+ "flex": "0 0.3 100px",
+ "_main-size": [ null, "55px" ] // +30% of 200px-100px-250px
+ },
+ {
+ "flex": "0 0.1 200px",
+ "_min-main-size": "250px",
+ "_main-size": [ null, "250px" ] // immediately frozen
+ }
+ ]
+ // (Same as previous example, except the min-main-size prevents the
+ // second item from shrinking at all)
+ },
+
+ // ...and now with a min-size and a small flex-basis, such that we initially
+ // have positive free space, which makes the "% of [original] free space"
+ // calculations a bit more subtle. We set the "original free space" after
+ // we've clamped the second item (the first time the free space is negative).
+ {
+ items:
+ [
+ {
+ "flex": "0 0.3 100px",
+ "_main-size": [ null, "70px" ]
+ },
+ {
+ "flex": "0 0.1 50px",
+ "_min-main-size": "200px",
+ "_main-size": [ null, "200px" ]
+ }
+ ]
+ },
+
+ // Now with max-size making an item shrink more than its flex-shrink value
+ // calls for:
+ {
+ items:
+ [
+ {
+ "flex": "0 0.3 100px",
+ "_main-size": [ null, "70px" ]
+ },
+ {
+ "flex": "0 0.1 200px",
+ "_max-main-size": "150px",
+ "_main-size": [ null, "150px" ]
+ }
+ ]
+ // Notes:
+ // - We proceed as in an earlier testcase, but clamp the second flex item
+ // at its max main size.
+ // - After that point, we have a total flex-shrink of = 0.3, so we
+ // distribute 0.3 * -100px = -30px to the remaining unfrozen flex
+ // items. Since there's only one unfrozen item left, it gets all of it.
+ },
+
+ // ...and now with a small enough max-size that it prevents the other flex
+ // item from taking its full desired portion of the (negative) original free
+ // space:
+ {
+ items:
+ [
+ {
+ "flex": "0 0.3 100px",
+ "_main-size": [ null, "90px" ]
+ },
+ {
+ "flex": "0 0.1 200px",
+ "_max-main-size": "110px",
+ "_main-size": [ null, "110px" ]
+ }
+ ]
+ // Notes:
+ // - We proceed as in an earlier testcase, but clamp the second flex item
+ // at its max main size.
+ // - After that point, we have a total flex-shrink of 0.3, which would
+ // have us distribute 0.3 * -100px = -30px to the (one) remaining
+ // unfrozen flex item. But our remaining free space is only -10px at
+ // that point, so we distribute that instead.
+ },
+
+ // ...and now with a small enough max-size that it pushes the other flex item
+ // to actually grow a bit (with custom "flex-grow: 1" for this testcase):
+ {
+ items:
+ [
+ {
+ "flex": "1 0.3 100px",
+ "_main-size": [ null, "120px" ]
+ },
+ {
+ "flex": "1 0.1 200px",
+ "_max-main-size": "80px",
+ "_main-size": [ null, "80px" ]
+ }
+ ]
+ },
+
+ // In this case, the items' flexibilities don't initially sum to < 1, but they
+ // do after we freeze the third item for violating its min-size.
+ {
+ items:
+ [
+ {
+ "flex": "0 0.3 100px",
+ "_main-size": [ null, "76px" ]
+ },
+ {
+ "flex": "0 0.1 150px",
+ "_main-size": [ null, "138px" ]
+ },
+ {
+ "flex": "0 0.8 10px",
+ "_min-main-size": "40px",
+ "_main-size": [ null, "40px" ]
+ }
+ ]
+ // Notes:
+ // - We immediately freeze the 3rd item, since we're shrinking and its
+ // min size obviously prevents it from shrinking at all. This leaves
+ // 200px - 100px - 150px - 40px = -90px of "initial free space".
+ //
+ // - Our remaining flexible items have a total flex-shrink of 0.4,
+ // so we can distribute a total of 0.4 * -90px = -36px
+ //
+ // - We distribute that space using *scaled* flex factors:
+ // * 1st item's scaled flex factor: 0.3 * 100px = 30
+ // * 2nd item's scaled flex factor: 0.1 * 150px = 15
+ // ...which means...
+ // * 1st item's share of distributed free space: 30/(30+15) = 2/3
+ // * 2nd item's share of distributed free space: 15/(30+15) = 1/3
+ //
+ // SO:
+ // - 1st item gets 2/3 * -36px = -24px. 100px - 24px = 76px
+ // - 2nd item gets 1/3 * -36px = -12px. 150px - 12px = 138px
+ },
+
+ // In this case, the items' flexibilities sum to > 1, in part due to an item
+ // that *can't actually shrink* due to its 0 flex-basis (which gives it a
+ // "scaled flex factor" of 0). This prevents us from triggering the special
+ // behavior for flexibilities that sum to less than 1, and as a result, the
+ // first item ends up absorbing all of the free space.
+ {
+ items:
+ [
+ {
+ "flex": "0 .5 300px",
+ "_main-size": [ null, "200px" ]
+ },
+ {
+ "flex": "0 5 0px",
+ "_main-size": [ null, "0px" ]
+ }
+ ]
+ },
+
+ // This case is similar to the one above, but with a *barely* nonzero base
+ // size for the second item. This should produce a result similar to the case
+ // above. (In particular, we should first distribute a very small amount of
+ // negative free space to the second item, getting it to approximately zero,
+ // and distribute the bulk of the negative free space to the first item,
+ // getting it to approximately 200px.)
+ {
+ items:
+ [
+ {
+ "flex": "0 .5 300px",
+ "_main-size": [ null, "200px" ]
+ },
+ {
+ "flex": "0 1 0.01px",
+ "_main-size": [ null, "0px" ]
+ }
+ ]
+ },
+ // This case is similar to the ones above, but now we've increased the
+ // flex-shrink value on the second-item so that it claims enough of the
+ // negative free space to go below its min-size (0px). So, it triggers a min
+ // violation & is frozen. For the loop *after* the min violation, the sum of
+ // the remaining flex items' flex-shrink values is less than 1, so we trigger
+ // the special <1 behavior and only distribute half of the remaining
+ // (negative) free space to the first item (instead of all of it).
+ {
+ items:
+ [
+ {
+ "flex": "0 .5 300px",
+ "_main-size": [ null, "250px" ]
+ },
+ {
+ "flex": "0 5 0.01px",
+ "_main-size": [ null, "0px" ]
+ }
+ ]
+ },
+];
diff --git a/layout/style/test/gen-css-properties.py b/layout/style/test/gen-css-properties.py
new file mode 100644
index 000000000..7196c5e71
--- /dev/null
+++ b/layout/style/test/gen-css-properties.py
@@ -0,0 +1,24 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from __future__ import print_function
+
+import os
+import sys
+import subprocess
+
+def main(output, css_properties, exe):
+ # moz.build passes in the exe name without any path, so to run it we need to
+ # prepend the './'
+ run_exe = exe if os.path.isabs(exe) else './%s' % exe
+
+ # Use universal_newlines so everything is '\n', which gets converted to
+ # '\r\n' when writing out the file in Windows.
+ data = subprocess.check_output([run_exe], universal_newlines=True)
+ with open(css_properties) as f:
+ data += f.read()
+ output.write(data)
+
+if __name__ == '__main__':
+ main(sys.stdout, *sys.argv[1:])
diff --git a/layout/style/test/media_queries_dynamic_xbl_binding.xml b/layout/style/test/media_queries_dynamic_xbl_binding.xml
new file mode 100644
index 000000000..4b8515539
--- /dev/null
+++ b/layout/style/test/media_queries_dynamic_xbl_binding.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/media_queries_dynamic_xbl_iframe.html b/layout/style/test/media_queries_dynamic_xbl_iframe.html
new file mode 100644
index 000000000..50e8008fa
--- /dev/null
+++ b/layout/style/test/media_queries_dynamic_xbl_iframe.html
@@ -0,0 +1,5 @@
+
+
+Hello
diff --git a/layout/style/test/media_queries_dynamic_xbl_style.css b/layout/style/test/media_queries_dynamic_xbl_style.css
new file mode 100644
index 000000000..5c99c07ee
--- /dev/null
+++ b/layout/style/test/media_queries_dynamic_xbl_style.css
@@ -0,0 +1,6 @@
+@media (orientation: portrait) {
+ div { color: purple; }
+}
+@media (orientation: landscape) {
+ div { color: blue; }
+}
diff --git a/layout/style/test/media_queries_iframe.html b/layout/style/test/media_queries_iframe.html
new file mode 100644
index 000000000..141ecdcd9
--- /dev/null
+++ b/layout/style/test/media_queries_iframe.html
@@ -0,0 +1,15 @@
+
+
+
+ Media Queries Test inner frame
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/mochitest.ini b/layout/style/test/mochitest.ini
new file mode 100644
index 000000000..406c6f901
--- /dev/null
+++ b/layout/style/test/mochitest.ini
@@ -0,0 +1,312 @@
+[DEFAULT]
+support-files =
+ animation_utils.js
+ ccd-quirks.html
+ ccd.sjs
+ ccd-standards.html
+ chrome/bug418986-2.js
+ chrome/match.png
+ chrome/mismatch.png
+ descriptor_database.js
+ display_mode_reflow_iframe.html
+ empty.html
+ media_queries_dynamic_xbl_binding.xml
+ media_queries_dynamic_xbl_iframe.html
+ media_queries_dynamic_xbl_style.css
+ media_queries_iframe.html
+ neverending_font_load.sjs
+ neverending_stylesheet_load.sjs
+ post-redirect-1.css
+ post-redirect-2.css
+ post-redirect-3.css
+ property_database.js
+ redirect.sjs
+ style_attribute_tests.js
+ unstyled.css
+ unstyled-frame.css
+ unstyled-frame.xml
+ unstyled.xml
+ viewport_units_iframe.html
+ visited_image_loading_frame_empty.html
+ visited_image_loading_frame.html
+ visited_image_loading.sjs
+ visited-lying-inner.html
+ visited-pref-iframe.html
+ xbl_bindings.xml
+
+[test_acid3_test46.html]
+[test_addSheet.html]
+support-files = additional_sheets_helper.html
+[test_additional_sheets.html]
+support-files = additional_sheets_helper.html
+[test_all_shorthand.html]
+[test_animations.html]
+skip-if = toolkit == 'android'
+[test_animations_async_tests.html]
+support-files = ../../reftests/fonts/Ahem.ttf file_animations_async_tests.html
+[test_animations_dynamic_changes.html]
+[test_animations_effect_timing_duration.html]
+support-files = file_animations_effect_timing_duration.html
+[test_animations_effect_timing_enddelay.html]
+support-files = file_animations_effect_timing_enddelay.html
+[test_animations_effect_timing_iterations.html]
+support-files = file_animations_effect_timing_iterations.html
+[test_animations_event_order.html]
+[test_animations_event_handler_attribute.html]
+[test_animations_iterationstart.html]
+support-files = file_animations_iterationstart.html
+[test_animations_omta.html]
+[test_animations_omta_start.html]
+[test_animations_pausing.html]
+support-files = file_animations_pausing.html
+[test_animations_playbackrate.html]
+support-files = file_animations_playbackrate.html
+[test_animations_styles_on_event.html]
+support-files = file_animations_styles_on_event.html
+[test_animations_with_disabled_properties.html]
+support-files = file_animations_with_disabled_properties.html
+[test_any_dynamic.html]
+[test_at_rule_parse_serialize.html]
+[test_attribute_selector_eof_behavior.html]
+[test_background_blend_mode.html]
+[test_box_size_keywords.html]
+[test_bug73586.html]
+[test_bug74880.html]
+[test_bug98997.html]
+[test_bug160403.html]
+[test_bug200089.html]
+[test_bug221428.html]
+[test_bug229915.html]
+[test_bug302186.html]
+[test_bug319381.html]
+[test_bug357614.html]
+[test_bug363146.html]
+[test_bug372770.html]
+[test_bug373293.html]
+[test_bug377947.html]
+[test_bug379440.html]
+skip-if = toolkit == 'android'
+[test_bug379741.html]
+[test_bug382027.html]
+[test_bug383075.html]
+[test_bug387615.html]
+[test_bug389464.html]
+[test_bug391034.html]
+[test_bug391221.html]
+[test_bug397427.html]
+[test_bug399349.html]
+[test_bug401046.html]
+skip-if = true # Bug 701060
+[test_bug405818.html]
+[test_bug412901.html]
+skip-if = android_version == '18' # bug 1147986
+[test_bug413958.html]
+[test_bug418986-2.html]
+[test_bug437915.html]
+[test_bug450191.html]
+[test_bug453896_deck.html]
+support-files = bug453896_iframe.html
+[test_bug470769.html]
+[test_bug499655.html]
+[test_bug499655.xhtml]
+[test_bug511909.html]
+[test_bug517224.html]
+support-files = bug517224.sjs
+[test_bug524175.html]
+[test_bug525952.html]
+[test_bug534804.html]
+[test_bug573255.html]
+[test_bug580685.html]
+[test_bug621351.html]
+[test_bug635286.html]
+[test_bug652486.html]
+[test_bug657143.html]
+[test_bug664955.html]
+[test_bug667520.html]
+[test_bug645998.html]
+support-files = file_bug645998-1.css file_bug645998-2.css
+[test_bug716226.html]
+[test_bug732153.html]
+[test_bug732209.html]
+support-files = bug732209-css.sjs
+[test_bug765590.html]
+[test_bug771043.html]
+[test_bug795520.html]
+[test_bug798567.html]
+[test_bug798843_pref.html]
+[test_bug829816.html]
+[test_bug874919.html]
+support-files = file_bug829816.css
+[test_bug887741_at-rules_in_declaration_lists.html]
+[test_bug892929.html]
+[test_bug1055933.html]
+support-files = file_bug1055933_circle-xxl.png
+[test_bug1089417.html]
+support-files = file_bug1089417_iframe.html
+[test_bug1112014.html]
+[test_bug1203766.html]
+[test_bug1232829.html]
+[test_bug1292447.html]
+[test_cascade.html]
+[test_ch_ex_no_infloops.html]
+[test_change_hint_optimizations.html]
+[test_clip-path_polygon.html]
+[test_compute_data_with_start_struct.html]
+skip-if = toolkit == 'android'
+[test_computed_style.html]
+[test_computed_style_min_size_auto.html]
+[test_computed_style_no_pseudo.html]
+[test_computed_style_prefs.html]
+[test_condition_text.html]
+[test_condition_text_assignment.html]
+[test_contain_formatting_context.html]
+[test_counter_descriptor_storage.html]
+[test_counter_style.html]
+[test_css_cross_domain.html]
+skip-if = toolkit == 'android' #bug 536603
+[test_css_eof_handling.html]
+[test_css_escape_api.html]
+[test_css_function_mismatched_parenthesis.html]
+[test_css_loader_crossorigin_data_url.html]
+[test_css_supports.html]
+[test_css_supports_variables.html]
+[test_default_bidi_css.html]
+[test_default_computed_style.html]
+[test_descriptor_storage.html]
+[test_descriptor_syntax_errors.html]
+[test_dont_use_document_colors.html]
+[test_dynamic_change_causing_reflow.html]
+[test_exposed_prop_accessors.html]
+[test_extra_inherit_initial.html]
+[test_align_justify_computed_values.html]
+[test_flexbox_child_display_values.xhtml]
+[test_flexbox_flex_grow_and_shrink.html]
+[test_flexbox_flex_shorthand.html]
+[test_flexbox_layout.html]
+support-files = flexbox_layout_testcases.js
+[test_flexbox_order.html]
+[test_flexbox_order_abspos.html]
+[test_flexbox_order_table.html]
+[test_flexbox_reflow_counts.html]
+[test_font_face_parser.html]
+[test_font_family_parsing.html]
+[test_font_feature_values_parsing.html]
+[test_font_loading_api.html]
+support-files =
+ BitPattern.woff
+ file_font_loading_api_vframe.html
+[test_garbage_at_end_of_declarations.html]
+[test_grid_container_shorthands.html]
+[test_grid_item_shorthands.html]
+[test_grid_shorthand_serialization.html]
+[test_grid_computed_values.html]
+[test_group_insertRule.html]
+[test_hover_quirk.html]
+[test_html_attribute_computed_values.html]
+[test_ident_escaping.html]
+[test_inherit_computation.html]
+skip-if = toolkit == 'android'
+[test_inherit_storage.html]
+[test_initial_computation.html]
+skip-if = toolkit == 'android'
+[test_initial_storage.html]
+[test_keyframes_rules.html]
+[test_load_events_on_stylesheets.html]
+[test_logical_properties.html]
+[test_media_queries.html]
+skip-if = android_version == '18' #debug-only failure; timed out #Android 4.3 aws only; bug 1030419
+[test_media_queries_dynamic.html]
+[test_media_queries_dynamic_xbl.html]
+[test_media_query_list.html]
+[test_moz_device_pixel_ratio.html]
+[test_namespace_rule.html]
+[test_of_type_selectors.xhtml]
+[test_page_parser.html]
+[test_parse_eof.html]
+[test_parse_ident.html]
+[test_parse_rule.html]
+[test_parse_url.html]
+[test_parser_diagnostics_unprintables.html]
+[test_pixel_lengths.html]
+[test_pointer-events.html]
+[test_position_float_display.html]
+[test_position_sticky.html]
+[test_priority_preservation.html]
+[test_property_database.html]
+[test_property_syntax_errors.html]
+[test_pseudoelement_state.html]
+[test_pseudoelement_parsing.html]
+[test_redundant_font_download.html]
+support-files = redundant_font_download.sjs
+[test_rem_unit.html]
+[test_restyles_in_smil_animation.html]
+[test_root_node_display.html]
+[test_rule_insertion.html]
+[test_rule_serialization.html]
+[test_rules_out_of_sheets.html]
+[test_selectors.html]
+skip-if = toolkit == 'android' #bug 775227
+[test_selectors_on_anonymous_content.html]
+[test_setPropertyWithNull.html]
+[test_shorthand_property_getters.html]
+[test_specified_value_serialization.html]
+[test_style_attribute_quirks.html]
+[test_style_attribute_standards.html]
+[test_style_struct_copy_constructors.html]
+[test_supports_rules.html]
+[test_system_font_serialization.html]
+[test_text_decoration_shorthands.html]
+[test_transitions_and_reframes.html]
+[test_transitions_and_restyles.html]
+[test_transitions_and_zoom.html]
+[test_transitions_cancel_near_end.html]
+[test_transitions_computed_values.html]
+[test_transitions_computed_value_combinations.html]
+[test_transitions_events.html]
+[test_transitions.html]
+skip-if = (android_version == '18' && debug) # bug 1159532
+[test_transitions_bug537151.html]
+[test_transitions_dynamic_changes.html]
+[test_transitions_per_property.html]
+skip-if = toolkit == 'android' #bug 775227
+[test_transitions_replacement_on_busy_frame.html]
+support-files = file_transitions_replacement_on_busy_frame.html
+[test_transitions_step_functions.html]
+[test_transitions_with_disabled_properties.html]
+support-files = file_transitions_with_disabled_properties.html
+[test_unclosed_parentheses.html]
+[test_unicode_range_loading.html]
+support-files = ../../reftests/fonts/markA.woff ../../reftests/fonts/markB.woff ../../reftests/fonts/markC.woff ../../reftests/fonts/markD.woff
+[test_units_angle.html]
+[test_units_frequency.html]
+[test_units_length.html]
+[test_units_time.html]
+[test_unprefixing_service.html]
+support-files = unprefixing_service_iframe.html unprefixing_service_utils.js
+[test_unprefixing_service_prefs.html]
+support-files = unprefixing_service_iframe.html unprefixing_service_utils.js
+[test_value_cloning.html]
+skip-if = toolkit == 'android' #bug 775227
+[test_value_computation.html]
+skip-if = toolkit == 'android'
+[test_value_storage.html]
+[test_variable_serialization_computed.html]
+[test_variable_serialization_specified.html]
+[test_variables.html]
+support-files = support/external-variable-url.css
+[test_video_object_fit.html]
+[test_viewport_units.html]
+[test_visited_image_loading.html]
+skip-if = toolkit == 'android' #TIMED_OUT
+[test_visited_image_loading_empty.html]
+skip-if = toolkit == 'android' #TIMED_OUT
+[test_visited_lying.html]
+skip-if = toolkit == 'android' #TIMED_OUT
+[test_visited_pref.html]
+skip-if = toolkit == 'android' #TIMED_OUT
+[test_visited_reftests.html]
+skip-if = toolkit == 'android' #TIMED_OUT
+[test_webkit_device_pixel_ratio.html]
+[test_webkit_flex_display.html]
+[test_asyncopen2.html]
+[test_align_shorthand_serialization.html]
diff --git a/layout/style/test/moz.build b/layout/style/test/moz.build
new file mode 100644
index 000000000..ca61f607a
--- /dev/null
+++ b/layout/style/test/moz.build
@@ -0,0 +1,126 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# ** Note: The comment below along with the CPP_UNIT_TESTS and LIBS variables
+# ** were commented out in the original Makefile.in, and should be restored
+# ** some day, perhaps as a gtest.
+#
+# ParseCSS.cpp used to be built as a test program, but it was not
+# being used for anything, and recent changes to the CSS loader have
+# made it fail to link. Further changes are planned which should make
+# it buildable again.
+#
+# TestCSSPropertyLookup.cpp needs the internal XPCOM APIs and so cannot
+# be built with libxul enabled.
+#
+#CPP_UNIT_TESTS = TestCSSPropertyLookup.cpp
+#LIBS += ../nsCSSKeywords.$(OBJ_SUFFIX) ../nsCSSProps.$(OBJ_SUFFIX) $(XPCOM_LIBS)
+
+HAS_MISC_RULE = True
+
+HostSimplePrograms([
+ 'host_ListCSSProperties',
+])
+
+MOCHITEST_MANIFESTS += [
+ 'mochitest.ini',
+]
+XPCSHELL_TESTS_MANIFESTS += ['xpcshell.ini']
+BROWSER_CHROME_MANIFESTS += ['browser.ini']
+MOCHITEST_CHROME_MANIFESTS += ['chrome/chrome.ini']
+
+TEST_HARNESS_FILES.testing.mochitest.tests.layout.style.test.chrome += [
+ 'chrome/moz_document_helper.html',
+]
+
+TEST_HARNESS_FILES.testing.mochitest.tests.layout.style.test['css-visited'] += [
+ '/layout/reftests/css-visited/border-1-ref.html',
+ '/layout/reftests/css-visited/border-1.html',
+ '/layout/reftests/css-visited/border-2-ref.html',
+ '/layout/reftests/css-visited/border-2a.html',
+ '/layout/reftests/css-visited/border-2b.html',
+ '/layout/reftests/css-visited/border-collapse-1-ref.html',
+ '/layout/reftests/css-visited/border-collapse-1.html',
+ '/layout/reftests/css-visited/color-choice-1-ref.html',
+ '/layout/reftests/css-visited/color-choice-1.html',
+ '/layout/reftests/css-visited/color-on-bullets-1-ref.html',
+ '/layout/reftests/css-visited/color-on-bullets-1.html',
+ '/layout/reftests/css-visited/color-on-link-1-ref.html',
+ '/layout/reftests/css-visited/color-on-link-1.html',
+ '/layout/reftests/css-visited/color-on-link-before-1.html',
+ '/layout/reftests/css-visited/color-on-text-decoration-1-ref.html',
+ '/layout/reftests/css-visited/color-on-text-decoration-1.html',
+ '/layout/reftests/css-visited/color-on-visited-1-ref.html',
+ '/layout/reftests/css-visited/color-on-visited-1.html',
+ '/layout/reftests/css-visited/color-on-visited-before-1.html',
+ '/layout/reftests/css-visited/column-rule-1-notref.html',
+ '/layout/reftests/css-visited/column-rule-1-ref.html',
+ '/layout/reftests/css-visited/column-rule-1.html',
+ '/layout/reftests/css-visited/content-before-1-ref.html',
+ '/layout/reftests/css-visited/content-color-on-link-before-1-ref.html',
+ '/layout/reftests/css-visited/content-color-on-link-before-1.html',
+ '/layout/reftests/css-visited/content-color-on-visited-before-1-ref.html',
+ '/layout/reftests/css-visited/content-color-on-visited-before-1.html',
+ '/layout/reftests/css-visited/content-on-link-before-1.html',
+ '/layout/reftests/css-visited/content-on-visited-before-1.html',
+ '/layout/reftests/css-visited/first-line-1-ref.html',
+ '/layout/reftests/css-visited/first-line-1.html',
+ '/layout/reftests/css-visited/inherit-keyword-1-ref.html',
+ '/layout/reftests/css-visited/inherit-keyword-1.xhtml',
+ '/layout/reftests/css-visited/link-root-1-ref.xhtml',
+ '/layout/reftests/css-visited/link-root-1.xhtml',
+ '/layout/reftests/css-visited/mathml-links-ref.html',
+ '/layout/reftests/css-visited/mathml-links.html',
+ '/layout/reftests/css-visited/outline-1-ref.html',
+ '/layout/reftests/css-visited/outline-1.html',
+ '/layout/reftests/css-visited/selector-adj-sibling-1-ref.html',
+ '/layout/reftests/css-visited/selector-adj-sibling-1.html',
+ '/layout/reftests/css-visited/selector-adj-sibling-2-ref.html',
+ '/layout/reftests/css-visited/selector-adj-sibling-2.html',
+ '/layout/reftests/css-visited/selector-any-sibling-1-ref.html',
+ '/layout/reftests/css-visited/selector-any-sibling-1.html',
+ '/layout/reftests/css-visited/selector-any-sibling-2-ref.html',
+ '/layout/reftests/css-visited/selector-any-sibling-2.html',
+ '/layout/reftests/css-visited/selector-child-1-ref.html',
+ '/layout/reftests/css-visited/selector-child-1.html',
+ '/layout/reftests/css-visited/selector-child-2-ref.xhtml',
+ '/layout/reftests/css-visited/selector-child-2.xhtml',
+ '/layout/reftests/css-visited/selector-descendant-1-ref.html',
+ '/layout/reftests/css-visited/selector-descendant-1.html',
+ '/layout/reftests/css-visited/selector-descendant-2-ref.xhtml',
+ '/layout/reftests/css-visited/selector-descendant-2.xhtml',
+ '/layout/reftests/css-visited/subject-of-selector-1-ref.html',
+ '/layout/reftests/css-visited/subject-of-selector-adj-sibling-1.html',
+ '/layout/reftests/css-visited/subject-of-selector-any-sibling-1.html',
+ '/layout/reftests/css-visited/subject-of-selector-child-1.html',
+ '/layout/reftests/css-visited/subject-of-selector-descendant-1.html',
+ '/layout/reftests/css-visited/subject-of-selector-descendant-2-ref.xhtml',
+ '/layout/reftests/css-visited/subject-of-selector-descendant-2.xhtml',
+ '/layout/reftests/css-visited/visited-page.html',
+ '/layout/reftests/css-visited/white-to-transparent-1-ref.html',
+ '/layout/reftests/css-visited/white-to-transparent-1.html',
+ '/layout/reftests/css-visited/width-1-ref.html',
+ '/layout/reftests/css-visited/width-on-link-1.html',
+ '/layout/reftests/css-visited/width-on-visited-1.html',
+ '/layout/reftests/svg/as-image/lime100x100.svg',
+ '/layout/reftests/svg/as-image/svg-image-visited-1-helper.svg',
+ '/layout/reftests/svg/as-image/svg-image-visited-2-helper.svg',
+ '/layout/reftests/svg/pseudo-classes-02-ref.svg',
+ '/layout/reftests/svg/pseudo-classes-02.svg',
+]
+
+DEFINES['MOZILLA_INTERNAL_API'] = True
+if CONFIG['MOZ_ENABLE_MASK_AS_SHORTHAND']:
+ HOST_DEFINES['MOZ_ENABLE_MASK_AS_SHORTHAND'] = True
+
+if CONFIG['COMPILE_ENVIRONMENT']:
+ GENERATED_FILES += ['css_properties.js']
+ GENERATED_FILES['css_properties.js'].script = 'gen-css-properties.py'
+ GENERATED_FILES['css_properties.js'].inputs = [
+ 'css_properties_like_longhand.js',
+ '!host_ListCSSProperties%s' % CONFIG['HOST_BIN_SUFFIX'],
+ ]
+ TEST_HARNESS_FILES.testing.mochitest.tests.layout.style.test += ['!css_properties.js']
diff --git a/layout/style/test/neverending_font_load.sjs b/layout/style/test/neverending_font_load.sjs
new file mode 100644
index 000000000..7bf419aaf
--- /dev/null
+++ b/layout/style/test/neverending_font_load.sjs
@@ -0,0 +1,6 @@
+function handleRequest(request, response)
+{
+ response.processAsync();
+ response.setHeader("Content-Type", "application/octet-stream", false);
+ response.write("");
+}
diff --git a/layout/style/test/neverending_stylesheet_load.sjs b/layout/style/test/neverending_stylesheet_load.sjs
new file mode 100644
index 000000000..386ffbe35
--- /dev/null
+++ b/layout/style/test/neverending_stylesheet_load.sjs
@@ -0,0 +1,6 @@
+function handleRequest(request, response)
+{
+ response.processAsync();
+ response.setHeader("Content-Type", "text/css", false);
+ response.write("");
+}
diff --git a/layout/style/test/newtab_share_rule_processors.html b/layout/style/test/newtab_share_rule_processors.html
new file mode 100644
index 000000000..bdfed1145
--- /dev/null
+++ b/layout/style/test/newtab_share_rule_processors.html
@@ -0,0 +1,22 @@
+
+
+Hello
+
diff --git a/layout/style/test/post-redirect-1.css b/layout/style/test/post-redirect-1.css
new file mode 100644
index 000000000..c2ae5d6eb
--- /dev/null
+++ b/layout/style/test/post-redirect-1.css
@@ -0,0 +1 @@
+#one { color: green; background: url("#"); }
diff --git a/layout/style/test/post-redirect-2.css b/layout/style/test/post-redirect-2.css
new file mode 100644
index 000000000..0a75299ce
--- /dev/null
+++ b/layout/style/test/post-redirect-2.css
@@ -0,0 +1 @@
+#two { color: green; background: url("#"); }
diff --git a/layout/style/test/post-redirect-3.css b/layout/style/test/post-redirect-3.css
new file mode 100644
index 000000000..b33887ae3
--- /dev/null
+++ b/layout/style/test/post-redirect-3.css
@@ -0,0 +1 @@
+#three { color: green; background: url("#"); }
diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js
new file mode 100644
index 000000000..9c69e7d10
--- /dev/null
+++ b/layout/style/test/property_database.js
@@ -0,0 +1,7917 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set ts=2 sw=2 sts=2 et: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Utility function. Returns true if the given boolean pref...
+// (a) exists and (b) is set to true.
+// Otherwise, returns false.
+//
+// This function also reports a test failure if the pref isn't set at all. This
+// ensures that we remove pref-checks from mochitests (instead of accidentally
+// disabling the tests that are controlled by that check) when we remove a
+// mature feature's pref from the rest of the codebase.
+function IsCSSPropertyPrefEnabled(prefName)
+{
+ try {
+ if (SpecialPowers.getBoolPref(prefName)) {
+ return true;
+ }
+ } catch (ex) {
+ ok(false, "Failed to look up property-controlling pref '" +
+ prefName + "' (" + ex + ")");
+ }
+
+ return false;
+}
+
+// True longhand properties.
+const CSS_TYPE_LONGHAND = 0;
+
+// True shorthand properties.
+const CSS_TYPE_TRUE_SHORTHAND = 1;
+
+// Properties that we handle as shorthands but were longhands either in
+// the current spec or earlier versions of the spec.
+const CSS_TYPE_SHORTHAND_AND_LONGHAND = 2;
+
+// Each property has the following fields:
+// domProp: The name of the relevant member of nsIDOM[NS]CSS2Properties
+// inherited: Whether the property is inherited by default (stated as
+// yes or no in the property header in all CSS specs)
+// type: see above
+// alias_for: optional, indicates that the property is an alias for
+// some other property that is the preferred serialization. (Type
+// must not be CSS_TYPE_LONGHAND.)
+// logical: optional, indicates that the property is a logical directional
+// property. (Type must be CSS_TYPE_LONGHAND.)
+// axis: optional, indicates that the property is an axis-related logical
+// directional property. (Type must be CSS_TYPE_LONGHAND and 'logical'
+// must be true.)
+// get_computed: if present, the property's computed value shows up on
+// another property, and this is a function used to get it
+// initial_values: Values whose computed value should be the same as the
+// computed value for the property's initial value.
+// other_values: Values whose computed value should be different from the
+// computed value for the property's initial value.
+// XXX Should have a third field for values whose computed value may or
+// may not be the same as for the property's initial value.
+// invalid_values: Things that are not values for the property and
+// should be rejected, but which are balanced and should not absorb
+// what follows
+// quirks_values: Values that should be accepted in quirks mode only,
+// mapped to the values they are equivalent to.
+// unbalanced_values: Things that are not values for the property and
+// should be rejected, and which also contain unbalanced constructs
+// that should absorb what follows
+//
+// Note: By default, an alias is assumed to accept/reject the same values as
+// the property that it aliases, and to have the same prerequisites. So, if
+// "alias_for" is set, the "*_values" and "prerequisites" fields can simply
+// be omitted, and they'll be populated automatically to match the aliased
+// property's fields.
+
+// Helper functions used to construct gCSSProperties.
+
+function initial_font_family_is_sans_serif()
+{
+ // The initial value of 'font-family' might be 'serif' or
+ // 'sans-serif'.
+ var div = document.createElement("div");
+ div.setAttribute("style", "font: initial");
+ return getComputedStyle(div, "").fontFamily == "sans-serif";
+}
+var gInitialFontFamilyIsSansSerif = initial_font_family_is_sans_serif();
+
+// shared by background-image and border-image-source
+var validGradientAndElementValues = [
+ "-moz-element(#a)",
+ "-moz-element( #a )",
+ "-moz-element(#a-1)",
+ "-moz-element(#a\\:1)",
+ /* gradient torture test */
+ "linear-gradient(red, blue)",
+ "linear-gradient(red, yellow, blue)",
+ "linear-gradient(red 1px, yellow 20%, blue 24em, green)",
+ "linear-gradient(red, yellow, green, blue 50%)",
+ "linear-gradient(red -50%, yellow -25%, green, blue)",
+ "linear-gradient(red -99px, yellow, green, blue 120%)",
+ "linear-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
+ "linear-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
+ "linear-gradient(red, green calc(50% + 20px), blue)",
+
+ "linear-gradient(to top, red, blue)",
+ "linear-gradient(to bottom, red, blue)",
+ "linear-gradient(to left, red, blue)",
+ "linear-gradient(to right, red, blue)",
+ "linear-gradient(to top left, red, blue)",
+ "linear-gradient(to top right, red, blue)",
+ "linear-gradient(to bottom left, red, blue)",
+ "linear-gradient(to bottom right, red, blue)",
+ "linear-gradient(to left top, red, blue)",
+ "linear-gradient(to left bottom, red, blue)",
+ "linear-gradient(to right top, red, blue)",
+ "linear-gradient(to right bottom, red, blue)",
+
+ "linear-gradient(-33deg, red, blue)",
+ "linear-gradient(30grad, red, blue)",
+ "linear-gradient(10deg, red, blue)",
+ "linear-gradient(1turn, red, blue)",
+ "linear-gradient(.414rad, red, blue)",
+
+ "linear-gradient(.414rad, red, 50%, blue)",
+ "linear-gradient(.414rad, red, 0%, blue)",
+ "linear-gradient(.414rad, red, 100%, blue)",
+
+ "linear-gradient(.414rad, red 50%, 50%, blue 50%)",
+ "linear-gradient(.414rad, red 50%, 20%, blue 50%)",
+ "linear-gradient(.414rad, red 50%, 30%, blue 10%)",
+ "linear-gradient(to right bottom, red, 20%, green 50%, 65%, blue)",
+ "linear-gradient(to right bottom, red, 20%, green 10%, blue)",
+ "linear-gradient(to right bottom, red, 50%, green 50%, 50%, blue)",
+ "linear-gradient(to right bottom, red, 0%, green 50%, 100%, blue)",
+
+ "-moz-linear-gradient(red, blue)",
+ "-moz-linear-gradient(red, yellow, blue)",
+ "-moz-linear-gradient(red 1px, yellow 20%, blue 24em, green)",
+ "-moz-linear-gradient(red, yellow, green, blue 50%)",
+ "-moz-linear-gradient(red -50%, yellow -25%, green, blue)",
+ "-moz-linear-gradient(red -99px, yellow, green, blue 120%)",
+ "-moz-linear-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
+ "-moz-linear-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
+
+ "-moz-linear-gradient(to top, red, blue)",
+ "-moz-linear-gradient(to bottom, red, blue)",
+ "-moz-linear-gradient(to left, red, blue)",
+ "-moz-linear-gradient(to right, red, blue)",
+ "-moz-linear-gradient(to top left, red, blue)",
+ "-moz-linear-gradient(to top right, red, blue)",
+ "-moz-linear-gradient(to bottom left, red, blue)",
+ "-moz-linear-gradient(to bottom right, red, blue)",
+ "-moz-linear-gradient(to left top, red, blue)",
+ "-moz-linear-gradient(to left bottom, red, blue)",
+ "-moz-linear-gradient(to right top, red, blue)",
+ "-moz-linear-gradient(to right bottom, red, blue)",
+
+ "-moz-linear-gradient(top left, red, blue)",
+ "-moz-linear-gradient(0 0, red, blue)",
+ "-moz-linear-gradient(20% bottom, red, blue)",
+ "-moz-linear-gradient(center 20%, red, blue)",
+ "-moz-linear-gradient(left 35px, red, blue)",
+ "-moz-linear-gradient(10% 10em, red, blue)",
+ "-moz-linear-gradient(44px top, red, blue)",
+
+ "-moz-linear-gradient(0px, red, blue)",
+ "-moz-linear-gradient(0, red, blue)",
+ "-moz-linear-gradient(top left 45deg, red, blue)",
+ "-moz-linear-gradient(20% bottom -300deg, red, blue)",
+ "-moz-linear-gradient(center 20% 1.95929rad, red, blue)",
+ "-moz-linear-gradient(left 35px 30grad, red, blue)",
+ "-moz-linear-gradient(left 35px 0.1turn, red, blue)",
+ "-moz-linear-gradient(10% 10em 99999deg, red, blue)",
+ "-moz-linear-gradient(44px top -33deg, red, blue)",
+
+ "-moz-linear-gradient(-33deg, red, blue)",
+ "-moz-linear-gradient(30grad left 35px, red, blue)",
+ "-moz-linear-gradient(10deg 20px, red, blue)",
+ "-moz-linear-gradient(1turn 20px, red, blue)",
+ "-moz-linear-gradient(.414rad bottom, red, blue)",
+
+ "-moz-linear-gradient(blue calc(0px) ,green calc(25%) ,red calc(40px) ,blue calc(60px) , yellow calc(100px))",
+ "-moz-linear-gradient(-33deg, blue calc(-25%) ,red 40px)",
+ "-moz-linear-gradient(10deg, blue calc(100px + -25%),red calc(40px))",
+ "-moz-linear-gradient(10deg, blue calc(-25px),red calc(100%))",
+ "-moz-linear-gradient(.414rad, blue calc(100px + -25px) ,green calc(100px + -25px) ,red calc(100px + -25%) ,blue calc(-25px) , yellow calc(-25px))",
+ "-moz-linear-gradient(1turn, blue calc(-25%) ,green calc(25px) ,red calc(25%),blue calc(0px),white 50px, yellow calc(-25px))",
+
+ "radial-gradient(red, blue)",
+ "radial-gradient(red, yellow, blue)",
+ "radial-gradient(red 1px, yellow 20%, blue 24em, green)",
+ "radial-gradient(red, yellow, green, blue 50%)",
+ "radial-gradient(red -50%, yellow -25%, green, blue)",
+ "radial-gradient(red -99px, yellow, green, blue 120%)",
+ "radial-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
+
+ "radial-gradient(0 0, red, blue)",
+ "radial-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
+
+ "radial-gradient(at top left, red, blue)",
+ "radial-gradient(at 20% bottom, red, blue)",
+ "radial-gradient(at center 20%, red, blue)",
+ "radial-gradient(at left 35px, red, blue)",
+ "radial-gradient(at 10% 10em, red, blue)",
+ "radial-gradient(at 44px top, red, blue)",
+ "radial-gradient(at 0 0, red, blue)",
+
+ "radial-gradient(farthest-corner, red, blue)",
+ "radial-gradient(circle, red, blue)",
+ "radial-gradient(ellipse closest-corner, red, blue)",
+ "radial-gradient(closest-corner ellipse, red, blue)",
+
+ "radial-gradient(43px, red, blue)",
+ "radial-gradient(43px 43px, red, blue)",
+ "radial-gradient(50% 50%, red, blue)",
+ "radial-gradient(43px 50%, red, blue)",
+ "radial-gradient(50% 43px, red, blue)",
+ "radial-gradient(circle 43px, red, blue)",
+ "radial-gradient(43px circle, red, blue)",
+ "radial-gradient(ellipse 43px 43px, red, blue)",
+ "radial-gradient(ellipse 50% 50%, red, blue)",
+ "radial-gradient(ellipse 43px 50%, red, blue)",
+ "radial-gradient(ellipse 50% 43px, red, blue)",
+ "radial-gradient(50% 43px ellipse, red, blue)",
+
+ "radial-gradient(farthest-corner at top left, red, blue)",
+ "radial-gradient(ellipse closest-corner at 45px, red, blue)",
+ "radial-gradient(circle farthest-side at 45px, red, blue)",
+ "radial-gradient(closest-side ellipse at 50%, red, blue)",
+ "radial-gradient(farthest-corner circle at 4em, red, blue)",
+
+ "radial-gradient(30% 40% at top left, red, blue)",
+ "radial-gradient(50px 60px at 15% 20%, red, blue)",
+ "radial-gradient(7em 8em at 45px, red, blue)",
+
+ "-moz-radial-gradient(red, blue)",
+ "-moz-radial-gradient(red, yellow, blue)",
+ "-moz-radial-gradient(red 1px, yellow 20%, blue 24em, green)",
+ "-moz-radial-gradient(red, yellow, green, blue 50%)",
+ "-moz-radial-gradient(red -50%, yellow -25%, green, blue)",
+ "-moz-radial-gradient(red -99px, yellow, green, blue 120%)",
+ "-moz-radial-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
+
+ "-moz-radial-gradient(top left, red, blue)",
+ "-moz-radial-gradient(20% bottom, red, blue)",
+ "-moz-radial-gradient(center 20%, red, blue)",
+ "-moz-radial-gradient(left 35px, red, blue)",
+ "-moz-radial-gradient(10% 10em, red, blue)",
+ "-moz-radial-gradient(44px top, red, blue)",
+
+ "-moz-radial-gradient(top left 45deg, red, blue)",
+ "-moz-radial-gradient(0 0, red, blue)",
+ "-moz-radial-gradient(20% bottom -300deg, red, blue)",
+ "-moz-radial-gradient(center 20% 1.95929rad, red, blue)",
+ "-moz-radial-gradient(left 35px 30grad, red, blue)",
+ "-moz-radial-gradient(10% 10em 99999deg, red, blue)",
+ "-moz-radial-gradient(44px top -33deg, red, blue)",
+ "-moz-radial-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
+
+ "-moz-radial-gradient(-33deg, red, blue)",
+ "-moz-radial-gradient(30grad left 35px, red, blue)",
+ "-moz-radial-gradient(10deg 20px, red, blue)",
+ "-moz-radial-gradient(.414rad bottom, red, blue)",
+
+ "-moz-radial-gradient(cover, red, blue)",
+ "-moz-radial-gradient(cover circle, red, blue)",
+ "-moz-radial-gradient(contain, red, blue)",
+ "-moz-radial-gradient(contain ellipse, red, blue)",
+ "-moz-radial-gradient(circle, red, blue)",
+ "-moz-radial-gradient(ellipse closest-corner, red, blue)",
+ "-moz-radial-gradient(farthest-side circle, red, blue)",
+
+ "-moz-radial-gradient(top left, cover, red, blue)",
+ "-moz-radial-gradient(15% 20%, circle, red, blue)",
+ "-moz-radial-gradient(45px, ellipse closest-corner, red, blue)",
+ "-moz-radial-gradient(45px, farthest-side circle, red, blue)",
+
+ "-moz-radial-gradient(99deg, cover, red, blue)",
+ "-moz-radial-gradient(-1.2345rad, circle, red, blue)",
+ "-moz-radial-gradient(399grad, ellipse closest-corner, red, blue)",
+ "-moz-radial-gradient(399grad, farthest-side circle, red, blue)",
+
+ "-moz-radial-gradient(top left 99deg, cover, red, blue)",
+ "-moz-radial-gradient(15% 20% -1.2345rad, circle, red, blue)",
+ "-moz-radial-gradient(45px 399grad, ellipse closest-corner, red, blue)",
+ "-moz-radial-gradient(45px 399grad, farthest-side circle, red, blue)",
+
+ "-moz-repeating-linear-gradient(red, blue)",
+ "-moz-repeating-linear-gradient(red, yellow, blue)",
+ "-moz-repeating-linear-gradient(red 1px, yellow 20%, blue 24em, green)",
+ "-moz-repeating-linear-gradient(red, yellow, green, blue 50%)",
+ "-moz-repeating-linear-gradient(red -50%, yellow -25%, green, blue)",
+ "-moz-repeating-linear-gradient(red -99px, yellow, green, blue 120%)",
+ "-moz-repeating-linear-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
+ "-moz-repeating-linear-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
+
+ "-moz-repeating-linear-gradient(to top, red, blue)",
+ "-moz-repeating-linear-gradient(to bottom, red, blue)",
+ "-moz-repeating-linear-gradient(to left, red, blue)",
+ "-moz-repeating-linear-gradient(to right, red, blue)",
+ "-moz-repeating-linear-gradient(to top left, red, blue)",
+ "-moz-repeating-linear-gradient(to top right, red, blue)",
+ "-moz-repeating-linear-gradient(to bottom left, red, blue)",
+ "-moz-repeating-linear-gradient(to bottom right, red, blue)",
+ "-moz-repeating-linear-gradient(to left top, red, blue)",
+ "-moz-repeating-linear-gradient(to left bottom, red, blue)",
+ "-moz-repeating-linear-gradient(to right top, red, blue)",
+ "-moz-repeating-linear-gradient(to right bottom, red, blue)",
+
+ "-moz-repeating-linear-gradient(top left, red, blue)",
+ "-moz-repeating-linear-gradient(0 0, red, blue)",
+ "-moz-repeating-linear-gradient(20% bottom, red, blue)",
+ "-moz-repeating-linear-gradient(center 20%, red, blue)",
+ "-moz-repeating-linear-gradient(left 35px, red, blue)",
+ "-moz-repeating-linear-gradient(10% 10em, red, blue)",
+ "-moz-repeating-linear-gradient(44px top, red, blue)",
+
+ "-moz-repeating-linear-gradient(top left 45deg, red, blue)",
+ "-moz-repeating-linear-gradient(20% bottom -300deg, red, blue)",
+ "-moz-repeating-linear-gradient(center 20% 1.95929rad, red, blue)",
+ "-moz-repeating-linear-gradient(left 35px 30grad, red, blue)",
+ "-moz-repeating-linear-gradient(10% 10em 99999deg, red, blue)",
+ "-moz-repeating-linear-gradient(44px top -33deg, red, blue)",
+
+ "-moz-repeating-linear-gradient(-33deg, red, blue)",
+ "-moz-repeating-linear-gradient(30grad left 35px, red, blue)",
+ "-moz-repeating-linear-gradient(10deg 20px, red, blue)",
+ "-moz-repeating-linear-gradient(.414rad bottom, red, blue)",
+
+ "-moz-repeating-radial-gradient(red, blue)",
+ "-moz-repeating-radial-gradient(red, yellow, blue)",
+ "-moz-repeating-radial-gradient(red 1px, yellow 20%, blue 24em, green)",
+ "-moz-repeating-radial-gradient(red, yellow, green, blue 50%)",
+ "-moz-repeating-radial-gradient(red -50%, yellow -25%, green, blue)",
+ "-moz-repeating-radial-gradient(red -99px, yellow, green, blue 120%)",
+ "-moz-repeating-radial-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
+ "-moz-repeating-radial-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
+
+ "repeating-radial-gradient(at top left, red, blue)",
+ "repeating-radial-gradient(at 0 0, red, blue)",
+ "repeating-radial-gradient(at 20% bottom, red, blue)",
+ "repeating-radial-gradient(at center 20%, red, blue)",
+ "repeating-radial-gradient(at left 35px, red, blue)",
+ "repeating-radial-gradient(at 10% 10em, red, blue)",
+ "repeating-radial-gradient(at 44px top, red, blue)",
+
+ "-moz-repeating-radial-gradient(farthest-corner, red, blue)",
+ "-moz-repeating-radial-gradient(circle, red, blue)",
+ "-moz-repeating-radial-gradient(ellipse closest-corner, red, blue)",
+
+ "repeating-radial-gradient(farthest-corner at top left, red, blue)",
+ "repeating-radial-gradient(closest-corner ellipse at 45px, red, blue)",
+ "repeating-radial-gradient(farthest-side circle at 45px, red, blue)",
+ "repeating-radial-gradient(ellipse closest-side at 50%, red, blue)",
+ "repeating-radial-gradient(circle farthest-corner at 4em, red, blue)",
+
+ "repeating-radial-gradient(30% 40% at top left, red, blue)",
+ "repeating-radial-gradient(50px 60px at 15% 20%, red, blue)",
+ "repeating-radial-gradient(7em 8em at 45px, red, blue)",
+
+ "-moz-image-rect(url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), 2, 10, 10, 2)",
+ "-moz-image-rect(url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), 10%, 50%, 30%, 0%)",
+ "-moz-image-rect(url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), 10, 50%, 30%, 0)",
+
+ "-moz-radial-gradient(calc(25%) top, red, blue)",
+ "-moz-radial-gradient(left calc(25%), red, blue)",
+ "-moz-radial-gradient(calc(25px) top, red, blue)",
+ "-moz-radial-gradient(left calc(25px), red, blue)",
+ "-moz-radial-gradient(calc(-25%) top, red, blue)",
+ "-moz-radial-gradient(left calc(-25%), red, blue)",
+ "-moz-radial-gradient(calc(-25px) top, red, blue)",
+ "-moz-radial-gradient(left calc(-25px), red, blue)",
+ "-moz-radial-gradient(calc(100px + -25%) top, red, blue)",
+ "-moz-radial-gradient(left calc(100px + -25%), red, blue)",
+ "-moz-radial-gradient(calc(100px + -25px) top, red, blue)",
+ "-moz-radial-gradient(left calc(100px + -25px), red, blue)"
+];
+var invalidGradientAndElementValues = [
+ "-moz-element(#a:1)",
+ "-moz-element(a#a)",
+ "-moz-element(#a a)",
+ "-moz-element(#a+a)",
+ "-moz-element(#a())",
+ /* no quirks mode colors */
+ "linear-gradient(red, ff00ff)",
+ /* no quirks mode colors */
+ "-moz-radial-gradient(10% bottom, ffffff, black) scroll no-repeat",
+ /* no quirks mode lengths */
+ "-moz-linear-gradient(10 10px -45deg, red, blue) repeat",
+ "-moz-linear-gradient(10px 10 -45deg, red, blue) repeat",
+ "linear-gradient(red -99, yellow, green, blue 120%)",
+ /* Unitless 0 is invalid as an */
+ "-moz-linear-gradient(top left 0, red, blue)",
+ "-moz-linear-gradient(5px 5px 0, red, blue)",
+ "linear-gradient(0, red, blue)",
+ /* Invalid color, calc() or -moz-image-rect() function */
+ "linear-gradient(red, rgb(0, rubbish, 0) 50%, red)",
+ "linear-gradient(red, red calc(50% + rubbish), red)",
+ "linear-gradient(to top calc(50% + rubbish), red, blue)",
+ /* Old syntax */
+ "-moz-linear-gradient(10px 10px, 20px, 30px 30px, 40px, from(blue), to(red))",
+ "-moz-radial-gradient(20px 20px, 10px 10px, from(green), to(#ff00ff))",
+ "-moz-radial-gradient(10px 10px, 20%, 40px 40px, 10px, from(green), to(#ff00ff))",
+ "-moz-linear-gradient(10px, 20px, 30px, 40px, color-stop(0.5, #00ccff))",
+ "-moz-linear-gradient(20px 20px, from(blue), to(red))",
+ "-moz-linear-gradient(40px 40px, 10px 10px, from(blue) to(red) color-stop(10%, fuchsia))",
+ "-moz-linear-gradient(20px 20px 30px, 10px 10px, from(red), to(#ff0000))",
+ "-moz-radial-gradient(left top, center, 20px 20px, 10px, from(blue), to(red))",
+ "-moz-linear-gradient(left left, top top, from(blue))",
+ "-moz-linear-gradient(inherit, 10px 10px, from(blue))",
+ /* New syntax */
+ "-moz-linear-gradient(10px 10px, 20px, 30px 30px, 40px, blue 0, red 100%)",
+ "-moz-radial-gradient(20px 20px, 10px 10px, from(green), to(#ff00ff))",
+ "-moz-radial-gradient(10px 10px, 20%, 40px 40px, 10px, from(green), to(#ff00ff))",
+ "-moz-linear-gradient(10px, 20px, 30px, 40px, #00ccff 50%)",
+ "-moz-linear-gradient(40px 40px, 10px 10px, blue 0 fuchsia 10% red 100%)",
+ "-moz-linear-gradient(20px 20px 30px, 10px 10px, red 0, #ff0000 100%)",
+ "-moz-radial-gradient(left top, center, 20px 20px, 10px, from(blue), to(red))",
+ "-moz-linear-gradient(left left, top top, blue 0)",
+ "-moz-linear-gradient(inherit, 10px 10px, blue 0)",
+ "-moz-linear-gradient(left left blue red)",
+ "-moz-linear-gradient(left left blue, red)",
+ "-moz-linear-gradient()",
+ "-moz-linear-gradient(cover, red, blue)",
+ "-moz-linear-gradient(auto, red, blue)",
+ "-moz-linear-gradient(22 top, red, blue)",
+ "-moz-linear-gradient(10% red blue)",
+ "-moz-linear-gradient(10%, red blue)",
+ "-moz-linear-gradient(10%,, red, blue)",
+ "-moz-linear-gradient(45px, center, red, blue)",
+ "-moz-linear-gradient(45px, center red, blue)",
+ "-moz-radial-gradient(contain, ellipse, red, blue)",
+ "-moz-radial-gradient(10deg contain, red, blue)",
+ "-moz-radial-gradient(10deg, contain,, red, blue)",
+ "-moz-radial-gradient(contain contain, red, blue)",
+ "-moz-radial-gradient(ellipse circle, red, blue)",
+ "-moz-radial-gradient(to top left, red, blue)",
+ "-moz-radial-gradient(center, 10%, red, blue)",
+ "-moz-radial-gradient(5rad, 20px, red, blue)",
+ "-moz-radial-gradient(40%, -100px -10%, red, blue)",
+
+ "-moz-radial-gradient(at top left to cover, red, blue)",
+ "-moz-radial-gradient(at 15% 20% circle, red, blue)",
+
+ "-moz-radial-gradient(to cover, red, blue)",
+ "-moz-radial-gradient(to contain, red, blue)",
+ "-moz-radial-gradient(to closest-side circle, red, blue)",
+ "-moz-radial-gradient(to farthest-corner ellipse, red, blue)",
+
+ "-moz-radial-gradient(ellipse at 45px closest-corner, red, blue)",
+ "-moz-radial-gradient(circle at 45px farthest-side, red, blue)",
+ "-moz-radial-gradient(ellipse 45px, closest-side, red, blue)",
+ "-moz-radial-gradient(circle 45px, farthest-corner, red, blue)",
+ "-moz-radial-gradient(ellipse, ellipse closest-side, red, blue)",
+ "-moz-radial-gradient(circle, circle farthest-corner, red, blue)",
+
+ "-moz-radial-gradient(99deg to farthest-corner, red, blue)",
+ "-moz-radial-gradient(-1.2345rad circle, red, blue)",
+ "-moz-radial-gradient(ellipse 399grad to closest-corner, red, blue)",
+ "-moz-radial-gradient(circle 399grad to farthest-side, red, blue)",
+
+ "-moz-radial-gradient(at top left 99deg, to farthest-corner, red, blue)",
+ "-moz-radial-gradient(circle at 15% 20% -1.2345rad, red, blue)",
+ "-moz-radial-gradient(to top left at 30% 40%, red, blue)",
+ "-moz-radial-gradient(ellipse at 45px 399grad, to closest-corner, red, blue)",
+ "-moz-radial-gradient(at 45px 399grad to farthest-side circle, red, blue)",
+
+ "-moz-radial-gradient(to 50%, red, blue)",
+ "-moz-radial-gradient(circle to 50%, red, blue)",
+ "-moz-radial-gradient(circle to 43px 43px, red, blue)",
+ "-moz-radial-gradient(circle to 50% 50%, red, blue)",
+ "-moz-radial-gradient(circle to 43px 50%, red, blue)",
+ "-moz-radial-gradient(circle to 50% 43px, red, blue)",
+ "-moz-radial-gradient(ellipse to 43px, red, blue)",
+ "-moz-radial-gradient(ellipse to 50%, red, blue)",
+
+ "-moz-linear-gradient(to 0 0, red, blue)",
+ "-moz-linear-gradient(to 20% bottom, red, blue)",
+ "-moz-linear-gradient(to center 20%, red, blue)",
+ "-moz-linear-gradient(to left 35px, red, blue)",
+ "-moz-linear-gradient(to 10% 10em, red, blue)",
+ "-moz-linear-gradient(to 44px top, red, blue)",
+ "-moz-linear-gradient(to top left 45deg, red, blue)",
+ "-moz-linear-gradient(to 20% bottom -300deg, red, blue)",
+ "-moz-linear-gradient(to center 20% 1.95929rad, red, blue)",
+ "-moz-linear-gradient(to left 35px 30grad, red, blue)",
+ "-moz-linear-gradient(to 10% 10em 99999deg, red, blue)",
+ "-moz-linear-gradient(to 44px top -33deg, red, blue)",
+ "-moz-linear-gradient(to -33deg, red, blue)",
+ "-moz-linear-gradient(to 30grad left 35px, red, blue)",
+ "-moz-linear-gradient(to 10deg 20px, red, blue)",
+ "-moz-linear-gradient(to .414rad bottom, red, blue)",
+
+ "-moz-linear-gradient(to top top, red, blue)",
+ "-moz-linear-gradient(to bottom bottom, red, blue)",
+ "-moz-linear-gradient(to left left, red, blue)",
+ "-moz-linear-gradient(to right right, red, blue)",
+
+ "-moz-repeating-linear-gradient(10px 10px, 20px, 30px 30px, 40px, blue 0, red 100%)",
+ "-moz-repeating-radial-gradient(20px 20px, 10px 10px, from(green), to(#ff00ff))",
+ "-moz-repeating-radial-gradient(10px 10px, 20%, 40px 40px, 10px, from(green), to(#ff00ff))",
+ "-moz-repeating-linear-gradient(10px, 20px, 30px, 40px, #00ccff 50%)",
+ "-moz-repeating-linear-gradient(40px 40px, 10px 10px, blue 0 fuchsia 10% red 100%)",
+ "-moz-repeating-linear-gradient(20px 20px 30px, 10px 10px, red 0, #ff0000 100%)",
+ "-moz-repeating-radial-gradient(left top, center, 20px 20px, 10px, from(blue), to(red))",
+ "-moz-repeating-linear-gradient(left left, top top, blue 0)",
+ "-moz-repeating-linear-gradient(inherit, 10px 10px, blue 0)",
+ "-moz-repeating-linear-gradient(left left blue red)",
+ "-moz-repeating-linear-gradient()",
+
+ "-moz-repeating-linear-gradient(to 0 0, red, blue)",
+ "-moz-repeating-linear-gradient(to 20% bottom, red, blue)",
+ "-moz-repeating-linear-gradient(to center 20%, red, blue)",
+ "-moz-repeating-linear-gradient(to left 35px, red, blue)",
+ "-moz-repeating-linear-gradient(to 10% 10em, red, blue)",
+ "-moz-repeating-linear-gradient(to 44px top, red, blue)",
+ "-moz-repeating-linear-gradient(to top left 45deg, red, blue)",
+ "-moz-repeating-linear-gradient(to 20% bottom -300deg, red, blue)",
+ "-moz-repeating-linear-gradient(to center 20% 1.95929rad, red, blue)",
+ "-moz-repeating-linear-gradient(to left 35px 30grad, red, blue)",
+ "-moz-repeating-linear-gradient(to 10% 10em 99999deg, red, blue)",
+ "-moz-repeating-linear-gradient(to 44px top -33deg, red, blue)",
+ "-moz-repeating-linear-gradient(to -33deg, red, blue)",
+ "-moz-repeating-linear-gradient(to 30grad left 35px, red, blue)",
+ "-moz-repeating-linear-gradient(to 10deg 20px, red, blue)",
+ "-moz-repeating-linear-gradient(to .414rad bottom, red, blue)",
+
+ "-moz-repeating-linear-gradient(to top top, red, blue)",
+ "-moz-repeating-linear-gradient(to bottom bottom, red, blue)",
+ "-moz-repeating-linear-gradient(to left left, red, blue)",
+ "-moz-repeating-linear-gradient(to right right, red, blue)",
+
+ "-moz-repeating-radial-gradient(to top left at 30% 40%, red, blue)",
+ "-moz-repeating-radial-gradient(ellipse at 45px closest-corner, red, blue)",
+ "-moz-repeating-radial-gradient(circle at 45px farthest-side, red, blue)",
+
+ "radial-gradient(circle 175px 20px, black, white)",
+ "radial-gradient(175px 20px circle, black, white)",
+ "radial-gradient(ellipse 175px, black, white)",
+ "radial-gradient(175px ellipse, black, white)",
+ "radial-gradient(50%, red, blue)",
+ "radial-gradient(circle 50%, red, blue)",
+ "radial-gradient(50% circle, red, blue)",
+
+ /* Valid only when prefixed */
+ "linear-gradient(top left, red, blue)",
+ "linear-gradient(0 0, red, blue)",
+ "linear-gradient(20% bottom, red, blue)",
+ "linear-gradient(center 20%, red, blue)",
+ "linear-gradient(left 35px, red, blue)",
+ "linear-gradient(10% 10em, red, blue)",
+ "linear-gradient(44px top, red, blue)",
+
+ "linear-gradient(top left 45deg, red, blue)",
+ "linear-gradient(20% bottom -300deg, red, blue)",
+ "linear-gradient(center 20% 1.95929rad, red, blue)",
+ "linear-gradient(left 35px 30grad, red, blue)",
+ "linear-gradient(left 35px 0.1turn, red, blue)",
+ "linear-gradient(10% 10em 99999deg, red, blue)",
+ "linear-gradient(44px top -33deg, red, blue)",
+
+ "linear-gradient(30grad left 35px, red, blue)",
+ "linear-gradient(10deg 20px, red, blue)",
+ "linear-gradient(1turn 20px, red, blue)",
+ "linear-gradient(.414rad bottom, red, blue)",
+
+ "linear-gradient(to top, 0%, blue)",
+ "linear-gradient(to top, red, 100%)",
+ "linear-gradient(to top, red, 45%, 56%, blue)",
+ "linear-gradient(to top, red,, blue)",
+ "linear-gradient(to top, red, green 35%, 15%, 54%, blue)",
+
+
+ "radial-gradient(top left 45deg, red, blue)",
+ "radial-gradient(20% bottom -300deg, red, blue)",
+ "radial-gradient(center 20% 1.95929rad, red, blue)",
+ "radial-gradient(left 35px 30grad, red, blue)",
+ "radial-gradient(10% 10em 99999deg, red, blue)",
+ "radial-gradient(44px top -33deg, red, blue)",
+
+ "radial-gradient(-33deg, red, blue)",
+ "radial-gradient(30grad left 35px, red, blue)",
+ "radial-gradient(10deg 20px, red, blue)",
+ "radial-gradient(.414rad bottom, red, blue)",
+
+ "radial-gradient(cover, red, blue)",
+ "radial-gradient(ellipse contain, red, blue)",
+ "radial-gradient(cover circle, red, blue)",
+
+ "radial-gradient(top left, cover, red, blue)",
+ "radial-gradient(15% 20%, circle, red, blue)",
+ "radial-gradient(45px, ellipse closest-corner, red, blue)",
+ "radial-gradient(45px, farthest-side circle, red, blue)",
+
+ "radial-gradient(99deg, cover, red, blue)",
+ "radial-gradient(-1.2345rad, circle, red, blue)",
+ "radial-gradient(399grad, ellipse closest-corner, red, blue)",
+ "radial-gradient(399grad, farthest-side circle, red, blue)",
+
+ "radial-gradient(top left 99deg, cover, red, blue)",
+ "radial-gradient(15% 20% -1.2345rad, circle, red, blue)",
+ "radial-gradient(45px 399grad, ellipse closest-corner, red, blue)",
+ "radial-gradient(45px 399grad, farthest-side circle, red, blue)",
+
+ /* Valid only when unprefixed */
+ "-moz-radial-gradient(at top left, red, blue)",
+ "-moz-radial-gradient(at 20% bottom, red, blue)",
+ "-moz-radial-gradient(at center 20%, red, blue)",
+ "-moz-radial-gradient(at left 35px, red, blue)",
+ "-moz-radial-gradient(at 10% 10em, red, blue)",
+ "-moz-radial-gradient(at 44px top, red, blue)",
+ "-moz-radial-gradient(at 0 0, red, blue)",
+
+ "-moz-radial-gradient(circle 43px, red, blue)",
+ "-moz-radial-gradient(ellipse 43px 43px, red, blue)",
+ "-moz-radial-gradient(ellipse 50% 50%, red, blue)",
+ "-moz-radial-gradient(ellipse 43px 50%, red, blue)",
+ "-moz-radial-gradient(ellipse 50% 43px, red, blue)",
+
+ "-moz-radial-gradient(farthest-corner at top left, red, blue)",
+ "-moz-radial-gradient(ellipse closest-corner at 45px, red, blue)",
+ "-moz-radial-gradient(circle farthest-side at 45px, red, blue)",
+ "-moz-radial-gradient(closest-side ellipse at 50%, red, blue)",
+ "-moz-radial-gradient(farthest-corner circle at 4em, red, blue)",
+
+ "-moz-radial-gradient(30% 40% at top left, red, blue)",
+ "-moz-radial-gradient(50px 60px at 15% 20%, red, blue)",
+ "-moz-radial-gradient(7em 8em at 45px, red, blue)"
+];
+var unbalancedGradientAndElementValues = [
+ "-moz-element(#a()",
+];
+
+if (IsCSSPropertyPrefEnabled("layout.css.prefixes.webkit")) {
+ // Extend gradient lists with valid/invalid webkit-prefixed expressions:
+ validGradientAndElementValues.push(
+ // 2008 GRADIENTS: -webkit-gradient()
+ // ----------------------------------
+ // linear w/ no color stops (valid) and a variety of position values:
+ "-webkit-gradient(linear, 1 2, 3 4)",
+ "-webkit-gradient(linear,1 2,3 4)", // (no extra space)
+ "-webkit-gradient(linear , 1 2 , 3 4 )", // (lots of extra space)
+ "-webkit-gradient(linear, 1 10% , 0% 4)", // percentages
+ "-webkit-gradient(linear, +1.0 -2%, +5.3% -0)", // (+/- & decimals are valid)
+ "-webkit-gradient(linear, left top, right bottom)", // keywords
+ "-webkit-gradient(linear, right center, center top)",
+ "-webkit-gradient(linear, center center, center center)",
+ "-webkit-gradient(linear, center 5%, 30 top)", // keywords mixed w/ nums
+
+ // linear w/ just 1 color stop:
+ "-webkit-gradient(linear, 1 2, 3 4, from(lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, to(lime))",
+ // * testing the various allowable stop values ( & ):
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(-0, lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(-30, lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(+9999, lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(-.1, lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0%, lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(100%, lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(9999%, lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(-.5%, lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(+0%, lime))",
+ // * testing the various color values:
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, transparent))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, rgb(1,2,3)))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, #00ff00))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, #00f))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, hsla(240, 30%, 50%, 0.8)))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, rgba(255, 230, 10, 0.5)))",
+
+ // linear w/ multiple color stops:
+ // * using from()/to() -- note that out-of-order is OK:
+ "-webkit-gradient(linear, 1 2, 3 4, from(lime), from(blue))",
+ "-webkit-gradient(linear, 1 2, 3 4, to(lime), to(blue))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(lime), to(blue))",
+ "-webkit-gradient(linear, 1 2, 3 4, to(lime), from(blue))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(lime), to(blue), from(purple))",
+ // * using color-stop():
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, lime), color-stop(30%, blue))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, lime), color-stop(30%, blue), color-stop(100%, purple))",
+ // * using color-stop() intermixed with from()/to() functions:
+ "-webkit-gradient(linear, 1 2, 3 4, from(lime), color-stop(30%, blue))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(30%, blue), to(lime))",
+ // * overshooting endpoints (0 & 1.0)
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(-30%, lime), color-stop(.4, blue), color-stop(1.5, purple))",
+ // * repeating a stop position (valid)
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(30%, lime), color-stop(30%, blue))",
+ // * stops out of order (valid)
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(70%, lime), color-stop(20%, blue), color-stop(40%, purple))",
+
+ // radial w/ no color stops (valid) and a several different radius values:
+ "-webkit-gradient(radial, 1 2, 8, 3 4, 9)",
+ "-webkit-gradient(radial, 0 0, 10, 0 0, 5)",
+ "-webkit-gradient(radial, 1 2, -1.5, center center, +99999.9999)",
+
+ // radial w/ color stops
+ // (mostly leaning on more-robust 'linear' tests above; just testing a few
+ // examples w/ radial as a sanity-check):
+ "-webkit-gradient(radial, 1 2, 8, 3 4, 9, from(lime))",
+ "-webkit-gradient(radial, 1 2, 8, 3 4, 9, to(blue))",
+ "-webkit-gradient(radial, 1 2, 8, 3 4, 9, color-stop(0.5, #00f), color-stop(0.8, rgba(100, 200, 0, 0.5)))",
+
+ // 2011 GRADIENTS: -webkit-linear-gradient(), -webkit-radial -gradient()
+ // ---------------------------------------------------------------------
+ // Basic linear-gradient syntax (valid when prefixed or unprefixed):
+ "-webkit-linear-gradient(red, green, blue)",
+
+ // Angled linear-gradients (valid when prefixed or unprefixed):
+ "-webkit-linear-gradient(135deg, red, blue)",
+ "-webkit-linear-gradient(280deg, red 60%, blue)",
+
+ // Linear-gradient with unitless-0 (normally invalid for
+ // but accepted here for better webkit emulation):
+ "-webkit-linear-gradient(0, red, blue)",
+ "-webkit-linear-gradient(0 red, blue)",
+
+ // Basic radial-gradient syntax (valid when prefixed or unprefixed):
+ "-webkit-radial-gradient(circle, white, black)",
+ "-webkit-radial-gradient(circle, white, black)",
+ "-webkit-radial-gradient(ellipse closest-side, white, black)",
+ "-webkit-radial-gradient(circle farthest-corner, white, black)",
+
+ // Contain/cover keywords (valid only for -moz/-webkit prefixed):
+ "-webkit-radial-gradient(cover, red, blue)",
+ "-webkit-radial-gradient(cover circle, red, blue)",
+ "-webkit-radial-gradient(contain, red, blue)",
+ "-webkit-radial-gradient(contain ellipse, red, blue)",
+
+ // Initial side/corner/point (valid only for -moz/-webkit prefixed):
+ "-webkit-linear-gradient(left, red, blue)",
+ "-webkit-linear-gradient(right top, red, blue)",
+ "-webkit-linear-gradient(top right, red, blue)",
+ "-webkit-radial-gradient(right, red, blue)",
+ "-webkit-radial-gradient(left bottom, red, blue)",
+ "-webkit-radial-gradient(bottom left, red, blue)",
+ "-webkit-radial-gradient(center, red, blue)",
+ "-webkit-radial-gradient(center right, red, blue)",
+ "-webkit-radial-gradient(center center, red, blue)",
+ "-webkit-radial-gradient(center top, red, blue)",
+ "-webkit-radial-gradient(left 50%, red, blue)",
+ "-webkit-radial-gradient(20px top, red, blue)",
+ "-webkit-radial-gradient(20em 30%, red, blue)",
+
+ // Point + keyword-sized shape (valid only for -moz/-webkit prefixed):
+ "-webkit-radial-gradient(center, circle closest-corner, red, blue)",
+ "-webkit-radial-gradient(10px 20px, cover circle, red, blue)",
+ "-webkit-radial-gradient(5em 50%, ellipse contain, red, blue)",
+
+ // Repeating examples:
+ "-webkit-repeating-linear-gradient(red 10%, blue 30%)",
+ "-webkit-repeating-linear-gradient(30deg, pink 20px, orange 70px)",
+ "-webkit-repeating-linear-gradient(left, red, blue)",
+ "-webkit-repeating-linear-gradient(left, red 10%, blue 30%)",
+ "-webkit-repeating-radial-gradient(circle, red, blue 10%, red 20%)",
+ "-webkit-repeating-radial-gradient(circle farthest-corner, gray 10px, yellow 20px)",
+ "-webkit-repeating-radial-gradient(top left, circle, red, blue 4%, red 8%)"
+ );
+
+ invalidGradientAndElementValues.push(
+ // 2008 GRADIENTS: -webkit-gradient()
+ // https://www.webkit.org/blog/175/introducing-css-gradients/
+ // ----------------------------------
+ // Mostly-empty expressions (missing most required pieces):
+ "-webkit-gradient()",
+ "-webkit-gradient( )",
+ "-webkit-gradient(,)",
+ "-webkit-gradient(bogus)",
+ "-webkit-gradient(linear)",
+ "-webkit-gradient(linear,)",
+ "-webkit-gradient(,linear)",
+ "-webkit-gradient(radial)",
+ "-webkit-gradient(radial,)",
+
+ // linear w/ partial/missing expression(s)
+ "-webkit-gradient(linear, 1)", // Incomplete
+ "-webkit-gradient(linear, left)", // Incomplete
+ "-webkit-gradient(linear, center)", // Incomplete
+ "-webkit-gradient(linear, top)", // Incomplete
+ "-webkit-gradient(linear, 5%)", // Incomplete
+ "-webkit-gradient(linear, 1 2)", // Missing 2nd
+ "-webkit-gradient(linear, 1, 3)", // 2 incomplete s
+ "-webkit-gradient(linear, 1, 3 4)", // Incomplete 1st
+ "-webkit-gradient(linear, 1 2, 3)", // Incomplete 2nd
+ "-webkit-gradient(linear, 1 2, 3, 4)", // Comma inside
+ "-webkit-gradient(linear, 1, 2, 3 4)", // Comma inside
+ "-webkit-gradient(linear, 1, 2, 3, 4)", // Comma inside
+
+ // linear w/ invalid units in expression
+ "-webkit-gradient(linear, 1px 2, 3 4)",
+ "-webkit-gradient(linear, 1 2, 3 4px)",
+ "-webkit-gradient(linear, 1px 2px, 3px 4px)",
+ "-webkit-gradient(linear, calc(1) 2, 3 4)",
+ "-webkit-gradient(linear, 1 2em, 3 4)",
+
+ // linear w/ (only valid for radial)
+ "-webkit-gradient(linear, 1 2, 8, 3 4, 9)",
+
+ // linear w/ out-of-order position keywords in expression
+ // (horizontal keyword is supposed to come first, for "x" coord)
+ "-webkit-gradient(linear, 0 0, top right)",
+ "-webkit-gradient(linear, bottom center, 0 0)",
+ "-webkit-gradient(linear, top bottom, 0 0)",
+ "-webkit-gradient(linear, bottom top, 0 0)",
+ "-webkit-gradient(linear, bottom top, 0 0)",
+
+ // linear w/ trailing comma (which implies missing color-stops):
+ "-webkit-gradient(linear, 1 2, 3 4,)",
+
+ // linear w/ invalid color values:
+ "-webkit-gradient(linear, 1 2, 3 4, from(invalidcolorname))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(inherit))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(initial))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(currentColor))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(00ff00))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(##00ff00))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(#00fff))", // wrong num hex digits
+ "-webkit-gradient(linear, 1 2, 3 4, from(xyz(0,0,0)))", // bogus color func
+ // Mixing and is invalid.
+ "-webkit-gradient(linear, 1 2, 3 4, from(rgb(100, 100%, 30)))",
+
+ // linear w/ color stops that have comma issues
+ "-webkit-gradient(linear, 1 2, 3 4 from(lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(lime,))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(lime),)",
+ "-webkit-gradient(linear, 1 2, 3 4, from(lime) to(blue))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(lime),, to(blue))",
+ "-webkit-gradient(linear, 1 2, 3 4, from(rbg(0, 0, 0,)))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0 lime))",
+ "-webkit-gradient(linear, 1 2, 3 4, color-stop(0,, lime))",
+
+ // radial w/ broken /radius expression(s)
+ "-webkit-gradient(radial, 1)", // Incomplete
+ "-webkit-gradient(radial, 1 2)", // Missing radius + 2nd
+ "-webkit-gradient(radial, 1 2, 8)", // Missing 2nd
+ "-webkit-gradient(radial, 1 2, 8, 3)", // Incomplete 2nd
+ "-webkit-gradient(radial, 1 2, 8, 3 4)", // Missing 2nd radius
+ "-webkit-gradient(radial, 1 2, 3 4, 9)", // Missing 1st radius
+
+ // radial w/ incorrect units on radius (invalid; expecting )
+ "-webkit-gradient(radial, 1 2, 8%, 3 4, 9)",
+ "-webkit-gradient(radial, 1 2, 8px, 3 4, 9)",
+ "-webkit-gradient(radial, 1 2, calc(8), 3 4, 9)",
+ "-webkit-gradient(radial, 1 2, 8em, 3 4, 9)",
+ "-webkit-gradient(radial, 1 2, top, 3 4, 9)",
+
+ // radial w/ trailing comma (which implies missing color-stops):
+ "-webkit-gradient(linear, 1 2, 8, 3 4, 9,)",
+
+ // radial w/ invalid color value (mostly leaning on 'linear' test above):
+ "-webkit-gradient(radial, 1 2, 8, 3 4, 9, from(invalidcolorname))",
+
+ // 2011 GRADIENTS: -webkit-linear-gradient(), -webkit-radial -gradient()
+ // ---------------------------------------------------------------------
+ // Syntax that's invalid for all types of gradients:
+ // * empty gradient expressions:
+ "-webkit-linear-gradient()",
+ "-webkit-radial-gradient()",
+ "-webkit-repeating-linear-gradient()",
+ "-webkit-repeating-radial-gradient()",
+
+ // Linear syntax that's invalid for both -webkit & unprefixed, but valid
+ // for -moz:
+ // * initial which includes a length:
+ "-webkit-linear-gradient(10px, red, blue)",
+ "-webkit-linear-gradient(10px top, red, blue)",
+ // * initial which includes a side *and* an angle:
+ "-webkit-linear-gradient(bottom 30deg, red, blue)",
+ "-webkit-linear-gradient(30deg bottom, red, blue)",
+ "-webkit-linear-gradient(10px top 50deg, red, blue)",
+ "-webkit-linear-gradient(50deg 10px top, red, blue)",
+ // * initial which includes explicit "center":
+ "-webkit-linear-gradient(center, red, blue)",
+ "-webkit-linear-gradient(left center, red, blue)",
+ "-webkit-linear-gradient(top center, red, blue)",
+ "-webkit-linear-gradient(center top, red, blue)",
+
+ // Linear syntax that's invalid for -webkit, but valid for -moz & unprefixed:
+ // * "to" syntax:
+ "-webkit-linear-gradient(to top, red, blue)",
+
+ // * followed by angle:
+ "-webkit-radial-gradient(circle 10deg, red, blue)",
+
+ // Radial syntax that's invalid for both -webkit & -moz, but valid for
+ // unprefixed:
+ // * " at " syntax:
+ "-webkit-radial-gradient(circle at left bottom, red, blue)",
+ // * explicitly-sized shape:
+ "-webkit-radial-gradient(circle 10px, red, blue)",
+ "-webkit-radial-gradient(ellipse 40px 20px, red, blue)",
+
+ // Radial syntax that's invalid for both -webkit & unprefixed, but valid
+ // for -moz:
+ // * initial angle
+ "-webkit-radial-gradient(30deg, red, blue)",
+ // * initial angle/position combo
+ "-webkit-radial-gradient(top 30deg, red, blue)",
+ "-webkit-radial-gradient(left top 30deg, red, blue)",
+ "-webkit-radial-gradient(10px 20px 30deg, red, blue)"
+ );
+}
+
+var gCSSProperties = {
+ "animation": {
+ domProp: "animation",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "animation-name", "animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state" ],
+ initial_values: [ "none none 0s 0s ease normal running 1.0", "none", "0s", "ease", "normal", "running", "1.0" ],
+ other_values: [ "none none 0s 0s cubic-bezier(0.25, 0.1, 0.25, 1.0) normal running 1.0", "bounce 1s linear 2s", "bounce 1s 2s linear", "bounce linear 1s 2s", "linear bounce 1s 2s", "linear 1s bounce 2s", "linear 1s 2s bounce", "1s bounce linear 2s", "1s bounce 2s linear", "1s 2s bounce linear", "1s linear bounce 2s", "1s linear 2s bounce", "1s 2s linear bounce", "bounce linear 1s", "bounce 1s linear", "linear bounce 1s", "linear 1s bounce", "1s bounce linear", "1s linear bounce", "1s 2s bounce", "1s bounce 2s", "bounce 1s 2s", "1s 2s linear", "1s linear 2s", "linear 1s 2s", "bounce 1s", "1s bounce", "linear 1s", "1s linear", "1s 2s", "2s 1s", "bounce", "linear", "1s", "height", "2s", "ease-in-out", "2s ease-in", "opacity linear", "ease-out 2s", "2s color, 1s bounce, 500ms height linear, 1s opacity 4s cubic-bezier(0.0, 0.1, 1.0, 1.0)", "1s \\32bounce linear 2s", "1s -bounce linear 2s", "1s -\\32bounce linear 2s", "1s \\32 0bounce linear 2s", "1s -\\32 0bounce linear 2s", "1s \\2bounce linear 2s", "1s -\\2bounce linear 2s", "2s, 1s bounce", "1s bounce, 2s", "2s all, 1s bounce", "1s bounce, 2s all", "1s bounce, 2s none", "2s none, 1s bounce", "2s bounce, 1s all", "2s all, 1s bounce" ],
+ invalid_values: [ "2s inherit", "inherit 2s", "2s bounce, 1s inherit", "2s inherit, 1s bounce", "2s initial", "2s all,, 1s bounce", "2s all, , 1s bounce", "bounce 1s cubic-bezier(0, rubbish) 2s", "bounce 1s steps(rubbish) 2s" ]
+ },
+ "animation-delay": {
+ domProp: "animationDelay",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0s", "0ms" ],
+ other_values: [ "1s", "250ms", "-100ms", "-1s", "1s, 250ms, 2.3s"],
+ invalid_values: [ "0", "0px" ]
+ },
+ "animation-direction": {
+ domProp: "animationDirection",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "alternate", "normal, alternate", "alternate, normal", "normal, normal", "normal, normal, normal", "reverse", "alternate-reverse", "normal, reverse, alternate-reverse, alternate" ],
+ invalid_values: [ "normal normal", "inherit, normal", "reverse-alternate" ]
+ },
+ "animation-duration": {
+ domProp: "animationDuration",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0s", "0ms" ],
+ other_values: [ "1s", "250ms", "1s, 250ms, 2.3s"],
+ invalid_values: [ "0", "0px", "-1ms", "-2s" ]
+ },
+ "animation-fill-mode": {
+ domProp: "animationFillMode",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "forwards", "backwards", "both", "none, none", "forwards, backwards", "forwards, none", "none, both" ],
+ invalid_values: [ "all"]
+ },
+ "animation-iteration-count": {
+ domProp: "animationIterationCount",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "1" ],
+ other_values: [ "infinite", "0", "0.5", "7.75", "-0.0", "1, 2, 3", "infinite, 2", "1, infinite" ],
+ // negatives forbidden per
+ // http://lists.w3.org/Archives/Public/www-style/2011Mar/0355.html
+ invalid_values: [ "none", "-1", "-0.5", "-1, infinite", "infinite, -3" ]
+ },
+ "animation-name": {
+ domProp: "animationName",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "all", "ball", "mall", "color", "bounce, bubble, opacity", "foobar", "auto", "\\32bounce", "-bounce", "-\\32bounce", "\\32 0bounce", "-\\32 0bounce", "\\2bounce", "-\\2bounce" ],
+ invalid_values: [ "bounce, initial", "initial, bounce", "bounce, inherit", "inherit, bounce" ]
+ },
+ "animation-play-state": {
+ domProp: "animationPlayState",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "running" ],
+ other_values: [ "paused", "running, running", "paused, running", "paused, paused", "running, paused", "paused, running, running, running, paused, running" ],
+ invalid_values: [ "0" ]
+ },
+ "animation-timing-function": {
+ domProp: "animationTimingFunction",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "ease" ],
+ other_values: [ "cubic-bezier(0.25, 0.1, 0.25, 1.0)", "linear", "ease-in", "ease-out", "ease-in-out", "linear, ease-in, cubic-bezier(0.1, 0.2, 0.8, 0.9)", "cubic-bezier(0.5, 0.5, 0.5, 0.5)", "cubic-bezier(0.25, 1.5, 0.75, -0.5)", "step-start", "step-end", "steps(1)", "steps(2, start)", "steps(386)", "steps(3, end)" ],
+ invalid_values: [ "none", "auto", "cubic-bezier(0.25, 0.1, 0.25)", "cubic-bezier(0.25, 0.1, 0.25, 0.25, 1.0)", "cubic-bezier(-0.5, 0.5, 0.5, 0.5)", "cubic-bezier(1.5, 0.5, 0.5, 0.5)", "cubic-bezier(0.5, 0.5, -0.5, 0.5)", "cubic-bezier(0.5, 0.5, 1.5, 0.5)", "steps(2, step-end)", "steps(0)", "steps(-2)", "steps(0, step-end, 1)" ]
+ },
+ "-moz-appearance": {
+ domProp: "MozAppearance",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "radio", "menulist" ],
+ invalid_values: []
+ },
+ "-moz-binding": {
+ domProp: "MozBinding",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "url(foo.xml)" ],
+ invalid_values: []
+ },
+ "-moz-border-bottom-colors": {
+ domProp: "MozBorderBottomColors",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "red green", "red #fc3", "#ff00cc", "currentColor", "blue currentColor orange currentColor" ],
+ invalid_values: [ "red none", "red inherit", "red, green", "none red", "inherit red", "ff00cc" ]
+ },
+ "border-inline-end": {
+ domProp: "borderInlineEnd",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-inline-end-color", "border-inline-end-style", "border-inline-end-width" ],
+ initial_values: [ "none", "medium", "currentColor", "thin", "none medium currentcolor" ],
+ other_values: [ "solid", "green", "medium solid", "green solid", "10px solid", "thick solid", "5px green none" ],
+ invalid_values: [ "5%", "5", "5 green none" ]
+ },
+ "border-inline-end-color": {
+ domProp: "borderInlineEndColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ initial_values: [ "currentColor" ],
+ other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000", "000000" ]
+ },
+ "border-inline-end-style": {
+ domProp: "borderInlineEndStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* XXX hidden is sometimes the same as initial */
+ initial_values: [ "none" ],
+ other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
+ invalid_values: []
+ },
+ "border-inline-end-width": {
+ domProp: "borderInlineEndWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ prerequisites: { "border-inline-end-style": "solid" },
+ initial_values: [ "medium", "3px", "calc(4px - 1px)" ],
+ other_values: [ "thin", "thick", "1px", "2em",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0em)",
+ "calc(0px)",
+ "calc(5em)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 5em)",
+ ],
+ invalid_values: [ "5%", "5" ]
+ },
+ "border-image": {
+ domProp: "borderImage",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat" ],
+ initial_values: [ "none" ],
+ other_values: [ "url('border.png') 27 27 27 27",
+ "url('border.png') 27",
+ "stretch url('border.png')",
+ "url('border.png') 27 fill",
+ "url('border.png') 27 27 27 27 repeat",
+ "repeat url('border.png') 27 27 27 27",
+ "url('border.png') repeat 27 27 27 27",
+ "url('border.png') fill 27 27 27 27 repeat",
+ "url('border.png') fill 27 27 27 27 repeat space",
+ "url('border.png') 27 27 27 27 / 1em",
+ "27 27 27 27 / 1em url('border.png') ",
+ "url('border.png') 27 27 27 27 / 10 10 10 / 10 10 repeat",
+ "repeat 27 27 27 27 / 10 10 10 / 10 10 url('border.png')",
+ "url('border.png') 27 27 27 27 / / 10 10 1em",
+ "fill 27 27 27 27 / / 10 10 1em url('border.png')",
+ "url('border.png') 27 27 27 27 / 1em 1em 1em 1em repeat",
+ "url('border.png') 27 27 27 27 / 1em 1em 1em 1em stretch round" ],
+ invalid_values: [ "url('border.png') 27 27 27 27 27",
+ "url('border.png') 27 27 27 27 / 1em 1em 1em 1em 1em",
+ "url('border.png') 27 27 27 27 /",
+ "url('border.png') fill",
+ "url('border.png') fill repeat",
+ "fill repeat",
+ "url('border.png') fill / 1em",
+ "url('border.png') / repeat",
+ "url('border.png') 1 /",
+ "url('border.png') 1 / /",
+ "1 / url('border.png')",
+ "url('border.png') / 1",
+ "url('border.png') / / 1"]
+ },
+ "border-image-source": {
+ domProp: "borderImageSource",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [
+ "url('border.png')"
+ ].concat(validGradientAndElementValues),
+ invalid_values: [
+ "url('border.png') url('border.png')",
+ ].concat(invalidGradientAndElementValues),
+ unbalanced_values: [
+ ].concat(unbalancedGradientAndElementValues)
+ },
+ "border-image-slice": {
+ domProp: "borderImageSlice",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "100%", "100% 100% 100% 100%" ],
+ other_values: [ "0%", "10", "10 100% 0 2", "0 0 0 0", "fill 10 10", "10 10 fill" ],
+ invalid_values: [ "-10%", "-10", "10 10 10 10 10", "10 10 10 10 -10", "10px", "-10px", "fill", "fill fill 10px", "10px fill fill" ]
+ },
+ "border-image-width": {
+ domProp: "borderImageWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "1", "1 1 1 1" ],
+ other_values: [ "0", "0%", "0px", "auto auto auto auto", "10 10% auto 15px", "10px 10px 10px 10px", "10", "10 10", "10 10 10" ],
+ invalid_values: [ "-10", "-10px", "-10%", "10 10 10 10 10", "10 10 10 10 auto", "auto auto auto auto auto", "10px calc(nonsense)", "1px red" ],
+ unbalanced_values: [ "10px calc(" ]
+ },
+ "border-image-outset": {
+ domProp: "borderImageOutset",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0", "0 0 0 0" ],
+ other_values: [ "10px", "10", "10 10", "10 10 10", "10 10 10 10", "10px 10 10 10px" ],
+ invalid_values: [ "-10", "-10px", "-10%", "10%", "10 10 10 10 10", "10px calc(nonsense)", "1px red" ],
+ unbalanced_values: [ "10px calc(" ]
+ },
+ "border-image-repeat": {
+ domProp: "borderImageRepeat",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "stretch", "stretch stretch" ],
+ other_values: [ "round", "repeat", "stretch round", "repeat round", "stretch repeat", "round round", "repeat repeat",
+ "space", "stretch space", "repeat space", "round space", "space space" ],
+ invalid_values: [ "none", "stretch stretch stretch", "0", "10", "0%", "0px" ]
+ },
+ "-moz-border-left-colors": {
+ domProp: "MozBorderLeftColors",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "red green", "red #fc3", "#ff00cc", "currentColor", "blue currentColor orange currentColor" ],
+ invalid_values: [ "red none", "red inherit", "red, green", "none red", "inherit red", "ff00cc" ]
+ },
+ "border-radius": {
+ domProp: "borderRadius",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ prerequisites: { "width": "200px", "height": "100px", "display": "inline-block"},
+ subproperties: [ "border-bottom-left-radius", "border-bottom-right-radius", "border-top-left-radius", "border-top-right-radius" ],
+ initial_values: [ "0", "0px", "0px 0 0 0px", "calc(-2px)", "calc(0px) calc(0pt)", "calc(0px) calc(0pt) calc(0px) calc(0em)" ],
+ other_values: [ "0%", "3%", "1px", "2em", "3em 2px", "2pt 3% 4em", "2px 2px 2px 2px", // circular
+ "3% / 2%", "1px / 4px", "2em / 1em", "3em 2px / 2px 3em", "2pt 3% 4em / 4pt 1% 5em", "2px 2px 2px 2px / 4px 4px 4px 4px", "1pt / 2pt 3pt", "4pt 5pt / 3pt", // elliptical
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ "2px 2px calc(2px + 1%) 2px",
+ "1px 2px 2px 2px / 2px 2px calc(2px + 1%) 2px",
+ ],
+ invalid_values: [ "2px -2px", "inherit 2px", "inherit / 2px", "2px inherit", "2px / inherit", "2px 2px 2px 2px 2px", "1px / 2px 2px 2px 2px 2px", "2", "2 2", "2px 2px 2px 2px / 2px 2px 2 2px", "2px calc(0px + rubbish)" ]
+ },
+ "border-bottom-left-radius": {
+ domProp: "borderBottomLeftRadius",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "width": "200px", "height": "100px", "display": "inline-block"},
+ initial_values: [ "0", "0px", "calc(-2px)" ],
+ other_values: [ "0%", "3%", "1px", "2em", // circular
+ "3% 2%", "1px 4px", "2em 2pt", // elliptical
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "-1px", "4px -2px", "inherit 2px", "2px inherit", "2", "2px 2", "2 2px", "2px calc(0px + rubbish)" ]
+ },
+ "border-bottom-right-radius": {
+ domProp: "borderBottomRightRadius",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "width": "200px", "height": "100px", "display": "inline-block"},
+ initial_values: [ "0", "0px", "calc(-2px)" ],
+ other_values: [ "0%", "3%", "1px", "2em", // circular
+ "3% 2%", "1px 4px", "2em 2pt", // elliptical
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "-1px", "4px -2px", "inherit 2px", "2px inherit", "2", "2px 2", "2 2px", "2px calc(0px + rubbish)" ]
+ },
+ "border-top-left-radius": {
+ domProp: "borderTopLeftRadius",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "width": "200px", "height": "100px", "display": "inline-block"},
+ initial_values: [ "0", "0px", "calc(-2px)" ],
+ other_values: [ "0%", "3%", "1px", "2em", // circular
+ "3% 2%", "1px 4px", "2em 2pt", // elliptical
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "-1px", "4px -2px", "inherit 2px", "2px inherit", "2", "2px 2", "2 2px", "2px calc(0px + rubbish)" ]
+ },
+ "border-top-right-radius": {
+ domProp: "borderTopRightRadius",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "width": "200px", "height": "100px", "display": "inline-block"},
+ initial_values: [ "0", "0px", "calc(-2px)" ],
+ other_values: [ "0%", "3%", "1px", "2em", // circular
+ "3% 2%", "1px 4px", "2em 2pt", // elliptical
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "-1px", "4px -2px", "inherit 2px", "2px inherit", "2", "2px 2", "2 2px", "2px calc(0px + rubbish)" ]
+ },
+ "-moz-border-right-colors": {
+ domProp: "MozBorderRightColors",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "red green", "red #fc3", "#ff00cc", "currentColor", "blue currentColor orange currentColor" ],
+ invalid_values: [ "red none", "red inherit", "red, green", "none red", "inherit red", "ff00cc" ]
+ },
+ "border-inline-start": {
+ domProp: "borderInlineStart",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-inline-start-color", "border-inline-start-style", "border-inline-start-width" ],
+ initial_values: [ "none", "medium", "currentColor", "thin", "none medium currentcolor" ],
+ other_values: [ "solid", "green", "medium solid", "green solid", "10px solid", "thick solid", "5px green none" ],
+ invalid_values: [ "5%", "5", "5 green solid" ]
+ },
+ "border-inline-start-color": {
+ domProp: "borderInlineStartColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ initial_values: [ "currentColor" ],
+ other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000", "000000" ]
+ },
+ "border-inline-start-style": {
+ domProp: "borderInlineStartStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* XXX hidden is sometimes the same as initial */
+ initial_values: [ "none" ],
+ other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
+ invalid_values: []
+ },
+ "border-inline-start-width": {
+ domProp: "borderInlineStartWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ prerequisites: { "border-inline-start-style": "solid" },
+ initial_values: [ "medium", "3px", "calc(4px - 1px)" ],
+ other_values: [ "thin", "thick", "1px", "2em",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0em)",
+ "calc(0px)",
+ "calc(5em)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 5em)",
+ ],
+ invalid_values: [ "5%", "5" ]
+ },
+ "-moz-border-top-colors": {
+ domProp: "MozBorderTopColors",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "red green", "red #fc3", "#ff00cc", "currentColor", "blue currentColor orange currentColor" ],
+ invalid_values: [ "red none", "red inherit", "red, green", "none red", "inherit red", "ff00cc" ]
+ },
+ "-moz-box-align": {
+ domProp: "MozBoxAlign",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "stretch" ],
+ other_values: [ "start", "center", "baseline", "end" ],
+ invalid_values: []
+ },
+ "-moz-box-direction": {
+ domProp: "MozBoxDirection",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "reverse" ],
+ invalid_values: []
+ },
+ "-moz-box-flex": {
+ domProp: "MozBoxFlex",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0", "0.0", "-0.0" ],
+ other_values: [ "1", "100", "0.1" ],
+ invalid_values: [ "10px", "-1" ]
+ },
+ "-moz-box-ordinal-group": {
+ domProp: "MozBoxOrdinalGroup",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "1" ],
+ other_values: [ "2", "100", "0" ],
+ invalid_values: [ "1.0", "-1", "-1000" ]
+ },
+ "-moz-box-orient": {
+ domProp: "MozBoxOrient",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "horizontal", "inline-axis" ],
+ other_values: [ "vertical", "block-axis" ],
+ invalid_values: []
+ },
+ "-moz-box-pack": {
+ domProp: "MozBoxPack",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "start" ],
+ other_values: [ "center", "end", "justify" ],
+ invalid_values: []
+ },
+ "box-sizing": {
+ domProp: "boxSizing",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "content-box" ],
+ other_values: [ "border-box" ],
+ invalid_values: [ "padding-box", "margin-box", "content", "padding", "border", "margin" ]
+ },
+ "-moz-box-sizing": {
+ domProp: "MozBoxSizing",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "box-sizing",
+ subproperties: [ "box-sizing" ],
+ },
+ "color-adjust": {
+ domProp: "colorAdjust",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "economy" ],
+ other_values: [ "exact" ],
+ invalid_values: []
+ },
+ "columns": {
+ domProp: "columns",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "column-count", "column-width" ],
+ initial_values: [ "auto", "auto auto" ],
+ other_values: [ "3", "20px", "2 10px", "10px 2", "2 auto", "auto 2", "auto 50px", "50px auto" ],
+ invalid_values: [ "5%", "-1px", "-1", "3 5", "10px 4px", "10 2px 5in", "30px -1",
+ "auto 3 5px", "5 auto 20px", "auto auto auto", "calc(50px + rubbish) 2" ]
+ },
+ "-moz-columns": {
+ domProp: "MozColumns",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "columns",
+ subproperties: [ "column-count", "column-width" ]
+ },
+ "column-count": {
+ domProp: "columnCount",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "1", "17" ],
+ // negative and zero invalid per editor's draft
+ invalid_values: [ "-1", "0", "3px" ]
+ },
+ "-moz-column-count": {
+ domProp: "MozColumnCount",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "column-count",
+ subproperties: [ "column-count" ]
+ },
+ "column-fill": {
+ domProp: "columnFill",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "balance" ],
+ other_values: [ "auto" ],
+ invalid_values: [ "2px", "dotted", "5em" ]
+ },
+ "-moz-column-fill": {
+ domProp: "MozColumnFill",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "column-fill",
+ subproperties: [ "column-fill" ]
+ },
+ "column-gap": {
+ domProp: "columnGap",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal", "1em", "calc(-2em + 3em)" ],
+ other_values: [ "2px", "4em",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0px)",
+ "calc(0pt)",
+ "calc(5em)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 5em)",
+ ],
+ invalid_values: [ "3%", "-1px", "4" ]
+ },
+ "-moz-column-gap": {
+ domProp: "MozColumnGap",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "column-gap",
+ subproperties: [ "column-gap" ]
+ },
+ "column-rule": {
+ domProp: "columnRule",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ prerequisites: { "color": "green" },
+ subproperties: [ "column-rule-width", "column-rule-style", "column-rule-color" ],
+ initial_values: [ "medium none currentColor", "none", "medium", "currentColor" ],
+ other_values: [ "2px blue solid", "red dotted 1px", "ridge 4px orange", "5px solid" ],
+ invalid_values: [ "2px 3px 4px red", "dotted dashed", "5px dashed green 3px", "5 solid", "5 green solid" ]
+ },
+ "-moz-column-rule": {
+ domProp: "MozColumnRule",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "column-rule",
+ subproperties: [ "column-rule-width", "column-rule-style", "column-rule-color" ]
+ },
+ "column-rule-width": {
+ domProp: "columnRuleWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "-moz-column-rule-style": "solid" },
+ initial_values: [
+ "medium",
+ "3px",
+ "-moz-calc(3px)",
+ "-moz-calc(5em + 3px - 5em)",
+ "calc(3px)",
+ "calc(5em + 3px - 5em)",
+ ],
+ other_values: [ "thin", "15px",
+ /* valid -moz-calc() values */
+ "-moz-calc(-2px)",
+ "-moz-calc(2px)",
+ "-moz-calc(3em)",
+ "-moz-calc(3em + 2px)",
+ "-moz-calc( 3em + 2px)",
+ "-moz-calc(3em + 2px )",
+ "-moz-calc( 3em + 2px )",
+ "-moz-calc(3*25px)",
+ "-moz-calc(3 *25px)",
+ "-moz-calc(3 * 25px)",
+ "-moz-calc(3* 25px)",
+ "-moz-calc(25px*3)",
+ "-moz-calc(25px *3)",
+ "-moz-calc(25px* 3)",
+ "-moz-calc(25px * 3)",
+ "-moz-calc(25px * 3 / 4)",
+ "-moz-calc((25px * 3) / 4)",
+ "-moz-calc(25px * (3 / 4))",
+ "-moz-calc(3 * 25px / 4)",
+ "-moz-calc((3 * 25px) / 4)",
+ "-moz-calc(3 * (25px / 4))",
+ "-moz-calc(3em + 25px * 3 / 4)",
+ "-moz-calc(3em + (25px * 3) / 4)",
+ "-moz-calc(3em + 25px * (3 / 4))",
+ "-moz-calc(25px * 3 / 4 + 3em)",
+ "-moz-calc((25px * 3) / 4 + 3em)",
+ "-moz-calc(25px * (3 / 4) + 3em)",
+ "-moz-calc(3em + (25px * 3 / 4))",
+ "-moz-calc(3em + ((25px * 3) / 4))",
+ "-moz-calc(3em + (25px * (3 / 4)))",
+ "-moz-calc((25px * 3 / 4) + 3em)",
+ "-moz-calc(((25px * 3) / 4) + 3em)",
+ "-moz-calc((25px * (3 / 4)) + 3em)",
+ "-moz-calc(3*25px + 1in)",
+ "-moz-calc(1in - 3em + 2px)",
+ "-moz-calc(1in - (3em + 2px))",
+ "-moz-calc((1in - 3em) + 2px)",
+ "-moz-calc(50px/2)",
+ "-moz-calc(50px/(2 - 1))",
+ "-moz-calc(-3px)",
+ /* numeric reduction cases */
+ "-moz-calc(5 * 3 * 2em)",
+ "-moz-calc(2em * 5 * 3)",
+ "-moz-calc((5 * 3) * 2em)",
+ "-moz-calc(2em * (5 * 3))",
+ "-moz-calc((5 + 3) * 2em)",
+ "-moz-calc(2em * (5 + 3))",
+ "-moz-calc(2em / (5 + 3))",
+ "-moz-calc(2em * (5*2 + 3))",
+ "-moz-calc(2em * ((5*2) + 3))",
+ "-moz-calc(2em * (5*(2 + 3)))",
+
+ "-moz-calc((5 + 7) * 3em)",
+ "-moz-calc((5em + 3em) - 2em)",
+ "-moz-calc((5em - 3em) + 2em)",
+ "-moz-calc(2em - (5em - 3em))",
+ "-moz-calc(2em + (5em - 3em))",
+ "-moz-calc(2em - (5em + 3em))",
+ "-moz-calc(2em + (5em + 3em))",
+ "-moz-calc(2em + 5em - 3em)",
+ "-moz-calc(2em - 5em - 3em)",
+ "-moz-calc(2em + 5em + 3em)",
+ "-moz-calc(2em - 5em + 3em)",
+
+ "-moz-calc(2em / 4 * 3)",
+ "-moz-calc(2em * 4 / 3)",
+ "-moz-calc(2em * 4 * 3)",
+ "-moz-calc(2em / 4 / 3)",
+ "-moz-calc(4 * 2em / 3)",
+ "-moz-calc(4 / 3 * 2em)",
+
+ "-moz-calc((2em / 4) * 3)",
+ "-moz-calc((2em * 4) / 3)",
+ "-moz-calc((2em * 4) * 3)",
+ "-moz-calc((2em / 4) / 3)",
+ "-moz-calc((4 * 2em) / 3)",
+ "-moz-calc((4 / 3) * 2em)",
+
+ "-moz-calc(2em / (4 * 3))",
+ "-moz-calc(2em * (4 / 3))",
+ "-moz-calc(2em * (4 * 3))",
+ "-moz-calc(2em / (4 / 3))",
+ "-moz-calc(4 * (2em / 3))",
+
+ // Valid cases with unitless zero (which is never
+ // a length).
+ "-moz-calc(0 * 2em)",
+ "-moz-calc(2em * 0)",
+ "-moz-calc(3em + 0 * 2em)",
+ "-moz-calc(3em + 2em * 0)",
+ "-moz-calc((0 + 2) * 2em)",
+ "-moz-calc((2 + 0) * 2em)",
+ // And test zero lengths while we're here.
+ "-moz-calc(2 * 0px)",
+ "-moz-calc(0 * 0px)",
+ "-moz-calc(2 * 0em)",
+ "-moz-calc(0 * 0em)",
+ "-moz-calc(0px * 0)",
+ "-moz-calc(0px * 2)",
+
+ /* valid calc() values */
+ "calc(-2px)",
+ "calc(2px)",
+ "calc(3em)",
+ "calc(3em + 2px)",
+ "calc( 3em + 2px)",
+ "calc(3em + 2px )",
+ "calc( 3em + 2px )",
+ "calc(3*25px)",
+ "calc(3 *25px)",
+ "calc(3 * 25px)",
+ "calc(3* 25px)",
+ "calc(25px*3)",
+ "calc(25px *3)",
+ "calc(25px* 3)",
+ "calc(25px * 3)",
+ "calc(25px * 3 / 4)",
+ "calc((25px * 3) / 4)",
+ "calc(25px * (3 / 4))",
+ "calc(3 * 25px / 4)",
+ "calc((3 * 25px) / 4)",
+ "calc(3 * (25px / 4))",
+ "calc(3em + 25px * 3 / 4)",
+ "calc(3em + (25px * 3) / 4)",
+ "calc(3em + 25px * (3 / 4))",
+ "calc(25px * 3 / 4 + 3em)",
+ "calc((25px * 3) / 4 + 3em)",
+ "calc(25px * (3 / 4) + 3em)",
+ "calc(3em + (25px * 3 / 4))",
+ "calc(3em + ((25px * 3) / 4))",
+ "calc(3em + (25px * (3 / 4)))",
+ "calc((25px * 3 / 4) + 3em)",
+ "calc(((25px * 3) / 4) + 3em)",
+ "calc((25px * (3 / 4)) + 3em)",
+ "calc(3*25px + 1in)",
+ "calc(1in - 3em + 2px)",
+ "calc(1in - (3em + 2px))",
+ "calc((1in - 3em) + 2px)",
+ "calc(50px/2)",
+ "calc(50px/(2 - 1))",
+ "calc(-3px)",
+ /* numeric reduction cases */
+ "calc(5 * 3 * 2em)",
+ "calc(2em * 5 * 3)",
+ "calc((5 * 3) * 2em)",
+ "calc(2em * (5 * 3))",
+ "calc((5 + 3) * 2em)",
+ "calc(2em * (5 + 3))",
+ "calc(2em / (5 + 3))",
+ "calc(2em * (5*2 + 3))",
+ "calc(2em * ((5*2) + 3))",
+ "calc(2em * (5*(2 + 3)))",
+
+ "calc((5 + 7) * 3em)",
+ "calc((5em + 3em) - 2em)",
+ "calc((5em - 3em) + 2em)",
+ "calc(2em - (5em - 3em))",
+ "calc(2em + (5em - 3em))",
+ "calc(2em - (5em + 3em))",
+ "calc(2em + (5em + 3em))",
+ "calc(2em + 5em - 3em)",
+ "calc(2em - 5em - 3em)",
+ "calc(2em + 5em + 3em)",
+ "calc(2em - 5em + 3em)",
+
+ "calc(2em / 4 * 3)",
+ "calc(2em * 4 / 3)",
+ "calc(2em * 4 * 3)",
+ "calc(2em / 4 / 3)",
+ "calc(4 * 2em / 3)",
+ "calc(4 / 3 * 2em)",
+
+ "calc((2em / 4) * 3)",
+ "calc((2em * 4) / 3)",
+ "calc((2em * 4) * 3)",
+ "calc((2em / 4) / 3)",
+ "calc((4 * 2em) / 3)",
+ "calc((4 / 3) * 2em)",
+
+ "calc(2em / (4 * 3))",
+ "calc(2em * (4 / 3))",
+ "calc(2em * (4 * 3))",
+ "calc(2em / (4 / 3))",
+ "calc(4 * (2em / 3))",
+
+ // Valid cases with unitless zero (which is never
+ // a length).
+ "calc(0 * 2em)",
+ "calc(2em * 0)",
+ "calc(3em + 0 * 2em)",
+ "calc(3em + 2em * 0)",
+ "calc((0 + 2) * 2em)",
+ "calc((2 + 0) * 2em)",
+ // And test zero lengths while we're here.
+ "calc(2 * 0px)",
+ "calc(0 * 0px)",
+ "calc(2 * 0em)",
+ "calc(0 * 0em)",
+ "calc(0px * 0)",
+ "calc(0px * 2)",
+
+ ],
+ invalid_values: [ "20", "-1px", "red", "50%",
+ /* invalid -moz-calc() values */
+ "-moz-calc(2em+ 2px)",
+ "-moz-calc(2em +2px)",
+ "-moz-calc(2em+2px)",
+ "-moz-calc(2em- 2px)",
+ "-moz-calc(2em -2px)",
+ "-moz-calc(2em-2px)",
+ /* invalid calc() values */
+ "calc(2em+ 2px)",
+ "calc(2em +2px)",
+ "calc(2em+2px)",
+ "calc(2em- 2px)",
+ "calc(2em -2px)",
+ "calc(2em-2px)",
+ "-moz-min()",
+ "calc(min())",
+ "-moz-max()",
+ "calc(max())",
+ "-moz-min(5px)",
+ "calc(min(5px))",
+ "-moz-max(5px)",
+ "calc(max(5px))",
+ "-moz-min(5px,2em)",
+ "calc(min(5px,2em))",
+ "-moz-max(5px,2em)",
+ "calc(max(5px,2em))",
+ "calc(50px/(2 - 2))",
+ "calc(5 + 5)",
+ "calc(5 * 5)",
+ "calc(5em * 5em)",
+ "calc(5em / 5em * 5em)",
+
+ "calc(4 * 3 / 2em)",
+ "calc((4 * 3) / 2em)",
+ "calc(4 * (3 / 2em))",
+ "calc(4 / (3 * 2em))",
+
+ // Tests for handling of unitless zero, which cannot
+ // be a length inside calc().
+ "calc(0)",
+ "calc(0 + 2em)",
+ "calc(2em + 0)",
+ "calc(0 * 2)",
+ "calc(2 * 0)",
+ "calc(1 * (2em + 0))",
+ "calc((2em + 0))",
+ "calc((2em + 0) * 1)",
+ "calc(1 * (0 + 2em))",
+ "calc((0 + 2em))",
+ "calc((0 + 2em) * 1)",
+ ]
+ },
+ "-moz-column-rule-width": {
+ domProp: "MozColumnRuleWidth",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "column-rule-width",
+ subproperties: [ "column-rule-width" ]
+ },
+ "column-rule-style": {
+ domProp: "columnRuleStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "solid", "hidden", "ridge", "groove", "inset", "outset", "double", "dotted", "dashed" ],
+ invalid_values: [ "20", "foo" ]
+ },
+ "-moz-column-rule-style": {
+ domProp: "MozColumnRuleStyle",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "column-rule-style",
+ subproperties: [ "column-rule-style" ]
+ },
+ "column-rule-color": {
+ domProp: "columnRuleColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "green" },
+ initial_values: [ "currentColor" ],
+ other_values: [ "red", "blue", "#ffff00" ],
+ invalid_values: [ "ffff00" ]
+ },
+ "-moz-column-rule-color": {
+ domProp: "MozColumnRuleColor",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "column-rule-color",
+ subproperties: [ "column-rule-color" ]
+ },
+ "column-width": {
+ domProp: "columnWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [
+ "15px",
+ "calc(15px)",
+ "calc(30px - 3em)",
+ "calc(-15px)",
+ "0px",
+ "calc(0px)"
+ ],
+ invalid_values: [ "20", "-1px", "50%" ]
+ },
+ "-moz-column-width": {
+ domProp: "MozColumnWidth",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "column-width",
+ subproperties: [ "column-width" ]
+ },
+ "-moz-float-edge": {
+ domProp: "MozFloatEdge",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "content-box" ],
+ other_values: [ "margin-box" ],
+ invalid_values: [ "content", "padding", "border", "margin" ]
+ },
+ "-moz-force-broken-image-icon": {
+ domProp: "MozForceBrokenImageIcon",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0" ],
+ other_values: [ "1" ],
+ invalid_values: []
+ },
+ "-moz-image-region": {
+ domProp: "MozImageRegion",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "rect(3px 20px 15px 4px)", "rect(17px, 21px, 33px, 2px)" ],
+ invalid_values: [ "rect(17px, 21px, 33, 2px)" ]
+ },
+ "margin-inline-end": {
+ domProp: "marginInlineEnd",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* no subproperties */
+ /* auto may or may not be initial */
+ initial_values: [ "0", "0px", "0%", "0em", "0ex", "calc(0pt)", "calc(0% + 0px)" ],
+ other_values: [ "1px", "3em", "5%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "5", "..25px", ".+5px", ".px", "-.px", "++5px", "-+4px", "+-3px", "--7px", "+-.6px", "-+.5px", "++.7px", "--.4px" ],
+ },
+ "margin-inline-start": {
+ domProp: "marginInlineStart",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* no subproperties */
+ /* auto may or may not be initial */
+ initial_values: [ "0", "0px", "0%", "0em", "0ex", "calc(0pt)", "calc(0% + 0px)" ],
+ other_values: [ "1px", "3em", "5%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "5", "..25px", ".+5px", ".px", "-.px", "++5px", "-+4px", "+-3px", "--7px", "+-.6px", "-+.5px", "++.7px", "--.4px" ],
+ },
+ "mask-type": {
+ domProp: "maskType",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "luminance" ],
+ other_values: [ "alpha" ],
+ invalid_values: [],
+ },
+ "-moz-outline-radius": {
+ domProp: "MozOutlineRadius",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ prerequisites: { "width": "200px", "height": "100px", "display": "inline-block"},
+ subproperties: [ "-moz-outline-radius-bottomleft", "-moz-outline-radius-bottomright", "-moz-outline-radius-topleft", "-moz-outline-radius-topright" ],
+ initial_values: [ "0", "0px", "calc(-2px)", "calc(0px) calc(0pt)", "calc(0px) calc(0em)" ],
+ other_values: [ "0%", "3%", "1px", "2em", "3em 2px", "2pt 3% 4em", "2px 2px 2px 2px", // circular
+ "3% / 2%", "1px / 4px", "2em / 1em", "3em 2px / 2px 3em", "2pt 3% 4em / 4pt 1% 5em", "2px 2px 2px 2px / 4px 4px 4px 4px", "1pt / 2pt 3pt", "4pt 5pt / 3pt", // elliptical
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ "2px 2px calc(2px + 1%) 2px",
+ "1px 2px 2px 2px / 2px 2px calc(2px + 1%) 2px",
+ ],
+ invalid_values: [ "2px -2px", "inherit 2px", "inherit / 2px", "2px inherit", "2px / inherit", "2px 2px 2px 2px 2px", "1px / 2px 2px 2px 2px 2px", "2", "2 2", "2px 2px 2px 2px / 2px 2px 2 2px" ]
+ },
+ "-moz-outline-radius-bottomleft": {
+ domProp: "MozOutlineRadiusBottomleft",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "width": "200px", "height": "100px", "display": "inline-block"},
+ initial_values: [ "0", "0px", "calc(-2px)", "calc(0px)" ],
+ other_values: [ "0%", "3%", "1px", "2em", // circular
+ "3% 2%", "1px 4px", "2em 2pt", // elliptical
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "-1px", "4px -2px", "inherit 2px", "2px inherit", "2", "2px 2", "2 2px" ]
+ },
+ "-moz-outline-radius-bottomright": {
+ domProp: "MozOutlineRadiusBottomright",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "width": "200px", "height": "100px", "display": "inline-block"},
+ initial_values: [ "0", "0px", "calc(-2px)", "calc(0px)" ],
+ other_values: [ "0%", "3%", "1px", "2em", // circular
+ "3% 2%", "1px 4px", "2em 2pt", // elliptical
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "-1px", "4px -2px", "inherit 2px", "2px inherit", "2", "2px 2", "2 2px" ]
+ },
+ "-moz-outline-radius-topleft": {
+ domProp: "MozOutlineRadiusTopleft",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "width": "200px", "height": "100px", "display": "inline-block"},
+ initial_values: [ "0", "0px", "calc(-2px)", "calc(0px)" ],
+ other_values: [ "0%", "3%", "1px", "2em", // circular
+ "3% 2%", "1px 4px", "2em 2pt", // elliptical
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "-1px", "4px -2px", "inherit 2px", "2px inherit", "2", "2px 2", "2 2px" ]
+ },
+ "-moz-outline-radius-topright": {
+ domProp: "MozOutlineRadiusTopright",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "width": "200px", "height": "100px", "display": "inline-block"},
+ initial_values: [ "0", "0px", "calc(-2px)", "calc(0px)" ],
+ other_values: [ "0%", "3%", "1px", "2em", // circular
+ "3% 2%", "1px 4px", "2em 2pt", // elliptical
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "-1px", "4px -2px", "inherit 2px", "2px inherit", "2", "2px 2", "2 2px" ]
+ },
+ "padding-inline-end": {
+ domProp: "paddingInlineEnd",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* no subproperties */
+ initial_values: [ "0", "0px", "0%", "0em", "0ex", "calc(0pt)", "calc(0% + 0px)", "calc(-3px)", "calc(-1%)" ],
+ other_values: [ "1px", "3em", "5%",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "5" ]
+ },
+ "padding-inline-start": {
+ domProp: "paddingInlineStart",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* no subproperties */
+ initial_values: [ "0", "0px", "0%", "0em", "0ex", "calc(0pt)", "calc(0% + 0px)", "calc(-3px)", "calc(-1%)" ],
+ other_values: [ "1px", "3em", "5%",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "5" ]
+ },
+ "resize": {
+ domProp: "resize",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "display": "block", "overflow": "auto" },
+ initial_values: [ "none" ],
+ other_values: [ "both", "horizontal", "vertical" ],
+ invalid_values: []
+ },
+ "-moz-stack-sizing": {
+ domProp: "MozStackSizing",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "stretch-to-fit" ],
+ other_values: [ "ignore" ],
+ invalid_values: []
+ },
+ "-moz-tab-size": {
+ domProp: "MozTabSize",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "8" ],
+ other_values: [ "0", "3", "99", "12000" ],
+ invalid_values: [ "-1", "-808", "3.0", "17.5" ]
+ },
+ "-moz-text-size-adjust": {
+ domProp: "MozTextSizeAdjust",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "none" ],
+ invalid_values: [ "-5%", "0", "100", "0%", "50%", "100%", "220.3%" ]
+ },
+ "transform": {
+ domProp: "transform",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "width": "300px", "height": "50px" },
+ initial_values: [ "none" ],
+ other_values: [ "translatex(1px)", "translatex(4em)",
+ "translatex(-4px)", "translatex(3px)",
+ "translatex(0px) translatex(1px) translatex(2px) translatex(3px) translatex(4px)",
+ "translatey(4em)", "translate(3px)", "translate(10px, -3px)",
+ "rotate(45deg)", "rotate(45grad)", "rotate(45rad)",
+ "rotate(0.25turn)", "rotate(0)", "scalex(10)", "scaley(10)",
+ "scale(10)", "scale(10, 20)", "skewx(30deg)", "skewx(0)",
+ "skewy(0)", "skewx(30grad)", "skewx(30rad)", "skewx(0.08turn)",
+ "skewy(30deg)", "skewy(30grad)", "skewy(30rad)", "skewy(0.08turn)",
+ "rotate(45deg) scale(2, 1)", "skewx(45deg) skewx(-50grad)",
+ "translate(0, 0) scale(1, 1) skewx(0) skewy(0) matrix(1, 0, 0, 1, 0, 0)",
+ "translatex(50%)", "translatey(50%)", "translate(50%)",
+ "translate(3%, 5px)", "translate(5px, 3%)",
+ "matrix(1, 2, 3, 4, 5, 6)",
+ /* valid calc() values */
+ "translatex(calc(5px + 10%))",
+ "translatey(calc(0.25 * 5px + 10% / 3))",
+ "translate(calc(5px - 10% * 3))",
+ "translate(calc(5px - 3 * 10%), 50px)",
+ "translate(-50px, calc(5px - 10% * 3))",
+ "translatez(1px)", "translatez(4em)", "translatez(-4px)",
+ "translatez(0px)", "translatez(2px) translatez(5px)",
+ "translate3d(3px, 4px, 5px)", "translate3d(2em, 3px, 1em)",
+ "translatex(2px) translate3d(4px, 5px, 6px) translatey(1px)",
+ "scale3d(4, 4, 4)", "scale3d(-2, 3, -7)", "scalez(4)",
+ "scalez(-6)", "rotate3d(2, 3, 4, 45deg)",
+ "rotate3d(-3, 7, 0, 12rad)", "rotatex(15deg)", "rotatey(-12grad)",
+ "rotatez(72rad)", "rotatex(0.125turn)",
+ "perspective(0px)", "perspective(1000px)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)",
+ ],
+ invalid_values: ["1px", "#0000ff", "red", "auto",
+ "translatex(1)", "translatey(1)", "translate(2)",
+ "translate(-3, -4)",
+ "translatex(1px 1px)", "translatex(translatex(1px))",
+ "translatex(#0000ff)", "translatex(red)", "translatey()",
+ "matrix(1px, 2px, 3px, 4px, 5px, 6px)", "scale(150%)",
+ "skewx(red)", "matrix(1%, 0, 0, 0, 0px, 0px)",
+ "matrix(0, 1%, 2, 3, 4px,5px)", "matrix(0, 1, 2%, 3, 4px, 5px)",
+ "matrix(0, 1, 2, 3%, 4%, 5%)", "matrix(1, 2, 3, 4, 5px, 6%)",
+ "matrix(1, 2, 3, 4, 5%, 6px)", "matrix(1, 2, 3, 4, 5%, 6%)",
+ "matrix(1, 2, 3, 4, 5px, 6em)",
+ /* invalid calc() values */
+ "translatey(-moz-min(5px,10%))",
+ "translatex(-moz-max(5px,10%))",
+ "translate(10px, calc(min(5px,10%)))",
+ "translate(calc(max(5px,10%)), 10%)",
+ "matrix(1, 0, 0, 1, max(5px * 3), calc(10% - 3px))",
+ "perspective(-10px)", "matrix3d(dinosaur)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15%, 16)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16px)",
+ "rotatey(words)", "rotatex(7)", "translate3d(3px, 4px, 1px, 7px)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13px, 14em, 15px, 16)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 20%, 10%, 15, 16)"
+ ],
+ },
+ "transform-origin": {
+ domProp: "transformOrigin",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* no subproperties */
+ prerequisites: { "width": "10px", "height": "10px", "display": "block"},
+ initial_values: [ "50% 50%", "center", "center center" ],
+ other_values: [ "25% 25%", "6px 5px", "20% 3em", "0 0", "0in 1in",
+ "top", "bottom","top left", "top right",
+ "top center", "center left", "center right",
+ "bottom left", "bottom right", "bottom center",
+ "20% center", "6px center", "13in bottom",
+ "left 50px", "right 13%", "center 40px",
+ "calc(20px)",
+ "calc(20px) 10px",
+ "10px calc(20px)",
+ "calc(20px) 25%",
+ "25% calc(20px)",
+ "calc(20px) calc(20px)",
+ "calc(20px + 1em) calc(20px / 2)",
+ "calc(20px + 50%) calc(50% - 10px)",
+ "calc(-20px) calc(-50%)",
+ "calc(-20%) calc(-50%)",
+ "6px 5px 5px",
+ "top center 10px"
+ ],
+ invalid_values: ["red", "auto", "none", "0.5 0.5", "40px #0000ff",
+ "border", "center red", "right diagonal",
+ "#00ffff bottom", "0px calc(0px + rubbish)",
+ "0px 0px calc(0px + rubbish)"]
+ },
+ "perspective-origin": {
+ domProp: "perspectiveOrigin",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* no subproperties */
+ prerequisites: { "width": "10px", "height": "10px", "display": "block"},
+ initial_values: [ "50% 50%", "center", "center center" ],
+ other_values: [ "25% 25%", "6px 5px", "20% 3em", "0 0", "0in 1in",
+ "top", "bottom","top left", "top right",
+ "top center", "center left", "center right",
+ "bottom left", "bottom right", "bottom center",
+ "20% center", "6px center", "13in bottom",
+ "left 50px", "right 13%", "center 40px",
+ "calc(20px)",
+ "calc(20px) 10px",
+ "10px calc(20px)",
+ "calc(20px) 25%",
+ "25% calc(20px)",
+ "calc(20px) calc(20px)",
+ "calc(20px + 1em) calc(20px / 2)",
+ "calc(20px + 50%) calc(50% - 10px)",
+ "calc(-20px) calc(-50%)",
+ "calc(-20%) calc(-50%)" ],
+ invalid_values: [ "red", "auto", "none", "0.5 0.5", "40px #0000ff",
+ "border", "center red", "right diagonal",
+ "#00ffff bottom"]
+ },
+ "perspective": {
+ domProp: "perspective",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "1000px", "500.2px", "0", "0px" ],
+ invalid_values: [ "pants", "200", "-100px", "-27.2em" ]
+ },
+ "backface-visibility": {
+ domProp: "backfaceVisibility",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "visible" ],
+ other_values: [ "hidden" ],
+ invalid_values: [ "collapse" ]
+ },
+ "transform-style": {
+ domProp: "transformStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "flat" ],
+ other_values: [ "preserve-3d" ],
+ invalid_values: []
+ },
+ "-moz-user-focus": {
+ domProp: "MozUserFocus",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "normal", "ignore", "select-all", "select-before", "select-after", "select-same", "select-menu" ],
+ invalid_values: []
+ },
+ "-moz-user-input": {
+ domProp: "MozUserInput",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "none", "enabled", "disabled" ],
+ invalid_values: []
+ },
+ "-moz-user-modify": {
+ domProp: "MozUserModify",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "read-only" ],
+ other_values: [ "read-write", "write-only" ],
+ invalid_values: []
+ },
+ "-moz-user-select": {
+ domProp: "MozUserSelect",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "none", "text", "element", "elements", "all", "toggle", "tri-state", "-moz-all", "-moz-none" ],
+ invalid_values: []
+ },
+ "background": {
+ domProp: "background",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "background-attachment", "background-color", "background-image", "background-position-x", "background-position-y", "background-repeat", "background-clip", "background-origin", "background-size" ],
+ initial_values: [ "transparent", "none", "repeat", "scroll", "0% 0%", "top left", "left top", "0% 0% / auto", "top left / auto", "left top / auto", "0% 0% / auto auto",
+ "transparent none", "top left none", "left top none", "none left top", "none top left", "none 0% 0%", "left top / auto none", "left top / auto auto none",
+ "transparent none repeat scroll top left", "left top repeat none scroll transparent", "transparent none repeat scroll top left / auto", "left top / auto repeat none scroll transparent", "none repeat scroll 0% 0% / auto auto transparent",
+ "padding-box border-box" ],
+ other_values: [
+ /* without multiple backgrounds */
+ "green",
+ "none green repeat scroll left top",
+ "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
+ "repeat url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==') transparent left top scroll",
+ "repeat-x",
+ "repeat-y",
+ "no-repeat",
+ "none repeat-y transparent scroll 0% 0%",
+ "fixed",
+ "0% top transparent fixed repeat none",
+ "top",
+ "left",
+ "50% 50%",
+ "center",
+ "top / 100px",
+ "left / contain",
+ "left / cover",
+ "10px / 10%",
+ "10em / calc(20px)",
+ "top left / 100px 100px",
+ "top left / 100px auto",
+ "top left / 100px 10%",
+ "top left / 100px calc(20px)",
+ "bottom right scroll none transparent repeat",
+ "50% transparent",
+ "transparent 50%",
+ "50%",
+ "-moz-radial-gradient(10% bottom, #ffffff, black) scroll no-repeat",
+ "-moz-linear-gradient(10px 10px -45deg, red, blue) repeat",
+ "-moz-linear-gradient(10px 10px -0.125turn, red, blue) repeat",
+ "-moz-repeating-radial-gradient(10% bottom, #ffffff, black) scroll no-repeat",
+ "-moz-repeating-linear-gradient(10px 10px -45deg, red, blue) repeat",
+ "-moz-element(#test) lime",
+ /* multiple backgrounds */
+ "url(404.png), url(404.png)",
+ "url(404.png), url(404.png) transparent",
+ "url(404.png), url(404.png) red",
+ "repeat-x, fixed, none",
+ "0% top url(404.png), url(404.png) 0% top",
+ "fixed repeat-y top left url(404.png), repeat-x green",
+ "url(404.png), -moz-linear-gradient(20px 20px -45deg, blue, green), -moz-element(#a) black",
+ "top left / contain, bottom right / cover",
+ /* test cases with clip+origin in the shorthand */
+ "url(404.png) green padding-box",
+ "url(404.png) border-box transparent",
+ "content-box url(404.png) blue",
+ "url(404.png) green padding-box padding-box",
+ "url(404.png) green padding-box border-box",
+ "content-box border-box url(404.png) blue",
+ ],
+ invalid_values: [
+ /* mixes with keywords have to be in correct order */
+ "50% left", "top 50%",
+ /* no quirks mode colors */
+ "-moz-radial-gradient(10% bottom, ffffff, black) scroll no-repeat",
+ /* no quirks mode lengths */
+ "-moz-linear-gradient(10 10px -45deg, red, blue) repeat",
+ "-moz-linear-gradient(10px 10 -45deg, red, blue) repeat",
+ "linear-gradient(red -99, yellow, green, blue 120%)",
+ /* bug 258080: don't accept background-position separated */
+ "left url(404.png) top", "top url(404.png) left",
+ /* not allowed to have color in non-bottom layer */
+ "url(404.png) transparent, url(404.png)",
+ "url(404.png) red, url(404.png)",
+ "url(404.png) transparent, url(404.png) transparent",
+ "url(404.png) transparent red, url(404.png) transparent red",
+ "url(404.png) red, url(404.png) red",
+ "url(404.png) rgba(0, 0, 0, 0), url(404.png)",
+ "url(404.png) rgb(255, 0, 0), url(404.png)",
+ "url(404.png) rgba(0, 0, 0, 0), url(404.png) rgba(0, 0, 0, 0)",
+ "url(404.png) rgba(0, 0, 0, 0) rgb(255, 0, 0), url(404.png) rgba(0, 0, 0, 0) rgb(255, 0, 0)",
+ "url(404.png) rgb(255, 0, 0), url(404.png) rgb(255, 0, 0)",
+ /* bug 513395: old syntax for gradients */
+ "-moz-radial-gradient(10% bottom, 30px, 20px 20px, 10px, from(#ffffff), to(black)) scroll no-repeat",
+ "-moz-linear-gradient(10px 10px, 20px 20px, from(red), to(blue)) repeat",
+ /* clip and origin separated in the shorthand */
+ "url(404.png) padding-box green border-box",
+ "url(404.png) padding-box green padding-box",
+ "transparent padding-box url(404.png) border-box",
+ "transparent padding-box url(404.png) padding-box",
+ /* error inside functions */
+ "-moz-image-rect(url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), rubbish, 50%, 30%, 0) transparent",
+ "-moz-element(#a rubbish) black",
+ "text",
+ "text border-box",
+ "content-box text text",
+ "padding-box text url(404.png) text",
+ ]
+ },
+ "background-attachment": {
+ domProp: "backgroundAttachment",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "scroll" ],
+ other_values: [ "fixed", "local", "scroll,scroll", "fixed, scroll", "scroll, fixed, local, scroll", "fixed, fixed" ],
+ invalid_values: []
+ },
+ "background-clip": {
+ /*
+ * When we rename this to 'background-clip', we also
+ * need to rename the values to match the spec.
+ */
+ domProp: "backgroundClip",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "border-box" ],
+ other_values: [ "content-box", "padding-box", "border-box, padding-box", "padding-box, padding-box, padding-box", "border-box, border-box" ],
+ invalid_values: [ "margin-box", "border-box border-box" ]
+ },
+ "background-color": {
+ domProp: "backgroundColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "transparent", "rgba(255, 127, 15, 0)", "hsla(240, 97%, 50%, 0.0)", "rgba(0, 0, 0, 0)", "rgba(255,255,255,-3.7)" ],
+ other_values: [ "green", "rgb(255, 0, 128)", "#fc2", "#96ed2a", "black", "rgba(255,255,0,3)", "hsl(240, 50%, 50%)", "rgb(50%, 50%, 50%)", "-moz-default-background-color", "rgb(100, 100.0, 100)" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000", "rgb(100, 100%, 100)" ],
+ quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
+ },
+ "background-image": {
+ domProp: "backgroundImage",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [
+ "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)", "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
+ "none, none",
+ "none, none, none, none, none",
+ "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
+ "none, url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
+ "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
+ ].concat(validGradientAndElementValues),
+ invalid_values: [
+ ].concat(invalidGradientAndElementValues),
+ unbalanced_values: [
+ ].concat(unbalancedGradientAndElementValues)
+ },
+ "background-origin": {
+ domProp: "backgroundOrigin",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "padding-box" ],
+ other_values: [ "border-box", "content-box", "border-box, padding-box", "padding-box, padding-box, padding-box", "border-box, border-box" ],
+ invalid_values: [ "margin-box", "padding-box padding-box" ]
+ },
+ "background-position": {
+ domProp: "backgroundPosition",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ initial_values: [ "top 0% left 0%", "top 0% left", "top left", "left top", "0% 0%", "0% top", "left 0%" ],
+ other_values: [ "top", "left", "right", "bottom", "center", "center bottom", "bottom center", "center right", "right center", "center top", "top center", "center left", "left center", "right bottom", "bottom right", "50%", "top left, top left", "top left, top right", "top right, top left", "left top, 0% 0%", "10% 20%, 30%, 40%", "top left, bottom right", "right bottom, left top", "0%", "0px", "30px", "0%, 10%, 20%, 30%", "top, top, top, top, top",
+ "calc(20px)",
+ "calc(20px) 10px",
+ "10px calc(20px)",
+ "calc(20px) 25%",
+ "25% calc(20px)",
+ "calc(20px) calc(20px)",
+ "calc(20px + 1em) calc(20px / 2)",
+ "calc(20px + 50%) calc(50% - 10px)",
+ "calc(-20px) calc(-50%)",
+ "calc(-20%) calc(-50%)",
+ "0px 0px",
+ "right 20px top 60px",
+ "right 20px bottom 60px",
+ "left 20px top 60px",
+ "left 20px bottom 60px",
+ "right -50px top -50px",
+ "left -50px bottom -50px",
+ "right 20px top -50px",
+ "right -20px top 50px",
+ "right 3em bottom 10px",
+ "bottom 3em right 10px",
+ "top 3em right 10px",
+ "left 15px",
+ "10px top",
+ "left top 15px",
+ "left 10px top",
+ "left 20%",
+ "right 20%"
+ ],
+ subproperties: [ "background-position-x", "background-position-y" ],
+ invalid_values: [ "center 10px center 4px", "center 10px center",
+ "top 20%", "bottom 20%", "50% left", "top 50%",
+ "50% bottom 10%", "right 10% 50%", "left right",
+ "top bottom", "left 10% right",
+ "top 20px bottom 20px", "left left",
+ "0px calc(0px + rubbish)"],
+ quirks_values: {
+ "20 20": "20px 20px",
+ "10 5px": "10px 5px",
+ "7px 2": "7px 2px",
+ },
+ },
+ "background-position-x": {
+ domProp: "backgroundPositionX",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "left 0%", "left", "0%" ],
+ other_values: [ "right", "center", "50%", "left, left", "left, right", "right, left", "left, 0%", "10%, 20%, 40%", "0px", "30px", "0%, 10%, 20%, 30%", "left, left, left, left, left",
+ "calc(20px)",
+ "calc(20px + 1em)",
+ "calc(20px / 2)",
+ "calc(20px + 50%)",
+ "calc(50% - 10px)",
+ "calc(-20px)",
+ "calc(-50%)",
+ "calc(-20%)",
+ "right 20px",
+ "left 20px",
+ "right -50px",
+ "left -50px",
+ "right 20px",
+ "right 3em",
+ ],
+ invalid_values: [ "center 10px", "right 10% 50%", "left right", "left left",
+ "bottom 20px", "top 10%", "bottom 3em",
+ "top", "bottom", "top, top", "top, bottom", "bottom, top", "top, 0%", "top, top, top, top, top",
+ "calc(0px + rubbish)"],
+ },
+ "background-position-y": {
+ domProp: "backgroundPositionY",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "top 0%", "top", "0%" ],
+ other_values: [ "bottom", "center", "50%", "top, top", "top, bottom", "bottom, top", "top, 0%", "10%, 20%, 40%", "0px", "30px", "0%, 10%, 20%, 30%", "top, top, top, top, top",
+ "calc(20px)",
+ "calc(20px + 1em)",
+ "calc(20px / 2)",
+ "calc(20px + 50%)",
+ "calc(50% - 10px)",
+ "calc(-20px)",
+ "calc(-50%)",
+ "calc(-20%)",
+ "bottom 20px",
+ "top 20px",
+ "bottom -50px",
+ "top -50px",
+ "bottom 20px",
+ "bottom 3em",
+ ],
+ invalid_values: [ "center 10px", "bottom 10% 50%", "top bottom", "top top",
+ "right 20px", "left 10%", "right 3em",
+ "left", "right", "left, left", "left, right", "right, left", "left, 0%", "left, left, left, left, left",
+ "calc(0px + rubbish)"],
+ },
+ "background-repeat": {
+ domProp: "backgroundRepeat",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "repeat", "repeat repeat" ],
+ other_values: [ "repeat-x", "repeat-y", "no-repeat",
+ "repeat-x, repeat-x",
+ "repeat, no-repeat",
+ "repeat-y, no-repeat, repeat-y",
+ "repeat, repeat, repeat",
+ "repeat no-repeat",
+ "no-repeat repeat",
+ "no-repeat no-repeat",
+ "repeat repeat, repeat repeat",
+ "round, repeat",
+ "round repeat, repeat-x",
+ "round no-repeat, repeat-y",
+ "round round",
+ "space, repeat",
+ "space repeat, repeat-x",
+ "space no-repeat, repeat-y",
+ "space space",
+ "space round"
+ ],
+ invalid_values: [ "repeat repeat repeat",
+ "repeat-x repeat-y",
+ "repeat repeat-x",
+ "repeat repeat-y",
+ "repeat-x repeat",
+ "repeat-y repeat",
+ "round round round",
+ "repeat-x round",
+ "round repeat-x",
+ "repeat-y round",
+ "round repeat-y",
+ "space space space",
+ "repeat-x space",
+ "space repeat-x",
+ "repeat-y space",
+ "space repeat-y" ]
+ },
+ "background-size": {
+ domProp: "backgroundSize",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto", "auto auto" ],
+ other_values: [ "contain", "cover", "100px auto", "auto 100px", "100% auto", "auto 100%", "25% 50px", "3em 40%",
+ "calc(20px)",
+ "calc(20px) 10px",
+ "10px calc(20px)",
+ "calc(20px) 25%",
+ "25% calc(20px)",
+ "calc(20px) calc(20px)",
+ "calc(20px + 1em) calc(20px / 2)",
+ "calc(20px + 50%) calc(50% - 10px)",
+ "calc(-20px) calc(-50%)",
+ "calc(-20%) calc(-50%)"
+ ],
+ invalid_values: [ "contain contain", "cover cover", "cover auto", "auto cover", "contain cover", "cover contain", "-5px 3px", "3px -5px", "auto -5px", "-5px auto", "5 3", "10px calc(10px + rubbish)" ]
+ },
+ "border": {
+ domProp: "border",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-bottom-color", "border-bottom-style", "border-bottom-width", "border-left-color", "border-left-style", "border-left-width", "border-right-color", "border-right-style", "border-right-width", "border-top-color", "border-top-style", "border-top-width", "-moz-border-top-colors", "-moz-border-right-colors", "-moz-border-bottom-colors", "-moz-border-left-colors", "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat" ],
+ initial_values: [ "none", "medium", "currentColor", "thin", "none medium currentcolor", "calc(4px - 1px) none" ],
+ other_values: [ "solid", "medium solid", "green solid", "10px solid", "thick solid", "calc(2px) solid blue" ],
+ invalid_values: [ "5%", "medium solid ff00ff", "5 solid green" ]
+ },
+ "border-bottom": {
+ domProp: "borderBottom",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-bottom-color", "border-bottom-style", "border-bottom-width" ],
+ initial_values: [ "none", "medium", "currentColor", "thin", "none medium currentcolor" ],
+ other_values: [ "solid", "green", "medium solid", "green solid", "10px solid", "thick solid", "5px green none" ],
+ invalid_values: [ "5%", "5", "5 solid green" ]
+ },
+ "border-bottom-color": {
+ domProp: "borderBottomColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "black" },
+ initial_values: [ "currentColor" ],
+ other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000" ],
+ quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
+ },
+ "border-bottom-style": {
+ domProp: "borderBottomStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* XXX hidden is sometimes the same as initial */
+ initial_values: [ "none" ],
+ other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
+ invalid_values: []
+ },
+ "border-bottom-width": {
+ domProp: "borderBottomWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "border-bottom-style": "solid" },
+ initial_values: [ "medium", "3px", "calc(4px - 1px)" ],
+ other_values: [ "thin", "thick", "1px", "2em",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0em)",
+ "calc(0px)",
+ "calc(5em)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 5em)",
+ ],
+ invalid_values: [ "5%" ],
+ quirks_values: { "5": "5px" },
+ },
+ "border-collapse": {
+ domProp: "borderCollapse",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "separate" ],
+ other_values: [ "collapse" ],
+ invalid_values: []
+ },
+ "border-color": {
+ domProp: "borderColor",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-top-color", "border-right-color", "border-bottom-color", "border-left-color" ],
+ initial_values: [ "currentColor", "currentColor currentColor", "currentColor currentColor currentColor", "currentColor currentColor currentcolor CURRENTcolor" ],
+ other_values: [ "green", "currentColor green", "currentColor currentColor green", "currentColor currentColor currentColor green", "rgba(255,128,0,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000", "red rgb(nonsense)", "red 1px" ],
+ unbalanced_values: [ "red rgb(" ],
+ quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
+ },
+ "border-left": {
+ domProp: "borderLeft",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-left-color", "border-left-style", "border-left-width" ],
+ initial_values: [ "none", "medium", "currentColor", "thin", "none medium currentcolor" ],
+ other_values: [ "solid", "green", "medium solid", "green solid", "10px solid", "thick solid", "5px green none" ],
+ invalid_values: [ "5%", "5", "5 solid green", "calc(5px + rubbish) green solid", "5px rgb(0, rubbish, 0) solid" ]
+ },
+ "border-left-color": {
+ domProp: "borderLeftColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "black" },
+ initial_values: [ "currentColor" ],
+ other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000" ],
+ quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
+ },
+ "border-left-style": {
+ domProp: "borderLeftStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* XXX hidden is sometimes the same as initial */
+ initial_values: [ "none" ],
+ other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
+ invalid_values: []
+ },
+ "border-left-width": {
+ domProp: "borderLeftWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "border-left-style": "solid" },
+ initial_values: [ "medium", "3px", "calc(4px - 1px)" ],
+ other_values: [ "thin", "thick", "1px", "2em",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0em)",
+ "calc(0px)",
+ "calc(5em)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 5em)",
+ ],
+ invalid_values: [ "5%" ],
+ quirks_values: { "5": "5px" },
+ },
+ "border-right": {
+ domProp: "borderRight",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-right-color", "border-right-style", "border-right-width" ],
+ initial_values: [ "none", "medium", "currentColor", "thin", "none medium currentcolor" ],
+ other_values: [ "solid", "green", "medium solid", "green solid", "10px solid", "thick solid", "5px green none" ],
+ invalid_values: [ "5%", "5", "5 solid green" ]
+ },
+ "border-right-color": {
+ domProp: "borderRightColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "black" },
+ initial_values: [ "currentColor" ],
+ other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000" ],
+ quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
+ },
+ "border-right-style": {
+ domProp: "borderRightStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* XXX hidden is sometimes the same as initial */
+ initial_values: [ "none" ],
+ other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
+ invalid_values: []
+ },
+ "border-right-width": {
+ domProp: "borderRightWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "border-right-style": "solid" },
+ initial_values: [ "medium", "3px", "calc(4px - 1px)" ],
+ other_values: [ "thin", "thick", "1px", "2em",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0em)",
+ "calc(0px)",
+ "calc(5em)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 5em)",
+ ],
+ invalid_values: [ "5%" ],
+ quirks_values: { "5": "5px" },
+ },
+ "border-spacing": {
+ domProp: "borderSpacing",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0", "0 0", "0px", "0 0px", "calc(0px)", "calc(0px) calc(0em)", "calc(2em - 2em) calc(3px + 7px - 10px)", "calc(-5px)", "calc(-5px) calc(-5px)" ],
+ other_values: [ "3px", "4em 2px", "4em 0", "0px 2px", "calc(7px)", "0 calc(7px)", "calc(7px) 0", "calc(0px) calc(7px)", "calc(7px) calc(0px)", "7px calc(0px)", "calc(0px) 7px", "7px calc(0px)", "3px calc(2em)" ],
+ invalid_values: [ "0%", "0 0%", "-5px", "-5px -5px", "0 -5px", "-5px 0", "0 calc(0px + rubbish)" ],
+ quirks_values: {
+ "2px 5": "2px 5px",
+ "7": "7px",
+ "3 4px": "3px 4px",
+ },
+ },
+ "border-style": {
+ domProp: "borderStyle",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-top-style", "border-right-style", "border-bottom-style", "border-left-style" ],
+ /* XXX hidden is sometimes the same as initial */
+ initial_values: [ "none", "none none", "none none none", "none none none none" ],
+ other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge", "none solid", "none none solid", "none none none solid", "groove none none none", "none ridge none none", "none none double none", "none none none dotted" ],
+ invalid_values: []
+ },
+ "border-top": {
+ domProp: "borderTop",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-top-color", "border-top-style", "border-top-width" ],
+ initial_values: [ "none", "medium", "currentColor", "thin", "none medium currentcolor" ],
+ other_values: [ "solid", "green", "medium solid", "green solid", "10px solid", "thick solid", "5px green none" ],
+ invalid_values: [ "5%", "5", "5 solid green" ]
+ },
+ "border-top-color": {
+ domProp: "borderTopColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "black" },
+ initial_values: [ "currentColor" ],
+ other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000" ],
+ quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
+ },
+ "border-top-style": {
+ domProp: "borderTopStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* XXX hidden is sometimes the same as initial */
+ initial_values: [ "none" ],
+ other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
+ invalid_values: []
+ },
+ "border-top-width": {
+ domProp: "borderTopWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "border-top-style": "solid" },
+ initial_values: [ "medium", "3px", "calc(4px - 1px)" ],
+ other_values: [ "thin", "thick", "1px", "2em",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0em)",
+ "calc(0px)",
+ "calc(5em)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 5em)",
+ ],
+ invalid_values: [ "5%" ],
+ quirks_values: { "5": "5px" },
+ },
+ "border-width": {
+ domProp: "borderWidth",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-top-width", "border-right-width", "border-bottom-width", "border-left-width" ],
+ prerequisites: { "border-style": "solid" },
+ initial_values: [ "medium", "3px", "medium medium", "3px medium medium", "medium 3px medium medium", "calc(3px) 3px calc(5px - 2px) calc(2px - -1px)" ],
+ other_values: [ "thin", "thick", "1px", "2em", "2px 0 0px 1em", "calc(2em)" ],
+ invalid_values: [ "5%", "1px calc(nonsense)", "1px red" ],
+ unbalanced_values: [ "1px calc(" ],
+ quirks_values: { "5": "5px" },
+ },
+ "bottom": {
+ domProp: "bottom",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* FIXME: run tests with multiple prerequisites */
+ prerequisites: { "position": "relative" },
+ /* XXX 0 may or may not be equal to auto */
+ initial_values: [ "auto" ],
+ other_values: [ "32px", "-3em", "12%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [],
+ quirks_values: { "5": "5px" },
+ },
+ "box-shadow": {
+ domProp: "boxShadow",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ prerequisites: { "color": "blue" },
+ other_values: [ "2px 2px", "2px 2px 1px", "2px 2px 2px 2px", "blue 3px 2px", "2px 2px 1px 5px green", "2px 2px red", "green 2px 2px 1px", "green 2px 2px, blue 1px 3px 4px", "currentColor 3px 3px", "blue 2px 2px, currentColor 1px 2px, 1px 2px 3px 2px orange", "3px 0 0 0", "inset 2px 2px 3px 4px black", "2px -2px green inset, 4px 4px 3px blue, inset 2px 2px",
+ /* calc() values */
+ "2px 2px calc(-5px)", /* clamped */
+ "calc(3em - 2px) 2px green",
+ "green calc(3em - 2px) 2px",
+ "2px calc(2px + 0.2em)",
+ "blue 2px calc(2px + 0.2em)",
+ "2px calc(2px + 0.2em) blue",
+ "calc(-2px) calc(-2px)",
+ "-2px -2px",
+ "calc(2px) calc(2px)",
+ "calc(2px) calc(2px) calc(2px)",
+ "calc(2px) calc(2px) calc(2px) calc(2px)"
+ ],
+ invalid_values: [ "3% 3%", "1px 1px 1px 1px 1px", "2px 2px, none", "red 2px 2px blue", "inherit, 2px 2px", "2px 2px, inherit", "2px 2px -5px", "inset 4px 4px black inset", "inset inherit", "inset none", "3 3", "3px 3", "3 3px", "3px 3px 3", "3px 3px 3px 3", "3px calc(3px + rubbish)", "3px 3px calc(3px + rubbish)", "3px 3px 3px calc(3px + rubbish)", "3px 3px 3px 3px rgb(0, rubbish, 0)" ]
+ },
+ "caption-side": {
+ domProp: "captionSide",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "top" ],
+ other_values: [ "bottom", "left", "right", "top-outside", "bottom-outside" ],
+ invalid_values: []
+ },
+ "clear": {
+ domProp: "clear",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "left", "right", "both" ],
+ invalid_values: []
+ },
+ "clip": {
+ domProp: "clip",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "rect(0 0 0 0)", "rect(auto,auto,auto,auto)", "rect(3px, 4px, 4em, 0)", "rect(auto, 3em, 4pt, 2px)", "rect(2px 3px 4px 5px)" ],
+ invalid_values: [ "rect(auto, 3em, 2%, 5px)" ],
+ quirks_values: { "rect(1, 2, 3, 4)": "rect(1px, 2px, 3px, 4px)" },
+ },
+ "color": {
+ domProp: "color",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ /* XXX should test currentColor, but may or may not be initial */
+ initial_values: [ "black", "#000", "#000f", "#000000ff", "-moz-default-color", "rgb(0, 0, 0)", "rgb(0%, 0%, 0%)",
+ /* css-color-4: */
+ /* rgb() and rgba() are aliases of each other. */
+ "rgb(0, 0, 0)", "rgba(0, 0, 0)", "rgb(0, 0, 0, 1)", "rgba(0, 0, 0, 1)",
+ /* hsl() and hsla() are aliases of each other. */
+ "hsl(0, 0%, 0%)", "hsla(0, 0%, 0%)", "hsl(0, 0%, 0%, 1)", "hsla(0, 0%, 0%, 1)",
+ /* rgb() and rgba() functions now accept rather than . */
+ "rgb(0.0, 0.0, 0.0)", "rgba(0.0, 0.0, 0.0)", "rgb(0.0, 0.0, 0.0, 1)", "rgba(0.0, 0.0, 0.0, 1)",
+ /* now accepts as well as in rgba() and hsla(). */
+ "rgb(0.0, 0.0, 0.0, 100%)", "hsl(0, 0%, 0%, 100%)",
+ /* rgb() and hsl() now support comma-less expression. */
+ "rgb(0 0 0)", "rgb(0 0 0 / 1)", "rgb(0/* comment */0/* comment */0)", "rgb(0/* comment */0/* comment*/0/1.0)",
+ "hsl(0 0% 0%)", "hsl(0 0% 0% / 1)", "hsl(0/* comment */0%/* comment */0%)", "hsl(0/* comment */0%/* comment */0%/1)",
+ /* Support for hsl() hue component. */
+ "hsl(0deg, 0%, 0%)", "hsl(360deg, 0%, 0%)", "hsl(0grad, 0%, 0%)", "hsl(400grad, 0%, 0%)", "hsl(0rad, 0%, 0%)", "hsl(0turn, 0%, 0%)", "hsl(1turn, 0%, 0%)",
+ ],
+ other_values: [ "green", "#f3c", "#fed292", "rgba(45,300,12,2)", "transparent", "-moz-nativehyperlinktext", "rgba(255,128,0,0.5)", "#e0fc", "#10fcee72",
+ /* css-color-4: */
+ "rgb(100, 100.0, 100)", "rgb(300 300 300 / 200%)", "rgb(300.0 300.0 300.0 / 2.0)", "hsl(720, 200%, 200%, 2.0)", "hsla(720 200% 200% / 200%)",
+ "hsl(480deg, 20%, 30%, 0.3)", "hsl(55grad, 400%, 30%)", "hsl(0.5grad 400% 500% / 9.0)", "hsl(33rad 100% 90% / 4)", "hsl(0.33turn, 40%, 40%, 10%)",
+ ],
+ invalid_values: [ "#f", "#ff", "#fffff", "#fffffff", "#fffffffff",
+ "rgb(100%, 0, 100%)", "rgba(100, 0, 100%, 30%)",
+ "hsl(0, 0, 0%)", "hsla(0%, 0%, 0%, 0.1)",
+ /* trailing commas */
+ "rgb(0, 0, 0,)", "rgba(0, 0, 0, 0,)",
+ "hsl(0, 0%, 0%,)", "hsla(0, 0%, 0%, 1,)",
+ /* css-color-4: */
+ /* comma and comma-less expressions should not mix together. */
+ "rgb(0, 0, 0 / 1)", "rgb(0 0 0, 1)", "rgb(0, 0 0, 1)", "rgb(0 0, 0 / 1)",
+ "hsl(0, 0%, 0% / 1)", "hsl(0 0% 0%, 1)", "hsl(0 0% 0%, 1)", "hsl(0 0%, 0% / 1)",
+ /* trailing slash */
+ "rgb(0 0 0 /)", "rgb(0, 0, 0 /)",
+ "hsl(0 0% 0% /)", "hsl(0, 0%, 0% /)",
+ ],
+ quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a", "fff": "#ffffff", "ffffff": "#ffffff", },
+ },
+ "content": {
+ domProp: "content",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* XXX needs to be on pseudo-elements */
+ initial_values: [ "normal", "none" ],
+ other_values: [ '""', "''", '"hello"', "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)", "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")', 'counter(foo)', 'counter(bar, upper-roman)', 'counters(foo, ".")', "counters(bar, '-', lower-greek)", "'-' counter(foo) '.'", "attr(title)", "open-quote", "close-quote", "no-open-quote", "no-close-quote", "close-quote attr(title) counters(foo, '.', upper-alpha)", "counter(foo, none)", "counters(bar, '.', none)", "attr(\\32)", "attr(\\2)", "attr(-\\2)", "attr(-\\32)", "counter(\\2)", "counters(\\32, '.')", "counter(-\\32, upper-roman)", "counters(-\\2, '-', lower-greek)", "counter(\\()", "counters(a\\+b, '.')", "counter(\\}, upper-alpha)", "-moz-alt-content", "counter(foo, symbols('*'))", "counter(foo, symbols(numeric '0' '1'))", "counters(foo, '.', symbols('*'))", "counters(foo, '.', symbols(numeric '0' '1'))" ],
+ invalid_values: [ 'counters(foo)', 'counter(foo, ".")', 'attr("title")', "attr('title')", "attr(2)", "attr(-2)", "counter(2)", "counters(-2, '.')", "-moz-alt-content 'foo'", "'foo' -moz-alt-content", "counter(one, two, three) 'foo'" ]
+ },
+ "counter-increment": {
+ domProp: "counterIncrement",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "foo 1", "bar", "foo 3 bar baz 2", "\\32 1", "-\\32 1", "-c 1", "\\32 1", "-\\32 1", "\\2 1", "-\\2 1", "-c 1", "\\2 1", "-\\2 1", "-\\7f \\9e 1" ],
+ invalid_values: [ "none foo", "none foo 3", "foo none", "foo 3 none" ],
+ unbalanced_values: [ "foo 1 (" ]
+ },
+ "counter-reset": {
+ domProp: "counterReset",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "foo 1", "bar", "foo 3 bar baz 2", "\\32 1", "-\\32 1", "-c 1", "\\32 1", "-\\32 1", "\\2 1", "-\\2 1", "-c 1", "\\2 1", "-\\2 1", "-\\7f \\9e 1" ],
+ invalid_values: [ "none foo", "none foo 3", "foo none", "foo 3 none" ]
+ },
+ "cursor": {
+ domProp: "cursor",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "crosshair", "default", "pointer", "move", "e-resize", "ne-resize", "nw-resize", "n-resize", "se-resize", "sw-resize", "s-resize", "w-resize", "text", "wait", "help", "progress", "copy", "alias", "context-menu", "cell", "not-allowed", "col-resize", "row-resize", "no-drop", "vertical-text", "all-scroll", "nesw-resize", "nwse-resize", "ns-resize", "ew-resize", "none", "grab", "grabbing", "zoom-in", "zoom-out", "-moz-grab", "-moz-grabbing", "-moz-zoom-in", "-moz-zoom-out", "url(foo.png), move", "url(foo.png) 5 7, move", "url(foo.png) 12 3, url(bar.png), no-drop", "url(foo.png), url(bar.png) 7 2, wait", "url(foo.png) 3 2, url(bar.png) 7 9, pointer" ],
+ invalid_values: [ "url(foo.png)", "url(foo.png) 5 5" ]
+ },
+ "direction": {
+ domProp: "direction",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "ltr" ],
+ other_values: [ "rtl" ],
+ invalid_values: []
+ },
+ "display": {
+ domProp: "display",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "inline" ],
+ /* XXX none will really mess with other properties */
+ prerequisites: { "float": "none", "position": "static", "contain": "none" },
+ other_values: [
+ "block",
+ "flex",
+ "inline-flex",
+ "list-item",
+ "inline-block",
+ "table",
+ "inline-table",
+ "table-row-group",
+ "table-header-group",
+ "table-footer-group",
+ "table-row",
+ "table-column-group",
+ "table-column",
+ "table-cell",
+ "table-caption",
+ "ruby",
+ "ruby-base",
+ "ruby-base-container",
+ "ruby-text",
+ "ruby-text-container",
+ "none"
+ ],
+ invalid_values: []
+ },
+ "empty-cells": {
+ domProp: "emptyCells",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "show" ],
+ other_values: [ "hide" ],
+ invalid_values: []
+ },
+ "float": {
+ domProp: "cssFloat",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "left", "right" ],
+ invalid_values: []
+ },
+ "font": {
+ domProp: "font",
+ inherited: true,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ prerequisites: { "writing-mode": "initial" },
+ subproperties: [ "font-style", "font-variant", "font-weight", "font-size", "line-height", "font-family", "font-stretch",
+ "font-size-adjust", "font-feature-settings", "font-language-override",
+ "font-kerning", "font-synthesis", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian",
+ "font-variant-ligatures", "font-variant-numeric", "font-variant-position" ],
+ initial_values: [ (gInitialFontFamilyIsSansSerif ? "medium sans-serif" : "medium serif") ],
+ other_values: [ "large serif", "9px fantasy", "condensed bold italic small-caps 24px/1.4 Times New Roman, serif", "small inherit roman", "small roman inherit",
+ // system fonts
+ "caption", "icon", "menu", "message-box", "small-caption", "status-bar",
+ // Gecko-specific system fonts
+ "-moz-window", "-moz-document", "-moz-desktop", "-moz-info", "-moz-dialog", "-moz-button", "-moz-pull-down-menu", "-moz-list", "-moz-field", "-moz-workspace",
+ // line-height with calc()
+ "condensed bold italic small-caps 24px/calc(2px) Times New Roman, serif",
+ "condensed bold italic small-caps 24px/calc(50%) Times New Roman, serif",
+ "condensed bold italic small-caps 24px/calc(3*25px) Times New Roman, serif",
+ "condensed bold italic small-caps 24px/calc(25px*3) Times New Roman, serif",
+ "condensed bold italic small-caps 24px/calc(3*25px + 50%) Times New Roman, serif",
+ "condensed bold italic small-caps 24px/calc(1 + 2*3/4) Times New Roman, serif",
+ ],
+ invalid_values: [ "9 fantasy", "-2px fantasy",
+ // line-height with calc()
+ "condensed bold italic small-caps 24px/calc(1 + 2px) Times New Roman, serif",
+ "condensed bold italic small-caps 24px/calc(100% + 0.1) Times New Roman, serif",
+ ]
+ },
+ "font-family": {
+ domProp: "fontFamily",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ (gInitialFontFamilyIsSansSerif ? "sans-serif" : "serif") ],
+ other_values: [ (gInitialFontFamilyIsSansSerif ? "serif" : "sans-serif"), "Times New Roman, serif", "'Times New Roman', serif", "cursive", "fantasy", "\\\"Times New Roman", "\"Times New Roman\"", "Times, \\\"Times New Roman", "Times, \"Times New Roman\"", "-no-such-font-installed", "inherit roman", "roman inherit", "Times, inherit roman", "inherit roman, Times", "roman inherit, Times", "Times, roman inherit" ],
+ invalid_values: [ "\"Times New\" Roman", "\"Times New Roman\n", "Times, \"Times New Roman\n" ]
+ },
+ "font-feature-settings": {
+ domProp: "fontFeatureSettings",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [
+ "'liga' on", "'liga'", "\"liga\" 1", "'liga', 'clig' 1",
+ "\"liga\" off", "\"liga\" 0", '"cv01" 3, "cv02" 4',
+ '"cswh", "smcp" off, "salt" 4', '"cswh" 1, "smcp" off, "salt" 4',
+ '"cswh" 0, \'blah\', "liga", "smcp" off, "salt" 4',
+ '"liga" ,"smcp" 0 , "blah"'
+ ],
+ invalid_values: [
+ 'liga', 'liga 1', 'liga normal', '"liga" normal', 'normal liga',
+ 'normal "liga"', 'normal, "liga"', '"liga=1"', "'foobar' on",
+ '"blahblah" 0', '"liga" 3.14', '"liga" 1 3.14', '"liga" 1 normal',
+ '"liga" 1 off', '"liga" on off', '"liga" , 0 "smcp"', '"liga" "smcp"'
+ ]
+ },
+ "font-kerning": {
+ domProp: "fontKerning",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "normal", "none" ],
+ invalid_values: [ "on" ]
+ },
+ "font-language-override": {
+ domProp: "fontLanguageOverride",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "'ENG'", "'TRK'", "\"TRK\"", "'N\\'Ko'" ],
+ invalid_values: [ "TRK", "ja" ]
+ },
+ "font-size": {
+ domProp: "fontSize",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "medium",
+ "1rem",
+ "calc(1rem)",
+ "calc(0.75rem + 200% - 125% + 0.25rem - 75%)"
+ ],
+ other_values: [ "large", "2em", "50%", "xx-small", "36pt", "8px", "larger", "smaller",
+ "0px",
+ "0%",
+ "calc(2em)",
+ "calc(36pt + 75% + (30% + 2em + 2px))",
+ "calc(-2em)",
+ "calc(-50%)",
+ "calc(-1px)"
+ ],
+ invalid_values: [ "-2em", "-50%", "-1px" ],
+ quirks_values: { "5": "5px" },
+ },
+ "font-size-adjust": {
+ domProp: "fontSizeAdjust",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "0.3", "0.5", "0.7", "0.0", "0", "3" ],
+ invalid_values: [ "-0.3", "-1" ]
+ },
+ "font-stretch": {
+ domProp: "fontStretch",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded" ],
+ invalid_values: [ "narrower", "wider" ]
+ },
+ "font-style": {
+ domProp: "fontStyle",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "italic", "oblique" ],
+ invalid_values: []
+ },
+ "font-synthesis": {
+ domProp: "fontSynthesis",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "weight style" ],
+ other_values: [ "none", "weight", "style" ],
+ invalid_values: [ "weight none", "style none", "none style", "weight 10px", "weight weight", "style style" ]
+ },
+ "font-variant": {
+ domProp: "fontVariant",
+ inherited: true,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position" ],
+ initial_values: [ "normal" ],
+ other_values: [ "small-caps", "none", "traditional oldstyle-nums", "all-small-caps", "common-ligatures no-discretionary-ligatures",
+ "proportional-nums oldstyle-nums", "proportional-nums slashed-zero diagonal-fractions oldstyle-nums ordinal",
+ "traditional historical-forms styleset(ok-alt-a, ok-alt-b)", "styleset(potato)" ],
+ invalid_values: [ "small-caps normal", "small-caps small-caps", "none common-ligatures", "common-ligatures none", "small-caps potato",
+ "small-caps jis83 all-small-caps", "super historical-ligatures sub", "stacked-fractions diagonal-fractions historical-ligatures",
+ "common-ligatures traditional common-ligatures", "lining-nums traditional slashed-zero ordinal normal",
+ "traditional historical-forms styleset(ok-alt-a, ok-alt-b) historical-forms",
+ "historical-forms styleset(ok-alt-a, ok-alt-b) traditional styleset(potato)", "annotation(a,b,c)" ]
+ },
+ "font-variant-alternates": {
+ domProp: "fontVariantAlternates",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "historical-forms",
+ "styleset(alt-a, alt-b)", "character-variant(a, b, c)", "annotation(circled)",
+ "swash(squishy)", "styleset(complex\\ blob, a)", "annotation(\\62 lah)" ],
+ invalid_values: [ "historical-forms normal", "historical-forms historical-forms",
+ "swash", "swash(3)", "annotation(a, b)", "ornaments(a,b)",
+ "styleset(1234blah)", "annotation(a), annotation(b)", "annotation(a) normal" ]
+ },
+ "font-variant-caps": {
+ domProp: "fontVariantCaps",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "small-caps", "all-small-caps", "petite-caps", "all-petite-caps", "titling-caps", "unicase" ],
+ invalid_values: [ "normal small-caps", "petite-caps normal", "unicase unicase" ]
+ },
+ "font-variant-east-asian": {
+ domProp: "fontVariantEastAsian",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "jis78", "jis83", "jis90", "jis04", "simplified", "traditional", "full-width", "proportional-width", "ruby",
+ "jis78 full-width", "jis78 full-width ruby", "simplified proportional-width", "ruby simplified" ],
+ invalid_values: [ "jis78 normal", "jis90 jis04", "simplified traditional", "full-width proportional-width",
+ "ruby simplified ruby", "jis78 ruby simplified" ]
+ },
+ "font-variant-ligatures": {
+ domProp: "fontVariantLigatures",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "none", "common-ligatures", "no-common-ligatures", "discretionary-ligatures", "no-discretionary-ligatures",
+ "historical-ligatures", "no-historical-ligatures", "contextual", "no-contextual",
+ "common-ligatures no-discretionary-ligatures", "contextual no-discretionary-ligatures",
+ "historical-ligatures no-common-ligatures", "no-historical-ligatures discretionary-ligatures",
+ "common-ligatures no-discretionary-ligatures historical-ligatures no-contextual" ],
+ invalid_values: [ "common-ligatures normal", "common-ligatures no-common-ligatures", "common-ligatures common-ligatures",
+ "no-historical-ligatures historical-ligatures", "no-discretionary-ligatures discretionary-ligatures",
+ "no-contextual contextual", "common-ligatures no-discretionary-ligatures no-common-ligatures",
+ "common-ligatures none", "no-discretionary-ligatures none", "none common-ligatures" ]
+ },
+ "font-variant-numeric": {
+ domProp: "fontVariantNumeric",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "lining-nums", "oldstyle-nums", "proportional-nums", "tabular-nums", "diagonal-fractions",
+ "stacked-fractions", "slashed-zero", "ordinal", "lining-nums diagonal-fractions",
+ "tabular-nums stacked-fractions", "tabular-nums slashed-zero stacked-fractions",
+ "proportional-nums slashed-zero diagonal-fractions oldstyle-nums ordinal" ],
+ invalid_values: [ "lining-nums normal", "lining-nums oldstyle-nums", "lining-nums normal slashed-zero ordinal",
+ "proportional-nums tabular-nums", "diagonal-fractions stacked-fractions", "slashed-zero diagonal-fractions slashed-zero",
+ "lining-nums slashed-zero diagonal-fractions oldstyle-nums", "diagonal-fractions diagonal-fractions" ]
+ },
+ "font-variant-position": {
+ domProp: "fontVariantPosition",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "super", "sub" ],
+ invalid_values: [ "normal sub", "super sub" ]
+ },
+ "font-weight": {
+ domProp: "fontWeight",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal", "400" ],
+ other_values: [ "bold", "100", "200", "300", "500", "600", "700", "800", "900", "bolder", "lighter" ],
+ invalid_values: [ "0", "100.0", "107", "399", "401", "699", "710", "1000" ]
+ },
+ "height": {
+ domProp: "height",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* FIXME: test zero, and test calc clamping */
+ initial_values: [ " auto",
+ // these four keywords compute to the initial value when the
+ // writing mode is horizontal, and that's the context we're testing in
+ "-moz-max-content", "-moz-min-content", "-moz-fit-content", "-moz-available",
+ ],
+ /* computed value tests for height test more with display:block */
+ prerequisites: { "display": "block" },
+ other_values: [ "15px", "3em", "15%",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "none" ],
+ quirks_values: { "5": "5px" },
+ },
+ "ime-mode": {
+ domProp: "imeMode",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "normal", "disabled", "active", "inactive" ],
+ invalid_values: [ "none", "enabled", "1px" ]
+ },
+ "left": {
+ domProp: "left",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* FIXME: run tests with multiple prerequisites */
+ prerequisites: { "position": "relative" },
+ /* XXX 0 may or may not be equal to auto */
+ initial_values: [ "auto" ],
+ other_values: [ "32px", "-3em", "12%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [],
+ quirks_values: { "5": "5px" },
+ },
+ "letter-spacing": {
+ domProp: "letterSpacing",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "0", "0px", "1em", "2px", "-3px",
+ "calc(0px)", "calc(1em)", "calc(1em + 3px)",
+ "calc(15px / 2)", "calc(15px/2)", "calc(-3px)"
+ ],
+ invalid_values: [],
+ quirks_values: { "5": "5px" },
+ },
+ "line-height": {
+ domProp: "lineHeight",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ /*
+ * Inheritance tests require consistent font size, since
+ * getComputedStyle (which uses the CSS2 computed value, or
+ * CSS2.1 used value) doesn't match what the CSS2.1 computed
+ * value is. And they even require consistent font metrics for
+ * computation of 'normal'. -moz-block-height requires height
+ * on a block.
+ */
+ prerequisites: { "font-size": "19px", "font-size-adjust": "none", "font-family": "serif", "font-weight": "normal", "font-style": "normal", "height": "18px", "display": "block", "writing-mode": "initial" },
+ initial_values: [ "normal" ],
+ other_values: [ "1.0", "1", "1em", "47px", "-moz-block-height", "calc(2px)", "calc(50%)", "calc(3*25px)", "calc(25px*3)", "calc(3*25px + 50%)", "calc(1 + 2*3/4)" ],
+ invalid_values: [ "calc(1 + 2px)", "calc(100% + 0.1)" ]
+ },
+ "list-style": {
+ domProp: "listStyle",
+ inherited: true,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "list-style-type", "list-style-position", "list-style-image" ],
+ initial_values: [ "outside", "disc", "disc outside", "outside disc", "disc none", "none disc", "none disc outside", "none outside disc", "disc none outside", "disc outside none", "outside none disc", "outside disc none" ],
+ other_values: [ "inside none", "none inside", "none none inside", "square", "none", "none none", "outside none none", "none outside none", "none none outside", "none outside", "outside none", "outside outside", "outside inside", "\\32 style", "\\32 style inside",
+ '"-"', "'-'", "inside '-'", "'-' outside", "none '-'", "inside none '-'",
+ "symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\")",
+ "symbols(cyclic \"*\" \"\\2020\" \"\\2021\" \"\\A7\")",
+ "inside symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\")",
+ "symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\") outside",
+ "none symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\")",
+ "inside none symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\")",
+ 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
+ 'none url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
+ 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") none',
+ 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") outside',
+ 'outside url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
+ 'outside none url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
+ 'outside url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") none',
+ 'none url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") outside',
+ 'none outside url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
+ 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") outside none',
+ 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") none outside'
+ ],
+ invalid_values: [ "disc disc", "unknown value", "none none none", "none disc url(404.png)", "none url(404.png) disc", "disc none url(404.png)", "disc url(404.png) none", "url(404.png) none disc", "url(404.png) disc none", "none disc outside url(404.png)" ]
+ },
+ "list-style-image": {
+ domProp: "listStyleImage",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
+ // Add some tests for interesting url() values here to test serialization, etc.
+ "url(\'data:text/plain,\"\')",
+ "url(\"data:text/plain,\'\")",
+ "url(\'data:text/plain,\\\'\')",
+ "url(\"data:text/plain,\\\"\")",
+ "url(\'data:text/plain,\\\"\')",
+ "url(\"data:text/plain,\\\'\")",
+ "url(data:text/plain,\\\\)",
+ ],
+ invalid_values: []
+ },
+ "list-style-position": {
+ domProp: "listStylePosition",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "outside" ],
+ other_values: [ "inside" ],
+ invalid_values: []
+ },
+ "list-style-type": {
+ domProp: "listStyleType",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "disc" ],
+ other_values: [ "none", "circle", "square",
+ "disclosure-closed", "disclosure-open",
+ "decimal", "decimal-leading-zero",
+ "lower-roman", "upper-roman", "lower-greek",
+ "lower-alpha", "lower-latin", "upper-alpha", "upper-latin",
+ "hebrew", "armenian", "georgian",
+ "cjk-decimal", "cjk-ideographic",
+ "hiragana", "katakana", "hiragana-iroha", "katakana-iroha",
+ "japanese-informal", "japanese-formal", "korean-hangul-formal",
+ "korean-hanja-informal", "korean-hanja-formal",
+ "simp-chinese-informal", "simp-chinese-formal",
+ "trad-chinese-informal", "trad-chinese-formal",
+ "ethiopic-numeric",
+ "-moz-cjk-heavenly-stem", "-moz-cjk-earthly-branch",
+ "-moz-trad-chinese-informal", "-moz-trad-chinese-formal",
+ "-moz-simp-chinese-informal", "-moz-simp-chinese-formal",
+ "-moz-japanese-informal", "-moz-japanese-formal",
+ "-moz-arabic-indic", "-moz-persian", "-moz-urdu",
+ "-moz-devanagari", "-moz-gurmukhi", "-moz-gujarati",
+ "-moz-oriya", "-moz-kannada", "-moz-malayalam", "-moz-bengali",
+ "-moz-tamil", "-moz-telugu", "-moz-thai", "-moz-lao",
+ "-moz-myanmar", "-moz-khmer",
+ "-moz-hangul", "-moz-hangul-consonant",
+ "-moz-ethiopic-halehame", "-moz-ethiopic-numeric",
+ "-moz-ethiopic-halehame-am",
+ "-moz-ethiopic-halehame-ti-er", "-moz-ethiopic-halehame-ti-et",
+ "other-style", "inside", "outside", "\\32 style",
+ '"-"', "'-'",
+ "symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\")",
+ "symbols(cyclic '*' '\\2020' '\\2021' '\\A7')"
+ ],
+ invalid_values: []
+ },
+ "margin": {
+ domProp: "margin",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "margin-top", "margin-right", "margin-bottom", "margin-left" ],
+ initial_values: [ "0", "0px 0 0em", "0% 0px 0em 0pt" ],
+ other_values: [ "3px 0", "2em 4px 2pt", "1em 2em 3px 4px", "1em calc(2em + 3px) 4ex 5cm" ],
+ invalid_values: [ "1px calc(nonsense)", "1px red" ],
+ unbalanced_values: [ "1px calc(" ],
+ quirks_values: { "5": "5px", "3px 6px 2 5px": "3px 6px 2px 5px" },
+ },
+ "margin-bottom": {
+ domProp: "marginBottom",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* XXX testing auto has prerequisites */
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)" ],
+ other_values: [ "1px", "2em", "5%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ ],
+ quirks_values: { "5": "5px" },
+ },
+ "margin-left": {
+ domProp: "marginLeft",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* XXX testing auto has prerequisites */
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)" ],
+ other_values: [ "1px", "2em", "5%", ".5px", "+32px", "+.789px", "-.328px", "+0.56px", "-0.974px", "237px", "-289px", "-056px", "1987.45px", "-84.32px",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "..25px", ".+5px", ".px", "-.px", "++5px", "-+4px", "+-3px", "--7px", "+-.6px", "-+.5px", "++.7px", "--.4px" ],
+ quirks_values: { "5": "5px" },
+ },
+ "margin-right": {
+ domProp: "marginRight",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* XXX testing auto has prerequisites */
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)" ],
+ other_values: [ "1px", "2em", "5%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ ],
+ quirks_values: { "5": "5px" },
+ },
+ "margin-top": {
+ domProp: "marginTop",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* XXX testing auto has prerequisites */
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)" ],
+ other_values: [ "1px", "2em", "5%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ ],
+ quirks_values: { "5": "5px" },
+ },
+ "max-height": {
+ domProp: "maxHeight",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "display": "block" },
+ initial_values: [ "none",
+ // these four keywords compute to the initial value when the
+ // writing mode is horizontal, and that's the context we're testing in
+ "-moz-max-content", "-moz-min-content", "-moz-fit-content", "-moz-available",
+ ],
+ other_values: [ "30px", "50%", "0",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "auto" ],
+ quirks_values: { "5": "5px" },
+ },
+ "max-width": {
+ domProp: "maxWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "display": "block" },
+ initial_values: [ "none" ],
+ other_values: [ "30px", "50%", "0",
+ // these four keywords compute to the initial value only when the
+ // writing mode is vertical, and we're testing with a horizontal
+ // writing mode
+ "-moz-max-content", "-moz-min-content", "-moz-fit-content", "-moz-available",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "auto" ],
+ quirks_values: { "5": "5px" },
+ },
+ "min-height": {
+ domProp: "minHeight",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "display": "block" },
+ initial_values: [ "auto", "0", "calc(0em)", "calc(-2px)",
+ // these four keywords compute to the initial value when the
+ // writing mode is horizontal, and that's the context we're testing in
+ "-moz-max-content", "-moz-min-content", "-moz-fit-content", "-moz-available",
+ ],
+ other_values: [ "30px", "50%",
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: ["none"],
+ quirks_values: { "5": "5px" },
+ },
+ "min-width": {
+ domProp: "minWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "display": "block" },
+ initial_values: [ "auto", "0", "calc(0em)", "calc(-2px)" ],
+ other_values: [ "30px", "50%",
+ // these four keywords compute to the initial value only when the
+ // writing mode is vertical, and we're testing with a horizontal
+ // writing mode
+ "-moz-max-content", "-moz-min-content", "-moz-fit-content", "-moz-available",
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "none" ],
+ quirks_values: { "5": "5px" },
+ },
+
+ "opacity": {
+ domProp: "opacity",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "1", "17", "397.376", "3e1", "3e+1", "3e0", "3e+0", "3e-0" ],
+ other_values: [ "0", "0.4", "0.0000", "-3", "3e-1" ],
+ invalid_values: [ "0px", "1px" ]
+ },
+ "-moz-orient": {
+ domProp: "MozOrient",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "inline" ],
+ other_values: [ "horizontal", "vertical", "block" ],
+ invalid_values: [ "none" ]
+ },
+ "outline": {
+ domProp: "outline",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "outline-color", "outline-style", "outline-width" ],
+ initial_values: [
+ "none", "medium", "thin",
+ // XXX Should be invert, but currently currentcolor.
+ //"invert", "none medium invert"
+ "currentColor", "none medium currentcolor"
+ ],
+ other_values: [ "solid", "medium solid", "green solid", "10px solid", "thick solid" ],
+ invalid_values: [ "5%", "5", "5 solid green" ]
+ },
+ "outline-color": {
+ domProp: "outlineColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "black" },
+ initial_values: [ "currentColor" ], // XXX should be invert
+ other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000", "000000", "cc00ff" ]
+ },
+ "outline-offset": {
+ domProp: "outlineOffset",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0", "0px", "-0", "calc(0px)", "calc(3em + 2px - 2px - 3em)", "calc(-0em)" ],
+ other_values: [ "-3px", "1em", "calc(3em)", "calc(7pt + 3 * 2em)", "calc(-3px)" ],
+ invalid_values: [ "5%" ]
+ },
+ "outline-style": {
+ domProp: "outlineStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ // XXX Should 'hidden' be the same as initial?
+ initial_values: [ "none" ],
+ other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge", "auto" ],
+ invalid_values: []
+ },
+ "outline-width": {
+ domProp: "outlineWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "outline-style": "solid" },
+ initial_values: [ "medium", "3px", "calc(4px - 1px)" ],
+ other_values: [ "thin", "thick", "1px", "2em",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0px)",
+ "calc(0px)",
+ "calc(5em)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 5em)",
+ ],
+ invalid_values: [ "5%", "5" ]
+ },
+ "overflow": {
+ domProp: "overflow",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ prerequisites: { "display": "block", "contain": "none" },
+ subproperties: [ "overflow-x", "overflow-y" ],
+ initial_values: [ "visible" ],
+ other_values: [ "auto", "scroll", "hidden", "-moz-hidden-unscrollable", "-moz-scrollbars-none" ],
+ invalid_values: []
+ },
+ "overflow-x": {
+ domProp: "overflowX",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "display": "block", "overflow-y": "visible", "contain": "none" },
+ initial_values: [ "visible" ],
+ other_values: [ "auto", "scroll", "hidden", "-moz-hidden-unscrollable" ],
+ invalid_values: []
+ },
+ "overflow-y": {
+ domProp: "overflowY",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "display": "block", "overflow-x": "visible", "contain": "none" },
+ initial_values: [ "visible" ],
+ other_values: [ "auto", "scroll", "hidden", "-moz-hidden-unscrollable" ],
+ invalid_values: []
+ },
+ "padding": {
+ domProp: "padding",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "padding-top", "padding-right", "padding-bottom", "padding-left" ],
+ initial_values: [ "0", "0px 0 0em", "0% 0px 0em 0pt", "calc(0px) calc(0em) calc(-2px) calc(-1%)" ],
+ other_values: [ "3px 0", "2em 4px 2pt", "1em 2em 3px 4px" ],
+ invalid_values: [ "1px calc(nonsense)", "1px red" ],
+ unbalanced_values: [ "1px calc(" ],
+ quirks_values: { "5": "5px", "3px 6px 2 5px": "3px 6px 2px 5px" },
+ },
+ "padding-bottom": {
+ domProp: "paddingBottom",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)", "calc(-3px)", "calc(-1%)" ],
+ other_values: [ "1px", "2em", "5%",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ ],
+ quirks_values: { "5": "5px" },
+ },
+ "padding-left": {
+ domProp: "paddingLeft",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)", "calc(-3px)", "calc(-1%)" ],
+ other_values: [ "1px", "2em", "5%",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ ],
+ quirks_values: { "5": "5px" },
+ },
+ "padding-right": {
+ domProp: "paddingRight",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)", "calc(-3px)", "calc(-1%)" ],
+ other_values: [ "1px", "2em", "5%",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ ],
+ quirks_values: { "5": "5px" },
+ },
+ "padding-top": {
+ domProp: "paddingTop",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)", "calc(-3px)", "calc(-1%)" ],
+ other_values: [ "1px", "2em", "5%",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ ],
+ quirks_values: { "5": "5px" },
+ },
+ "page-break-after": {
+ domProp: "pageBreakAfter",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "always", "avoid", "left", "right" ],
+ invalid_values: []
+ },
+ "page-break-before": {
+ domProp: "pageBreakBefore",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "always", "avoid", "left", "right" ],
+ invalid_values: []
+ },
+ "page-break-inside": {
+ domProp: "pageBreakInside",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "avoid" ],
+ invalid_values: [ "left", "right" ]
+ },
+ "pointer-events": {
+ domProp: "pointerEvents",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "visiblePainted", "visibleFill", "visibleStroke", "visible",
+ "painted", "fill", "stroke", "all", "none" ],
+ invalid_values: []
+ },
+ "position": {
+ domProp: "position",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "static" ],
+ other_values: [ "relative", "absolute", "fixed", "sticky" ],
+ invalid_values: []
+ },
+ "quotes": {
+ domProp: "quotes",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ '"\u201C" "\u201D" "\u2018" "\u2019"',
+ '"\\201C" "\\201D" "\\2018" "\\2019"' ],
+ other_values: [ "none", "'\"' '\"'" ],
+ invalid_values: []
+ },
+ "right": {
+ domProp: "right",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* FIXME: run tests with multiple prerequisites */
+ prerequisites: { "position": "relative" },
+ /* XXX 0 may or may not be equal to auto */
+ initial_values: [ "auto" ],
+ other_values: [ "32px", "-3em", "12%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [],
+ quirks_values: { "5": "5px" },
+ },
+ "ruby-align": {
+ domProp: "rubyAlign",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "space-around" ],
+ other_values: [ "start", "center", "space-between" ],
+ invalid_values: [
+ "end", "1", "10px", "50%", "start center"
+ ]
+ },
+ "ruby-position": {
+ domProp: "rubyPosition",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "over" ],
+ other_values: [ "under" ],
+ invalid_values: [
+ "left", "right", "auto", "none", "not_a_position",
+ "over left", "right under", "0", "100px", "50%"
+ ]
+ },
+ "table-layout": {
+ domProp: "tableLayout",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "fixed" ],
+ invalid_values: []
+ },
+ "text-align": {
+ domProp: "textAlign",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ // don't know whether left and right are same as start
+ initial_values: [ "start" ],
+ other_values: [ "center", "justify", "end", "match-parent" ],
+ invalid_values: [ "true", "true true" ]
+ },
+ "text-align-last": {
+ domProp: "textAlignLast",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "center", "justify", "start", "end", "left", "right" ],
+ invalid_values: []
+ },
+ "text-decoration": {
+ domProp: "textDecoration",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ subproperties: [ "text-decoration-color", "text-decoration-line", "text-decoration-style" ],
+ initial_values: [ "none" ],
+ other_values: [ "underline", "overline", "line-through", "blink", "blink line-through underline", "underline overline line-through blink", "-moz-anchor-decoration", "blink -moz-anchor-decoration",
+ "underline red solid", "underline #ff0000", "solid underline", "red underline", "#ff0000 underline", "dotted underline" ],
+ invalid_values: [ "none none", "underline none", "none underline", "blink none", "none blink", "line-through blink line-through", "underline overline line-through blink none", "underline overline line-throuh blink blink", "rgb(0, rubbish, 0) underline" ]
+ },
+ "text-decoration-color": {
+ domProp: "textDecorationColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "black" },
+ initial_values: [ "currentColor" ],
+ other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000", "000000", "ff00ff" ]
+ },
+ "text-decoration-line": {
+ domProp: "textDecorationLine",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "underline", "overline", "line-through", "blink", "blink line-through underline", "underline overline line-through blink", "-moz-anchor-decoration", "blink -moz-anchor-decoration" ],
+ invalid_values: [ "none none", "underline none", "none underline", "line-through blink line-through", "underline overline line-through blink none", "underline overline line-throuh blink blink" ]
+ },
+ "text-decoration-style": {
+ domProp: "textDecorationStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "solid" ],
+ other_values: [ "double", "dotted", "dashed", "wavy", "-moz-none" ],
+ invalid_values: [ "none", "groove", "ridge", "inset", "outset", "solid dashed", "wave" ]
+ },
+ "text-emphasis": {
+ domProp: "textEmphasis",
+ inherited: true,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ prerequisites: { "color": "black" },
+ subproperties: [ "text-emphasis-style", "text-emphasis-color" ],
+ initial_values: [ "none currentColor", "currentColor none", "none", "currentColor", "none black" ],
+ other_values: [ "filled dot black", "#f00 circle open", "sesame filled rgba(0,0,255,0.5)", "red", "green none", "currentColor filled", "currentColor open" ],
+ invalid_values: [ "filled black dot", "filled filled red", "open open circle #000", "circle dot #f00", "rubbish" ]
+ },
+ "text-emphasis-color": {
+ domProp: "textEmphasisColor",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "black" },
+ initial_values: [ "currentColor", "black", "rgb(0,0,0)" ],
+ other_values: [ "red", "rgba(255,255,255,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000", "000000", "ff00ff", "rgb(255,xxx,255)" ]
+ },
+ "text-emphasis-position": {
+ domProp: "textEmphasisPosition",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "over right", "right over" ],
+ other_values: [ "over left", "left over", "under left", "left under", "under right", "right under" ],
+ invalid_values: [ "over over", "left left", "over right left", "rubbish left", "over rubbish" ]
+ },
+ "text-emphasis-style": {
+ domProp: "textEmphasisStyle",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "filled", "open", "dot", "circle", "double-circle", "triangle", "sesame", "'#'",
+ "filled dot", "filled circle", "filled double-circle", "filled triangle", "filled sesame",
+ "dot filled", "circle filled", "double-circle filled", "triangle filled", "sesame filled",
+ "dot open", "circle open", "double-circle open", "triangle open", "sesame open" ],
+ invalid_values: [ "rubbish", "dot rubbish", "rubbish dot", "open rubbish", "rubbish open", "open filled", "dot circle",
+ "open '#'", "'#' filled", "dot '#'", "'#' circle", "1", "1 open", "open 1" ]
+ },
+ "text-indent": {
+ domProp: "textIndent",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0", "calc(3em - 5em + 2px + 2em - 2px)" ],
+ other_values: [ "2em", "5%", "-10px",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ ],
+ quirks_values: { "5": "5px" },
+ },
+ "text-overflow": {
+ domProp: "textOverflow",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "clip" ],
+ other_values: [ "ellipsis", '""', "''", '"hello"', 'clip clip', 'ellipsis ellipsis', 'clip ellipsis', 'clip ""', '"hello" ""', '"" ellipsis' ],
+ invalid_values: [ "none", "auto", '"hello" inherit', 'inherit "hello"', 'clip initial', 'initial clip', 'initial inherit', 'inherit initial', 'inherit none']
+ },
+ "text-shadow": {
+ domProp: "textShadow",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "blue" },
+ initial_values: [ "none" ],
+ other_values: [ "2px 2px", "2px 2px 1px", "2px 2px green", "2px 2px 1px green", "green 2px 2px", "green 2px 2px 1px", "green 2px 2px, blue 1px 3px 4px", "currentColor 3px 3px", "blue 2px 2px, currentColor 1px 2px",
+ /* calc() values */
+ "2px 2px calc(-5px)", /* clamped */
+ "calc(3em - 2px) 2px green",
+ "green calc(3em - 2px) 2px",
+ "2px calc(2px + 0.2em)",
+ "blue 2px calc(2px + 0.2em)",
+ "2px calc(2px + 0.2em) blue",
+ "calc(-2px) calc(-2px)",
+ "-2px -2px",
+ "calc(2px) calc(2px)",
+ "calc(2px) calc(2px) calc(2px)",
+ ],
+ invalid_values: [ "3% 3%", "2px 2px -5px", "2px 2px 2px 2px", "2px 2px, none", "none, 2px 2px", "inherit, 2px 2px", "2px 2px, inherit", "2 2px", "2px 2", "2px 2px 2", "2px 2px 2px 2",
+ "calc(2px) calc(2px) calc(2px) calc(2px)", "3px 3px calc(3px + rubbish)"
+ ]
+ },
+ "text-transform": {
+ domProp: "textTransform",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "capitalize", "uppercase", "lowercase", "full-width" ],
+ invalid_values: []
+ },
+ "top": {
+ domProp: "top",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* FIXME: run tests with multiple prerequisites */
+ prerequisites: { "position": "relative" },
+ /* XXX 0 may or may not be equal to auto */
+ initial_values: [ "auto" ],
+ other_values: [ "32px", "-3em", "12%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [],
+ quirks_values: { "5": "5px" },
+ },
+ "transition": {
+ domProp: "transition",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "transition-property", "transition-duration", "transition-timing-function", "transition-delay" ],
+ initial_values: [ "all 0s ease 0s", "all", "0s", "0s 0s", "ease" ],
+ other_values: [ "all 0s cubic-bezier(0.25, 0.1, 0.25, 1.0) 0s", "width 1s linear 2s", "width 1s 2s linear", "width linear 1s 2s", "linear width 1s 2s", "linear 1s width 2s", "linear 1s 2s width", "1s width linear 2s", "1s width 2s linear", "1s 2s width linear", "1s linear width 2s", "1s linear 2s width", "1s 2s linear width", "width linear 1s", "width 1s linear", "linear width 1s", "linear 1s width", "1s width linear", "1s linear width", "1s 2s width", "1s width 2s", "width 1s 2s", "1s 2s linear", "1s linear 2s", "linear 1s 2s", "width 1s", "1s width", "linear 1s", "1s linear", "1s 2s", "2s 1s", "width", "linear", "1s", "height", "2s", "ease-in-out", "2s ease-in", "opacity linear", "ease-out 2s", "2s color, 1s width, 500ms height linear, 1s opacity 4s cubic-bezier(0.0, 0.1, 1.0, 1.0)", "1s \\32width linear 2s", "1s -width linear 2s", "1s -\\32width linear 2s", "1s \\32 0width linear 2s", "1s -\\32 0width linear 2s", "1s \\2width linear 2s", "1s -\\2width linear 2s", "2s, 1s width", "1s width, 2s", "2s all, 1s width", "1s width, 2s all", "2s all, 1s width", "2s width, 1s all", "3s --my-color" ],
+ invalid_values: [ "1s width, 2s none", "2s none, 1s width", "2s inherit", "inherit 2s", "2s width, 1s inherit", "2s inherit, 1s width", "2s initial", "1s width,,2s color", "1s width, ,2s color", "bounce 1s cubic-bezier(0, rubbish) 2s", "bounce 1s steps(rubbish) 2s" ]
+ },
+ "transition-delay": {
+ domProp: "transitionDelay",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0s", "0ms" ],
+ other_values: [ "1s", "250ms", "-100ms", "-1s", "1s, 250ms, 2.3s"],
+ invalid_values: [ "0", "0px" ]
+ },
+ "transition-duration": {
+ domProp: "transitionDuration",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0s", "0ms" ],
+ other_values: [ "1s", "250ms", "1s, 250ms, 2.3s"],
+ invalid_values: [ "0", "0px", "-1ms", "-2s" ]
+ },
+ "transition-property": {
+ domProp: "transitionProperty",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "all" ],
+ other_values: [ "none", "left", "top", "color", "width, height, opacity", "foobar", "auto", "\\32width", "-width", "-\\32width", "\\32 0width", "-\\32 0width", "\\2width", "-\\2width", "all, all", "all, color", "color, all", "--my-color" ],
+ invalid_values: [ "none, none", "color, none", "none, color", "inherit, color", "color, inherit", "initial, color", "color, initial", "none, color", "color, none" ]
+ },
+ "transition-timing-function": {
+ domProp: "transitionTimingFunction",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "ease" ],
+ other_values: [ "cubic-bezier(0.25, 0.1, 0.25, 1.0)", "linear", "ease-in", "ease-out", "ease-in-out", "linear, ease-in, cubic-bezier(0.1, 0.2, 0.8, 0.9)", "cubic-bezier(0.5, 0.5, 0.5, 0.5)", "cubic-bezier(0.25, 1.5, 0.75, -0.5)", "step-start", "step-end", "steps(1)", "steps(2, start)", "steps(386)", "steps(3, end)" ],
+ invalid_values: [ "none", "auto", "cubic-bezier(0.25, 0.1, 0.25)", "cubic-bezier(0.25, 0.1, 0.25, 0.25, 1.0)", "cubic-bezier(-0.5, 0.5, 0.5, 0.5)", "cubic-bezier(1.5, 0.5, 0.5, 0.5)", "cubic-bezier(0.5, 0.5, -0.5, 0.5)", "cubic-bezier(0.5, 0.5, 1.5, 0.5)", "steps(2, step-end)", "steps(0)", "steps(-2)", "steps(0, step-end, 1)" ]
+ },
+ "unicode-bidi": {
+ domProp: "unicodeBidi",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "embed", "bidi-override", "isolate", "plaintext", "isolate-override", "-moz-isolate", "-moz-plaintext", "-moz-isolate-override" ],
+ invalid_values: [ "auto", "none" ]
+ },
+ "vertical-align": {
+ domProp: "verticalAlign",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "baseline" ],
+ other_values: [ "sub", "super", "top", "text-top", "middle", "bottom", "text-bottom", "-moz-middle-with-baseline", "15%", "3px", "0.2em", "-5px", "-3%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ ],
+ quirks_values: { "5": "5px" },
+ },
+ "visibility": {
+ domProp: "visibility",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "visible" ],
+ other_values: [ "hidden", "collapse" ],
+ invalid_values: []
+ },
+ "white-space": {
+ domProp: "whiteSpace",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "pre", "nowrap", "pre-wrap", "pre-line", "-moz-pre-space" ],
+ invalid_values: []
+ },
+ "width": {
+ domProp: "width",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* computed value tests for width test more with display:block */
+ prerequisites: { "display": "block" },
+ initial_values: [ " auto" ],
+ /* XXX these have prerequisites */
+ other_values: [ "15px", "3em", "15%",
+ // these three keywords compute to the initial value only when the
+ // writing mode is vertical, and we're testing with a horizontal
+ // writing mode
+ "-moz-max-content", "-moz-min-content", "-moz-fit-content",
+ // whether -moz-available computes to the initial value depends on
+ // the container size, and for the container size we're testing
+ // with, it does
+ // "-moz-available",
+ "3e1px", "3e+1px", "3e0px", "3e+0px", "3e-0px", "3e-1px",
+ "3.2e1px", "3.2e+1px", "3.2e0px", "3.2e+0px", "3.2e-0px", "3.2e-1px",
+ "3e1%", "3e+1%", "3e0%", "3e+0%", "3e-0%", "3e-1%",
+ "3.2e1%", "3.2e+1%", "3.2e0%", "3.2e+0%", "3.2e-0%", "3.2e-1%",
+ /* valid -moz-calc() values */
+ "-moz-calc(-2px)",
+ "-moz-calc(2px)",
+ "-moz-calc(50%)",
+ "-moz-calc(50% + 2px)",
+ "-moz-calc( 50% + 2px)",
+ "-moz-calc(50% + 2px )",
+ "-moz-calc( 50% + 2px )",
+ "-moz-calc(50% - -2px)",
+ "-moz-calc(2px - -50%)",
+ "-moz-calc(3*25px)",
+ "-moz-calc(3 *25px)",
+ "-moz-calc(3 * 25px)",
+ "-moz-calc(3* 25px)",
+ "-moz-calc(25px*3)",
+ "-moz-calc(25px *3)",
+ "-moz-calc(25px* 3)",
+ "-moz-calc(25px * 3)",
+ "-moz-calc(3*25px + 50%)",
+ "-moz-calc(50% - 3em + 2px)",
+ "-moz-calc(50% - (3em + 2px))",
+ "-moz-calc((50% - 3em) + 2px)",
+ "-moz-calc(2em)",
+ "-moz-calc(50%)",
+ "-moz-calc(50px/2)",
+ "-moz-calc(50px/(2 - 1))",
+ /* valid calc() values */
+ "calc(-2px)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(50% + 2px)",
+ "calc( 50% + 2px)",
+ "calc(50% + 2px )",
+ "calc( 50% + 2px )",
+ "calc(50% - -2px)",
+ "calc(2px - -50%)",
+ "calc(3*25px)",
+ "calc(3 *25px)",
+ "calc(3 * 25px)",
+ "calc(3* 25px)",
+ "calc(25px*3)",
+ "calc(25px *3)",
+ "calc(25px* 3)",
+ "calc(25px * 3)",
+ "calc(3*25px + 50%)",
+ "calc(50% - 3em + 2px)",
+ "calc(50% - (3em + 2px))",
+ "calc((50% - 3em) + 2px)",
+ "calc(2em)",
+ "calc(50%)",
+ "calc(50px/2)",
+ "calc(50px/(2 - 1))",
+ ],
+ invalid_values: [ "none", "-2px",
+ /* invalid -moz-calc() values */
+ "-moz-calc(50%+ 2px)",
+ "-moz-calc(50% +2px)",
+ "-moz-calc(50%+2px)",
+ /* invalid calc() values */
+ "calc(50%+ 2px)",
+ "calc(50% +2px)",
+ "calc(50%+2px)",
+ "-moz-min()",
+ "calc(min())",
+ "-moz-max()",
+ "calc(max())",
+ "-moz-min(5px)",
+ "calc(min(5px))",
+ "-moz-max(5px)",
+ "calc(max(5px))",
+ "-moz-min(5px,2em)",
+ "calc(min(5px,2em))",
+ "-moz-max(5px,2em)",
+ "calc(max(5px,2em))",
+ "calc(50px/(2 - 2))",
+ /* If we ever support division by values, which is
+ * complicated for the reasons described in
+ * http://lists.w3.org/Archives/Public/www-style/2010Jan/0007.html
+ * , we should support all 4 of these as described in
+ * http://lists.w3.org/Archives/Public/www-style/2009Dec/0296.html
+ */
+ "calc((3em / 100%) * 3em)",
+ "calc(3em / 100% * 3em)",
+ "calc(3em * (3em / 100%))",
+ "calc(3em * 3em / 100%)",
+ ],
+ quirks_values: { "5": "5px" },
+ },
+ "will-change": {
+ domProp: "willChange",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "scroll-position", "contents", "transform", "opacity", "scroll-position, transform", "transform, opacity", "contents, transform", "property-that-doesnt-exist-yet" ],
+ invalid_values: [ "none", "all", "default", "auto, scroll-position", "scroll-position, auto", "transform scroll-position", ",", "trailing,", "will-change", "transform, will-change" ]
+ },
+ "word-break": {
+ domProp: "wordBreak",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "break-all", "keep-all" ],
+ invalid_values: []
+ },
+ "word-spacing": {
+ domProp: "wordSpacing",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal", "0", "0px", "-0em",
+ "calc(-0px)", "calc(0em)"
+ ],
+ other_values: [ "1em", "2px", "-3px", "0%", "50%", "-120%",
+ "calc(1em)", "calc(1em + 3px)",
+ "calc(15px / 2)", "calc(15px/2)",
+ "calc(-2em)", "calc(0% + 0px)",
+ "calc(-10%/2 - 1em)"
+ ],
+ invalid_values: [],
+ quirks_values: { "5": "5px" },
+ },
+ "overflow-wrap": {
+ domProp: "overflowWrap",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "break-word" ],
+ invalid_values: []
+ },
+ "hyphens": {
+ domProp: "hyphens",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "manual" ],
+ other_values: [ "none", "auto" ],
+ invalid_values: []
+ },
+ "z-index": {
+ domProp: "zIndex",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ /* XXX requires position */
+ initial_values: [ "auto" ],
+ other_values: [ "0", "3", "-7000", "12000" ],
+ invalid_values: [ "3.0", "17.5", "3e1" ]
+ }
+ ,
+ "clip-path": {
+ domProp: "clipPath",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "url(#mypath)", "url('404.svg#mypath')" ],
+ invalid_values: []
+ },
+ "clip-rule": {
+ domProp: "clipRule",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "nonzero" ],
+ other_values: [ "evenodd" ],
+ invalid_values: []
+ },
+ "color-interpolation": {
+ domProp: "colorInterpolation",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "sRGB" ],
+ other_values: [ "auto", "linearRGB" ],
+ invalid_values: []
+ },
+ "color-interpolation-filters": {
+ domProp: "colorInterpolationFilters",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "linearRGB" ],
+ other_values: [ "sRGB", "auto" ],
+ invalid_values: []
+ },
+ "dominant-baseline": {
+ domProp: "dominantBaseline",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "use-script", "no-change", "reset-size", "ideographic", "alphabetic", "hanging", "mathematical", "central", "middle", "text-after-edge", "text-before-edge" ],
+ invalid_values: []
+ },
+ "fill": {
+ domProp: "fill",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "blue" },
+ initial_values: [ "black", "#000", "#000000", "rgb(0,0,0)", "rgba(0,0,0,1)" ],
+ other_values: [ "green", "#fc3", "url('#myserver')", "url(foo.svg#myserver)", 'url("#myserver") green', "none", "currentColor", "context-fill", "context-stroke" ],
+ invalid_values: [ "000000", "ff00ff", "url('#myserver') rgb(0, rubbish, 0)" ]
+ },
+ "fill-opacity": {
+ domProp: "fillOpacity",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "1", "2.8", "1.000", "context-fill-opacity", "context-stroke-opacity" ],
+ other_values: [ "0", "0.3", "-7.3" ],
+ invalid_values: []
+ },
+ "fill-rule": {
+ domProp: "fillRule",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "nonzero" ],
+ other_values: [ "evenodd" ],
+ invalid_values: []
+ },
+ "filter": {
+ domProp: "filter",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "url(#myfilt)" ],
+ invalid_values: [ "url(#myfilt) none" ]
+ },
+ "flood-color": {
+ domProp: "floodColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "blue" },
+ initial_values: [ "black", "#000", "#000000", "rgb(0,0,0)", "rgba(0,0,0,1)" ],
+ other_values: [ "green", "#fc3", "currentColor" ],
+ invalid_values: [ "url('#myserver')", "url(foo.svg#myserver)", 'url("#myserver") green', "000000", "ff00ff" ]
+ },
+ "flood-opacity": {
+ domProp: "floodOpacity",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "1", "2.8", "1.000" ],
+ other_values: [ "0", "0.3", "-7.3" ],
+ invalid_values: []
+ },
+ "image-rendering": {
+ domProp: "imageRendering",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "optimizeSpeed", "optimizeQuality", "-moz-crisp-edges" ],
+ invalid_values: []
+ },
+ "lighting-color": {
+ domProp: "lightingColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "blue" },
+ initial_values: [ "white", "#fff", "#ffffff", "rgb(255,255,255)", "rgba(255,255,255,1.0)", "rgba(255,255,255,42.0)" ],
+ other_values: [ "green", "#fc3", "currentColor" ],
+ invalid_values: [ "url('#myserver')", "url(foo.svg#myserver)", 'url("#myserver") green', "000000", "ff00ff" ]
+ },
+ "marker": {
+ domProp: "marker",
+ inherited: true,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "marker-start", "marker-mid", "marker-end" ],
+ initial_values: [ "none" ],
+ other_values: [ "url(#mysym)" ],
+ invalid_values: [ "none none", "url(#mysym) url(#mysym)", "none url(#mysym)", "url(#mysym) none" ]
+ },
+ "marker-end": {
+ domProp: "markerEnd",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "url(#mysym)" ],
+ invalid_values: []
+ },
+ "marker-mid": {
+ domProp: "markerMid",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "url(#mysym)" ],
+ invalid_values: []
+ },
+ "marker-start": {
+ domProp: "markerStart",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "url(#mysym)" ],
+ invalid_values: []
+ },
+ "shape-rendering": {
+ domProp: "shapeRendering",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "optimizeSpeed", "crispEdges", "geometricPrecision" ],
+ invalid_values: []
+ },
+ "stop-color": {
+ domProp: "stopColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "blue" },
+ initial_values: [ "black", "#000", "#000000", "rgb(0,0,0)", "rgba(0,0,0,1)" ],
+ other_values: [ "green", "#fc3", "currentColor" ],
+ invalid_values: [ "url('#myserver')", "url(foo.svg#myserver)", 'url("#myserver") green', "000000", "ff00ff" ]
+ },
+ "stop-opacity": {
+ domProp: "stopOpacity",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "1", "2.8", "1.000" ],
+ other_values: [ "0", "0.3", "-7.3" ],
+ invalid_values: []
+ },
+ "stroke": {
+ domProp: "stroke",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "black", "#000", "#000000", "rgb(0,0,0)", "rgba(0,0,0,1)", "green", "#fc3", "url('#myserver')", "url(foo.svg#myserver)", 'url("#myserver") green', "currentColor", "context-fill", "context-stroke" ],
+ invalid_values: [ "000000", "ff00ff" ]
+ },
+ "stroke-dasharray": {
+ domProp: "strokeDasharray",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none", "context-value" ],
+ other_values: [ "5px,3px,2px", "5px 3px 2px", " 5px ,3px\t, 2px ", "1px", "5%", "3em" ],
+ invalid_values: [ "-5px,3px,2px", "5px,3px,-2px" ]
+ },
+ "stroke-dashoffset": {
+ domProp: "strokeDashoffset",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0", "-0px", "0em", "context-value" ],
+ other_values: [ "3px", "3%", "1em" ],
+ invalid_values: []
+ },
+ "stroke-linecap": {
+ domProp: "strokeLinecap",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "butt" ],
+ other_values: [ "round", "square" ],
+ invalid_values: []
+ },
+ "stroke-linejoin": {
+ domProp: "strokeLinejoin",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "miter" ],
+ other_values: [ "round", "bevel" ],
+ invalid_values: []
+ },
+ "stroke-miterlimit": {
+ domProp: "strokeMiterlimit",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "4" ],
+ other_values: [ "1", "7", "5000", "1.1" ],
+ invalid_values: [ "0.9", "0", "-1", "3px", "-0.3" ]
+ },
+ "stroke-opacity": {
+ domProp: "strokeOpacity",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "1", "2.8", "1.000", "context-fill-opacity", "context-stroke-opacity" ],
+ other_values: [ "0", "0.3", "-7.3" ],
+ invalid_values: []
+ },
+ "stroke-width": {
+ domProp: "strokeWidth",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "1px", "context-value" ],
+ other_values: [ "0", "0px", "-0em", "17px", "0.2em" ],
+ invalid_values: [ "-0.1px", "-3px" ]
+ },
+ "text-anchor": {
+ domProp: "textAnchor",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "start" ],
+ other_values: [ "middle", "end" ],
+ invalid_values: []
+ },
+ "text-rendering": {
+ domProp: "textRendering",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "optimizeSpeed", "optimizeLegibility", "geometricPrecision" ],
+ invalid_values: []
+ },
+ "vector-effect": {
+ domProp: "vectorEffect",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "non-scaling-stroke" ],
+ invalid_values: []
+ },
+ "-moz-window-dragging": {
+ domProp: "MozWindowDragging",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "default" ],
+ other_values: [ "drag", "no-drag" ],
+ invalid_values: [ "none" ]
+ },
+ "align-content": {
+ domProp: "alignContent",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "start", "end", "flex-start", "flex-end", "center", "left",
+ "right", "space-between", "space-around", "space-evenly",
+ "first baseline", "last baseline", "baseline", "stretch", "start safe",
+ "unsafe end", "unsafe end stretch", "end safe space-evenly" ],
+ invalid_values: [ "none", "5", "self-end", "safe", "normal unsafe", "unsafe safe",
+ "safe baseline", "baseline unsafe", "baseline end", "end normal",
+ "safe end unsafe start", "safe end unsafe", "normal safe start",
+ "unsafe end start", "end start safe", "space-between unsafe",
+ "stretch safe", "auto", "first", "last" ]
+ },
+ "align-items": {
+ domProp: "alignItems",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ // Can't test 'left'/'right' here since that computes to 'start' for blocks.
+ other_values: [ "end", "flex-start", "flex-end", "self-start", "self-end",
+ "center", "stretch", "first baseline", "last baseline", "baseline",
+ "unsafe left", "start", "center unsafe", "safe right", "center safe" ],
+ invalid_values: [ "space-between", "abc", "5%", "legacy", "legacy end",
+ "end legacy", "unsafe", "unsafe baseline", "normal unsafe",
+ "safe left unsafe", "safe stretch", "end end", "auto" ]
+ },
+ "align-self": {
+ domProp: "alignSelf",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "normal", "start", "flex-start", "flex-end", "center", "stretch",
+ "first baseline", "last baseline", "baseline", "right safe",
+ "unsafe center", "self-start", "self-end safe" ],
+ invalid_values: [ "space-between", "abc", "30px", "stretch safe", "safe" ]
+ },
+ "justify-content": {
+ domProp: "justifyContent",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "start", "end", "flex-start", "flex-end", "center", "left",
+ "right", "space-between", "space-around", "space-evenly",
+ "first baseline", "last baseline", "baseline", "stretch", "start safe",
+ "unsafe end", "unsafe end stretch", "end safe space-evenly" ],
+ invalid_values: [ "30px", "5%", "self-end", "safe", "normal unsafe", "unsafe safe",
+ "safe baseline", "baseline unsafe", "baseline end", "normal end",
+ "safe end unsafe start", "safe end unsafe", "normal safe start",
+ "unsafe end start", "end start safe", "space-around unsafe",
+ "safe stretch", "auto", "first", "last" ]
+ },
+ "justify-items": {
+ domProp: "justifyItems",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto", "normal" ],
+ other_values: [ "end", "flex-start", "flex-end", "self-start", "self-end",
+ "center", "left", "right", "first baseline", "last baseline",
+ "baseline", "stretch", "start", "legacy left", "right legacy",
+ "legacy center", "unsafe right", "left unsafe", "safe right",
+ "center safe" ],
+ invalid_values: [ "space-between", "abc", "30px", "legacy", "legacy start",
+ "end legacy", "legacy baseline", "legacy legacy", "unsafe",
+ "safe legacy left", "legacy left safe", "legacy safe left",
+ "safe left legacy", "legacy left legacy", "baseline unsafe",
+ "safe unsafe", "safe left unsafe", "safe stretch", "last" ]
+ },
+ "justify-self": {
+ domProp: "justifySelf",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "normal", "start", "end", "flex-start", "flex-end", "self-start",
+ "self-end", "center", "left", "right", "baseline", "first baseline",
+ "last baseline", "stretch", "left unsafe", "unsafe right",
+ "safe right", "center safe" ],
+ invalid_values: [ "space-between", "abc", "30px", "none", "first", "last",
+ "legacy left", "right legacy", "baseline first", "baseline last" ]
+ },
+ "place-content": {
+ domProp: "placeContent",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "align-content", "justify-content" ],
+ initial_values: [ "normal" ],
+ other_values: [ "normal start", "end baseline", "end end",
+ "space-between flex-end", "last baseline start",
+ "space-evenly", "flex-start", "end", "left" ],
+ invalid_values: [ "none", "center safe", "unsafe start", "right / end" ]
+ },
+ "place-items": {
+ domProp: "placeItems",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "align-items", "justify-items" ],
+ initial_values: [ "normal" ],
+ other_values: [ "normal center", "end baseline", "end auto",
+ "end", "right", "baseline", "start last baseline",
+ "left flex-end", "last baseline start", "stretch" ],
+ invalid_values: [ "space-between", "start space-evenly", "none", "end/end",
+ "center safe", "auto start", "end legacy left" ]
+ },
+ "place-self": {
+ domProp: "placeSelf",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "align-self", "justify-self" ],
+ initial_values: [ "auto" ],
+ other_values: [ "normal start", "end first baseline", "end auto",
+ "end", "right", "normal", "baseline", "start baseline",
+ "left self-end", "last baseline start", "stretch" ],
+ invalid_values: [ "space-between", "start space-evenly", "none", "end safe",
+ "auto legacy left", "legacy left", "auto/auto" ]
+ },
+ "flex": {
+ domProp: "flex",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [
+ "flex-grow",
+ "flex-shrink",
+ "flex-basis"
+ ],
+ initial_values: [ "0 1 auto", "auto 0 1", "0 auto", "auto 0" ],
+ other_values: [
+ "none",
+ "1",
+ "0",
+ "0 1",
+ "0.5",
+ "1.2 3.4",
+ "0 0 0",
+ "0 0 0px",
+ "0px 0 0",
+ "5px 0 0",
+ "2 auto",
+ "auto 4",
+ "auto 5.6 7.8",
+ "-moz-max-content",
+ "1 -moz-max-content",
+ "1 2 -moz-max-content",
+ "-moz-max-content 1",
+ "-moz-max-content 1 2",
+ "-0"
+ ],
+ invalid_values: [
+ "1 2px 3",
+ "1 auto 3",
+ "1px 2 3px",
+ "1px 2 3 4px",
+ "-1",
+ "1 -1",
+ "0 1 calc(0px + rubbish)",
+ ]
+ },
+ "flex-basis": {
+ domProp: "flexBasis",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ " auto" ],
+ // NOTE: This is cribbed directly from the "width" chunk, since this
+ // property takes the exact same values as width (albeit with
+ // different semantics on 'auto').
+ // XXXdholbert (Maybe these should get separated out into
+ // a reusable array defined at the top of this file?)
+ other_values: [ "15px", "3em", "15%", "-moz-max-content", "-moz-min-content", "-moz-fit-content", "-moz-available",
+ // valid calc() values
+ "calc(-2px)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(50% + 2px)",
+ "calc( 50% + 2px)",
+ "calc(50% + 2px )",
+ "calc( 50% + 2px )",
+ "calc(50% - -2px)",
+ "calc(2px - -50%)",
+ "calc(3*25px)",
+ "calc(3 *25px)",
+ "calc(3 * 25px)",
+ "calc(3* 25px)",
+ "calc(25px*3)",
+ "calc(25px *3)",
+ "calc(25px* 3)",
+ "calc(25px * 3)",
+ "calc(3*25px + 50%)",
+ "calc(50% - 3em + 2px)",
+ "calc(50% - (3em + 2px))",
+ "calc((50% - 3em) + 2px)",
+ "calc(2em)",
+ "calc(50%)",
+ "calc(50px/2)",
+ "calc(50px/(2 - 1))"
+ ],
+ invalid_values: [ "none", "-2px",
+ // invalid calc() values
+ "calc(50%+ 2px)",
+ "calc(50% +2px)",
+ "calc(50%+2px)",
+ "-moz-min()",
+ "calc(min())",
+ "-moz-max()",
+ "calc(max())",
+ "-moz-min(5px)",
+ "calc(min(5px))",
+ "-moz-max(5px)",
+ "calc(max(5px))",
+ "-moz-min(5px,2em)",
+ "calc(min(5px,2em))",
+ "-moz-max(5px,2em)",
+ "calc(max(5px,2em))",
+ "calc(50px/(2 - 2))",
+ // If we ever support division by values, which is
+ // complicated for the reasons described in
+ // http://lists.w3.org/Archives/Public/www-style/2010Jan/0007.html
+ // , we should support all 4 of these as described in
+ // http://lists.w3.org/Archives/Public/www-style/2009Dec/0296.html
+ "calc((3em / 100%) * 3em)",
+ "calc(3em / 100% * 3em)",
+ "calc(3em * (3em / 100%))",
+ "calc(3em * 3em / 100%)"
+ ]
+ },
+ "flex-direction": {
+ domProp: "flexDirection",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "row" ],
+ other_values: [ "row-reverse", "column", "column-reverse" ],
+ invalid_values: [ "10px", "30%", "justify", "column wrap" ]
+ },
+ "flex-flow": {
+ domProp: "flexFlow",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [
+ "flex-direction",
+ "flex-wrap"
+ ],
+ initial_values: [ "row nowrap", "nowrap row", "row", "nowrap" ],
+ other_values: [
+ // only specifying one property:
+ "column",
+ "wrap",
+ "wrap-reverse",
+ // specifying both properties, 'flex-direction' first:
+ "row wrap",
+ "row wrap-reverse",
+ "column wrap",
+ "column wrap-reverse",
+ // specifying both properties, 'flex-wrap' first:
+ "wrap row",
+ "wrap column",
+ "wrap-reverse row",
+ "wrap-reverse column",
+ ],
+ invalid_values: [
+ // specifying flex-direction twice (invalid):
+ "row column",
+ "row column nowrap",
+ "row nowrap column",
+ "nowrap row column",
+ // specifying flex-wrap twice (invalid):
+ "nowrap wrap-reverse",
+ "nowrap wrap-reverse row",
+ "nowrap row wrap-reverse",
+ "row nowrap wrap-reverse",
+ // Invalid data-type / invalid keyword type:
+ "1px", "5%", "justify", "none"
+ ]
+ },
+ "flex-grow": {
+ domProp: "flexGrow",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0" ],
+ other_values: [ "3", "1", "1.0", "2.5", "123" ],
+ invalid_values: [ "0px", "-5", "1%", "3em", "stretch", "auto" ]
+ },
+ "flex-shrink": {
+ domProp: "flexShrink",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "1" ],
+ other_values: [ "3", "0", "0.0", "2.5", "123" ],
+ invalid_values: [ "0px", "-5", "1%", "3em", "stretch", "auto" ]
+ },
+ "flex-wrap": {
+ domProp: "flexWrap",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "nowrap" ],
+ other_values: [ "wrap", "wrap-reverse" ],
+ invalid_values: [ "10px", "30%", "justify", "column wrap", "auto" ]
+ },
+ "order": {
+ domProp: "order",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0" ],
+ other_values: [ "1", "99999", "-1", "-50" ],
+ invalid_values: [ "0px", "1.0", "1.", "1%", "0.2", "3em", "stretch" ]
+ },
+
+ // Aliases
+ "word-wrap": {
+ domProp: "wordWrap",
+ inherited: true,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "overflow-wrap",
+ subproperties: [ "overflow-wrap" ],
+ },
+ "-moz-transform": {
+ domProp: "MozTransform",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transform",
+ subproperties: [ "transform" ],
+ // NOTE: We specify other_values & invalid_values explicitly here (instead
+ // of deferring to "transform") because we accept some legacy syntax as
+ // valid for "-moz-transform" but not for "transform".
+ other_values: [ "translatex(1px)", "translatex(4em)",
+ "translatex(-4px)", "translatex(3px)",
+ "translatex(0px) translatex(1px) translatex(2px) translatex(3px) translatex(4px)",
+ "translatey(4em)", "translate(3px)", "translate(10px, -3px)",
+ "rotate(45deg)", "rotate(45grad)", "rotate(45rad)",
+ "rotate(0.25turn)", "rotate(0)", "scalex(10)", "scaley(10)",
+ "scale(10)", "scale(10, 20)", "skewx(30deg)", "skewx(0)",
+ "skewy(0)", "skewx(30grad)", "skewx(30rad)", "skewx(0.08turn)",
+ "skewy(30deg)", "skewy(30grad)", "skewy(30rad)", "skewy(0.08turn)",
+ "rotate(45deg) scale(2, 1)", "skewx(45deg) skewx(-50grad)",
+ "translate(0, 0) scale(1, 1) skewx(0) skewy(0) matrix(1, 0, 0, 1, 0, 0)",
+ "translatex(50%)", "translatey(50%)", "translate(50%)",
+ "translate(3%, 5px)", "translate(5px, 3%)",
+ "matrix(1, 2, 3, 4, 5, 6)",
+ /* valid calc() values */
+ "translatex(calc(5px + 10%))",
+ "translatey(calc(0.25 * 5px + 10% / 3))",
+ "translate(calc(5px - 10% * 3))",
+ "translate(calc(5px - 3 * 10%), 50px)",
+ "translate(-50px, calc(5px - 10% * 3))",
+ /* valid only when prefixed */
+ "matrix(1, 2, 3, 4, 5px, 6%)",
+ "matrix(1, 2, 3, 4, 5%, 6px)",
+ "matrix(1, 2, 3, 4, 5%, 6%)",
+ "matrix(1, 2, 3, 4, 5px, 6em)",
+ "matrix(1, 0, 0, 1, calc(5px * 3), calc(10% - 3px))",
+ "translatez(1px)", "translatez(4em)", "translatez(-4px)",
+ "translatez(0px)", "translatez(2px) translatez(5px)",
+ "translate3d(3px, 4px, 5px)", "translate3d(2em, 3px, 1em)",
+ "translatex(2px) translate3d(4px, 5px, 6px) translatey(1px)",
+ "scale3d(4, 4, 4)", "scale3d(-2, 3, -7)", "scalez(4)",
+ "scalez(-6)", "rotate3d(2, 3, 4, 45deg)",
+ "rotate3d(-3, 7, 0, 12rad)", "rotatex(15deg)", "rotatey(-12grad)",
+ "rotatez(72rad)", "rotatex(0.125turn)",
+ "perspective(0px)", "perspective(1000px)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)",
+ /* valid only when prefixed */
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13px, 14em, 15px, 16)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 20%, 10%, 15, 16)",
+ ],
+ invalid_values: ["1px", "#0000ff", "red", "auto",
+ "translatex(1)", "translatey(1)", "translate(2)",
+ "translate(-3, -4)",
+ "translatex(1px 1px)", "translatex(translatex(1px))",
+ "translatex(#0000ff)", "translatex(red)", "translatey()",
+ "matrix(1px, 2px, 3px, 4px, 5px, 6px)", "scale(150%)",
+ "skewx(red)", "matrix(1%, 0, 0, 0, 0px, 0px)",
+ "matrix(0, 1%, 2, 3, 4px,5px)", "matrix(0, 1, 2%, 3, 4px, 5px)",
+ "matrix(0, 1, 2, 3%, 4%, 5%)",
+ /* invalid calc() values */
+ "translatey(-moz-min(5px,10%))",
+ "translatex(-moz-max(5px,10%))",
+ "translate(10px, calc(min(5px,10%)))",
+ "translate(calc(max(5px,10%)), 10%)",
+ "matrix(1, 0, 0, 1, max(5px * 3), calc(10% - 3px))",
+ "perspective(-10px)", "matrix3d(dinosaur)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15%, 16)",
+ "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16px)",
+ "rotatey(words)", "rotatex(7)", "translate3d(3px, 4px, 1px, 7px)",
+ ],
+ },
+ "-moz-transform-origin": {
+ domProp: "MozTransformOrigin",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transform-origin",
+ subproperties: [ "transform-origin" ],
+ },
+ "-moz-perspective-origin": {
+ domProp: "MozPerspectiveOrigin",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "perspective-origin",
+ subproperties: [ "perspective-origin" ],
+ },
+ "-moz-perspective": {
+ domProp: "MozPerspective",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "perspective",
+ subproperties: [ "perspective" ],
+ },
+ "-moz-backface-visibility": {
+ domProp: "MozBackfaceVisibility",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "backface-visibility",
+ subproperties: [ "backface-visibility" ],
+ },
+ "-moz-transform-style": {
+ domProp: "MozTransformStyle",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transform-style",
+ subproperties: [ "transform-style" ],
+ },
+ "-moz-border-image": {
+ domProp: "MozBorderImage",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "border-image",
+ subproperties: [ "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat" ],
+ },
+ "-moz-transition": {
+ domProp: "MozTransition",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "transition",
+ subproperties: [ "transition-property", "transition-duration", "transition-timing-function", "transition-delay" ],
+ },
+ "-moz-transition-delay": {
+ domProp: "MozTransitionDelay",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transition-delay",
+ subproperties: [ "transition-delay" ],
+ },
+ "-moz-transition-duration": {
+ domProp: "MozTransitionDuration",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transition-duration",
+ subproperties: [ "transition-duration" ],
+ },
+ "-moz-transition-property": {
+ domProp: "MozTransitionProperty",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transition-property",
+ subproperties: [ "transition-property" ],
+ },
+ "-moz-transition-timing-function": {
+ domProp: "MozTransitionTimingFunction",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transition-timing-function",
+ subproperties: [ "transition-timing-function" ],
+ },
+ "-moz-animation": {
+ domProp: "MozAnimation",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "animation",
+ subproperties: [ "animation-name", "animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state" ],
+ },
+ "-moz-animation-delay": {
+ domProp: "MozAnimationDelay",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-delay",
+ subproperties: [ "animation-delay" ],
+ },
+ "-moz-animation-direction": {
+ domProp: "MozAnimationDirection",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-direction",
+ subproperties: [ "animation-direction" ],
+ },
+ "-moz-animation-duration": {
+ domProp: "MozAnimationDuration",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-duration",
+ subproperties: [ "animation-duration" ],
+ },
+ "-moz-animation-fill-mode": {
+ domProp: "MozAnimationFillMode",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-fill-mode",
+ subproperties: [ "animation-fill-mode" ],
+ },
+ "-moz-animation-iteration-count": {
+ domProp: "MozAnimationIterationCount",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-iteration-count",
+ subproperties: [ "animation-iteration-count" ],
+ },
+ "-moz-animation-name": {
+ domProp: "MozAnimationName",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-name",
+ subproperties: [ "animation-name" ],
+ },
+ "-moz-animation-play-state": {
+ domProp: "MozAnimationPlayState",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-play-state",
+ subproperties: [ "animation-play-state" ],
+ },
+ "-moz-animation-timing-function": {
+ domProp: "MozAnimationTimingFunction",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-timing-function",
+ subproperties: [ "animation-timing-function" ],
+ },
+ "-moz-font-feature-settings": {
+ domProp: "MozFontFeatureSettings",
+ inherited: true,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "font-feature-settings",
+ subproperties: [ "font-feature-settings" ],
+ },
+ "-moz-font-language-override": {
+ domProp: "MozFontLanguageOverride",
+ inherited: true,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "font-language-override",
+ subproperties: [ "font-language-override" ],
+ },
+ "-moz-hyphens": {
+ domProp: "MozHyphens",
+ inherited: true,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "hyphens",
+ subproperties: [ "hyphens" ],
+ },
+ "-moz-text-align-last": {
+ domProp: "MozTextAlignLast",
+ inherited: true,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "text-align-last",
+ subproperties: [ "text-align-last" ],
+ },
+ // vertical text properties
+ "writing-mode": {
+ domProp: "writingMode",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "horizontal-tb", "lr", "lr-tb", "rl", "rl-tb" ],
+ other_values: [ "vertical-lr", "vertical-rl", "sideways-rl", "sideways-lr", "tb", "tb-rl" ],
+ invalid_values: [ "10px", "30%", "justify", "auto", "1em" ]
+ },
+ "text-orientation": {
+ domProp: "textOrientation",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "mixed" ],
+ other_values: [ "upright", "sideways", "sideways-right" ], /* sideways-right alias for backward compatibility */
+ invalid_values: [ "none", "3em", "sideways-left" ] /* sideways-left removed from CSS Writing Modes */
+ },
+ "border-block-end": {
+ domProp: "borderBlockEnd",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-block-end-color", "border-block-end-style", "border-block-end-width" ],
+ initial_values: [ "none", "medium", "currentColor", "thin", "none medium currentcolor" ],
+ other_values: [ "solid", "green", "medium solid", "green solid", "10px solid", "thick solid", "5px green none" ],
+ invalid_values: [ "5%", "5", "5 solid green" ]
+ },
+ "block-size": {
+ domProp: "blockSize",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ axis: true,
+ get_computed: logical_axis_prop_get_computed,
+ /* XXX testing auto has prerequisites */
+ initial_values: [ "auto" ],
+ prerequisites: { "display": "block" },
+ other_values: [ "15px", "3em", "15%",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "none", "-moz-max-content", "-moz-min-content", "-moz-fit-content", "-moz-available" ],
+ },
+ "border-block-end-color": {
+ domProp: "borderBlockEndColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ initial_values: [ "currentColor" ],
+ other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000", "000000" ]
+ },
+ "border-block-end-style": {
+ domProp: "borderBlockEndStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* XXX hidden is sometimes the same as initial */
+ initial_values: [ "none" ],
+ other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
+ invalid_values: []
+ },
+ "border-block-end-width": {
+ domProp: "borderBlockEndWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ prerequisites: { "border-block-end-style": "solid" },
+ initial_values: [ "medium", "3px", "calc(4px - 1px)" ],
+ other_values: [ "thin", "thick", "1px", "2em",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0em)",
+ "calc(0px)",
+ "calc(5em)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 5em)",
+ ],
+ invalid_values: [ "5%", "5" ]
+ },
+ "border-block-start": {
+ domProp: "borderBlockStart",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "border-block-start-color", "border-block-start-style", "border-block-start-width" ],
+ initial_values: [ "none", "medium", "currentColor", "thin", "none medium currentcolor" ],
+ other_values: [ "solid", "green", "medium solid", "green solid", "10px solid", "thick solid", "5px green none" ],
+ invalid_values: [ "5%", "5", "5 solid green" ]
+ },
+ "border-block-start-color": {
+ domProp: "borderBlockStartColor",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ initial_values: [ "currentColor" ],
+ other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000", "000000" ]
+ },
+ "border-block-start-style": {
+ domProp: "borderBlockStartStyle",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* XXX hidden is sometimes the same as initial */
+ initial_values: [ "none" ],
+ other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
+ invalid_values: []
+ },
+ "border-block-start-width": {
+ domProp: "borderBlockStartWidth",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ prerequisites: { "border-block-start-style": "solid" },
+ initial_values: [ "medium", "3px", "calc(4px - 1px)" ],
+ other_values: [ "thin", "thick", "1px", "2em",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(0em)",
+ "calc(0px)",
+ "calc(5em)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 5em)",
+ ],
+ invalid_values: [ "5%", "5" ]
+ },
+ "-moz-border-end": {
+ domProp: "MozBorderEnd",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "border-inline-end",
+ subproperties: [ "-moz-border-end-color", "-moz-border-end-style", "-moz-border-end-width" ],
+ },
+ "-moz-border-end-color": {
+ domProp: "MozBorderEndColor",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "border-inline-end-color",
+ subproperties: [ "border-inline-end-color" ],
+ get_computed: logical_box_prop_get_computed,
+ },
+ "-moz-border-end-style": {
+ domProp: "MozBorderEndStyle",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "border-inline-end-style",
+ subproperties: [ "border-inline-end-style" ],
+ get_computed: logical_box_prop_get_computed,
+ },
+ "-moz-border-end-width": {
+ domProp: "MozBorderEndWidth",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "border-inline-end-width",
+ subproperties: [ "border-inline-end-width" ],
+ get_computed: logical_box_prop_get_computed,
+ },
+ "-moz-border-start": {
+ domProp: "MozBorderStart",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "border-inline-start",
+ subproperties: [ "-moz-border-start-color", "-moz-border-start-style", "-moz-border-start-width" ],
+ },
+ "-moz-border-start-color": {
+ domProp: "MozBorderStartColor",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "border-inline-start-color",
+ subproperties: [ "border-inline-start-color" ],
+ get_computed: logical_box_prop_get_computed,
+ },
+ "-moz-border-start-style": {
+ domProp: "MozBorderStartStyle",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "border-inline-start-style",
+ subproperties: [ "border-inline-start-style" ],
+ get_computed: logical_box_prop_get_computed,
+ },
+ "-moz-border-start-width": {
+ domProp: "MozBorderStartWidth",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "border-inline-start-width",
+ subproperties: [ "border-inline-start-width" ],
+ get_computed: logical_box_prop_get_computed,
+ },
+ "inline-size": {
+ domProp: "inlineSize",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ axis: true,
+ get_computed: logical_axis_prop_get_computed,
+ /* XXX testing auto has prerequisites */
+ initial_values: [ "auto" ],
+ prerequisites: { "display": "block" },
+ other_values: [ "15px", "3em", "15%",
+ // these three keywords compute to the initial value only when the
+ // writing mode is vertical, and we're testing with a horizontal
+ // writing mode
+ "-moz-max-content", "-moz-min-content", "-moz-fit-content",
+ // whether -moz-available computes to the initial value depends on
+ // the container size, and for the container size we're testing
+ // with, it does
+ // "-moz-available",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "none" ],
+ },
+ "margin-block-end": {
+ domProp: "marginBlockEnd",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* XXX testing auto has prerequisites */
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)" ],
+ other_values: [ "1px", "2em", "5%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "..25px", ".+5px", ".px", "-.px", "++5px", "-+4px", "+-3px", "--7px", "+-.6px", "-+.5px", "++.7px", "--.4px" ],
+ },
+ "margin-block-start": {
+ domProp: "marginBlockStart",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* XXX testing auto has prerequisites */
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)" ],
+ other_values: [ "1px", "2em", "5%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "..25px", ".+5px", ".px", "-.px", "++5px", "-+4px", "+-3px", "--7px", "+-.6px", "-+.5px", "++.7px", "--.4px" ],
+ },
+ "-moz-margin-end": {
+ domProp: "MozMarginEnd",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "margin-inline-end",
+ subproperties: [ "margin-inline-end" ],
+ get_computed: logical_box_prop_get_computed,
+ },
+ "-moz-margin-start": {
+ domProp: "MozMarginStart",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "margin-inline-start",
+ subproperties: [ "margin-inline-start" ],
+ get_computed: logical_box_prop_get_computed,
+ },
+ "max-block-size": {
+ domProp: "maxBlockSize",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ axis: true,
+ get_computed: logical_axis_prop_get_computed,
+ prerequisites: { "display": "block" },
+ initial_values: [ "none" ],
+ other_values: [ "30px", "50%",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "auto", "5", "-moz-max-content", "-moz-min-content", "-moz-fit-content", "-moz-available" ]
+ },
+ "max-inline-size": {
+ domProp: "maxInlineSize",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ axis: true,
+ get_computed: logical_axis_prop_get_computed,
+ prerequisites: { "display": "block" },
+ initial_values: [ "none" ],
+ other_values: [ "30px", "50%",
+ // these four keywords compute to the initial value only when the
+ // writing mode is vertical, and we're testing with a horizontal
+ // writing mode
+ "-moz-max-content", "-moz-min-content", "-moz-fit-content", "-moz-available",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "auto", "5" ]
+ },
+ "min-block-size": {
+ domProp: "minBlockSize",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ axis: true,
+ get_computed: logical_axis_prop_get_computed,
+ prerequisites: { "display": "block" },
+ initial_values: [ "auto", "0", "calc(0em)", "calc(-2px)" ],
+ other_values: [ "30px", "50%",
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "none", "5", "-moz-max-content", "-moz-min-content", "-moz-fit-content", "-moz-available" ]
+ },
+ "min-inline-size": {
+ domProp: "minInlineSize",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ axis: true,
+ get_computed: logical_axis_prop_get_computed,
+ prerequisites: { "display": "block" },
+ initial_values: [ "auto", "0", "calc(0em)", "calc(-2px)" ],
+ other_values: [ "30px", "50%",
+ // these four keywords compute to the initial value only when the
+ // writing mode is vertical, and we're testing with a horizontal
+ // writing mode
+ "-moz-max-content", "-moz-min-content", "-moz-fit-content", "-moz-available",
+ "calc(-1%)",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ "none", "5" ]
+ },
+ "offset-block-end": {
+ domProp: "offsetBlockEnd",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* FIXME: run tests with multiple prerequisites */
+ prerequisites: { "position": "relative" },
+ /* XXX 0 may or may not be equal to auto */
+ initial_values: [ "auto" ],
+ other_values: [ "32px", "-3em", "12%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: []
+ },
+ "offset-block-start": {
+ domProp: "offsetBlockStart",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* FIXME: run tests with multiple prerequisites */
+ prerequisites: { "position": "relative" },
+ /* XXX 0 may or may not be equal to auto */
+ initial_values: [ "auto" ],
+ other_values: [ "32px", "-3em", "12%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: []
+ },
+ "offset-inline-end": {
+ domProp: "offsetInlineEnd",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* FIXME: run tests with multiple prerequisites */
+ prerequisites: { "position": "relative" },
+ /* XXX 0 may or may not be equal to auto */
+ initial_values: [ "auto" ],
+ other_values: [ "32px", "-3em", "12%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: []
+ },
+ "offset-inline-start": {
+ domProp: "offsetInlineStart",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ /* FIXME: run tests with multiple prerequisites */
+ prerequisites: { "position": "relative" },
+ /* XXX 0 may or may not be equal to auto */
+ initial_values: [ "auto" ],
+ other_values: [ "32px", "-3em", "12%",
+ "calc(2px)",
+ "calc(-2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: []
+ },
+ "padding-block-end": {
+ domProp: "paddingBlockEnd",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)", "calc(-3px)", "calc(-1%)" ],
+ other_values: [ "1px", "2em", "5%",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ ],
+ },
+ "padding-block-start": {
+ domProp: "paddingBlockStart",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ logical: true,
+ get_computed: logical_box_prop_get_computed,
+ initial_values: [ "0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)", "calc(-3px)", "calc(-1%)" ],
+ other_values: [ "1px", "2em", "5%",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ ],
+ invalid_values: [ ],
+ },
+ "-moz-padding-end": {
+ domProp: "MozPaddingEnd",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "padding-inline-end",
+ subproperties: [ "padding-inline-end" ],
+ get_computed: logical_box_prop_get_computed,
+ },
+ "-moz-padding-start": {
+ domProp: "MozPaddingStart",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "padding-inline-start",
+ subproperties: [ "padding-inline-start" ],
+ get_computed: logical_box_prop_get_computed,
+ },
+} // end of gCSSProperties
+
+function logical_axis_prop_get_computed(cs, property)
+{
+ // Use defaults for these two properties in case the vertical text
+ // pref (which they live behind) is turned off.
+ var writingMode = cs.getPropertyValue("writing-mode") || "horizontal-tb";
+ var orientation = writingMode.substring(0, writingMode.indexOf("-"));
+
+ var mappings = {
+ "block-size": { horizontal: "height",
+ vertical: "width",
+ sideways: "width" },
+ "inline-size": { horizontal: "width",
+ vertical: "height",
+ sideways: "height" },
+ "max-block-size": { horizontal: "max-height",
+ vertical: "max-width",
+ sideways: "max-width" },
+ "max-inline-size": { horizontal: "max-width",
+ vertical: "max-height",
+ sideways: "max-height" },
+ "min-block-size": { horizontal: "min-height",
+ vertical: "min-width",
+ sideways: "min-width" },
+ "min-inline-size": { horizontal: "min-width",
+ vertical: "min-height",
+ sideways: "min-height" },
+ };
+
+ if (!mappings[property]) {
+ throw "unexpected property " + property;
+ }
+
+ var prop = mappings[property][orientation];
+ if (!prop) {
+ throw "unexpected writing mode " + writingMode;
+ }
+
+ return cs.getPropertyValue(prop);
+}
+
+function logical_box_prop_get_computed(cs, property)
+{
+ // http://dev.w3.org/csswg/css-writing-modes-3/#logical-to-physical
+
+ // Use default for writing-mode in case the vertical text
+ // pref (which it lives behind) is turned off.
+ var writingMode = cs.getPropertyValue("writing-mode") || "horizontal-tb";
+
+ var direction = cs.getPropertyValue("direction");
+
+ // keys in blockMappings are writing-mode values
+ var blockMappings = {
+ "horizontal-tb": { "start": "top", "end": "bottom" },
+ "vertical-rl": { "start": "right", "end": "left" },
+ "vertical-lr": { "start": "left", "end": "right" },
+ "sideways-rl": { "start": "right", "end": "left" },
+ "sideways-lr": { "start": "left", "end": "right" },
+ };
+
+ // keys in inlineMappings are regular expressions that match against
+ // a {writing-mode,direction} pair as a space-separated string
+ var inlineMappings = {
+ "horizontal-tb ltr": { "start": "left", "end": "right" },
+ "horizontal-tb rtl": { "start": "right", "end": "left" },
+ "vertical-.. ltr": { "start": "bottom", "end": "top" },
+ "vertical-.. rtl": { "start": "top", "end": "bottom" },
+ "vertical-.. ltr": { "start": "top", "end": "bottom" },
+ "vertical-.. rtl": { "start": "bottom", "end": "top" },
+ "sideways-lr ltr": { "start": "bottom", "end": "top" },
+ "sideways-lr rtl": { "start": "top", "end": "bottom" },
+ "sideways-rl ltr": { "start": "top", "end": "bottom" },
+ "sideways-rl rtl": { "start": "bottom", "end": "top" },
+ };
+
+ var blockMapping = blockMappings[writingMode];
+ var inlineMapping;
+
+ // test each regular expression in inlineMappings against the
+ // {writing-mode,direction} pair
+ var key = `${writingMode} ${direction}`;
+ for (var k in inlineMappings) {
+ if (new RegExp(k).test(key)) {
+ inlineMapping = inlineMappings[k];
+ break;
+ }
+ }
+
+ if (!blockMapping || !inlineMapping) {
+ throw "Unexpected writing mode property values";
+ }
+
+ function physicalize(aProperty, aMapping, aLogicalPrefix) {
+ for (var logicalSide in aMapping) {
+ var physicalSide = aMapping[logicalSide];
+ logicalSide = aLogicalPrefix + logicalSide;
+ aProperty = aProperty.replace(logicalSide, physicalSide);
+ }
+ return aProperty;
+ }
+
+ if (/^-moz-/.test(property)) {
+ property = physicalize(property.substring(5), inlineMapping, "");
+ } else if (/^offset-(block|inline)-(start|end)/.test(property)) {
+ property = property.substring(7); // we want "top" not "offset-top", e.g.
+ property = physicalize(property, blockMapping, "block-");
+ property = physicalize(property, inlineMapping, "inline-");
+ } else if (/-(block|inline)-(start|end)/.test(property)) {
+ property = physicalize(property, blockMapping, "block-");
+ property = physicalize(property, inlineMapping, "inline-");
+ } else {
+ throw "Unexpected property";
+ }
+ return cs.getPropertyValue(property);
+}
+
+// Get the computed value for a property. For shorthands, return the
+// computed values of all the subproperties, delimited by " ; ".
+function get_computed_value(cs, property)
+{
+ var info = gCSSProperties[property];
+ if (info.type == CSS_TYPE_TRUE_SHORTHAND ||
+ (info.type == CSS_TYPE_SHORTHAND_AND_LONGHAND &&
+ (property == "text-decoration" || property == "mask"))) {
+ var results = [];
+ for (var idx in info.subproperties) {
+ var subprop = info.subproperties[idx];
+ results.push(get_computed_value(cs, subprop));
+ }
+ return results.join(" ; ");
+ }
+ if (info.get_computed)
+ return info.get_computed(cs, property);
+ return cs.getPropertyValue(property);
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.touch_action.enabled")) {
+ gCSSProperties["touch-action"] = {
+ domProp: "touchAction",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: ["auto"],
+ other_values: ["none", "pan-x", "pan-y", "pan-x pan-y", "pan-y pan-x", "manipulation"],
+ invalid_values: ["zoom", "pinch", "tap", "10px", "2", "auto pan-x", "pan-x auto", "none pan-x", "pan-x none",
+ "auto pan-y", "pan-y auto", "none pan-y", "pan-y none", "pan-x pan-x", "pan-y pan-y",
+ "pan-x pan-y none", "pan-x none pan-y", "none pan-x pan-y", "pan-y pan-x none", "pan-y none pan-x", "none pan-y pan-x",
+ "pan-x pan-y auto", "pan-x auto pan-y", "auto pan-x pan-y", "pan-y pan-x auto", "pan-y auto pan-x", "auto pan-y pan-x",
+ "pan-x pan-y zoom", "pan-x zoom pan-y", "zoom pan-x pan-y", "pan-y pan-x zoom", "pan-y zoom pan-x", "zoom pan-y pan-x",
+ "pan-x pan-y pan-x", "pan-x pan-x pan-y", "pan-y pan-x pan-x", "pan-y pan-x pan-y", "pan-y pan-y pan-x", "pan-x pan-y pan-y",
+ "manipulation none", "none manipulation", "manipulation auto", "auto manipulation", "manipulation zoom", "zoom manipulation",
+ "manipulation manipulation", "manipulation pan-x", "pan-x manipulation", "manipulation pan-y", "pan-y manipulation",
+ "manipulation pan-x pan-y", "pan-x manipulation pan-y", "pan-x pan-y manipulation",
+ "manipulation pan-y pan-x", "pan-y manipulation pan-x", "pan-y pan-x manipulation"]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.text-combine-upright.enabled")) {
+ gCSSProperties["text-combine-upright"] = {
+ domProp: "textCombineUpright",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "all" ],
+ invalid_values: [ "auto", "all 2", "none all", "digits -3", "digits 0",
+ "digits 12", "none 3", "digits 3.1415", "digits3", "digits 1",
+ "digits 3 all", "digits foo", "digits all", "digits 3.0" ]
+ };
+ if (IsCSSPropertyPrefEnabled("layout.css.text-combine-upright-digits.enabled")) {
+ gCSSProperties["text-combine-upright"].other_values.push(
+ "digits", "digits 2", "digits 3", "digits 4", "digits 3");
+ }
+}
+
+if (IsCSSPropertyPrefEnabled("svg.paint-order.enabled")) {
+ gCSSProperties["paint-order"] = {
+ domProp: "paintOrder",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "fill", "fill stroke", "fill stroke markers", "stroke markers fill" ],
+ invalid_values: [ "fill stroke markers fill", "fill normal" ]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("svg.transform-box.enabled")) {
+ gCSSProperties["transform-box"] = {
+ domProp: "transformBox",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "border-box" ],
+ other_values: [ "fill-box", "view-box" ],
+ invalid_values: []
+ };
+}
+
+var basicShapeOtherValues = [
+ "polygon(20px 20px)",
+ "polygon(20px 20%)",
+ "polygon(20% 20%)",
+ "polygon(20rem 20em)",
+ "polygon(20cm 20mm)",
+ "polygon(20px 20px, 30px 30px)",
+ "polygon(20px 20px, 30% 30%, 30px 30px)",
+ "polygon(nonzero, 20px 20px, 30% 30%, 30px 30px)",
+ "polygon(evenodd, 20px 20px, 30% 30%, 30px 30px)",
+
+ "content-box",
+ "padding-box",
+ "border-box",
+ "margin-box",
+
+ "polygon(0 0) content-box",
+ "border-box polygon(0 0)",
+ "padding-box polygon( 0 20px , 30px 20% ) ",
+ "polygon(evenodd, 20% 20em) content-box",
+ "polygon(evenodd, 20vh 20em) padding-box",
+ "polygon(evenodd, 20vh calc(20% + 20em)) border-box",
+ "polygon(evenodd, 20vh 20vw) margin-box",
+
+ "circle()",
+ "circle(at center)",
+ "circle(at top left 20px)",
+ "circle(at bottom right)",
+ "circle(20%)",
+ "circle(300px)",
+ "circle(calc(20px + 30px))",
+ "circle(farthest-side)",
+ "circle(closest-side)",
+ "circle(closest-side at center)",
+ "circle(farthest-side at top)",
+ "circle(20px at top right)",
+ "circle(40% at 50% 100%)",
+ "circle(calc(20% + 20%) at right bottom)",
+ "circle() padding-box",
+
+ "ellipse()",
+ "ellipse(at center)",
+ "ellipse(at top left 20px)",
+ "ellipse(at bottom right)",
+ "ellipse(20% 20%)",
+ "ellipse(300px 50%)",
+ "ellipse(calc(20px + 30px) 10%)",
+ "ellipse(farthest-side closest-side)",
+ "ellipse(closest-side farthest-side)",
+ "ellipse(farthest-side farthest-side)",
+ "ellipse(closest-side closest-side)",
+ "ellipse(closest-side closest-side at center)",
+ "ellipse(20% farthest-side at top)",
+ "ellipse(20px 50% at top right)",
+ "ellipse(closest-side 40% at 50% 100%)",
+ "ellipse(calc(20% + 20%) calc(20px + 20cm) at right bottom)",
+
+ "inset(1px)",
+ "inset(20% -20px)",
+ "inset(20em 4rem calc(20% + 20px))",
+ "inset(20vh 20vw 20pt 3%)",
+ "inset(5px round 3px)",
+ "inset(1px 2px round 3px / 3px)",
+ "inset(1px 2px 3px round 3px 2em / 20%)",
+ "inset(1px 2px 3px 4px round 3px 2vw 20% / 20px 3em 2vh 20%)",
+];
+
+var basicShapeInvalidValues = [
+ "url(#test) url(#tes2)",
+ "polygon (0 0)",
+ "polygon(20px, 40px)",
+ "border-box content-box",
+ "polygon(0 0) polygon(0 0)",
+ "polygon(nonzero 0 0)",
+ "polygon(evenodd 20px 20px)",
+ "polygon(20px 20px, evenodd)",
+ "polygon(20px 20px, nonzero)",
+ "polygon(0 0) conten-box content-box",
+ "content-box polygon(0 0) conten-box",
+ "padding-box polygon(0 0) conten-box",
+ "polygon(0 0) polygon(0 0) content-box",
+ "polygon(0 0) content-box polygon(0 0)",
+ "polygon(0 0), content-box",
+ "polygon(0 0), polygon(0 0)",
+ "content-box polygon(0 0) polygon(0 0)",
+ "content-box polygon(0 0) none",
+ "none content-box polygon(0 0)",
+ "inherit content-box polygon(0 0)",
+ "initial polygon(0 0)",
+ "polygon(0 0) farthest-side",
+ "farthest-corner polygon(0 0)",
+ "polygon(0 0) farthest-corner",
+ "polygon(0 0) conten-box",
+ "polygon(0 0) polygon(0 0) farthest-corner",
+ "polygon(0 0) polygon(0 0) polygon(0 0)",
+ "border-box polygon(0, 0)",
+ "border-box padding-box",
+ "margin-box farthest-side",
+ "nonsense() border-box",
+ "border-box nonsense()",
+
+ "circle(at)",
+ "circle(at 20% 20% 30%)",
+ "circle(20px 2px at center)",
+ "circle(2at center)",
+ "circle(closest-corner)",
+ "circle(at center top closest-side)",
+ "circle(-20px)",
+ "circle(farthest-side closest-side)",
+ "circle(20% 20%)",
+ "circle(at farthest-side)",
+ "circle(calc(20px + rubbish))",
+
+ "ellipse(at)",
+ "ellipse(at 20% 20% 30%)",
+ "ellipse(20px at center)",
+ "ellipse(-20px 20px)",
+ "ellipse(closest-corner farthest-corner)",
+ "ellipse(20px -20px)",
+ "ellipse(-20px -20px)",
+ "ellipse(farthest-side)",
+ "ellipse(20%)",
+ "ellipse(at farthest-side farthest-side)",
+ "ellipse(at top left calc(20px + rubbish))",
+
+ "polygon(at)",
+ "polygon(at 20% 20% 30%)",
+ "polygon(20px at center)",
+ "polygon(2px 2at center)",
+ "polygon(closest-corner farthest-corner)",
+ "polygon(at center top closest-side closest-side)",
+ "polygon(40% at 50% 100%)",
+ "polygon(40% farthest-side 20px at 50% 100%)",
+
+ "inset()",
+ "inset(round)",
+ "inset(round 3px)",
+ "inset(1px round 1px 2px 3px 4px 5px)",
+ "inset(1px 2px 3px 4px 5px)",
+ "inset(1px, round 3px)",
+ "inset(1px, 2px)",
+ "inset(1px 2px, 3px)",
+ "inset(1px at 3px)",
+ "inset(1px round 1px // 2px)",
+ "inset(1px round)",
+ "inset(1px calc(2px + rubbish))",
+ "inset(1px round 2px calc(3px + rubbish))",
+];
+
+var basicShapeUnbalancedValues = [
+ "polygon(30% 30%",
+ "polygon(nonzero, 20% 20px",
+ "polygon(evenodd, 20px 20px",
+
+ "circle(",
+ "circle(40% at 50% 100%",
+ "ellipse(",
+ "ellipse(40% at 50% 100%",
+
+ "inset(1px",
+ "inset(1px 2px",
+ "inset(1px 2px 3px",
+ "inset(1px 2px 3px 4px",
+ "inset(1px 2px 3px 4px round 5px",
+ "inset(1px 2px 3px 4px round 5px / 6px",
+];
+
+if (IsCSSPropertyPrefEnabled("layout.css.clip-path-shapes.enabled")) {
+ gCSSProperties["clip-path"] = {
+ domProp: "clipPath",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [
+ // SVG reference clip-path
+ "url(#my-clip-path)",
+
+ "fill-box",
+ "stroke-box",
+ "view-box",
+
+ "polygon(evenodd, 20pt 20cm) fill-box",
+ "polygon(evenodd, 20ex 20pc) stroke-box",
+ "polygon(evenodd, 20rem 20in) view-box",
+ ].concat(basicShapeOtherValues),
+ invalid_values: basicShapeInvalidValues,
+ unbalanced_values: basicShapeUnbalancedValues,
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.shape-outside.enabled")) {
+ gCSSProperties["shape-outside"] = {
+ domProp: "shapeOutside",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [
+ "url(#my-shape-outside)",
+ ].concat(basicShapeOtherValues),
+ invalid_values: basicShapeInvalidValues,
+ unbalanced_values: basicShapeUnbalancedValues,
+ };
+}
+
+
+if (IsCSSPropertyPrefEnabled("layout.css.filters.enabled")) {
+ gCSSProperties["filter"] = {
+ domProp: "filter",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [
+ // SVG reference filters
+ "url(#my-filter)",
+ "url(#my-filter-1) url(#my-filter-2)",
+
+ // Filter functions
+ "opacity(50%) saturate(1.0)",
+ "invert(50%) sepia(0.1) brightness(90%)",
+
+ // Mixed SVG reference filters and filter functions
+ "grayscale(1) url(#my-filter-1)",
+ "url(#my-filter-1) brightness(50%) contrast(0.9)",
+
+ // Bad URLs
+ "url('badscheme:badurl')",
+ "blur(3px) url('badscheme:badurl') grayscale(50%)",
+
+ "blur(0)",
+ "blur(0px)",
+ "blur(0.5px)",
+ "blur(3px)",
+ "blur(100px)",
+ "blur(0.1em)",
+ "blur(calc(-1px))", // Parses and becomes blur(0px).
+ "blur(calc(0px))",
+ "blur(calc(5px))",
+ "blur(calc(2 * 5px))",
+
+ "brightness(0)",
+ "brightness(50%)",
+ "brightness(1)",
+ "brightness(1.0)",
+ "brightness(2)",
+ "brightness(350%)",
+ "brightness(4.567)",
+
+ "contrast(0)",
+ "contrast(50%)",
+ "contrast(1)",
+ "contrast(1.0)",
+ "contrast(2)",
+ "contrast(350%)",
+ "contrast(4.567)",
+
+ "drop-shadow(2px 2px)",
+ "drop-shadow(2px 2px 1px)",
+ "drop-shadow(2px 2px green)",
+ "drop-shadow(2px 2px 1px green)",
+ "drop-shadow(green 2px 2px)",
+ "drop-shadow(green 2px 2px 1px)",
+ "drop-shadow(currentColor 3px 3px)",
+ "drop-shadow(2px 2px calc(-5px))", /* clamped */
+ "drop-shadow(calc(3em - 2px) 2px green)",
+ "drop-shadow(green calc(3em - 2px) 2px)",
+ "drop-shadow(2px calc(2px + 0.2em))",
+ "drop-shadow(blue 2px calc(2px + 0.2em))",
+ "drop-shadow(2px calc(2px + 0.2em) blue)",
+ "drop-shadow(calc(-2px) calc(-2px))",
+ "drop-shadow(-2px -2px)",
+ "drop-shadow(calc(2px) calc(2px))",
+ "drop-shadow(calc(2px) calc(2px) calc(2px))",
+
+ "grayscale(0)",
+ "grayscale(50%)",
+ "grayscale(1)",
+ "grayscale(1.0)",
+ "grayscale(2)",
+ "grayscale(350%)",
+ "grayscale(4.567)",
+
+ "hue-rotate(0deg)",
+ "hue-rotate(90deg)",
+ "hue-rotate(540deg)",
+ "hue-rotate(-90deg)",
+ "hue-rotate(10grad)",
+ "hue-rotate(1.6rad)",
+ "hue-rotate(-1.6rad)",
+ "hue-rotate(0.5turn)",
+ "hue-rotate(-2turn)",
+
+ "invert(0)",
+ "invert(50%)",
+ "invert(1)",
+ "invert(1.0)",
+ "invert(2)",
+ "invert(350%)",
+ "invert(4.567)",
+
+ "opacity(0)",
+ "opacity(50%)",
+ "opacity(1)",
+ "opacity(1.0)",
+ "opacity(2)",
+ "opacity(350%)",
+ "opacity(4.567)",
+
+ "saturate(0)",
+ "saturate(50%)",
+ "saturate(1)",
+ "saturate(1.0)",
+ "saturate(2)",
+ "saturate(350%)",
+ "saturate(4.567)",
+
+ "sepia(0)",
+ "sepia(50%)",
+ "sepia(1)",
+ "sepia(1.0)",
+ "sepia(2)",
+ "sepia(350%)",
+ "sepia(4.567)",
+ ],
+ invalid_values: [
+ // none
+ "none none",
+ "url(#my-filter) none",
+ "none url(#my-filter)",
+ "blur(2px) none url(#my-filter)",
+
+ // Nested filters
+ "grayscale(invert(1.0))",
+
+ // Comma delimited filters
+ "url(#my-filter),",
+ "invert(50%), url(#my-filter), brightness(90%)",
+
+ // Test the following situations for each filter function:
+ // - Invalid number of arguments
+ // - Comma delimited arguments
+ // - Wrong argument type
+ // - Argument value out of range
+ "blur()",
+ "blur(3px 5px)",
+ "blur(3px,)",
+ "blur(3px, 5px)",
+ "blur(#my-filter)",
+ "blur(0.5)",
+ "blur(50%)",
+ "blur(calc(0))", // Unitless zero in calc is not a valid length.
+ "blur(calc(0.1))",
+ "blur(calc(10%))",
+ "blur(calc(20px - 5%))",
+ "blur(-3px)",
+
+ "brightness()",
+ "brightness(0.5 0.5)",
+ "brightness(0.5,)",
+ "brightness(0.5, 0.5)",
+ "brightness(#my-filter)",
+ "brightness(10px)",
+ "brightness(-1)",
+
+ "contrast()",
+ "contrast(0.5 0.5)",
+ "contrast(0.5,)",
+ "contrast(0.5, 0.5)",
+ "contrast(#my-filter)",
+ "contrast(10px)",
+ "contrast(-1)",
+
+ "drop-shadow()",
+ "drop-shadow(3% 3%)",
+ "drop-shadow(2px 2px -5px)",
+ "drop-shadow(2px 2px 2px 2px)",
+ "drop-shadow(2px 2px, none)",
+ "drop-shadow(none, 2px 2px)",
+ "drop-shadow(inherit, 2px 2px)",
+ "drop-shadow(2px 2px, inherit)",
+ "drop-shadow(2 2px)",
+ "drop-shadow(2px 2)",
+ "drop-shadow(2px 2px 2)",
+ "drop-shadow(2px 2px 2px 2)",
+ "drop-shadow(calc(2px) calc(2px) calc(2px) calc(2px))",
+ "drop-shadow(green 2px 2px, blue 1px 3px 4px)",
+ "drop-shadow(blue 2px 2px, currentColor 1px 2px)",
+
+ "grayscale()",
+ "grayscale(0.5 0.5)",
+ "grayscale(0.5,)",
+ "grayscale(0.5, 0.5)",
+ "grayscale(#my-filter)",
+ "grayscale(10px)",
+ "grayscale(-1)",
+
+ "hue-rotate()",
+ "hue-rotate(0)",
+ "hue-rotate(0.5 0.5)",
+ "hue-rotate(0.5,)",
+ "hue-rotate(0.5, 0.5)",
+ "hue-rotate(#my-filter)",
+ "hue-rotate(10px)",
+ "hue-rotate(-1)",
+ "hue-rotate(45deg,)",
+
+ "invert()",
+ "invert(0.5 0.5)",
+ "invert(0.5,)",
+ "invert(0.5, 0.5)",
+ "invert(#my-filter)",
+ "invert(10px)",
+ "invert(-1)",
+
+ "opacity()",
+ "opacity(0.5 0.5)",
+ "opacity(0.5,)",
+ "opacity(0.5, 0.5)",
+ "opacity(#my-filter)",
+ "opacity(10px)",
+ "opacity(-1)",
+
+ "saturate()",
+ "saturate(0.5 0.5)",
+ "saturate(0.5,)",
+ "saturate(0.5, 0.5)",
+ "saturate(#my-filter)",
+ "saturate(10px)",
+ "saturate(-1)",
+
+ "sepia()",
+ "sepia(0.5 0.5)",
+ "sepia(0.5,)",
+ "sepia(0.5, 0.5)",
+ "sepia(#my-filter)",
+ "sepia(10px)",
+ "sepia(-1)",
+ ]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.grid.enabled")) {
+ var isGridTemplateSubgridValueEnabled =
+ IsCSSPropertyPrefEnabled("layout.css.grid-template-subgrid-value.enabled");
+
+ gCSSProperties["display"].other_values.push("grid", "inline-grid");
+ gCSSProperties["grid-auto-flow"] = {
+ domProp: "gridAutoFlow",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "row" ],
+ other_values: [
+ "column",
+ "column dense",
+ "row dense",
+ "dense column",
+ "dense row",
+ "dense",
+ ],
+ invalid_values: [
+ "",
+ "auto",
+ "none",
+ "10px",
+ "column row",
+ "dense row dense",
+ ]
+ };
+
+ gCSSProperties["grid-auto-columns"] = {
+ domProp: "gridAutoColumns",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [
+ "40px",
+ "2em",
+ "2.5fr",
+ "12%",
+ "min-content",
+ "max-content",
+ "calc(2px - 99%)",
+ "minmax(20px, max-content)",
+ "minmax(min-content, auto)",
+ "minmax(auto, max-content)",
+ "m\\69nmax(20px, 4Fr)",
+ "MinMax(min-content, calc(20px + 10%))",
+ "fit-content(1px)",
+ "fit-content(calc(1px - 99%))",
+ "fit-content(10%)",
+ ],
+ invalid_values: [
+ "",
+ "normal",
+ "40ms",
+ "-40px",
+ "-12%",
+ "-2em",
+ "-2.5fr",
+ "minmax()",
+ "minmax(20px)",
+ "mİnmax(20px, 100px)",
+ "minmax(20px, 100px, 200px)",
+ "maxmin(100px, 20px)",
+ "minmax(min-content, minmax(30px, max-content))",
+ "fit-content(-1px)",
+ "fit-content(auto)",
+ "fit-content(min-content)",
+ ]
+ };
+ gCSSProperties["grid-auto-rows"] = {
+ domProp: "gridAutoRows",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: gCSSProperties["grid-auto-columns"].initial_values,
+ other_values: gCSSProperties["grid-auto-columns"].other_values,
+ invalid_values: gCSSProperties["grid-auto-columns"].invalid_values
+ };
+
+ gCSSProperties["grid-template-columns"] = {
+ domProp: "gridTemplateColumns",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [
+ "auto",
+ "40px",
+ "2.5fr",
+ "[normal] 40px [] auto [ ] 12%",
+ "[foo] 40px min-content [ bar ] calc(2px - 99%) max-content",
+ "40px min-content calc(20px + 10%) max-content",
+ "minmax(min-content, auto)",
+ "minmax(auto, max-content)",
+ "m\\69nmax(20px, 4Fr)",
+ "40px MinMax(min-content, calc(20px + 10%)) max-content",
+ "40px 2em",
+ "[] 40px [-foo] 2em [bar baz This\ is\ one\ ident]",
+ // TODO bug 978478: "[a] repeat(3, [b] 20px [c] 40px [d]) [e]",
+ "repeat(1, 20px)",
+ "repeat(1, [a] 20px)",
+ "[a] Repeat(4, [a] 20px [] auto [b c]) [d]",
+ "[a] 2.5fr Repeat(4, [a] 20px [] auto [b c]) [d]",
+ "[a] 2.5fr [z] Repeat(4, [a] 20px [] auto [b c]) [d]",
+ "[a] 2.5fr [z] Repeat(4, [a] 20px [] auto) [d]",
+ "[a] 2.5fr [z] Repeat(4, 20px [b c] auto [b c]) [d]",
+ "[a] 2.5fr [z] Repeat(4, 20px auto) [d]",
+ "repeat(auto-fill, 0)",
+ "[a] repeat( Auto-fill,1%)",
+ "minmax(auto,0) [a] repeat(Auto-fit, 0) minmax(0,auto)",
+ "minmax(calc(1% + 1px),auto) repeat(Auto-fit,[] 1%) minmax(auto,1%)",
+ "[a] repeat( auto-fit,[a b] minmax(0,0) )",
+ "[a] 40px repeat(auto-fit,[a b] minmax(1px, 0) [])",
+ "[a] calc(1px - 99%) [b] repeat(auto-fit,[a b] minmax(1mm, 1%) [c]) [c]",
+ "repeat(auto-fill,minmax(1%,auto))",
+ "repeat(auto-fill,minmax(1em,min-content)) minmax(min-content,0)",
+ "repeat(auto-fill,minmax(max-content,1mm))",
+ "fit-content(1px) 1fr",
+ "[a] fit-content(calc(1px - 99%)) [b]",
+ "[a] fit-content(10%) [b c] fit-content(1em)",
+ ],
+ invalid_values: [
+ "",
+ "normal",
+ "40ms",
+ "-40px",
+ "-12%",
+ "-2fr",
+ "[foo]",
+ "[inherit] 40px",
+ "[initial] 40px",
+ "[unset] 40px",
+ "[default] 40px",
+ "[span] 40px",
+ "[6%] 40px",
+ "[5th] 40px",
+ "[foo[] bar] 40px",
+ "[foo]] 40px",
+ "(foo) 40px",
+ "[foo] [bar] 40px",
+ "40px [foo] [bar]",
+ "minmax()",
+ "minmax(20px)",
+ "mİnmax(20px, 100px)",
+ "minmax(20px, 100px, 200px)",
+ "maxmin(100px, 20px)",
+ "minmax(min-content, minmax(30px, max-content))",
+ "repeat(0, 20px)",
+ "repeat(-3, 20px)",
+ "rêpeat(1, 20px)",
+ "repeat(1)",
+ "repeat(1, )",
+ "repeat(3px, 20px)",
+ "repeat(2.0, 20px)",
+ "repeat(2.5, 20px)",
+ "repeat(2, (foo))",
+ "repeat(2, foo)",
+ "40px calc(0px + rubbish)",
+ "repeat(1, repeat(1, 20px))",
+ "repeat(auto-fill, auto)",
+ "repeat(auto-fit,auto)",
+ "repeat(auto-fit,[])",
+ "repeat(auto-fill, 0) repeat(auto-fit, 0) ",
+ "repeat(auto-fit, 0) repeat(auto-fill, 0) ",
+ "[a] repeat(auto-fit, 0) repeat(auto-fit, 0) ",
+ "[a] repeat(auto-fill, 0) [a] repeat(auto-fill, 0) ",
+ "repeat(auto-fill, 0 0)",
+ "repeat(auto-fill, 0 [] 0)",
+ "repeat(auto-fill, min-content)",
+ "repeat(auto-fit,max-content)",
+ "repeat(auto-fit,1fr)",
+ "repeat(auto-fit,minmax(auto,auto))",
+ "repeat(auto-fit,minmax(min-content,1fr))",
+ "repeat(auto-fit,minmax(1fr,auto))",
+ "repeat(auto-fill,minmax(1fr,1em))",
+ "repeat(auto-fill, 10px) auto",
+ "auto repeat(auto-fit, 10px)",
+ "minmax(min-content,max-content) repeat(auto-fit, 0)",
+ "10px [a] 10px [b a] 1fr [b] repeat(auto-fill, 0)",
+ "fit-content(-1px)",
+ "fit-content(auto)",
+ "fit-content(min-content)",
+ ],
+ unbalanced_values: [
+ "(foo] 40px",
+ ]
+ };
+ if (isGridTemplateSubgridValueEnabled) {
+ gCSSProperties["grid-template-columns"].other_values.push(
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=981300
+ "[none auto subgrid min-content max-content foo] 40px",
+
+ "subgrid",
+ "subgrid [] [foo bar]",
+ "subgrid repeat(1, [])",
+ "subgrid Repeat(4, [a] [b c] [] [d])",
+ "subgrid repeat(auto-fill, [])",
+ "subgrid [x] repeat( Auto-fill, [a b c]) []",
+ "subgrid [x] repeat(auto-fill, []) [y z]"
+ );
+ gCSSProperties["grid-template-columns"].invalid_values.push(
+ "subgrid [inherit]",
+ "subgrid [initial]",
+ "subgrid [unset]",
+ "subgrid [default]",
+ "subgrid [span]",
+ "subgrid [foo] 40px",
+ "subgrid [foo 40px]",
+ "[foo] subgrid",
+ "subgrid rêpeat(1, [])",
+ "subgrid repeat(0, [])",
+ "subgrid repeat(-3, [])",
+ "subgrid repeat(2.0, [])",
+ "subgrid repeat(2.5, [])",
+ "subgrid repeat(3px, [])",
+ "subgrid repeat(1)",
+ "subgrid repeat(1, )",
+ "subgrid repeat(2, [40px])",
+ "subgrid repeat(2, foo)",
+ "subgrid repeat(1, repeat(1, []))",
+ "subgrid repeat(auto-fit,[])",
+ "subgrid [] repeat(auto-fit,[])",
+ "subgrid [a] repeat(auto-fit,[])",
+ "subgrid repeat(auto-fill, 1px)",
+ "subgrid repeat(auto-fill, 1px [])",
+ "subgrid repeat(Auto-fill, [a] [b c] [] [d])",
+ "subgrid repeat(auto-fill, []) repeat(auto-fill, [])"
+ );
+ }
+ gCSSProperties["grid-template-rows"] = {
+ domProp: "gridTemplateRows",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: gCSSProperties["grid-template-columns"].initial_values,
+ other_values: gCSSProperties["grid-template-columns"].other_values,
+ invalid_values: gCSSProperties["grid-template-columns"].invalid_values
+ };
+ gCSSProperties["grid-template-areas"] = {
+ domProp: "gridTemplateAreas",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [
+ "''",
+ "'' ''",
+ "'1a-é_ .' \"b .\"",
+ "' Z\t\\aZ' 'Z Z'",
+ " '. . a b' '. .a b' ",
+ "'a.b' '. . .'",
+ "'.' '..'",
+ "'...' '.'",
+ "'...-blah' '. .'",
+ "'.. ..' '.. ...'",
+ ],
+ invalid_values: [
+ "'a b' 'a/b'",
+ "'a . a'",
+ "'. a a' 'a a a'",
+ "'a a .' 'a a a'",
+ "'a a' 'a .'",
+ "'a a'\n'..'\n'a a'",
+ ]
+ };
+
+ gCSSProperties["grid-template"] = {
+ domProp: "gridTemplate",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [
+ "grid-template-areas",
+ "grid-template-rows",
+ "grid-template-columns",
+ ],
+ initial_values: [
+ "none",
+ "none / none",
+ ],
+ other_values: [
+ // <'grid-template-rows'> / <'grid-template-columns'>
+ "40px / 100px",
+ "[foo] 40px [bar] / [baz] repeat(auto-fill,100px) [fizz]",
+ " none/100px",
+ "40px/none",
+ // [ ? ? ? ]+ [ / ]?
+ "'fizz'",
+ "[bar] 'fizz'",
+ "'fizz' / [foo] 40px",
+ "[bar] 'fizz' / [foo] 40px",
+ "'fizz' 100px / [foo] 40px",
+ "[bar] 'fizz' 100px / [foo] 40px",
+ "[bar] 'fizz' 100px [buzz] / [foo] 40px",
+ "[bar] 'fizz' 100px [buzz] \n [a] '.' 200px [b] / [foo] 40px",
+ ],
+ invalid_values: [
+ "'fizz' / repeat(1, 100px)",
+ "'fizz' repeat(1, 100px) / 0px",
+ "[foo] [bar] 40px / 100px",
+ "[fizz] [buzz] 100px / 40px",
+ "[fizz] [buzz] 'foo' / 40px",
+ "'foo' / none"
+ ]
+ };
+ if (isGridTemplateSubgridValueEnabled) {
+ gCSSProperties["grid-template"].other_values.push(
+ "subgrid",
+ "subgrid/40px 20px",
+ "subgrid [foo] [] [bar baz] / 40px 20px",
+ "40px 20px/subgrid",
+ "40px 20px/subgrid [foo] [] repeat(3, [a] [b]) [bar baz]",
+ "subgrid/subgrid",
+ "subgrid [foo] [] [bar baz]/subgrid [foo] [] [bar baz]"
+ );
+ gCSSProperties["grid-template"].invalid_values.push(
+ "subgrid []",
+ "subgrid [] / 'fizz'",
+ "subgrid / 'fizz'"
+ );
+ }
+
+ gCSSProperties["grid"] = {
+ domProp: "grid",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [
+ "grid-template-areas",
+ "grid-template-rows",
+ "grid-template-columns",
+ "grid-auto-flow",
+ "grid-auto-rows",
+ "grid-auto-columns",
+ "grid-column-gap",
+ "grid-row-gap",
+ ],
+ initial_values: [
+ "none",
+ "none / none",
+ ],
+ other_values: [
+ "auto-flow 40px / none",
+ "auto-flow / 40px",
+ "auto-flow dense auto / auto",
+ "dense auto-flow minmax(min-content, 2fr) / auto",
+ "dense auto-flow / 100px",
+ "none / auto-flow 40px",
+ "40px / auto-flow",
+ "none / dense auto-flow auto",
+ ].concat(
+ gCSSProperties["grid-template"].other_values
+ ),
+ invalid_values: [
+ "auto-flow",
+ " / auto-flow",
+ "dense 0 / 0",
+ "dense dense 40px / 0",
+ "auto-flow / auto-flow",
+ "auto-flow / dense",
+ "auto-flow [a] 0 / 0",
+ "0 / auto-flow [a] 0",
+ "auto-flow -20px / 0",
+ "auto-flow 200ms / 0",
+ "auto-flow 40px 100px / 0",
+ ].concat(
+ gCSSProperties["grid-template"].invalid_values,
+ gCSSProperties["grid-auto-flow"].other_values,
+ gCSSProperties["grid-auto-flow"].invalid_values
+ .filter((v) => v != 'none')
+ )
+ };
+
+ var gridLineOtherValues = [
+ "foo",
+ "2",
+ "2 foo",
+ "foo 2",
+ "-3",
+ "-3 bar",
+ "bar -3",
+ "span 2",
+ "2 span",
+ "span foo",
+ "foo span",
+ "span 2 foo",
+ "span foo 2",
+ "2 foo span",
+ "foo 2 span",
+ ];
+ var gridLineInvalidValues = [
+ "",
+ "4th",
+ "span",
+ "inherit 2",
+ "2 inherit",
+ "20px",
+ "2 3",
+ "2.5",
+ "2.0",
+ "0",
+ "0 foo",
+ "span 0",
+ "2 foo 3",
+ "foo 2 foo",
+ "2 span foo",
+ "foo span 2",
+ "span -3",
+ "span -3 bar",
+ "span 2 span",
+ "span foo span",
+ "span 2 foo span",
+ ];
+
+ gCSSProperties["grid-column-start"] = {
+ domProp: "gridColumnStart",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: gridLineOtherValues,
+ invalid_values: gridLineInvalidValues
+ };
+ gCSSProperties["grid-column-end"] = {
+ domProp: "gridColumnEnd",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: gridLineOtherValues,
+ invalid_values: gridLineInvalidValues
+ };
+ gCSSProperties["grid-row-start"] = {
+ domProp: "gridRowStart",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: gridLineOtherValues,
+ invalid_values: gridLineInvalidValues
+ };
+ gCSSProperties["grid-row-end"] = {
+ domProp: "gridRowEnd",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: gridLineOtherValues,
+ invalid_values: gridLineInvalidValues
+ };
+
+ // The grid-column and grid-row shorthands take values of the form
+ // [ / ]?
+ var gridColumnRowOtherValues = [].concat(gridLineOtherValues);
+ gridLineOtherValues.concat([ "auto" ]).forEach(function(val) {
+ gridColumnRowOtherValues.push(" foo / " + val);
+ gridColumnRowOtherValues.push(val + "/2");
+ });
+ var gridColumnRowInvalidValues = [
+ "foo, bar",
+ "foo / bar / baz",
+ ].concat(gridLineInvalidValues);
+ gridLineInvalidValues.forEach(function(val) {
+ gridColumnRowInvalidValues.push("span 3 / " + val);
+ gridColumnRowInvalidValues.push(val + " / foo");
+ });
+ gCSSProperties["grid-column"] = {
+ domProp: "gridColumn",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [
+ "grid-column-start",
+ "grid-column-end"
+ ],
+ initial_values: [ "auto", "auto / auto" ],
+ other_values: gridColumnRowOtherValues,
+ invalid_values: gridColumnRowInvalidValues
+ };
+ gCSSProperties["grid-row"] = {
+ domProp: "gridRow",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [
+ "grid-row-start",
+ "grid-row-end"
+ ],
+ initial_values: [ "auto", "auto / auto" ],
+ other_values: gridColumnRowOtherValues,
+ invalid_values: gridColumnRowInvalidValues
+ };
+
+ var gridAreaOtherValues = gridLineOtherValues.slice();
+ gridLineOtherValues.forEach(function(val) {
+ gridAreaOtherValues.push("foo / " + val);
+ gridAreaOtherValues.push(val + "/2/3");
+ gridAreaOtherValues.push("foo / bar / " + val + " / baz");
+ });
+ var gridAreaInvalidValues = [
+ "foo, bar",
+ "foo / bar / baz / fizz / buzz",
+ "default / foo / bar / baz",
+ "foo / initial / bar / baz",
+ "foo / bar / inherit / baz",
+ "foo / bar / baz / unset",
+ ].concat(gridLineInvalidValues);
+ gridLineInvalidValues.forEach(function(val) {
+ gridAreaInvalidValues.push("foo / " + val);
+ gridAreaInvalidValues.push("foo / bar / " + val);
+ gridAreaInvalidValues.push("foo / 4 / bar / " + val);
+ });
+
+ gCSSProperties["grid-area"] = {
+ domProp: "gridArea",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [
+ "grid-row-start",
+ "grid-column-start",
+ "grid-row-end",
+ "grid-column-end"
+ ],
+ initial_values: [
+ "auto",
+ "auto / auto",
+ "auto / auto / auto",
+ "auto / auto / auto / auto"
+ ],
+ other_values: gridAreaOtherValues,
+ invalid_values: gridAreaInvalidValues
+ };
+
+ gCSSProperties["grid-column-gap"] = {
+ domProp: "gridColumnGap",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0" ],
+ other_values: [ "2px", "2%", "1em", "calc(1px + 1em)", "calc(1%)",
+ "calc(1% + 1ch)" , "calc(1px - 99%)" ],
+ invalid_values: [ "-1px", "auto", "none", "1px 1px", "-1%", "fit-content(1px)" ],
+ };
+ gCSSProperties["grid-row-gap"] = {
+ domProp: "gridRowGap",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0" ],
+ other_values: [ "2px", "2%", "1em", "calc(1px + 1em)", "calc(1%)",
+ "calc(1% + 1ch)" , "calc(1px - 99%)" ],
+ invalid_values: [ "-1px", "auto", "none", "1px 1px", "-1%", "min-content" ],
+ };
+ gCSSProperties["grid-gap"] = {
+ domProp: "gridGap",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "grid-column-gap", "grid-row-gap" ],
+ initial_values: [ "0", "0 0" ],
+ other_values: [ "1ch 0", "1px 1%", "1em 1px", "calc(1px) calc(1%)" ],
+ invalid_values: [ "-1px", "1px -1px", "1px 1px 1px", "inherit 1px",
+ "1px auto" ]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.display-contents.enabled")) {
+ gCSSProperties["display"].other_values.push("contents");
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.contain.enabled")) {
+ gCSSProperties["contain"] = {
+ domProp: "contain",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [
+ "strict",
+ "layout",
+ "style",
+ "layout style",
+ "style layout",
+ "paint",
+ "layout paint",
+ "paint layout",
+ "style paint",
+ "paint style",
+ "layout style paint",
+ "layout paint style",
+ "style paint layout",
+ "paint style layout",
+ ],
+ invalid_values: [
+ "none strict",
+ "strict layout",
+ "strict layout style",
+ "layout strict",
+ "layout style strict",
+ "layout style paint strict",
+ "paint strict",
+ "style strict",
+ "paint paint",
+ "strict strict",
+ "auto",
+ "10px",
+ "0",
+ ]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.image-orientation.enabled")) {
+ gCSSProperties["image-orientation"] = {
+ domProp: "imageOrientation",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [
+ "0deg",
+ "0grad",
+ "0rad",
+ "0turn",
+
+ // Rounded initial values.
+ "-90deg",
+ "15deg",
+ "360deg",
+ ],
+ other_values: [
+ "0deg flip",
+ "90deg",
+ "90deg flip",
+ "180deg",
+ "180deg flip",
+ "270deg",
+ "270deg flip",
+ "flip",
+ "from-image",
+
+ // Grad units.
+ "0grad flip",
+ "100grad",
+ "100grad flip",
+ "200grad",
+ "200grad flip",
+ "300grad",
+ "300grad flip",
+
+ // Radian units.
+ "0rad flip",
+ "1.57079633rad",
+ "1.57079633rad flip",
+ "3.14159265rad",
+ "3.14159265rad flip",
+ "4.71238898rad",
+ "4.71238898rad flip",
+
+ // Turn units.
+ "0turn flip",
+ "0.25turn",
+ "0.25turn flip",
+ "0.5turn",
+ "0.5turn flip",
+ "0.75turn",
+ "0.75turn flip",
+
+ // Rounded values.
+ "-45deg flip",
+ "65deg flip",
+ "400deg flip",
+ ],
+ invalid_values: [
+ "none",
+ "0deg none",
+ "flip 0deg",
+ "flip 0deg",
+ "0",
+ "0 flip",
+ "flip 0",
+ "0deg from-image",
+ "from-image 0deg",
+ "flip from-image",
+ "from-image flip",
+ ]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.initial-letter.enabled")) {
+ gCSSProperties["initial-letter"] = {
+ domProp: "initialLetter",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "2", "2.5", "3.7 2", "4 3" ],
+ invalid_values: [ "-3", "3.7 -2", "25%", "16px", "1 0", "0", "0 1" ]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.osx-font-smoothing.enabled")) {
+ gCSSProperties["-moz-osx-font-smoothing"] = {
+ domProp: "MozOsxFontSmoothing",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "grayscale" ],
+ invalid_values: [ "none", "subpixel-antialiased", "antialiased" ]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.mix-blend-mode.enabled")) {
+ gCSSProperties["mix-blend-mode"] = {
+ domProp: "mixBlendMode",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: ["multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn",
+ "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"],
+ invalid_values: []
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.isolation.enabled")) {
+ gCSSProperties["isolation"] = {
+ domProp: "isolation",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: ["isolate"],
+ invalid_values: []
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.background-blend-mode.enabled")) {
+ gCSSProperties["background-blend-mode"] = {
+ domProp: "backgroundBlendMode",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "normal" ],
+ other_values: [ "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn",
+ "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity" ],
+ invalid_values: ["none", "10px", "multiply multiply"]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.object-fit-and-position.enabled")) {
+ gCSSProperties["object-fit"] = {
+ domProp: "objectFit",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "fill" ],
+ other_values: [ "contain", "cover", "none", "scale-down" ],
+ invalid_values: [ "auto", "5px", "100%" ]
+ };
+ gCSSProperties["object-position"] = {
+ domProp: "objectPosition",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "50% 50%", "50%", "center", "center center" ],
+ other_values: [
+ "calc(20px)",
+ "calc(20px) 10px",
+ "10px calc(20px)",
+ "calc(20px) 25%",
+ "25% calc(20px)",
+ "calc(20px) calc(20px)",
+ "calc(20px + 1em) calc(20px / 2)",
+ "calc(20px + 50%) calc(50% - 10px)",
+ "calc(-20px) calc(-50%)",
+ "calc(-20%) calc(-50%)",
+ "0px 0px",
+ "right 20px top 60px",
+ "right 20px bottom 60px",
+ "left 20px top 60px",
+ "left 20px bottom 60px",
+ "right -50px top -50px",
+ "left -50px bottom -50px",
+ "right 20px top -50px",
+ "right -20px top 50px",
+ "right 3em bottom 10px",
+ "bottom 3em right 10px",
+ "top 3em right 10px",
+ "left 15px",
+ "10px top",
+ "left top 15px",
+ "left 10px top",
+ "left 20%",
+ "right 20%"
+ ],
+ invalid_values: [ "center 10px center 4px", "center 10px center",
+ "top 20%", "bottom 20%", "50% left", "top 50%",
+ "50% bottom 10%", "right 10% 50%", "left right",
+ "top bottom", "left 10% right",
+ "top 20px bottom 20px", "left left", "20 20" ]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.overflow-clip-box.enabled")) {
+ gCSSProperties["overflow-clip-box"] = {
+ domProp: "overflowClipBox",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "padding-box" ],
+ other_values: [ "content-box" ],
+ invalid_values: [ "none", "auto", "border-box", "0" ]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.box-decoration-break.enabled")) {
+ gCSSProperties["box-decoration-break"] = {
+ domProp: "boxDecorationBreak",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "slice" ],
+ other_values: [ "clone" ],
+ invalid_values: [ "auto", "none", "1px" ]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.scroll-behavior.property-enabled")) {
+ gCSSProperties["scroll-behavior"] = {
+ domProp: "scrollBehavior",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "smooth" ],
+ invalid_values: [ "none", "1px" ]
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.scroll-snap.enabled")) {
+ gCSSProperties["scroll-snap-coordinate"] = {
+ domProp: "scrollSnapCoordinate",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "25% 25%", "top", "0px 100px, 10em 50%",
+ "top left, top right, bottom left, bottom right, center",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)",
+ "calc(20%) calc(3*25px), center"],
+ invalid_values: [ "auto", "default" ]
+ }
+ gCSSProperties["scroll-snap-destination"] = {
+ domProp: "scrollSnapDestination",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0px 0px" ],
+ other_values: [ "25% 25%", "6px 5px", "20% 3em", "0in 1in",
+ "top", "right", "top left", "top right", "center",
+ "calc(2px)",
+ "calc(50%)",
+ "calc(3*25px)",
+ "calc(3*25px) 5px",
+ "5px calc(3*25px)",
+ "calc(20%) calc(3*25px)",
+ "calc(25px*3)",
+ "calc(3*25px + 50%)"],
+ invalid_values: [ "auto", "none", "default" ]
+ }
+ gCSSProperties["scroll-snap-points-x"] = {
+ domProp: "scrollSnapPointsX",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "repeat(100%)", "repeat(120px)", "repeat(calc(3*25px))" ],
+ invalid_values: [ "auto", "1px", "left", "rgb(1,2,3)" ]
+ }
+ gCSSProperties["scroll-snap-points-y"] = {
+ domProp: "scrollSnapPointsY",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "repeat(100%)", "repeat(120px)", "repeat(calc(3*25px))" ],
+ invalid_values: [ "auto", "1px", "top", "rgb(1,2,3)" ]
+ }
+ gCSSProperties["scroll-snap-type"] = {
+ domProp: "scrollSnapType",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ subproperties: [ "scroll-snap-type-x", "scroll-snap-type-y" ],
+ initial_values: [ "none" ],
+ other_values: [ "mandatory", "proximity" ],
+ invalid_values: [ "auto", "1px" ]
+ };
+ gCSSProperties["scroll-snap-type-x"] = {
+ domProp: "scrollSnapTypeX",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: ["mandatory", "proximity"],
+ invalid_values: [ "auto", "1px" ]
+ };
+ gCSSProperties["scroll-snap-type-y"] = {
+ domProp: "scrollSnapTypeY",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: ["mandatory", "proximity"],
+ invalid_values: [ "auto", "1px" ]
+ };
+}
+
+function SupportsMaskShorthand() {
+ return "maskImage" in document.documentElement.style;
+}
+
+if (SupportsMaskShorthand()) {
+ gCSSProperties["mask"] = {
+ domProp: "mask",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ /* FIXME: All mask-border-* should be added when we implement them. */
+ subproperties: ["mask-clip", "mask-image", "mask-mode", "mask-origin", "mask-position-x", "mask-position-y", "mask-repeat", "mask-size" , "mask-composite"],
+ initial_values: [ "match-source", "none", "repeat", "add", "0% 0%", "top left", "0% 0% / auto", "top left / auto", "left top / auto", "0% 0% / auto auto",
+ "top left none", "left top none", "none left top", "none top left", "none 0% 0%", "top left / auto none", "left top / auto none",
+ "top left / auto auto none",
+ "match-source none repeat add top left", "top left repeat none add", "none repeat add top left / auto", "top left / auto repeat none add match-source", "none repeat add 0% 0% / auto auto match-source",
+ "border-box", "border-box border-box" ],
+ other_values: [
+ "none alpha repeat add left top",
+ "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
+ "no-repeat url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==') alpha left top add",
+ "repeat-x",
+ "repeat-y",
+ "no-repeat",
+ "none repeat-y alpha add 0% 0%",
+ "subtract",
+ "0% top subtract alpha repeat none",
+ "top",
+ "left",
+ "50% 50%",
+ "center",
+ "top / 100px",
+ "left / contain",
+ "left / cover",
+ "10px / 10%",
+ "10em / calc(20px)",
+ "top left / 100px 100px",
+ "top left / 100px auto",
+ "top left / 100px 10%",
+ "top left / 100px calc(20px)",
+ "bottom right add none alpha repeat",
+ "50% alpha",
+ "alpha 50%",
+ "50%",
+ "url(#mymask)",
+ "-moz-radial-gradient(10% bottom, #ffffff, black) add no-repeat",
+ "-moz-linear-gradient(10px 10px -45deg, red, blue) repeat",
+ "-moz-linear-gradient(10px 10px -0.125turn, red, blue) repeat",
+ "-moz-repeating-radial-gradient(10% bottom, #ffffff, black) add no-repeat",
+ "-moz-repeating-linear-gradient(10px 10px -45deg, red, blue) repeat",
+ "-moz-element(#test) alpha",
+ /* multiple mask-image */
+ "url(404.png), url(404.png)",
+ "repeat-x, subtract, none",
+ "0% top url(404.png), url(404.png) 50% top",
+ "subtract repeat-y top left url(404.png), repeat-x alpha",
+ "url(404.png), -moz-linear-gradient(20px 20px -45deg, blue, green), -moz-element(#a) alpha",
+ "top left / contain, bottom right / cover",
+ /* test cases with clip+origin in the shorthand */
+ "url(404.png) alpha padding-box",
+ "url(404.png) border-box alpha",
+ "content-box url(404.png)",
+ "url(404.png) alpha padding-box padding-box",
+ "url(404.png) alpha padding-box border-box",
+ "content-box border-box url(404.png)",
+ ],
+ invalid_values: [
+ /* mixes with keywords have to be in correct order */
+ "50% left", "top 50%",
+ /* no quirks mode colors */
+ "-moz-radial-gradient(10% bottom, ffffff, black) add no-repeat",
+ /* no quirks mode lengths */
+ "-moz-linear-gradient(10 10px -45deg, red, blue) repeat",
+ "-moz-linear-gradient(10px 10 -45deg, red, blue) repeat",
+ "linear-gradient(red -99, yellow, green, blue 120%)",
+ /* bug 258080: don't accept background-position separated */
+ "left url(404.png) top", "top url(404.png) left",
+ "alpha padding-box url(404.png) border-box",
+ "alpha padding-box url(404.png) padding-box",
+ "-moz-element(#a rubbish)",
+ "left top / match-source"
+ ]
+ };
+ gCSSProperties["mask-clip"] = {
+ domProp: "maskClip",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "border-box" ],
+ other_values: [ "content-box", "padding-box", "border-box, padding-box", "padding-box, padding-box, padding-box", "border-box, border-box" ],
+ invalid_values: [ "margin-box", "content-box content-box" ]
+ };
+ gCSSProperties["mask-image"] = {
+ domProp: "maskImage",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [
+ "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)", "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
+ "none, none",
+ "none, none, none, none, none",
+ "url(#mymask)",
+ "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
+ "none, url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
+ "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
+ ].concat(validGradientAndElementValues),
+ invalid_values: [
+ ].concat(invalidGradientAndElementValues),
+ unbalanced_values: [
+ ].concat(unbalancedGradientAndElementValues)
+ };
+ gCSSProperties["mask-mode"] = {
+ domProp: "maskMode",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "match-source" ],
+ other_values: [ "alpha", "luminance", "match-source, match-source", "match-source, alpha", "alpha, luminance, match-source"],
+ invalid_values: [ "match-source match-source", "alpha match-source" ]
+ };
+ gCSSProperties["mask-composite"] = {
+ domProp: "maskComposite",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "add" ],
+ other_values: [ "subtract", "intersect", "exclude", "add, add", "subtract, intersect", "subtract, subtract, add"],
+ invalid_values: [ "add subtract", "intersect exclude" ]
+ };
+ gCSSProperties["mask-origin"] = {
+ domProp: "maskOrigin",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "border-box" ],
+ other_values: [ "padding-box", "content-box", "border-box, padding-box", "padding-box, padding-box, padding-box", "border-box, border-box" ],
+ invalid_values: [ "margin-box", "padding-box padding-box" ]
+ };
+ gCSSProperties["mask-position"] = {
+ domProp: "maskPosition",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ initial_values: [ "top 0% left 0%", "top 0% left", "top left", "left top", "0% 0%", "0% top", "left 0%" ],
+ other_values: [ "top", "left", "right", "bottom", "center", "center bottom", "bottom center", "center right", "right center", "center top", "top center", "center left", "left center", "right bottom", "bottom right", "50%", "top left, top left", "top left, top right", "top right, top left", "left top, 0% 0%", "10% 20%, 30%, 40%", "top left, bottom right", "right bottom, left top", "0%", "0px", "30px", "0%, 10%, 20%, 30%", "top, top, top, top, top",
+ "calc(20px)",
+ "calc(20px) 10px",
+ "10px calc(20px)",
+ "calc(20px) 25%",
+ "25% calc(20px)",
+ "calc(20px) calc(20px)",
+ "calc(20px + 1em) calc(20px / 2)",
+ "calc(20px + 50%) calc(50% - 10px)",
+ "calc(-20px) calc(-50%)",
+ "calc(-20%) calc(-50%)",
+ "0px 0px",
+ "right 20px top 60px",
+ "right 20px bottom 60px",
+ "left 20px top 60px",
+ "left 20px bottom 60px",
+ "right -50px top -50px",
+ "left -50px bottom -50px",
+ "right 20px top -50px",
+ "right -20px top 50px",
+ "right 3em bottom 10px",
+ "bottom 3em right 10px",
+ "top 3em right 10px",
+ "left 15px",
+ "10px top",
+ "left top 15px",
+ "left 10px top",
+ "left 20%",
+ "right 20%"
+ ],
+ subproperties: [ "mask-position-x", "mask-position-y" ],
+ invalid_values: [ "center 10px center 4px", "center 10px center",
+ "top 20%", "bottom 20%", "50% left", "top 50%",
+ "50% bottom 10%", "right 10% 50%", "left right",
+ "top bottom", "left 10% right",
+ "top 20px bottom 20px", "left left",
+ "0px calc(0px + rubbish)"],
+ };
+ gCSSProperties["mask-position-x"] = {
+ domProp: "maskPositionX",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "left", "0%" ],
+ other_values: [ "right", "center", "50%", "center, center", "center, right", "right, center", "center, 50%", "10%, 20%, 40%", "1px", "30px", "50%, 10%, 20%, 30%", "center, center, center, center, center",
+ "calc(20px)",
+ "calc(20px + 1em)",
+ "calc(20px / 2)",
+ "calc(20px + 50%)",
+ "calc(50% - 10px)",
+ "calc(-20px)",
+ "calc(-50%)",
+ "calc(-20%)",
+ "right 20px",
+ "left 20px",
+ "right -50px",
+ "left -50px",
+ "right 20px",
+ "right 3em",
+ ],
+ invalid_values: [ "center 10px", "right 10% 50%", "left right", "left left",
+ "bottom 20px", "top 10%", "bottom 3em",
+ "top", "bottom", "top, top", "top, bottom", "bottom, top", "top, 0%", "top, top, top, top, top",
+ "calc(0px + rubbish)", "center 0%"],
+ };
+ gCSSProperties["mask-position-y"] = {
+ domProp: "maskPositionY",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "top", "0%" ],
+ other_values: [ "bottom", "center", "50%", "center, center", "center, bottom", "bottom, center", "center, 0%", "10%, 20%, 40%", "1px", "30px", "50%, 10%, 20%, 30%", "center, center, center, center, center",
+ "calc(20px)",
+ "calc(20px + 1em)",
+ "calc(20px / 2)",
+ "calc(20px + 50%)",
+ "calc(50% - 10px)",
+ "calc(-20px)",
+ "calc(-50%)",
+ "calc(-20%)",
+ "bottom 20px",
+ "top 20px",
+ "bottom -50px",
+ "top -50px",
+ "bottom 20px",
+ "bottom 3em",
+ ],
+ invalid_values: [ "center 10px", "bottom 10% 50%", "top bottom", "top top",
+ "right 20px", "left 10%", "right 3em",
+ "left", "right", "left, left", "left, right", "right, left", "left, 0%", "left, left, left, left, left",
+ "calc(0px + rubbish)", "center 0%"],
+ };
+ gCSSProperties["mask-repeat"] = {
+ domProp: "maskRepeat",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "repeat", "repeat repeat" ],
+ other_values: [ "repeat-x", "repeat-y", "no-repeat",
+ "repeat-x, repeat-x",
+ "repeat, no-repeat",
+ "repeat-y, no-repeat, repeat-y",
+ "repeat, repeat, repeat",
+ "repeat no-repeat",
+ "no-repeat repeat",
+ "no-repeat no-repeat",
+ "repeat no-repeat",
+ "no-repeat no-repeat, no-repeat no-repeat",
+ ],
+ invalid_values: [ "repeat repeat repeat",
+ "repeat-x repeat-y",
+ "repeat repeat-x",
+ "repeat repeat-y",
+ "repeat-x repeat",
+ "repeat-y repeat" ]
+ };
+ gCSSProperties["mask-size"] = {
+ domProp: "maskSize",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto", "auto auto" ],
+ other_values: [ "contain", "cover", "100px auto", "auto 100px", "100% auto", "auto 100%", "25% 50px", "3em 40%",
+ "calc(20px)",
+ "calc(20px) 10px",
+ "10px calc(20px)",
+ "calc(20px) 25%",
+ "25% calc(20px)",
+ "calc(20px) calc(20px)",
+ "calc(20px + 1em) calc(20px / 2)",
+ "calc(20px + 50%) calc(50% - 10px)",
+ "calc(-20px) calc(-50%)",
+ "calc(-20%) calc(-50%)"
+ ],
+ invalid_values: [ "contain contain", "cover cover", "cover auto", "auto cover", "contain cover", "cover contain", "-5px 3px", "3px -5px", "auto -5px", "-5px auto", "5 3", "10px calc(10px + rubbish)" ]
+ };
+} else {
+ gCSSProperties["mask"] = {
+ domProp: "mask",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "none" ],
+ other_values: [ "url(#mymask)" ],
+ invalid_values: []
+ };
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.prefixes.webkit")) {
+ gCSSProperties["-webkit-animation"] = {
+ domProp: "webkitAnimation",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "animation",
+ subproperties: [ "animation-name", "animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state" ],
+ };
+ gCSSProperties["-webkit-animation-delay"] = {
+ domProp: "webkitAnimationDelay",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-delay",
+ subproperties: [ "animation-delay" ],
+ };
+ gCSSProperties["-webkit-animation-direction"] = {
+ domProp: "webkitAnimationDirection",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-direction",
+ subproperties: [ "animation-direction" ],
+ };
+ gCSSProperties["-webkit-animation-duration"] = {
+ domProp: "webkitAnimationDuration",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-duration",
+ subproperties: [ "animation-duration" ],
+ };
+ gCSSProperties["-webkit-animation-fill-mode"] = {
+ domProp: "webkitAnimationFillMode",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-fill-mode",
+ subproperties: [ "animation-fill-mode" ],
+ };
+ gCSSProperties["-webkit-animation-iteration-count"] = {
+ domProp: "webkitAnimationIterationCount",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-iteration-count",
+ subproperties: [ "animation-iteration-count" ],
+ };
+ gCSSProperties["-webkit-animation-name"] = {
+ domProp: "webkitAnimationName",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-name",
+ subproperties: [ "animation-name" ],
+ };
+ gCSSProperties["-webkit-animation-play-state"] = {
+ domProp: "webkitAnimationPlayState",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-play-state",
+ subproperties: [ "animation-play-state" ],
+ };
+ gCSSProperties["-webkit-animation-timing-function"] = {
+ domProp: "webkitAnimationTimingFunction",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "animation-timing-function",
+ subproperties: [ "animation-timing-function" ],
+ };
+ gCSSProperties["-webkit-filter"] = {
+ domProp: "webkitFilter",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "filter",
+ subproperties: [ "filter" ],
+ };
+ gCSSProperties["-webkit-text-fill-color"] = {
+ domProp: "webkitTextFillColor",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "black" },
+ initial_values: [ "currentColor", "black", "#000", "#000000", "rgb(0,0,0)" ],
+ other_values: [ "red", "rgba(255,255,255,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000", "000000", "ff00ff", "rgb(255,xxx,255)" ]
+ };
+ gCSSProperties["-webkit-text-stroke"] = {
+ domProp: "webkitTextStroke",
+ inherited: true,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ prerequisites: { "color": "black" },
+ subproperties: [ "-webkit-text-stroke-width", "-webkit-text-stroke-color" ],
+ initial_values: [ "0 currentColor", "currentColor 0px", "0", "currentColor", "0px black" ],
+ other_values: [ "thin black", "#f00 medium", "thick rgba(0,0,255,0.5)", "calc(4px - 8px) green", "2px", "green 0", "currentColor 4em", "currentColor calc(5px - 1px)" ],
+ invalid_values: [ "-3px black", "calc(50%+ 2px) #000", "30% #f00" ]
+ };
+ gCSSProperties["-webkit-text-stroke-color"] = {
+ domProp: "webkitTextStrokeColor",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ prerequisites: { "color": "black" },
+ initial_values: [ "currentColor", "black", "#000", "#000000", "rgb(0,0,0)" ],
+ other_values: [ "red", "rgba(255,255,255,0.5)", "transparent" ],
+ invalid_values: [ "#0", "#00", "#00000", "#0000000", "#000000000", "000000", "ff00ff", "rgb(255,xxx,255)" ]
+ };
+ gCSSProperties["-webkit-text-stroke-width"] = {
+ domProp: "webkitTextStrokeWidth",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "0", "0px", "0em", "0ex", "calc(0pt)", "calc(4px - 8px)" ],
+ other_values: [ "thin", "medium", "thick", "17px", "0.2em", "calc(3*25px + 5em)", "calc(5px - 1px)" ],
+ invalid_values: [ "5%", "1px calc(nonsense)", "1px red", "-0.1px", "-3px", "30%" ]
+ },
+ gCSSProperties["-webkit-text-size-adjust"] = {
+ domProp: "webkitTextSizeAdjust",
+ inherited: true,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "-moz-text-size-adjust",
+ subproperties: [ "-moz-text-size-adjust" ],
+ };
+ gCSSProperties["-webkit-transform"] = {
+ domProp: "webkitTransform",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transform",
+ subproperties: [ "transform" ],
+ };
+ gCSSProperties["-webkit-transform-origin"] = {
+ domProp: "webkitTransformOrigin",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transform-origin",
+ subproperties: [ "transform-origin" ],
+ };
+ gCSSProperties["-webkit-transform-style"] = {
+ domProp: "webkitTransformStyle",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transform-style",
+ subproperties: [ "transform-style" ],
+ };
+ gCSSProperties["-webkit-backface-visibility"] = {
+ domProp: "webkitBackfaceVisibility",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "backface-visibility",
+ subproperties: [ "backface-visibility" ],
+ };
+ gCSSProperties["-webkit-perspective"] = {
+ domProp: "webkitPerspective",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "perspective",
+ subproperties: [ "perspective" ],
+ };
+ gCSSProperties["-webkit-perspective-origin"] = {
+ domProp: "webkitPerspectiveOrigin",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "perspective-origin",
+ subproperties: [ "perspective-origin" ],
+ };
+ gCSSProperties["-webkit-transition"] = {
+ domProp: "webkitTransition",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "transition",
+ subproperties: [ "transition-property", "transition-duration", "transition-timing-function", "transition-delay" ],
+ };
+ gCSSProperties["-webkit-transition-delay"] = {
+ domProp: "webkitTransitionDelay",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transition-delay",
+ subproperties: [ "transition-delay" ],
+ };
+ gCSSProperties["-webkit-transition-duration"] = {
+ domProp: "webkitTransitionDuration",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transition-duration",
+ subproperties: [ "transition-duration" ],
+ };
+ gCSSProperties["-webkit-transition-property"] = {
+ domProp: "webkitTransitionProperty",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transition-property",
+ subproperties: [ "transition-property" ],
+ };
+ gCSSProperties["-webkit-transition-timing-function"] = {
+ domProp: "webkitTransitionTimingFunction",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "transition-timing-function",
+ subproperties: [ "transition-timing-function" ],
+ };
+ gCSSProperties["-webkit-border-radius"] = {
+ domProp: "webkitBorderRadius",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "border-radius",
+ subproperties: [ "border-bottom-left-radius", "border-bottom-right-radius", "border-top-left-radius", "border-top-right-radius" ],
+ };
+ gCSSProperties["-webkit-border-top-left-radius"] = {
+ domProp: "webkitBorderTopLeftRadius",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "border-top-left-radius",
+ subproperties: [ "border-top-left-radius" ],
+ };
+ gCSSProperties["-webkit-border-top-right-radius"] = {
+ domProp: "webkitBorderTopRightRadius",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "border-top-right-radius",
+ subproperties: [ "border-top-right-radius" ],
+ };
+ gCSSProperties["-webkit-border-bottom-left-radius"] = {
+ domProp: "webkitBorderBottomLeftRadius",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "border-bottom-left-radius",
+ subproperties: [ "border-bottom-left-radius" ],
+ };
+ gCSSProperties["-webkit-border-bottom-right-radius"] = {
+ domProp: "webkitBorderBottomRightRadius",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "border-bottom-right-radius",
+ subproperties: [ "border-bottom-right-radius" ],
+ };
+ gCSSProperties["-webkit-background-clip"] = {
+ domProp: "webkitBackgroundClip",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "background-clip",
+ subproperties: [ "background-clip" ],
+ };
+ gCSSProperties["-webkit-background-origin"] = {
+ domProp: "webkitBackgroundOrigin",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "background-origin",
+ subproperties: [ "background-origin" ],
+ };
+ gCSSProperties["-webkit-background-size"] = {
+ domProp: "webkitBackgroundSize",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "background-size",
+ subproperties: [ "background-size" ],
+ };
+ gCSSProperties["-webkit-border-image"] = {
+ domProp: "webkitBorderImage",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "border-image",
+ subproperties: [ "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat" ],
+ };
+ gCSSProperties["-webkit-box-shadow"] = {
+ domProp: "webkitBoxShadow",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "box-shadow",
+ subproperties: [ "box-shadow" ],
+ };
+ gCSSProperties["-webkit-box-sizing"] = {
+ domProp: "webkitBoxSizing",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "box-sizing",
+ subproperties: [ "box-sizing" ],
+ };
+ gCSSProperties["-webkit-box-flex"] = {
+ domProp: "webkitBoxFlex",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "-moz-box-flex",
+ subproperties: [ "-moz-box-flex" ],
+ };
+ gCSSProperties["-webkit-box-ordinal-group"] = {
+ domProp: "webkitBoxOrdinalGroup",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "-moz-box-ordinal-group",
+ subproperties: [ "-moz-box-ordinal-group" ],
+ };
+ gCSSProperties["-webkit-box-orient"] = {
+ domProp: "webkitBoxOrient",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "-moz-box-orient",
+ subproperties: [ "-moz-box-orient" ],
+ };
+ gCSSProperties["-webkit-box-direction"] = {
+ domProp: "webkitBoxDirection",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "-moz-box-direction",
+ subproperties: [ "-moz-box-direction" ],
+ };
+ gCSSProperties["-webkit-box-align"] = {
+ domProp: "webkitBoxAlign",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "-moz-box-align",
+ subproperties: [ "-moz-box-align" ],
+ };
+ gCSSProperties["-webkit-box-pack"] = {
+ domProp: "webkitBoxPack",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "-moz-box-pack",
+ subproperties: [ "-moz-box-pack" ],
+ };
+ gCSSProperties["-webkit-flex-direction"] = {
+ domProp: "webkitFlexDirection",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "flex-direction",
+ subproperties: [ "flex-direction" ],
+ };
+ gCSSProperties["-webkit-flex-wrap"] = {
+ domProp: "webkitFlexWrap",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "flex-wrap",
+ subproperties: [ "flex-wrap" ],
+ };
+ gCSSProperties["-webkit-flex-flow"] = {
+ domProp: "webkitFlexFlow",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "flex-flow",
+ subproperties: [ "flex-direction", "flex-wrap" ],
+ };
+ gCSSProperties["-webkit-order"] = {
+ domProp: "webkitOrder",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "order",
+ subproperties: [ "order" ],
+ };
+ gCSSProperties["-webkit-flex"] = {
+ domProp: "webkitFlex",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "flex",
+ subproperties: [ "flex-grow", "flex-shrink", "flex-basis" ],
+ };
+ gCSSProperties["-webkit-flex-grow"] = {
+ domProp: "webkitFlexGrow",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "flex-grow",
+ subproperties: [ "flex-grow" ],
+ };
+ gCSSProperties["-webkit-flex-shrink"] = {
+ domProp: "webkitFlexShrink",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "flex-shrink",
+ subproperties: [ "flex-shrink" ],
+ };
+ gCSSProperties["-webkit-flex-basis"] = {
+ domProp: "webkitFlexBasis",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "flex-basis",
+ subproperties: [ "flex-basis" ],
+ };
+ gCSSProperties["-webkit-justify-content"] = {
+ domProp: "webkitJustifyContent",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "justify-content",
+ subproperties: [ "justify-content" ],
+ };
+ gCSSProperties["-webkit-align-items"] = {
+ domProp: "webkitAlignItems",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "align-items",
+ subproperties: [ "align-items" ],
+ };
+ gCSSProperties["-webkit-align-self"] = {
+ domProp: "webkitAlignSelf",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "align-self",
+ subproperties: [ "align-self" ],
+ };
+ gCSSProperties["-webkit-align-content"] = {
+ domProp: "webkitAlignContent",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "align-content",
+ subproperties: [ "align-content" ],
+ };
+ gCSSProperties["-webkit-user-select"] = {
+ domProp: "webkitUserSelect",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "-moz-user-select",
+ subproperties: [ "-moz-user-select" ],
+ };
+
+ if (SupportsMaskShorthand()) {
+ gCSSProperties["-webkit-mask"] = {
+ domProp: "webkitMask",
+ inherited: false,
+ type: CSS_TYPE_TRUE_SHORTHAND,
+ alias_for: "mask",
+ subproperties: [ "mask-clip", "mask-image", "mask-mode", "mask-origin", "mask-position", "mask-repeat", "mask-size" , "mask-composite" ],
+ };
+ gCSSProperties["-webkit-mask-clip"] = {
+ domProp: "webkitMaskClip",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "mask-clip",
+ subproperties: [ "mask-clip" ],
+ };
+
+ gCSSProperties["-webkit-mask-composite"] = {
+ domProp: "webkitMaskComposite",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "mask-composite",
+ subproperties: [ "mask-composite" ],
+ };
+
+ gCSSProperties["-webkit-mask-image"] = {
+ domProp: "webkitMaskImage",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "mask-image",
+ subproperties: [ "mask-image" ],
+ };
+ gCSSProperties["-webkit-mask-origin"] = {
+ domProp: "webkitMaskOrigin",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "mask-origin",
+ subproperties: [ "mask-origin" ],
+ };
+ gCSSProperties["-webkit-mask-position"] = {
+ domProp: "webkitMaskPosition",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "mask-position",
+ subproperties: [ "mask-position" ],
+ };
+ gCSSProperties["-webkit-mask-position-x"] = {
+ domProp: "webkitMaskPositionX",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "mask-position-x",
+ subproperties: [ "mask-position-x" ],
+ };
+ gCSSProperties["-webkit-mask-position-y"] = {
+ domProp: "webkitMaskPositionY",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "mask-position-y",
+ subproperties: [ "mask-position-y" ],
+ };
+ gCSSProperties["-webkit-mask-repeat"] = {
+ domProp: "webkitMaskRepeat",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "mask-repeat",
+ subproperties: [ "mask-repeat" ],
+ };
+ gCSSProperties["-webkit-mask-size"] = {
+ domProp: "webkitMaskSize",
+ inherited: false,
+ type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
+ alias_for: "mask-size",
+ subproperties: [ "mask-size" ],
+ };
+ }
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.unset-value.enabled")) {
+ gCSSProperties["animation"].invalid_values.push("2s unset");
+ gCSSProperties["animation-direction"].invalid_values.push("normal, unset", "unset, normal");
+ gCSSProperties["animation-name"].invalid_values.push("bounce, unset", "unset, bounce");
+ gCSSProperties["-moz-border-bottom-colors"].invalid_values.push("red unset", "unset red");
+ gCSSProperties["-moz-border-left-colors"].invalid_values.push("red unset", "unset red");
+ gCSSProperties["border-radius"].invalid_values.push("unset 2px", "unset / 2px", "2px unset", "2px / unset");
+ gCSSProperties["border-bottom-left-radius"].invalid_values.push("unset 2px", "2px unset");
+ gCSSProperties["border-bottom-right-radius"].invalid_values.push("unset 2px", "2px unset");
+ gCSSProperties["border-top-left-radius"].invalid_values.push("unset 2px", "2px unset");
+ gCSSProperties["border-top-right-radius"].invalid_values.push("unset 2px", "2px unset");
+ gCSSProperties["-moz-border-right-colors"].invalid_values.push("red unset", "unset red");
+ gCSSProperties["-moz-border-top-colors"].invalid_values.push("red unset", "unset red");
+ gCSSProperties["-moz-outline-radius"].invalid_values.push("unset 2px", "unset / 2px", "2px unset", "2px / unset");
+ gCSSProperties["-moz-outline-radius-bottomleft"].invalid_values.push("unset 2px", "2px unset");
+ gCSSProperties["-moz-outline-radius-bottomright"].invalid_values.push("unset 2px", "2px unset");
+ gCSSProperties["-moz-outline-radius-topleft"].invalid_values.push("unset 2px", "2px unset");
+ gCSSProperties["-moz-outline-radius-topright"].invalid_values.push("unset 2px", "2px unset");
+ gCSSProperties["background-image"].invalid_values.push("-moz-linear-gradient(unset, 10px 10px, from(blue))", "-moz-linear-gradient(unset, 10px 10px, blue 0)", "-moz-repeating-linear-gradient(unset, 10px 10px, blue 0)");
+ gCSSProperties["box-shadow"].invalid_values.push("unset, 2px 2px", "2px 2px, unset", "inset unset");
+ gCSSProperties["text-overflow"].invalid_values.push('"hello" unset', 'unset "hello"', 'clip unset', 'unset clip', 'unset inherit', 'unset none', 'initial unset');
+ gCSSProperties["text-shadow"].invalid_values.push("unset, 2px 2px", "2px 2px, unset");
+ gCSSProperties["transition"].invalid_values.push("2s unset");
+ gCSSProperties["transition-property"].invalid_values.push("unset, color", "color, unset");
+ if (IsCSSPropertyPrefEnabled("layout.css.filters.enabled")) {
+ gCSSProperties["filter"].invalid_values.push("drop-shadow(unset, 2px 2px)", "drop-shadow(2px 2px, unset)");
+ }
+ if (IsCSSPropertyPrefEnabled("layout.css.text-align-unsafe-value.enabled")) {
+ gCSSProperties["text-align"].other_values.push("true left");
+ } else {
+ gCSSProperties["text-align"].invalid_values.push("true left");
+ }
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.float-logical-values.enabled")) {
+ gCSSProperties["float"].other_values.push("inline-start");
+ gCSSProperties["float"].other_values.push("inline-end");
+ gCSSProperties["clear"].other_values.push("inline-start");
+ gCSSProperties["clear"].other_values.push("inline-end");
+} else {
+ gCSSProperties["float"].invalid_values.push("inline-start");
+ gCSSProperties["float"].invalid_values.push("inline-end");
+ gCSSProperties["clear"].invalid_values.push("inline-start");
+ gCSSProperties["clear"].invalid_values.push("inline-end");
+}
+
+if (IsCSSPropertyPrefEnabled("layout.css.background-clip-text.enabled")) {
+ gCSSProperties["background-clip"].other_values.push(
+ "text",
+ "content-box, text",
+ "text, border-box",
+ "text, text"
+ );
+ gCSSProperties["background"].other_values.push(
+ "url(404.png) green padding-box text",
+ "content-box text url(404.png) blue"
+ );
+} else {
+ gCSSProperties["background-clip"].invalid_values.push(
+ "text",
+ "content-box, text",
+ "text, border-box",
+ "text, text"
+ );
+ gCSSProperties["background"].invalid_values.push(
+ "url(404.png) green padding-box text",
+ "content-box text url(404.png) blue"
+ );
+}
+
+// Copy aliased properties' fields from their alias targets.
+for (var prop in gCSSProperties) {
+ var entry = gCSSProperties[prop];
+ if (entry.alias_for) {
+ var aliasTargetEntry = gCSSProperties[entry.alias_for];
+ if (!aliasTargetEntry) {
+ ok(false,
+ "Alias '" + prop + "' alias_for field, '" + entry.alias_for + "', " +
+ "must be set to a recognized CSS property in gCSSProperties");
+ } else {
+ // Copy 'values' fields & 'prerequisites' field from aliasTargetEntry:
+ var fieldsToCopy =
+ ["initial_values", "other_values", "invalid_values",
+ "quirks_values", "unbalanced_values",
+ "prerequisites"];
+
+ fieldsToCopy.forEach(function(fieldName) {
+ // (Don't copy the field if the alias already has something there,
+ // or if the aliased property doesn't have anything to copy.)
+ if (!(fieldName in entry) &&
+ fieldName in aliasTargetEntry) {
+ entry[fieldName] = aliasTargetEntry[fieldName]
+ }
+ });
+ }
+ }
+}
+
+if (false) {
+ // TODO These properties are chrome-only, and are not exposed via CSSOM.
+ // We may still want to find a way to test them. See bug 1206999.
+ gCSSProperties["-moz-window-shadow"] = {
+ //domProp: "MozWindowShadow",
+ inherited: false,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "default" ],
+ other_values: [ "none", "menu", "tooltip", "sheet" ],
+ invalid_values: []
+ };
+}
diff --git a/layout/style/test/redirect.sjs b/layout/style/test/redirect.sjs
new file mode 100644
index 000000000..b6249cadf
--- /dev/null
+++ b/layout/style/test/redirect.sjs
@@ -0,0 +1,5 @@
+function handleRequest(request, response)
+{
+ response.setStatusLine(request.httpVersion, 301, "Moved Permanently");
+ response.setHeader("Location", request.queryString, false);
+}
diff --git a/layout/style/test/redundant_font_download.sjs b/layout/style/test/redundant_font_download.sjs
new file mode 100644
index 000000000..7eb7d8f8d
--- /dev/null
+++ b/layout/style/test/redundant_font_download.sjs
@@ -0,0 +1,60 @@
+const BinaryOutputStream =
+ Components.Constructor("@mozilla.org/binaryoutputstream;1",
+ "nsIBinaryOutputStream",
+ "setOutputStream");
+
+// this is simply a hex dump of a red square .PNG image
+const RED_SQUARE =
+ [
+ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00,
+ 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0x00, 0x20, 0x08, 0x02, 0x00, 0x00, 0x00, 0xFC,
+ 0x18, 0xED, 0xA3, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47,
+ 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00, 0x00, 0x28,
+ 0x49, 0x44, 0x41, 0x54, 0x48, 0xC7, 0xED, 0xCD, 0x41, 0x0D,
+ 0x00, 0x00, 0x08, 0x04, 0xA0, 0xD3, 0xFE, 0x9D, 0x35, 0x85,
+ 0x0F, 0x37, 0x28, 0x40, 0x4D, 0x6E, 0x75, 0x04, 0x02, 0x81,
+ 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0xC1, 0x93, 0x60, 0x01,
+ 0xA3, 0xC4, 0x01, 0x3F, 0x58, 0x1D, 0xEF, 0x27, 0x00, 0x00,
+ 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82
+ ];
+
+function handleRequest(request, response)
+{
+ var query = {};
+ request.queryString.split('&').forEach(function (val) {
+ var [name, value] = val.split('=');
+ query[name] = unescape(value);
+ });
+
+ response.setHeader("Cache-Control", "no-cache");
+
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.setHeader("Content-Type", "text/plain", false);
+
+ var log = getState("bug-879963-request-log") || "";
+
+ var stream = new BinaryOutputStream(response.bodyOutputStream);
+
+ if (query["q"] == "init") {
+ log = "init"; // initialize the log, and return a PNG image
+ response.setHeader("Content-Type", "image/png", false);
+ stream.writeByteArray(RED_SQUARE, RED_SQUARE.length);
+ } else if (query["q"] == "image") {
+ log = log + ";" + query["q"];
+ response.setHeader("Content-Type", "image/png", false);
+ stream.writeByteArray(RED_SQUARE, RED_SQUARE.length);
+ } else if (query["q"] == "font") {
+ log = log + ";" + query["q"];
+ // we don't provide a real font; that's ok, OTS will just reject it
+ response.write("Junk");
+ } else if (query["q"] == "report") {
+ // don't include the actual "report" request in the log we return
+ response.write(log);
+ } else {
+ log = log + ";" + query["q"];
+ response.setStatusLine(request.httpVersion, 404, "Not Found");
+ }
+
+ setState("bug-879963-request-log", log);
+}
diff --git a/layout/style/test/style_attribute_tests.js b/layout/style/test/style_attribute_tests.js
new file mode 100644
index 000000000..be24baf95
--- /dev/null
+++ b/layout/style/test/style_attribute_tests.js
@@ -0,0 +1,27 @@
+
+SimpleTest.waitForExplicitFinish();
+
+window.addEventListener("load", runTests, false);
+
+function runTests(event)
+{
+ if (event.target != document) {
+ return;
+ }
+
+ var elt = document.getElementById("content");
+
+ elt.setAttribute("style", "color: blue; background-color: fuchsia");
+ is(elt.style.color, "blue",
+ "setting correct style attribute (color)");
+ is(elt.style.backgroundColor, "fuchsia",
+ "setting correct style attribute (color)");
+
+ elt.setAttribute("style", "{color: blue; background-color: fuchsia}");
+ is(elt.style.color, "",
+ "setting braced style attribute (color)");
+ is(elt.style.backgroundColor, "",
+ "setting braced style attribute (color)");
+
+ SimpleTest.finish();
+}
diff --git a/layout/style/test/support/external-variable-url.css b/layout/style/test/support/external-variable-url.css
new file mode 100644
index 000000000..b13150428
--- /dev/null
+++ b/layout/style/test/support/external-variable-url.css
@@ -0,0 +1,3 @@
+div {
+ --a: url('image.png');
+}
diff --git a/layout/style/test/test_acid3_test46.html b/layout/style/test/test_acid3_test46.html
new file mode 100644
index 000000000..89850f0c5
--- /dev/null
+++ b/layout/style/test/test_acid3_test46.html
@@ -0,0 +1,141 @@
+
+
+
+
+
+ Test for Bug 156716
+
+
+
+
+
+Mozilla Bug 156716
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_addSheet.html b/layout/style/test/test_addSheet.html
new file mode 100644
index 000000000..e112378a9
--- /dev/null
+++ b/layout/style/test/test_addSheet.html
@@ -0,0 +1,46 @@
+
+
+
+ Test for addSheet
+
+
+
+
+Mozilla Bug 1024707
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_additional_sheets.html b/layout/style/test/test_additional_sheets.html
new file mode 100644
index 000000000..f1b8f6ed8
--- /dev/null
+++ b/layout/style/test/test_additional_sheets.html
@@ -0,0 +1,314 @@
+
+
+
+ Test for additional sheets
+
+
+
+
+Mozilla Bug 737003
+
+
+
+
+
+
diff --git a/layout/style/test/test_align_justify_computed_values.html b/layout/style/test/test_align_justify_computed_values.html
new file mode 100644
index 000000000..3cd4b8b0e
--- /dev/null
+++ b/layout/style/test/test_align_justify_computed_values.html
@@ -0,0 +1,529 @@
+
+
+
+
+
+ Test align/justify-items/self/content computed values
+
+
+
+
+Mozilla Bug 696253
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_align_shorthand_serialization.html b/layout/style/test/test_align_shorthand_serialization.html
new file mode 100644
index 000000000..95a3f4814
--- /dev/null
+++ b/layout/style/test/test_align_shorthand_serialization.html
@@ -0,0 +1,123 @@
+
+
+
+
+ Test serialization of CSS Align shorthand properties
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_all_shorthand.html b/layout/style/test/test_all_shorthand.html
new file mode 100644
index 000000000..6185778cc
--- /dev/null
+++ b/layout/style/test/test_all_shorthand.html
@@ -0,0 +1,159 @@
+
+Test the 'all' shorthand property
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_animations.html b/layout/style/test/test_animations.html
new file mode 100644
index 000000000..eaccba122
--- /dev/null
+++ b/layout/style/test/test_animations.html
@@ -0,0 +1,2047 @@
+
+
+
+
+
+ Test for css3-animations (Bug 435442)
+
+
+
+
+
+
+Mozilla Bug 435442
+
+
+
+
+
+
diff --git a/layout/style/test/test_animations_async_tests.html b/layout/style/test/test_animations_async_tests.html
new file mode 100644
index 000000000..5d328c7aa
--- /dev/null
+++ b/layout/style/test/test_animations_async_tests.html
@@ -0,0 +1,26 @@
+
+
+
+
+ Test for Bug 1086937
+
+
+
+
+
+
+Mozilla Bug 1086937
+
+
+
+
+
diff --git a/layout/style/test/test_animations_dynamic_changes.html b/layout/style/test/test_animations_dynamic_changes.html
new file mode 100644
index 000000000..a68d734dc
--- /dev/null
+++ b/layout/style/test/test_animations_dynamic_changes.html
@@ -0,0 +1,65 @@
+
+
+
+
+ Test for Bug 978833
+
+
+
+
+
+Mozilla Bug 978833
+
+
+
+
+
+
diff --git a/layout/style/test/test_animations_effect_timing_duration.html b/layout/style/test/test_animations_effect_timing_duration.html
new file mode 100644
index 000000000..30d77f20a
--- /dev/null
+++ b/layout/style/test/test_animations_effect_timing_duration.html
@@ -0,0 +1,24 @@
+
+
+
+ Test for animation.effect.timing on compositor
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_animations_effect_timing_enddelay.html b/layout/style/test/test_animations_effect_timing_enddelay.html
new file mode 100644
index 000000000..d4ad918dd
--- /dev/null
+++ b/layout/style/test/test_animations_effect_timing_enddelay.html
@@ -0,0 +1,24 @@
+
+
+
+ Test for animation.effect.timing.endDelay on compositor
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_animations_effect_timing_iterations.html b/layout/style/test/test_animations_effect_timing_iterations.html
new file mode 100644
index 000000000..625c52867
--- /dev/null
+++ b/layout/style/test/test_animations_effect_timing_iterations.html
@@ -0,0 +1,24 @@
+
+
+
+ Test for animation.effect.timing.iterations on compositor
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_animations_event_handler_attribute.html b/layout/style/test/test_animations_event_handler_attribute.html
new file mode 100644
index 000000000..e5def2b34
--- /dev/null
+++ b/layout/style/test/test_animations_event_handler_attribute.html
@@ -0,0 +1,147 @@
+
+
+
+
+
+ Test for CSS Animation and Transition event handler
+ attributes. (Bug 911987)
+
+
+
+
+
+
+Mozilla Bug
+ 911987
+
+
+
+
+
diff --git a/layout/style/test/test_animations_event_order.html b/layout/style/test/test_animations_event_order.html
new file mode 100644
index 000000000..5af7639cc
--- /dev/null
+++ b/layout/style/test/test_animations_event_order.html
@@ -0,0 +1,585 @@
+
+
+
+
+
+
+ Test for CSS Animation and Transition event ordering
+ (Bug 1183461)
+
+
+
+
+
+
+
+Mozilla Bug
+ 1183461
+
+
+
+
+
diff --git a/layout/style/test/test_animations_iterationstart.html b/layout/style/test/test_animations_iterationstart.html
new file mode 100644
index 000000000..d6a54f3b2
--- /dev/null
+++ b/layout/style/test/test_animations_iterationstart.html
@@ -0,0 +1,28 @@
+
+
+
+
+ Test for iterationStart on compositor animations (Bug 1248338)
+
+
+
+
+Mozilla Bug 1248338
+
+
+
+
+
+
diff --git a/layout/style/test/test_animations_omta.html b/layout/style/test/test_animations_omta.html
new file mode 100644
index 000000000..4b276c896
--- /dev/null
+++ b/layout/style/test/test_animations_omta.html
@@ -0,0 +1,2392 @@
+
+
+
+
+
+
+ Test for css3-animations running on the compositor thread (Bug
+ 964646)
+
+
+
+
+
+
+
+Mozilla Bug
+ 964646
+
+
+
+
diff --git a/layout/style/test/test_animations_omta_start.html b/layout/style/test/test_animations_omta_start.html
new file mode 100644
index 000000000..235c32342
--- /dev/null
+++ b/layout/style/test/test_animations_omta_start.html
@@ -0,0 +1,189 @@
+
+
+
+
+
+ Test OMTA animations start correctly (Bug 975261)
+
+
+
+
+
+
+
+Mozilla Bug
+ 975261
+
+
+
+
+
+
diff --git a/layout/style/test/test_animations_pausing.html b/layout/style/test/test_animations_pausing.html
new file mode 100644
index 000000000..65dee5b29
--- /dev/null
+++ b/layout/style/test/test_animations_pausing.html
@@ -0,0 +1,28 @@
+
+
+
+
+ Test for play() and pause() on animations (Bug 1070745)
+
+
+
+
+Mozilla Bug 1070745
+
+
+
+
+
+
diff --git a/layout/style/test/test_animations_playbackrate.html b/layout/style/test/test_animations_playbackrate.html
new file mode 100644
index 000000000..16deca02c
--- /dev/null
+++ b/layout/style/test/test_animations_playbackrate.html
@@ -0,0 +1,28 @@
+
+
+
+
+ Test for Animation.playbackRate on compositor animations (Bug 1175751)
+
+
+
+
+Mozilla Bug 1175751
+
+
+
+
+
+
diff --git a/layout/style/test/test_animations_styles_on_event.html b/layout/style/test/test_animations_styles_on_event.html
new file mode 100644
index 000000000..da7680727
--- /dev/null
+++ b/layout/style/test/test_animations_styles_on_event.html
@@ -0,0 +1,28 @@
+
+
+
+
+ Test that mouse movement immediately after finish() should involve restyling for finished state(Bug 1228137)
+
+
+
+
+Mozilla Bug 1228137
+
+
+
+
+
+
diff --git a/layout/style/test/test_animations_with_disabled_properties.html b/layout/style/test/test_animations_with_disabled_properties.html
new file mode 100644
index 000000000..2ac631169
--- /dev/null
+++ b/layout/style/test/test_animations_with_disabled_properties.html
@@ -0,0 +1,34 @@
+
+
+
+
+ Test CSS animations ignore disabled properties (Bug 1265611)
+
+
+
+
+Mozilla Bug
+ 1265611
+
+
+
+
+
diff --git a/layout/style/test/test_any_dynamic.html b/layout/style/test/test_any_dynamic.html
new file mode 100644
index 000000000..ae3276d86
--- /dev/null
+++ b/layout/style/test/test_any_dynamic.html
@@ -0,0 +1,49 @@
+
+
+
+
+ Test for Bug 544834
+
+
+
+
+
+Mozilla Bug 544834
+
+
+
+
+
+
diff --git a/layout/style/test/test_asyncopen2.html b/layout/style/test/test_asyncopen2.html
new file mode 100644
index 000000000..6dda6848a
--- /dev/null
+++ b/layout/style/test/test_asyncopen2.html
@@ -0,0 +1,54 @@
+
+
+
+
+ Bug 1195173 - Test asyncOpen2 security exception
+
+
+
+
+
+
+
+
+Mozilla Bug 1195173
+
+
+
+
+
+
diff --git a/layout/style/test/test_at_rule_parse_serialize.html b/layout/style/test/test_at_rule_parse_serialize.html
new file mode 100644
index 000000000..3723e335b
--- /dev/null
+++ b/layout/style/test/test_at_rule_parse_serialize.html
@@ -0,0 +1,43 @@
+
+
+
+
+ Test for Bug 478160
+
+
+
+
+
+Mozilla Bug 478160
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_attribute_selector_eof_behavior.html b/layout/style/test/test_attribute_selector_eof_behavior.html
new file mode 100644
index 000000000..76635f9ed
--- /dev/null
+++ b/layout/style/test/test_attribute_selector_eof_behavior.html
@@ -0,0 +1,18 @@
+
+
+Test for EOF behavior of attribute selectors in selectors API
+
+
+
+
diff --git a/layout/style/test/test_background_blend_mode.html b/layout/style/test/test_background_blend_mode.html
new file mode 100644
index 000000000..443fe1940
--- /dev/null
+++ b/layout/style/test/test_background_blend_mode.html
@@ -0,0 +1,58 @@
+
+
+
+ Test for miscellaneous computed style issues
+
+
+
+
+Mozilla Bug
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_box_size_keywords.html b/layout/style/test/test_box_size_keywords.html
new file mode 100644
index 000000000..c8bd5e86c
--- /dev/null
+++ b/layout/style/test/test_box_size_keywords.html
@@ -0,0 +1,172 @@
+
+
+
+
+ Test for Bug 1122253
+
+
+
+
+
+Mozilla Bug 1122253
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug1055933.html b/layout/style/test/test_bug1055933.html
new file mode 100644
index 000000000..bce171682
--- /dev/null
+++ b/layout/style/test/test_bug1055933.html
@@ -0,0 +1,42 @@
+
+
+
+
+ Test for Bug 1055933
+
+
+
+
+
+
+Mozilla Bug 1055933
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug1089417.html b/layout/style/test/test_bug1089417.html
new file mode 100644
index 000000000..3b5a217e4
--- /dev/null
+++ b/layout/style/test/test_bug1089417.html
@@ -0,0 +1,47 @@
+
+
+
+
+
+ Test for Bug 1089417
+
+
+
+
+
+Mozilla Bug 1089417
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug1112014.html b/layout/style/test/test_bug1112014.html
new file mode 100644
index 000000000..d0f66aa46
--- /dev/null
+++ b/layout/style/test/test_bug1112014.html
@@ -0,0 +1,127 @@
+
+
+
+
+
+ Test for Bug 1112014
+
+
+
+
+
+Mozilla Bug 1112014
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug1203766.html b/layout/style/test/test_bug1203766.html
new file mode 100644
index 000000000..5d8152440
--- /dev/null
+++ b/layout/style/test/test_bug1203766.html
@@ -0,0 +1,112 @@
+
+
+Test for bug 1203766
+
+
+
+Mozilla Bug 1203766
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug1232829.html b/layout/style/test/test_bug1232829.html
new file mode 100644
index 000000000..8981d56e0
--- /dev/null
+++ b/layout/style/test/test_bug1232829.html
@@ -0,0 +1,38 @@
+
+
+
+
+
+Test for Bug 1232829
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug1292447.html b/layout/style/test/test_bug1292447.html
new file mode 100644
index 000000000..9636780f4
--- /dev/null
+++ b/layout/style/test/test_bug1292447.html
@@ -0,0 +1,377 @@
+
+
+
+
+ Test for Bug 1292447
+
+
+
+
+
+Mozilla Bug 1292447
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug160403.html b/layout/style/test/test_bug160403.html
new file mode 100644
index 000000000..18ad66aa9
--- /dev/null
+++ b/layout/style/test/test_bug160403.html
@@ -0,0 +1,73 @@
+
+
+
+
+ Test for Bug 160403
+
+
+
+
+Mozilla Bug 160403
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug200089.html b/layout/style/test/test_bug200089.html
new file mode 100644
index 000000000..39ab78d59
--- /dev/null
+++ b/layout/style/test/test_bug200089.html
@@ -0,0 +1,30 @@
+
+
+
+
+ Test for Bug 200089
+
+
+
+
+Mozilla Bug 200089
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug221428.html b/layout/style/test/test_bug221428.html
new file mode 100644
index 000000000..25965b567
--- /dev/null
+++ b/layout/style/test/test_bug221428.html
@@ -0,0 +1,68 @@
+
+
+
+
+ Test for Bug 221428
+
+
+
+
+
+
+
+
+Mozilla Bug 221428
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug229915.html b/layout/style/test/test_bug229915.html
new file mode 100644
index 000000000..e3d1f6280
--- /dev/null
+++ b/layout/style/test/test_bug229915.html
@@ -0,0 +1,95 @@
+
+
+
+
+ Test for Bug 229915
+
+
+
+
+
+Mozilla Bug 229915
+
+
+
+
After testing, this should turn green.
+
+
+
+
To be replaced.
+
After testing, this should turn green.
+
+
+
+
Previous paragraph.
+
To be removed.
+
After testing, this should turn green.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug302186.html b/layout/style/test/test_bug302186.html
new file mode 100644
index 000000000..746e7da0a
--- /dev/null
+++ b/layout/style/test/test_bug302186.html
@@ -0,0 +1,508 @@
+
+
+
+
+ Test for Bug 302186
+
+
+
+
+
+
+
+
+
+
+Mozilla Bug 302186
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug319381.html b/layout/style/test/test_bug319381.html
new file mode 100644
index 000000000..f387428e8
--- /dev/null
+++ b/layout/style/test/test_bug319381.html
@@ -0,0 +1,89 @@
+
+
+
+
+ Test for Bug 319381
+
+
+
+
+Mozilla Bug 319381
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug357614.html b/layout/style/test/test_bug357614.html
new file mode 100644
index 000000000..2cfb63044
--- /dev/null
+++ b/layout/style/test/test_bug357614.html
@@ -0,0 +1,73 @@
+
+
+
+
+ Test for Bug 357614
+
+
+
+
+
+Mozilla Bug 357614
+a link
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug363146.html b/layout/style/test/test_bug363146.html
new file mode 100644
index 000000000..dfdc4028b
--- /dev/null
+++ b/layout/style/test/test_bug363146.html
@@ -0,0 +1,62 @@
+
+
+
+
+ Test for Bug 363146
+
+
+
+
+Mozilla Bug 363146
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug372770.html b/layout/style/test/test_bug372770.html
new file mode 100644
index 000000000..208a79e3e
--- /dev/null
+++ b/layout/style/test/test_bug372770.html
@@ -0,0 +1,91 @@
+
+
+
+
+ Test for Bug 372770
+
+
+
+
+
+Mozilla Bug 372770
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug373293.html b/layout/style/test/test_bug373293.html
new file mode 100644
index 000000000..07053303c
--- /dev/null
+++ b/layout/style/test/test_bug373293.html
@@ -0,0 +1,29 @@
+
+
+
+
+ Test for Bug 373293
+
+
+
+
+Mozilla Bug 373293
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug377947.html b/layout/style/test/test_bug377947.html
new file mode 100644
index 000000000..43f60577c
--- /dev/null
+++ b/layout/style/test/test_bug377947.html
@@ -0,0 +1,107 @@
+
+
+
+
+ Test for Bug 377947
+
+
+
+
+Mozilla Bug 377947
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug379440.html b/layout/style/test/test_bug379440.html
new file mode 100644
index 000000000..2a6c392ea
--- /dev/null
+++ b/layout/style/test/test_bug379440.html
@@ -0,0 +1,72 @@
+
+
+
+
+ Test for Bug 379440
+
+
+
+
+
+Mozilla Bug 379440
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug379741.html b/layout/style/test/test_bug379741.html
new file mode 100644
index 000000000..fc99be1ff
--- /dev/null
+++ b/layout/style/test/test_bug379741.html
@@ -0,0 +1,43 @@
+
+
+
+
+ Test for Bug 379741
+
+
+
+
+Mozilla Bug 379741
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug382027.html b/layout/style/test/test_bug382027.html
new file mode 100644
index 000000000..f9a88b17f
--- /dev/null
+++ b/layout/style/test/test_bug382027.html
@@ -0,0 +1,37 @@
+
+
+
+
+ Test for Bug 382027
+
+
+
+
+Mozilla Bug 382027
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug383075.html b/layout/style/test/test_bug383075.html
new file mode 100644
index 000000000..c970a802f
--- /dev/null
+++ b/layout/style/test/test_bug383075.html
@@ -0,0 +1,84 @@
+
+
+
+
+ Test for bug 383075
+
+
+
+
+
+Mozilla bug 383075
+
+
+The X'es below should have the same size:
+
+X
+X
+X
+X
+X
+X
+X
+X
+X
+
+
+
+X
+X
+X
+X
+X
+X
+X
+X
+X
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug387615.html b/layout/style/test/test_bug387615.html
new file mode 100644
index 000000000..daa61f342
--- /dev/null
+++ b/layout/style/test/test_bug387615.html
@@ -0,0 +1,53 @@
+
+
+
+
+ Test for Bug 387615
+
+
+
+
+
+Mozilla Bug 387615
+link
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug389464.html b/layout/style/test/test_bug389464.html
new file mode 100644
index 000000000..05e2faf63
--- /dev/null
+++ b/layout/style/test/test_bug389464.html
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+ Test for preference not to use document colors
+
+
+
+
+
+Mozilla Bug 58048
+Mozilla Bug 255411
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug391034.html b/layout/style/test/test_bug391034.html
new file mode 100644
index 000000000..e98f68f7a
--- /dev/null
+++ b/layout/style/test/test_bug391034.html
@@ -0,0 +1,71 @@
+
+
+
+
+ Test for Bug 391034
+
+
+
+
+Mozilla Bug 391034
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug391221.html b/layout/style/test/test_bug391221.html
new file mode 100644
index 000000000..f5cb9ce3b
--- /dev/null
+++ b/layout/style/test/test_bug391221.html
@@ -0,0 +1,43 @@
+
+
+
+
+ Test for Bug 391221
+
+
+
+
+Mozilla Bug 391221
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug397427.html b/layout/style/test/test_bug397427.html
new file mode 100644
index 000000000..3175d0e92
--- /dev/null
+++ b/layout/style/test/test_bug397427.html
@@ -0,0 +1,91 @@
+
+
+
+
+ Test for Bug 397427
+
+
+
+
+
+
+
+
+Mozilla Bug 397427
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug399349.html b/layout/style/test/test_bug399349.html
new file mode 100644
index 000000000..8e61f7d3b
--- /dev/null
+++ b/layout/style/test/test_bug399349.html
@@ -0,0 +1,80 @@
+
+
+
+
+ Test for Bug 363146
+
+
+
+
+
+Mozilla Bug 399349
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug401046.html b/layout/style/test/test_bug401046.html
new file mode 100644
index 000000000..34491eaa8
--- /dev/null
+++ b/layout/style/test/test_bug401046.html
@@ -0,0 +1,82 @@
+
+
+
+
+ Test for Bug 401046
+
+
+
+
+
+
+Mozilla Bug 401046
+
+ 汉字
+ 汉字
+ 汉字
+ 汉字
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug405818.html b/layout/style/test/test_bug405818.html
new file mode 100644
index 000000000..fb1c98708
--- /dev/null
+++ b/layout/style/test/test_bug405818.html
@@ -0,0 +1,72 @@
+
+
+
+
+ Test for Bug 405818
+
+
+
+
+
+
+
+
+
+
+Mozilla Bug 405818
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug412901.html b/layout/style/test/test_bug412901.html
new file mode 100644
index 000000000..6443d25c3
--- /dev/null
+++ b/layout/style/test/test_bug412901.html
@@ -0,0 +1,42 @@
+
+
+
+
+ Test for Bug 412901
+
+
+
+
+Mozilla Bug 412901
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug413958.html b/layout/style/test/test_bug413958.html
new file mode 100644
index 000000000..273e4466e
--- /dev/null
+++ b/layout/style/test/test_bug413958.html
@@ -0,0 +1,78 @@
+
+
+
+
+
Test for Bug 413958
+
+
+
+
+
+
+
Mozilla Bug 413958 . All text below should be black on white.
+
Sheet: 1
+ 2
+ 3 .
+ Style attr: 4 .
+ Properties: 5 .
+
+
+
diff --git a/layout/style/test/test_bug418986-2.html b/layout/style/test/test_bug418986-2.html
new file mode 100644
index 000000000..aa9ff8af1
--- /dev/null
+++ b/layout/style/test/test_bug418986-2.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+
Test 2/3 for Bug #418986: Resist fingerprinting by preventing exposure of screen and system info
+
+
+
+
+
+
+
+
+
Bug 418986
+
TEST
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug437915.html b/layout/style/test/test_bug437915.html
new file mode 100644
index 000000000..595c0a643
--- /dev/null
+++ b/layout/style/test/test_bug437915.html
@@ -0,0 +1,70 @@
+
+
+
+
+
Test for Bug 437915
+
+
+
+
+
+
Mozilla Bug 437915
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug450191.html b/layout/style/test/test_bug450191.html
new file mode 100644
index 000000000..6471bcc73
--- /dev/null
+++ b/layout/style/test/test_bug450191.html
@@ -0,0 +1,64 @@
+
+
+
+
+
Test for Bug 450191
+
+
+
+
+
Mozilla Bug 450191
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug453896_deck.html b/layout/style/test/test_bug453896_deck.html
new file mode 100644
index 000000000..603063241
--- /dev/null
+++ b/layout/style/test/test_bug453896_deck.html
@@ -0,0 +1,42 @@
+
+
+
+
+
Test for Bug 453896
+
+
+
+
+
Mozilla Bug 453896
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug470769.html b/layout/style/test/test_bug470769.html
new file mode 100644
index 000000000..cb32f47ec
--- /dev/null
+++ b/layout/style/test/test_bug470769.html
@@ -0,0 +1,31 @@
+
+
+
+
+
Test for Bug 470769
+
+
+
+
+
Mozilla Bug 470769
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug499655.html b/layout/style/test/test_bug499655.html
new file mode 100644
index 000000000..385ee43fa
--- /dev/null
+++ b/layout/style/test/test_bug499655.html
@@ -0,0 +1,45 @@
+
+
+
+
Test for Bug 499655
+
+
+
+
+
Mozilla Bug 499655
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug499655.xhtml b/layout/style/test/test_bug499655.xhtml
new file mode 100644
index 000000000..539c3fa36
--- /dev/null
+++ b/layout/style/test/test_bug499655.xhtml
@@ -0,0 +1,48 @@
+
+
+
+
Test for Bug 499655
+
+
+
+
+
Mozilla Bug 499655
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug511909.html b/layout/style/test/test_bug511909.html
new file mode 100644
index 000000000..060636a9f
--- /dev/null
+++ b/layout/style/test/test_bug511909.html
@@ -0,0 +1,205 @@
+
+
+
@media and @-moz-document testcases
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Mozilla Bug 511909
+
+
+
+
+
+
+
+
@-moz-document regexp("not_this_url"){
+ @media print ,}
+ #mxx {
+ color: blue;
+ }
+ }
+}
+
+
This line should be blue
+
@media screen {
+ @-moz-documen {...}
+}
+
+
This line should be green
+
@media screen {
+ @-moz-document {
+ @media screen {...}
+ }
+}
+
+
This line should be blue
+
+
+
diff --git a/layout/style/test/test_bug517224.html b/layout/style/test/test_bug517224.html
new file mode 100644
index 000000000..e748f9e20
--- /dev/null
+++ b/layout/style/test/test_bug517224.html
@@ -0,0 +1,45 @@
+
+
+
+
+
Test for Bug 517224
+
+
+
+
+
+
+
Mozilla Bug 517224
+
Element with overridden background
+
+
+
+
+
diff --git a/layout/style/test/test_bug524175.html b/layout/style/test/test_bug524175.html
new file mode 100644
index 000000000..a86b3ed0b
--- /dev/null
+++ b/layout/style/test/test_bug524175.html
@@ -0,0 +1,28 @@
+
+
+
+
+
Test for Bug 524175
+
+
+
+
+
+
Mozilla Bug 524175
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug525952.html b/layout/style/test/test_bug525952.html
new file mode 100644
index 000000000..66768a742
--- /dev/null
+++ b/layout/style/test/test_bug525952.html
@@ -0,0 +1,46 @@
+
+
+
+
+
Test for Bug 525952
+
+
+
+
+
Mozilla Bug 525952
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug534804.html b/layout/style/test/test_bug534804.html
new file mode 100644
index 000000000..ac04c3563
--- /dev/null
+++ b/layout/style/test/test_bug534804.html
@@ -0,0 +1,89 @@
+
+
+
+
+
Test for Bug 534804
+
+
+
+
+
+
+
Mozilla Bug 534804
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug573255.html b/layout/style/test/test_bug573255.html
new file mode 100644
index 000000000..5ea1d826f
--- /dev/null
+++ b/layout/style/test/test_bug573255.html
@@ -0,0 +1,32 @@
+
+
+
+
+
Test for Bug 573255
+
+
+
+
+
+
Mozilla Bug 573255
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug580685.html b/layout/style/test/test_bug580685.html
new file mode 100644
index 000000000..795b2ce0c
--- /dev/null
+++ b/layout/style/test/test_bug580685.html
@@ -0,0 +1,41 @@
+
+
+
+
+
Test for Bug 580685
+
+
+
+
+
Mozilla Bug 580685
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug621351.html b/layout/style/test/test_bug621351.html
new file mode 100644
index 000000000..6a6d373af
--- /dev/null
+++ b/layout/style/test/test_bug621351.html
@@ -0,0 +1,35 @@
+
+
+
Test for Bug 160403
+
+
+
+
+
diff --git a/layout/style/test/test_bug635286.html b/layout/style/test/test_bug635286.html
new file mode 100644
index 000000000..c6c9d6ad4
--- /dev/null
+++ b/layout/style/test/test_bug635286.html
@@ -0,0 +1,52 @@
+
+
+
+
+
Test for Bug 635286
+
+
+
+
+
+
+
Mozilla Bug 635286
+
case1, :-moz-any()
+
case2, :not()
+
case3, :not() in :-moz-any()
+
case4, :-moz-any() in :not()
+
+
+
+
+
diff --git a/layout/style/test/test_bug645998.html b/layout/style/test/test_bug645998.html
new file mode 100644
index 000000000..f511185ed
--- /dev/null
+++ b/layout/style/test/test_bug645998.html
@@ -0,0 +1,29 @@
+
+
+
+
+
Test for Bug 645998
+
+
+
+
+
+
+
+
Mozilla Bug 645998
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug652486.html b/layout/style/test/test_bug652486.html
new file mode 100644
index 000000000..9abb7041c
--- /dev/null
+++ b/layout/style/test/test_bug652486.html
@@ -0,0 +1,212 @@
+
+
+
+
+
Test for Bug 652486 and Bug 1039488
+
+
+
+
+
Mozilla Bug 652486
+
Mozilla Bug 1039488
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug657143.html b/layout/style/test/test_bug657143.html
new file mode 100644
index 000000000..4b9980eb7
--- /dev/null
+++ b/layout/style/test/test_bug657143.html
@@ -0,0 +1,132 @@
+
+
+
+
+
Test for Bug 657143
+
+
+
+
+
+
Mozilla Bug 657143
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug664955.html b/layout/style/test/test_bug664955.html
new file mode 100644
index 000000000..a7e31c557
--- /dev/null
+++ b/layout/style/test/test_bug664955.html
@@ -0,0 +1,37 @@
+
+
+
+
+
Test for Bug 664955
+
+
+
+
+
+
Mozilla Bug 664955
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug667520.html b/layout/style/test/test_bug667520.html
new file mode 100644
index 000000000..b6909eedb
--- /dev/null
+++ b/layout/style/test/test_bug667520.html
@@ -0,0 +1,50 @@
+
+
+
+
+
Test for Bug 667520
+
+
+
+
+
Mozilla Bug 667520
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug716226.html b/layout/style/test/test_bug716226.html
new file mode 100644
index 000000000..25df9ffd8
--- /dev/null
+++ b/layout/style/test/test_bug716226.html
@@ -0,0 +1,52 @@
+
+
+
+
+
+
Test for Bug 716226
+
+
+
+
+
+
Mozilla Bug 716226
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug732153.html b/layout/style/test/test_bug732153.html
new file mode 100644
index 000000000..892029886
--- /dev/null
+++ b/layout/style/test/test_bug732153.html
@@ -0,0 +1,22 @@
+
+
+
Test for Bug 732153
+
+
+
Mozilla Bug 732153
+
+
diff --git a/layout/style/test/test_bug732209.html b/layout/style/test/test_bug732209.html
new file mode 100644
index 000000000..0a6c4353d
--- /dev/null
+++ b/layout/style/test/test_bug732209.html
@@ -0,0 +1,95 @@
+
+
+
+
+
+
Test for Bug 732209
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Mozilla Bug 732209
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug73586.html b/layout/style/test/test_bug73586.html
new file mode 100644
index 000000000..a88ae0a30
--- /dev/null
+++ b/layout/style/test/test_bug73586.html
@@ -0,0 +1,192 @@
+
+
+
+
+
Test for Bug 73586
+
+
+
+
+
+
Mozilla Bug 73586
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug74880.html b/layout/style/test/test_bug74880.html
new file mode 100644
index 000000000..9641f5944
--- /dev/null
+++ b/layout/style/test/test_bug74880.html
@@ -0,0 +1,125 @@
+
+
+
+
+
Test for Bug 74880
+
+
+
+
+
+
Mozilla Bug 74880
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug765590.html b/layout/style/test/test_bug765590.html
new file mode 100644
index 000000000..1e2445804
--- /dev/null
+++ b/layout/style/test/test_bug765590.html
@@ -0,0 +1,21 @@
+
+
+
+
+
Test for Bug 765590
+
+
+
+
+
+
+
diff --git a/layout/style/test/test_bug771043.html b/layout/style/test/test_bug771043.html
new file mode 100644
index 000000000..ca9d0cfb6
--- /dev/null
+++ b/layout/style/test/test_bug771043.html
@@ -0,0 +1,69 @@
+
+
+
+
+
+
Test for Bug 771043
+
+
+
+
+
+
Mozilla Bug 771043
+
+