aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Ahlroos <john@vaadin.com>2013-11-20 14:26:40 +0200
committerJohn Ahlroos <john@vaadin.com>2013-11-20 14:27:09 +0200
commite3b1e6be389cbe48d1782723adf1595edbd10ea2 (patch)
tree61dbd2fac407f0b6657863d100d6b1f09e67e356
parent96de019ea4ee5536dab87d1f04d4cb94ae71371d (diff)
parentdd7e6fee8c4717df59699f04f7e72a6f2e92008f (diff)
downloadvaadin-framework-e3b1e6be389cbe48d1782723adf1595edbd10ea2.tar.gz
vaadin-framework-e3b1e6be389cbe48d1782723adf1595edbd10ea2.zip
Merge branch 'master' into grid
Change-Id: I9f669ec38c39a42d1ef2a25121b77aab31551863
-rw-r--r--.settings/org.eclipse.jdt.ui.prefs2
-rw-r--r--WebContent/VAADIN/jquery-1.7.2.js9404
-rw-r--r--WebContent/VAADIN/jquery.atmosphere.js2748
-rw-r--r--WebContent/VAADIN/themes/base/base.scss2
-rw-r--r--WebContent/VAADIN/themes/base/browserframe/browserframe.scss7
-rw-r--r--WebContent/VAADIN/themes/base/common/common.scss8
-rw-r--r--WebContent/VAADIN/themes/base/customcomponent/customcomponent.scss1
-rw-r--r--WebContent/WEB-INF/web.xml6
-rw-r--r--WebContent/WEB-INF/web.xml.2.42
-rw-r--r--WebContent/release-notes.html54
-rw-r--r--WebContent/statictestfiles/long-html.htm128
-rw-r--r--build.xml15
-rwxr-xr-xbuild/ide.xml24
-rw-r--r--client/ivy.xml2
-rw-r--r--client/src/com/vaadin/client/ApplicationConfiguration.java17
-rw-r--r--client/src/com/vaadin/client/ApplicationConnection.java91
-rw-r--r--client/src/com/vaadin/client/BrowserInfo.java25
-rw-r--r--client/src/com/vaadin/client/LayoutManager.java92
-rw-r--r--client/src/com/vaadin/client/Util.java37
-rw-r--r--client/src/com/vaadin/client/VConsole.java18
-rw-r--r--client/src/com/vaadin/client/VTooltip.java2
-rw-r--r--client/src/com/vaadin/client/communication/AtmospherePushConnection.java10
-rw-r--r--client/src/com/vaadin/client/debug/internal/LogSection.java6
-rw-r--r--client/src/com/vaadin/client/ui/AbstractComponentConnector.java19
-rw-r--r--client/src/com/vaadin/client/ui/PostLayoutListener.java18
-rw-r--r--client/src/com/vaadin/client/ui/VCalendarPanel.java29
-rw-r--r--client/src/com/vaadin/client/ui/VDragAndDropWrapper.java15
-rw-r--r--client/src/com/vaadin/client/ui/VLink.java4
-rw-r--r--client/src/com/vaadin/client/ui/VNativeButton.java8
-rw-r--r--client/src/com/vaadin/client/ui/VOptionGroup.java79
-rw-r--r--client/src/com/vaadin/client/ui/VOverlay.java79
-rw-r--r--client/src/com/vaadin/client/ui/VScrollTable.java149
-rw-r--r--client/src/com/vaadin/client/ui/VTabsheet.java29
-rw-r--r--client/src/com/vaadin/client/ui/VUI.java3
-rw-r--r--client/src/com/vaadin/client/ui/VWindow.java30
-rw-r--r--client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java21
-rw-r--r--client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java11
-rw-r--r--client/src/com/vaadin/client/ui/dd/VTargetInSubtree.java4
-rw-r--r--client/src/com/vaadin/client/ui/link/LinkConnector.java59
-rw-r--r--client/src/com/vaadin/client/ui/nativebutton/NativeButtonConnector.java2
-rw-r--r--client/src/com/vaadin/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java32
-rw-r--r--client/src/com/vaadin/client/ui/slider/SliderConnector.java1
-rw-r--r--client/src/com/vaadin/client/ui/table/TableConnector.java5
-rw-r--r--client/src/com/vaadin/client/ui/ui/UIConnector.java50
-rw-r--r--client/src/com/vaadin/client/ui/window/WindowConnector.java18
-rw-r--r--client/src/com/vaadin/client/ui/window/WindowMoveEvent.java82
-rw-r--r--client/src/com/vaadin/client/ui/window/WindowMoveHandler.java35
-rw-r--r--client/tests/src/com/vaadin/client/TestVBrowserDetailsUserAgentParser.java28
-rw-r--r--ivysettings.xml6
-rw-r--r--liferay/build.xml76
-rw-r--r--liferay/ivy.xml30
-rw-r--r--publish.xml5
-rw-r--r--push/build.xml30
-rw-r--r--push/ivy.xml17
-rwxr-xr-xscripts/automerge7.sh2
-rw-r--r--server/ivy.xml2
-rw-r--r--server/src/com/vaadin/data/Container.java54
-rw-r--r--server/src/com/vaadin/data/util/AbstractBeanContainer.java20
-rw-r--r--server/src/com/vaadin/data/util/AbstractInMemoryContainer.java151
-rw-r--r--server/src/com/vaadin/data/util/IndexedContainer.java7
-rw-r--r--server/src/com/vaadin/event/ConnectorActionManager.java88
-rw-r--r--server/src/com/vaadin/event/UIEvents.java116
-rw-r--r--server/src/com/vaadin/server/ClientMethodInvocation.java54
-rw-r--r--server/src/com/vaadin/server/Constants.java4
-rw-r--r--server/src/com/vaadin/server/ErrorHandlingRunnable.java38
-rw-r--r--server/src/com/vaadin/server/VaadinPortlet.java29
-rw-r--r--server/src/com/vaadin/server/VaadinService.java7
-rw-r--r--server/src/com/vaadin/server/VaadinServlet.java2
-rw-r--r--server/src/com/vaadin/server/VaadinServletService.java4
-rw-r--r--server/src/com/vaadin/server/VaadinSession.java60
-rw-r--r--server/src/com/vaadin/server/communication/PortletBootstrapHandler.java11
-rw-r--r--server/src/com/vaadin/server/communication/PushHandler.java64
-rw-r--r--server/src/com/vaadin/server/communication/ServerRpcHandler.java33
-rw-r--r--server/src/com/vaadin/ui/AbstractComponent.java5
-rw-r--r--server/src/com/vaadin/ui/Link.java84
-rw-r--r--server/src/com/vaadin/ui/Table.java32
-rw-r--r--server/src/com/vaadin/ui/TreeTable.java4
-rw-r--r--server/src/com/vaadin/ui/UI.java60
-rw-r--r--server/src/com/vaadin/ui/Window.java10
-rw-r--r--server/tests/src/com/vaadin/data/util/BeanItemContainerTest.java185
-rw-r--r--server/tests/src/com/vaadin/data/util/TestIndexedContainer.java113
-rw-r--r--server/tests/src/com/vaadin/tests/server/TestAtmosphereVersion.java2
-rw-r--r--server/tests/src/com/vaadin/tests/server/TestClientMethodSerialization.java111
-rw-r--r--server/tests/src/com/vaadin/tests/server/TestSerialization.java19
-rw-r--r--server/tests/src/com/vaadin/tests/server/component/abstractfield/AbsFieldValueConversions.java1
-rw-r--r--server/tests/src/com/vaadin/tests/server/component/treetable/TreeTableSetContainerNull.java15
-rw-r--r--shared/ivy.xml2
-rw-r--r--shared/src/com/vaadin/shared/ApplicationConstants.java4
-rw-r--r--shared/src/com/vaadin/shared/EventId.java2
-rw-r--r--shared/src/com/vaadin/shared/VBrowserDetails.java38
-rw-r--r--shared/src/com/vaadin/shared/ui/link/LinkState.java6
-rw-r--r--shared/src/com/vaadin/shared/ui/window/WindowServerRpc.java2
-rw-r--r--theme-compiler/ivy.xml4
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/ScssStylesheet.java121
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/handler/SCSSDocumentHandler.java5
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/handler/SCSSDocumentHandlerImpl.java7
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/handler/SCSSErrorHandler.java24
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/parser/LexicalUnitImpl.java39
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java2228
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj80
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/parser/ParserConstants.java633
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java10884
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/resolver/AbstractResolver.java200
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/resolver/ClassloaderResolver.java20
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/resolver/FilesystemResolver.java44
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/resolver/ScssStylesheetResolver.java7
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/resolver/VaadinResolver.java90
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/tree/BlockNode.java3
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/tree/KeyframesNode.java3
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/tree/RuleNode.java5
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/visitor/ImportNodeHandler.java15
-rw-r--r--theme-compiler/tests/resources/automatic/css/at-directive-in-if.css1
-rw-r--r--theme-compiler/tests/resources/automatic/css/fontface-in-mixin_new.css9
-rw-r--r--theme-compiler/tests/resources/automatic/css/functions/abs.css11
-rw-r--r--theme-compiler/tests/resources/automatic/css/functions/ceil.css11
-rw-r--r--theme-compiler/tests/resources/automatic/css/functions/floor.css11
-rw-r--r--theme-compiler/tests/resources/automatic/css/functions/round.css11
-rw-r--r--theme-compiler/tests/resources/automatic/css/interpolation-singlequote.css1
-rw-r--r--theme-compiler/tests/resources/automatic/css/mixin-content-parameters.css2
-rw-r--r--theme-compiler/tests/resources/automatic/css/mixin-keyframes.css10
-rw-r--r--theme-compiler/tests/resources/automatic/css/negative-ch-value.css3
-rw-r--r--theme-compiler/tests/resources/automatic/scss/at-directive-in-if.scss8
-rw-r--r--theme-compiler/tests/resources/automatic/scss/fontface-in-mixin_new.scss17
-rw-r--r--theme-compiler/tests/resources/automatic/scss/foo/_bar.scss (renamed from theme-compiler/tests/resources/automatic/scss/foo/bar.scss)0
-rw-r--r--theme-compiler/tests/resources/automatic/scss/functions/abs.scss11
-rw-r--r--theme-compiler/tests/resources/automatic/scss/functions/ceil.scss11
-rw-r--r--theme-compiler/tests/resources/automatic/scss/functions/floor.scss11
-rw-r--r--theme-compiler/tests/resources/automatic/scss/functions/round.scss11
-rw-r--r--theme-compiler/tests/resources/automatic/scss/import-file-which-contains-comment-in-last-line.scss2
-rw-r--r--theme-compiler/tests/resources/automatic/scss/interpolation-singlequote.scss7
-rw-r--r--theme-compiler/tests/resources/automatic/scss/mixin-content-parameters.scss9
-rw-r--r--theme-compiler/tests/resources/automatic/scss/mixin-keyframes.scss14
-rw-r--r--theme-compiler/tests/resources/automatic/scss/negative-ch-value.scss3
-rw-r--r--theme-compiler/tests/resources/automatic/scss/nested-import.scss2
-rw-r--r--theme-compiler/tests/resources/automatic/scss/to-be-imported/_imported-file-contains-comments-in-last-line.scss (renamed from theme-compiler/tests/resources/automatic/scss/to-be-imported/imported-file-contains-comments-in-last-line.scss)0
-rw-r--r--theme-compiler/tests/resources/automatic/scss/url-path.scss2
-rw-r--r--theme-compiler/tests/resources/automatic/scss/utf8-imported/_to-be-imported-scss-file-contains-utf8.scss (renamed from theme-compiler/tests/resources/automatic/scss/utf8-imported/to-be-imported-scss-file-contains-utf8.scss)0
-rw-r--r--theme-compiler/tests/resources/automatic/scss/utf8.scss2
-rw-r--r--theme-compiler/tests/resources/css/compass-import.css49
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/100-test_optional_extend_does_not_warn_when_extension_fails.css (renamed from theme-compiler/tests/resources/sasslang/css/100-test_optional_extend_does_not_warn_when_extension_fails.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css (renamed from theme-compiler/tests/resources/sasslang/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/36-test_extend_self_loop.css (renamed from theme-compiler/tests/resources/sasslang/css/36-test_extend_self_loop.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/37-test_extend_warns_when_extendee_doesnt_exist.css (renamed from theme-compiler/tests/resources/sasslang/css/37-test_extend_warns_when_extendee_doesnt_exist.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/38-test_extend_warns_when_extension_fails.css (renamed from theme-compiler/tests/resources/sasslang/css/38-test_extend_warns_when_extension_fails.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/57-test_long_extendee_requires_all_selectors.css (renamed from theme-compiler/tests/resources/sasslang/css/57-test_long_extendee_requires_all_selectors.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/60-test_long_extender_aborts_unification.css (renamed from theme-compiler/tests/resources/sasslang/css/60-test_long_extender_aborts_unification.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/71-test_nested_extender_aborts_unification.css (renamed from theme-compiler/tests/resources/sasslang/css/71-test_nested_extender_aborts_unification.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css (renamed from theme-compiler/tests/resources/sasslang/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css (renamed from theme-compiler/tests/resources/sasslang/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss (renamed from theme-compiler/tests/resources/sasslang/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss (renamed from theme-compiler/tests/resources/sasslang/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/36-test_extend_self_loop.scss (renamed from theme-compiler/tests/resources/sasslang/scss/36-test_extend_self_loop.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss (renamed from theme-compiler/tests/resources/sasslang/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/38-test_extend_warns_when_extension_fails.scss (renamed from theme-compiler/tests/resources/sasslang/scss/38-test_extend_warns_when_extension_fails.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/57-test_long_extendee_requires_all_selectors.scss (renamed from theme-compiler/tests/resources/sasslang/scss/57-test_long_extendee_requires_all_selectors.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/60-test_long_extender_aborts_unification.scss (renamed from theme-compiler/tests/resources/sasslang/scss/60-test_long_extender_aborts_unification.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/71-test_nested_extender_aborts_unification.scss (renamed from theme-compiler/tests/resources/sasslang/scss/71-test_nested_extender_aborts_unification.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss (renamed from theme-compiler/tests/resources/sasslang/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss)0
-rw-r--r--theme-compiler/tests/resources/sasslangbroken/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss (renamed from theme-compiler/tests/resources/sasslang/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss)0
-rw-r--r--theme-compiler/tests/resources/scss/compass-test/compass-import.scss4
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/_compass.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass-import2.scss4
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/_css3.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/_typography.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/_utilities.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/css3/_border-radius.scss4
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/css3/_inline-block.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/css3/_opacity.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/typography/_links.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/typography/_lists.scss3
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/typography/_text.scss6
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_color.scss4
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_general.scss5
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_sprites.scss6
-rw-r--r--theme-compiler/tests/resources/scss/compass-test2/license-readme.txt26
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004a.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004c.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004d.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005a.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005c.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005d.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009a.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009e.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-non-replaced-width-margin-000.0.scss93
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/abspos-replaced-width-margin-000.0.scss88
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/anonymous-boxes-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.1.scssbin0 -> 174 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.1.scssbin0 -> 175 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.1.scssbin0 -> 175 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.1.scssbin0 -> 180 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.1.scssbin0 -> 180 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-001.0.scss40
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-002.0.scss42
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-003.0.scss42
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-004.0.scss45
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-005.0.scss45
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-006.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-007.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-008.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-009.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-display-types-001.0.scss25
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-attr-001.0.scss12
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-restyle-001.0.scss11
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-floated-001.0.scss29
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-images-001.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.0.scss44
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/before-after-table-whitespace-001.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-001.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001c.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001d.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001e.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001f.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001g.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001h.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001i.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001j.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001k.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001l.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002c.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002d.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002e.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002f.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002g.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002h.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002i.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-003.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-004.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-006.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-007.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008c.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-009.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-010.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-011.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-012.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-015.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-002.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-003.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-004.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-005.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-006.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.1.scssbin0 -> 131 bytes
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-1.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-10.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-11.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-13.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14.0.scss10
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-144.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-148.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14b.0.scss10
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14c.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14d.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14e.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-150.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-151.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-152.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155b.0.scss10
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155d.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-159.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15b.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-16.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-160.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-161.0.scss26
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-17.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170d.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-176.0.scss11
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-178.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179a.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-180a.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-181.0.scss15
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184d.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184e.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184f.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18a.0.scss12
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-2.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-20.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21c.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-22.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-23.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-24.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-25.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27a.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-30.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-31.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-32.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-33.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-34.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-35.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-36.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-37.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-38.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39a.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39b.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39c.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-3a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-4.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41a.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42a.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44d.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45c.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-5.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-54.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-55.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-56.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-59.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-6.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-60.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-61.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-62.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-63.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-64.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-65.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-67.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-68.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-69.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-70.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-79.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7b.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-8.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-80.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-86.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-89.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-9.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90b.0.scss3
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1b.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d2.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d4.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003a.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003b.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-004.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-005.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-006.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-007.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-002.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-003.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-004.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-005.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-006.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-floats-004.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-001.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-002.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-003.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.12.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.24.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.8.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.9.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.0.scss12
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.10.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.11.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.12.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.13.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.131.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.14.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.15.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.16.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.17.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.18.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.19.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.20.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.21.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.22.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.23.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.24.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.25.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.26.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.27.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.28.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.29.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.30.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.31.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.32.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.33.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.6.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.65.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.66.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.7.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.8.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.9.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.98.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.99.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.15.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.16.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.19.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.20.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.23.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.24.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.27.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.28.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.31.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.39.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.40.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.43.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.44.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.48.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.7.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.8.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-outside-001.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-001.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-002.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-003.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-004.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-005.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-006.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-007.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-008.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-009.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-012.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-013.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-014.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-016.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-017.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-018.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-019.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-020.0.scss9
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-021.0.scss10
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-022.0.scss14
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-023.0.scss20
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-family-name-024.0.scss26
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-weight-bolder-001.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-weight-lighter-001.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/font-weight-normal-001.0.scss43
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-000.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-height-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-height-002.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-002.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002a.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-002.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-003.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-004.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-005.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-002a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-002b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-003.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-height-001.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-height-002.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-valign-001.0.scss15
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001a.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001b.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002a.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002b.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-002.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-003.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-004.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-005.0.scss7
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/quotes-035.0.scss29
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/quotes-035a.0.scss31
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/quotes-036.0.scss35
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/ref-green-box-100x100.0.scss8
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-cell-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-colgroup-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-column-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-row-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-rowgroup-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-table-001.0.scss33
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-cell-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-colgroup-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-column-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-row-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-rowgroup-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-table-001.0.scss34
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.6.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.6.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.0.scss6
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-113.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-114.0.scss4
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-115.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.11.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.8.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.11.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.8.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.11.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.17.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.25.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.3.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.5.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.0.scss17
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.10.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.16.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.2.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.24.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-percent-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-indent-wrap-001.0.scss5
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.1.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.4.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.7.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-lowercase-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-001.0.scss2
-rw-r--r--theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-002.0.scss2
-rw-r--r--theme-compiler/tests/src/com/vaadin/sass/resolvers/VaadinResolverTest.java18
-rw-r--r--theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AbstractDirectoryScanningSassTests.java85
-rw-r--r--theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AutomaticSassTests.java3
-rw-r--r--theme-compiler/tests/src/com/vaadin/sass/testcases/scss/CompassImports.java80
-rw-r--r--theme-compiler/tests/src/com/vaadin/sass/testcases/scss/SassLangTests.java3
-rw-r--r--theme-compiler/tests/src/com/vaadin/sass/testcases/scss/SassLangTestsBroken.java3
-rw-r--r--theme-compiler/tests/src/com/vaadin/sass/testcases/scss/W3ConformanceTests.java236
-rw-r--r--uitest/build.xml55
-rw-r--r--uitest/eclipse-run-selected-test.properties26
-rw-r--r--uitest/integration_tests.xml106
-rw-r--r--uitest/ivy.xml43
-rw-r--r--uitest/src/com/vaadin/launcher/DevelopmentServerLauncher.java8
-rw-r--r--uitest/src/com/vaadin/tests/VerifyBrowserVersion.java10
-rw-r--r--uitest/src/com/vaadin/tests/VerifyBrowserVersionTest.java62
-rw-r--r--uitest/src/com/vaadin/tests/actions/ActionsOnInvisibleComponents.java76
-rw-r--r--uitest/src/com/vaadin/tests/actions/ActionsOnInvisibleComponentsTest.java46
-rw-r--r--uitest/src/com/vaadin/tests/application/DetachOldUIOnReload.html15
-rw-r--r--uitest/src/com/vaadin/tests/application/DetachOldUIOnReload.java13
-rw-r--r--uitest/src/com/vaadin/tests/components/AbstractTestUI.java16
-rw-r--r--uitest/src/com/vaadin/tests/components/browserframe/BrowserFrameDoubleScrollbars.java40
-rw-r--r--uitest/src/com/vaadin/tests/components/browserframe/BrowserFrameDoubleScrollbarsTest.java15
-rw-r--r--uitest/src/com/vaadin/tests/components/button/ButtonsWaiAria.java4
-rw-r--r--uitest/src/com/vaadin/tests/components/customfield/CustomFieldSize.java65
-rw-r--r--uitest/src/com/vaadin/tests/components/customfield/CustomFieldSizeTest.java36
-rw-r--r--uitest/src/com/vaadin/tests/components/datefield/DateFieldTestTest.java118
-rw-r--r--uitest/src/com/vaadin/tests/components/datefield/DynamicallyChangeDateRange.html10
-rw-r--r--uitest/src/com/vaadin/tests/components/label/LabelModesTest.java30
-rw-r--r--uitest/src/com/vaadin/tests/components/nativebutton/NativeButtonIconAndText.java124
-rw-r--r--uitest/src/com/vaadin/tests/components/nativebutton/NativeButtonIconAndTextTest.java94
-rw-r--r--uitest/src/com/vaadin/tests/components/optiongroup/OptionGroupRetainFocusKeyboardValueChange.html54
-rw-r--r--uitest/src/com/vaadin/tests/components/optiongroup/OptionGroupRetainFocusKeyboardValueChange.java70
-rw-r--r--uitest/src/com/vaadin/tests/components/orderedlayout/HorizontalLayoutFullsizeContentWithErrorMsg.java66
-rw-r--r--uitest/src/com/vaadin/tests/components/orderedlayout/HorizontalLayoutFullsizeContentWithErrorMsgTest.java49
-rw-r--r--uitest/src/com/vaadin/tests/components/panel/PanelChangeContentsTest.java53
-rw-r--r--uitest/src/com/vaadin/tests/components/panel/WebkitScrollbarTest.html (renamed from uitest/src/com/vaadin/tests/components/label/LabelModes.html)12
-rw-r--r--uitest/src/com/vaadin/tests/components/panel/WebkitScrollbarTest.java63
-rw-r--r--uitest/src/com/vaadin/tests/components/slider/SliderDisable.java62
-rw-r--r--uitest/src/com/vaadin/tests/components/slider/SliderDisableTest.java36
-rw-r--r--uitest/src/com/vaadin/tests/components/table/EmptyTable.java58
-rw-r--r--uitest/src/com/vaadin/tests/components/table/EmptyTableTest.java44
-rw-r--r--uitest/src/com/vaadin/tests/components/table/ShowLastItem.html (renamed from uitest/src/com/vaadin/tests/push/PushFromInit.html)24
-rw-r--r--uitest/src/com/vaadin/tests/components/table/ShowLastItem.java66
-rw-r--r--uitest/src/com/vaadin/tests/components/table/TableDragColumnFloatingElementStyles.html124
-rw-r--r--uitest/src/com/vaadin/tests/components/table/TableHorizontalScrollPositionOnItemSetChange.html110
-rw-r--r--uitest/src/com/vaadin/tests/components/table/TableHorizontalScrollPositionOnItemSetChange.java101
-rw-r--r--uitest/src/com/vaadin/tests/components/table/TableMoveFocusWithSelection.java125
-rw-r--r--uitest/src/com/vaadin/tests/components/table/TableMoveFocusWithSelectionTest.java81
-rw-r--r--uitest/src/com/vaadin/tests/components/table/TableRemovedQuicklySendsInvalidRpcCalls.java (renamed from server/tests/src/com/vaadin/tests/server/component/table/TableRemovedQuicklySendsInvalidRpcCalls.java)2
-rw-r--r--uitest/src/com/vaadin/tests/components/table/TableSizeInTabsheet.java69
-rw-r--r--uitest/src/com/vaadin/tests/components/table/TableSizeInTabsheetTest.java50
-rw-r--r--uitest/src/com/vaadin/tests/components/tabsheet/TabSheetErrorTooltip.java60
-rw-r--r--uitest/src/com/vaadin/tests/components/tabsheet/TabSheetErrorTooltipTest.java81
-rw-r--r--uitest/src/com/vaadin/tests/components/tabsheet/TabSheetHotKeysWithModifiers.java50
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/PollListenerTest.html (renamed from uitest/src/com/vaadin/tests/push/TrackMessageSizeUnitTests.html)20
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/PollListenerTest.java54
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/UIAccess.java (renamed from uitest/src/com/vaadin/tests/components/ui/UiAccess.java)2
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/UIAccessExceptionHandling.html67
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/UIAccessExceptionHandling.java157
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/UIAccessTest.java204
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/UiAccess.html166
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/UiAccessPush.html41
-rw-r--r--uitest/src/com/vaadin/tests/components/window/ComboboxScrollableWindow.java66
-rw-r--r--uitest/src/com/vaadin/tests/components/window/ComboboxScrollableWindowTest.java57
-rw-r--r--uitest/src/com/vaadin/tests/components/window/WindowMoveListener.java67
-rw-r--r--uitest/src/com/vaadin/tests/components/window/WindowMoveListenerTest.java50
-rw-r--r--uitest/src/com/vaadin/tests/dd/DnDOnSubtree.html51
-rw-r--r--uitest/src/com/vaadin/tests/integration/AbstractIntegrationTest.java54
-rw-r--r--uitest/src/com/vaadin/tests/integration/AbstractServletIntegrationTest.java63
-rw-r--r--uitest/src/com/vaadin/tests/integration/IntegrationTestRunner.java54
-rw-r--r--uitest/src/com/vaadin/tests/integration/ServletIntegrationStreamingUI.java30
-rw-r--r--uitest/src/com/vaadin/tests/integration/ServletIntegrationStreamingUITest.java21
-rwxr-xr-xuitest/src/com/vaadin/tests/integration/ServletIntegrationUI.java (renamed from uitest/src/com/vaadin/tests/integration/IntegrationTestUI.java)3
-rw-r--r--uitest/src/com/vaadin/tests/integration/ServletIntegrationUITest.java20
-rw-r--r--uitest/src/com/vaadin/tests/integration/ServletIntegrationWebsocketUI.java48
-rw-r--r--uitest/src/com/vaadin/tests/integration/ServletIntegrationWebsocketUITest.java21
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayoutTests.java26
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java21
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.html896
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.java15
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplicationTest.java137
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java20
-rw-r--r--uitest/src/com/vaadin/tests/push/BarInUIDL.html42
-rw-r--r--uitest/src/com/vaadin/tests/push/BarInUIDL.java3
-rw-r--r--uitest/src/com/vaadin/tests/push/BarInUIDLTest.java45
-rw-r--r--uitest/src/com/vaadin/tests/push/BasicPush.html88
-rw-r--r--uitest/src/com/vaadin/tests/push/BasicPush.java101
-rw-r--r--uitest/src/com/vaadin/tests/push/BasicPushStreaming.java23
-rw-r--r--uitest/src/com/vaadin/tests/push/BasicPushStreamingTest.java19
-rw-r--r--uitest/src/com/vaadin/tests/push/BasicPushTest.java108
-rw-r--r--uitest/src/com/vaadin/tests/push/BasicPushWebsocket.java26
-rw-r--r--uitest/src/com/vaadin/tests/push/BasicPushWebsocketTest.java29
-rw-r--r--uitest/src/com/vaadin/tests/push/EnableDisablePush.html97
-rw-r--r--uitest/src/com/vaadin/tests/push/EnableDisablePush.java5
-rw-r--r--uitest/src/com/vaadin/tests/push/EnableDisablePushTest.java72
-rw-r--r--uitest/src/com/vaadin/tests/push/PushConfiguration.html130
-rw-r--r--uitest/src/com/vaadin/tests/push/PushConfiguration.java117
-rw-r--r--uitest/src/com/vaadin/tests/push/PushConfigurationTest.java181
-rw-r--r--uitest/src/com/vaadin/tests/push/PushErrorHandling.java95
-rw-r--r--uitest/src/com/vaadin/tests/push/PushErrorHandlingTest.java47
-rw-r--r--uitest/src/com/vaadin/tests/push/PushFromInit.java15
-rw-r--r--uitest/src/com/vaadin/tests/push/PushFromInitTest.java50
-rw-r--r--uitest/src/com/vaadin/tests/push/PushLargeData.java152
-rw-r--r--uitest/src/com/vaadin/tests/push/PushLargeDataStreaming.java33
-rw-r--r--uitest/src/com/vaadin/tests/push/PushLargeDataStreamingTest.java61
-rw-r--r--uitest/src/com/vaadin/tests/push/PushLargeDataWebsocket.java33
-rw-r--r--uitest/src/com/vaadin/tests/push/PushLargeDataWebsocketTest.java60
-rw-r--r--uitest/src/com/vaadin/tests/push/PushReattachedComponent.html47
-rw-r--r--uitest/src/com/vaadin/tests/push/PushReconnectTest.java164
-rw-r--r--uitest/src/com/vaadin/tests/push/PushTransportAnnotation.html46
-rw-r--r--uitest/src/com/vaadin/tests/push/StreamingPush.html88
-rwxr-xr-xuitest/src/com/vaadin/tests/push/StreamingReconnectTest.java25
-rw-r--r--uitest/src/com/vaadin/tests/push/TogglePush.html91
-rw-r--r--uitest/src/com/vaadin/tests/push/TogglePush.java15
-rw-r--r--uitest/src/com/vaadin/tests/push/TogglePushInInit.html69
-rw-r--r--uitest/src/com/vaadin/tests/push/TogglePushTest.java112
-rw-r--r--uitest/src/com/vaadin/tests/push/TrackMessageSizeUI.java (renamed from uitest/src/com/vaadin/tests/push/TrackMessageSizeUnitTests.java)10
-rw-r--r--uitest/src/com/vaadin/tests/push/TrackMessageSizeUITest.java30
-rw-r--r--uitest/src/com/vaadin/tests/push/WebsocketReconnectTest.java36
-rw-r--r--uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java838
-rw-r--r--uitest/src/com/vaadin/tests/tb3/AllTB3Tests.java42
-rw-r--r--uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java76
-rwxr-xr-xuitest/src/com/vaadin/tests/tb3/MultiBrowserTestWithProxy.java106
-rw-r--r--uitest/src/com/vaadin/tests/tb3/ParallelScheduler.java69
-rw-r--r--uitest/src/com/vaadin/tests/tb3/PrivateTB3Configuration.java161
-rw-r--r--uitest/src/com/vaadin/tests/tb3/ScreenshotTB3Test.java416
-rw-r--r--uitest/src/com/vaadin/tests/tb3/ServletIntegrationTests.java35
-rw-r--r--uitest/src/com/vaadin/tests/tb3/TB3Runner.java162
-rw-r--r--uitest/src/com/vaadin/tests/tb3/TB3TestSuite.java238
-rw-r--r--uitest/src/com/vaadin/tests/tb3/WebsocketTest.java59
-rw-r--r--uitest/src/com/vaadin/tests/tickets/Ticket12727.java51
-rw-r--r--uitest/src/com/vaadin/tests/util/LoremIpsum.java9
-rw-r--r--uitest/tb3test.xml33
-rw-r--r--uitest/test.xml21
-rw-r--r--uitest/vaadin-server.xml2
1019 files changed, 21618 insertions, 22254 deletions
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
index 31240a63bd..4f3b6f7ed3 100644
--- a/.settings/org.eclipse.jdt.ui.prefs
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -3,7 +3,7 @@ editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_Vaadin Java Conventions 20110923
formatter_settings_version=12
org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * \n * @since \n * @author Vaadin Ltd\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="false" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * @since\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*\n * Copyright 2000-2013 Vaadin Ltd.\n * \n * Licensed under the Apache License, Version 2.0 (the "License"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * \n * http\://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\n${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * \n * @since \n * @author Vaadin Ltd\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="false" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * @since\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*\n * Copyright 2000-2013 Vaadin Ltd.\n * \n * Licensed under the Apache License, Version 2.0 (the "License"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * \n * http\://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
sp_cleanup.add_default_serial_version_id=true
sp_cleanup.add_generated_serial_version_id=false
sp_cleanup.add_missing_annotations=true
diff --git a/WebContent/VAADIN/jquery-1.7.2.js b/WebContent/VAADIN/jquery-1.7.2.js
deleted file mode 100644
index 3774ff9861..0000000000
--- a/WebContent/VAADIN/jquery-1.7.2.js
+++ /dev/null
@@ -1,9404 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.7.2
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Wed Mar 21 12:46:34 2012 -0700
- */
-(function( window, undefined ) {
-
-// Use the correct document accordingly with window argument (sandbox)
-var document = window.document,
- navigator = window.navigator,
- location = window.location;
-var jQuery = (function() {
-
-// Define a local copy of jQuery
-var jQuery = function( selector, context ) {
- // The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context, rootjQuery );
- },
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$,
-
- // A central reference to the root jQuery(document)
- rootjQuery,
-
- // A simple way to check for HTML strings or ID strings
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
- quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
- // Check if a string has a non-whitespace character in it
- rnotwhite = /\S/,
-
- // Used for trimming whitespace
- trimLeft = /^\s+/,
- trimRight = /\s+$/,
-
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
-
- // JSON RegExp
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
- // Useragent RegExp
- rwebkit = /(webkit)[ \/]([\w.]+)/,
- ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
- rmsie = /(msie) ([\w.]+)/,
- rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
-
- // Matches dashed string for camelizing
- rdashAlpha = /-([a-z]|[0-9])/ig,
- rmsPrefix = /^-ms-/,
-
- // Used by jQuery.camelCase as callback to replace()
- fcamelCase = function( all, letter ) {
- return ( letter + "" ).toUpperCase();
- },
-
- // Keep a UserAgent string for use with jQuery.browser
- userAgent = navigator.userAgent,
-
- // For matching the engine and version of the browser
- browserMatch,
-
- // The deferred used on DOM ready
- readyList,
-
- // The ready event handler
- DOMContentLoaded,
-
- // Save a reference to some core methods
- toString = Object.prototype.toString,
- hasOwn = Object.prototype.hasOwnProperty,
- push = Array.prototype.push,
- slice = Array.prototype.slice,
- trim = String.prototype.trim,
- indexOf = Array.prototype.indexOf,
-
- // [[Class]] -> type pairs
- class2type = {};
-
-jQuery.fn = jQuery.prototype = {
- constructor: jQuery,
- init: function( selector, context, rootjQuery ) {
- var match, elem, ret, doc;
-
- // Handle $(""), $(null), or $(undefined)
- if ( !selector ) {
- return this;
- }
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
- }
-
- // The body element only exists once, optimize finding it
- if ( selector === "body" && !context && document.body ) {
- this.context = document;
- this[0] = document.body;
- this.selector = selector;
- this.length = 1;
- return this;
- }
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- // Are we dealing with HTML string or an ID?
- if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = quickExpr.exec( selector );
- }
-
- // Verify a match, and that no context was specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] ) {
- context = context instanceof jQuery ? context[0] : context;
- doc = ( context ? context.ownerDocument || context : document );
-
- // If a single string is passed in and it's a single tag
- // just do a createElement and skip the rest
- ret = rsingleTag.exec( selector );
-
- if ( ret ) {
- if ( jQuery.isPlainObject( context ) ) {
- selector = [ document.createElement( ret[1] ) ];
- jQuery.fn.attr.call( selector, context, true );
-
- } else {
- selector = [ doc.createElement( ret[1] ) ];
- }
-
- } else {
- ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
- selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
- }
-
- return jQuery.merge( this, selector );
-
- // HANDLE: $("#id")
- } else {
- elem = document.getElementById( match[2] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[2] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[0] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || rootjQuery ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
-
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- },
-
- // Start with an empty selector
- selector: "",
-
- // The current version of jQuery being used
- jquery: "1.7.2",
-
- // The default length of a jQuery object is 0
- length: 0,
-
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
-
- toArray: function() {
- return slice.call( this, 0 );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num == null ?
-
- // Return a 'clean' array
- this.toArray() :
-
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems, name, selector ) {
- // Build a new jQuery matched element set
- var ret = this.constructor();
-
- if ( jQuery.isArray( elems ) ) {
- push.apply( ret, elems );
-
- } else {
- jQuery.merge( ret, elems );
- }
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- ret.context = this.context;
-
- if ( name === "find" ) {
- ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
- } else if ( name ) {
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- }
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- ready: function( fn ) {
- // Attach the listeners
- jQuery.bindReady();
-
- // Add the callback
- readyList.add( fn );
-
- return this;
- },
-
- eq: function( i ) {
- i = +i;
- return i === -1 ?
- this.slice( i ) :
- this.slice( i, i + 1 );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- slice: function() {
- return this.pushStack( slice.apply( this, arguments ),
- "slice", slice.call(arguments).join(",") );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function( elem, i ) {
- return callback.call( elem, i, elem );
- }));
- },
-
- end: function() {
- return this.prevObject || this.constructor(null);
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: push,
- sort: [].sort,
- splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
- target = {};
- }
-
- // extend jQuery itself if only one argument is passed
- if ( length === i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ ) {
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray(src) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject(src) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend({
- noConflict: function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
- },
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready: function( wait ) {
- // Either a released hold or an DOMready/load event and not yet ready
- if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( !document.body ) {
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.fireWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger( "ready" ).off( "ready" );
- }
- }
- },
-
- bindReady: function() {
- if ( readyList ) {
- return;
- }
-
- readyList = jQuery.Callbacks( "once memory" );
-
- // Catch cases where $(document).ready() is called after the
- // browser event has already occurred.
- if ( document.readyState === "complete" ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Mozilla, Opera and webkit nightlies currently support this event
- if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", jQuery.ready, false );
-
- // If IE event model is used
- } else if ( document.attachEvent ) {
- // ensure firing before onload,
- // maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", jQuery.ready );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var toplevel = false;
-
- try {
- toplevel = window.frameElement == null;
- } catch(e) {}
-
- if ( document.documentElement.doScroll && toplevel ) {
- doScrollCheck();
- }
- }
- },
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction: function( obj ) {
- return jQuery.type(obj) === "function";
- },
-
- isArray: Array.isArray || function( obj ) {
- return jQuery.type(obj) === "array";
- },
-
- isWindow: function( obj ) {
- return obj != null && obj == obj.window;
- },
-
- isNumeric: function( obj ) {
- return !isNaN( parseFloat(obj) ) && isFinite( obj );
- },
-
- type: function( obj ) {
- return obj == null ?
- String( obj ) :
- class2type[ toString.call(obj) ] || "object";
- },
-
- isPlainObject: function( obj ) {
- // Must be an Object.
- // Because of IE, we also have to check the presence of the constructor property.
- // Make sure that DOM nodes and window objects don't pass through, as well
- if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- try {
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !hasOwn.call(obj, "constructor") &&
- !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
- return false;
- }
- } catch ( e ) {
- // IE8,9 Will throw exceptions on certain host objects #9897
- return false;
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own.
-
- var key;
- for ( key in obj ) {}
-
- return key === undefined || hasOwn.call( obj, key );
- },
-
- isEmptyObject: function( obj ) {
- for ( var name in obj ) {
- return false;
- }
- return true;
- },
-
- error: function( msg ) {
- throw new Error( msg );
- },
-
- parseJSON: function( data ) {
- if ( typeof data !== "string" || !data ) {
- return null;
- }
-
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = jQuery.trim( data );
-
- // Attempt to parse using the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
- return window.JSON.parse( data );
- }
-
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if ( rvalidchars.test( data.replace( rvalidescape, "@" )
- .replace( rvalidtokens, "]" )
- .replace( rvalidbraces, "")) ) {
-
- return ( new Function( "return " + data ) )();
-
- }
- jQuery.error( "Invalid JSON: " + data );
- },
-
- // Cross-browser xml parsing
- parseXML: function( data ) {
- if ( typeof data !== "string" || !data ) {
- return null;
- }
- var xml, tmp;
- try {
- if ( window.DOMParser ) { // Standard
- tmp = new DOMParser();
- xml = tmp.parseFromString( data , "text/xml" );
- } else { // IE
- xml = new ActiveXObject( "Microsoft.XMLDOM" );
- xml.async = "false";
- xml.loadXML( data );
- }
- } catch( e ) {
- xml = undefined;
- }
- if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
- },
-
- noop: function() {},
-
- // Evaluates a script in a global context
- // Workarounds based on findings by Jim Driscoll
- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
- globalEval: function( data ) {
- if ( data && rnotwhite.test( data ) ) {
- // We use execScript on Internet Explorer
- // We use an anonymous function so that context is window
- // rather than jQuery in Firefox
- ( window.execScript || function( data ) {
- window[ "eval" ].call( window, data );
- } )( data );
- }
- },
-
- // Convert dashed to camelCase; used by the css and data modules
- // Microsoft forgot to hump their vendor prefix (#9572)
- camelCase: function( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
- },
-
- // args is for internal usage only
- each: function( object, callback, args ) {
- var name, i = 0,
- length = object.length,
- isObj = length === undefined || jQuery.isFunction( object );
-
- if ( args ) {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.apply( object[ name ], args ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.apply( object[ i++ ], args ) === false ) {
- break;
- }
- }
- }
-
- // A special, fast, case for the most common use of each
- } else {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
- break;
- }
- }
- }
- }
-
- return object;
- },
-
- // Use native String.trim function wherever possible
- trim: trim ?
- function( text ) {
- return text == null ?
- "" :
- trim.call( text );
- } :
-
- // Otherwise use our own trimming functionality
- function( text ) {
- return text == null ?
- "" :
- text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
- },
-
- // results is for internal usage only
- makeArray: function( array, results ) {
- var ret = results || [];
-
- if ( array != null ) {
- // The window, strings (and functions) also have 'length'
- // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
- var type = jQuery.type( array );
-
- if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
- push.call( ret, array );
- } else {
- jQuery.merge( ret, array );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, array, i ) {
- var len;
-
- if ( array ) {
- if ( indexOf ) {
- return indexOf.call( array, elem, i );
- }
-
- len = array.length;
- i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
- for ( ; i < len; i++ ) {
- // Skip accessing in sparse arrays
- if ( i in array && array[ i ] === elem ) {
- return i;
- }
- }
- }
-
- return -1;
- },
-
- merge: function( first, second ) {
- var i = first.length,
- j = 0;
-
- if ( typeof second.length === "number" ) {
- for ( var l = second.length; j < l; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- } else {
- while ( second[j] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, inv ) {
- var ret = [], retVal;
- inv = !!inv;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( var i = 0, length = elems.length; i < length; i++ ) {
- retVal = !!callback( elems[ i ], i );
- if ( inv !== retVal ) {
- ret.push( elems[ i ] );
- }
- }
-
- return ret;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var value, key, ret = [],
- i = 0,
- length = elems.length,
- // jquery objects are treated as arrays
- isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
- // Go through the array, translating each of the items to their
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( key in elems ) {
- value = callback( elems[ key ], key, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
- }
-
- // Flatten any nested arrays
- return ret.concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy: function( fn, context ) {
- if ( typeof context === "string" ) {
- var tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- var args = slice.call( arguments, 2 ),
- proxy = function() {
- return fn.apply( context, args.concat( slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
- return proxy;
- },
-
- // Mutifunctional method to get and set values to a collection
- // The value/s can optionally be executed if it's a function
- access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
- var exec,
- bulk = key == null,
- i = 0,
- length = elems.length;
-
- // Sets many values
- if ( key && typeof key === "object" ) {
- for ( i in key ) {
- jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
- }
- chainable = 1;
-
- // Sets one value
- } else if ( value !== undefined ) {
- // Optionally, function values get executed if exec is true
- exec = pass === undefined && jQuery.isFunction( value );
-
- if ( bulk ) {
- // Bulk operations only iterate when executing function values
- if ( exec ) {
- exec = fn;
- fn = function( elem, key, value ) {
- return exec.call( jQuery( elem ), value );
- };
-
- // Otherwise they run against the entire set
- } else {
- fn.call( elems, value );
- fn = null;
- }
- }
-
- if ( fn ) {
- for (; i < length; i++ ) {
- fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
- }
- }
-
- chainable = 1;
- }
-
- return chainable ?
- elems :
-
- // Gets
- bulk ?
- fn.call( elems ) :
- length ? fn( elems[0], key ) : emptyGet;
- },
-
- now: function() {
- return ( new Date() ).getTime();
- },
-
- // Use of jQuery.browser is frowned upon.
- // More details: http://docs.jquery.com/Utilities/jQuery.browser
- uaMatch: function( ua ) {
- ua = ua.toLowerCase();
-
- var match = rwebkit.exec( ua ) ||
- ropera.exec( ua ) ||
- rmsie.exec( ua ) ||
- ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
- [];
-
- return { browser: match[1] || "", version: match[2] || "0" };
- },
-
- sub: function() {
- function jQuerySub( selector, context ) {
- return new jQuerySub.fn.init( selector, context );
- }
- jQuery.extend( true, jQuerySub, this );
- jQuerySub.superclass = this;
- jQuerySub.fn = jQuerySub.prototype = this();
- jQuerySub.fn.constructor = jQuerySub;
- jQuerySub.sub = this.sub;
- jQuerySub.fn.init = function init( selector, context ) {
- if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
- context = jQuerySub( context );
- }
-
- return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
- };
- jQuerySub.fn.init.prototype = jQuerySub.fn;
- var rootjQuerySub = jQuerySub(document);
- return jQuerySub;
- },
-
- browser: {}
-});
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-browserMatch = jQuery.uaMatch( userAgent );
-if ( browserMatch.browser ) {
- jQuery.browser[ browserMatch.browser ] = true;
- jQuery.browser.version = browserMatch.version;
-}
-
-// Deprecated, use jQuery.browser.webkit instead
-if ( jQuery.browser.webkit ) {
- jQuery.browser.safari = true;
-}
-
-// IE doesn't match non-breaking spaces with \s
-if ( rnotwhite.test( "\xA0" ) ) {
- trimLeft = /^[\s\xA0]+/;
- trimRight = /[\s\xA0]+$/;
-}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-
-// Cleanup functions for the document ready method
-if ( document.addEventListener ) {
- DOMContentLoaded = function() {
- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
- jQuery.ready();
- };
-
-} else if ( document.attachEvent ) {
- DOMContentLoaded = function() {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( document.readyState === "complete" ) {
- document.detachEvent( "onreadystatechange", DOMContentLoaded );
- jQuery.ready();
- }
- };
-}
-
-// The DOM ready check for Internet Explorer
-function doScrollCheck() {
- if ( jQuery.isReady ) {
- return;
- }
-
- try {
- // If IE is used, use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- document.documentElement.doScroll("left");
- } catch(e) {
- setTimeout( doScrollCheck, 1 );
- return;
- }
-
- // and execute any waiting functions
- jQuery.ready();
-}
-
-return jQuery;
-
-})();
-
-
-// String to Object flags format cache
-var flagsCache = {};
-
-// Convert String-formatted flags into Object-formatted ones and store in cache
-function createFlags( flags ) {
- var object = flagsCache[ flags ] = {},
- i, length;
- flags = flags.split( /\s+/ );
- for ( i = 0, length = flags.length; i < length; i++ ) {
- object[ flags[i] ] = true;
- }
- return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- * flags: an optional list of space-separated flags that will change how
- * the callback list behaves
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible flags:
- *
- * once: will ensure the callback list can only be fired once (like a Deferred)
- *
- * memory: will keep track of previous values and will call any callback added
- * after the list has been fired right away with the latest "memorized"
- * values (like a Deferred)
- *
- * unique: will ensure a callback can only be added once (no duplicate in the list)
- *
- * stopOnFalse: interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( flags ) {
-
- // Convert flags from String-formatted to Object-formatted
- // (we check in cache first)
- flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
-
- var // Actual callback list
- list = [],
- // Stack of fire calls for repeatable lists
- stack = [],
- // Last fire value (for non-forgettable lists)
- memory,
- // Flag to know if list was already fired
- fired,
- // Flag to know if list is currently firing
- firing,
- // First callback to fire (used internally by add and fireWith)
- firingStart,
- // End of the loop when firing
- firingLength,
- // Index of currently firing callback (modified by remove if needed)
- firingIndex,
- // Add one or several callbacks to the list
- add = function( args ) {
- var i,
- length,
- elem,
- type,
- actual;
- for ( i = 0, length = args.length; i < length; i++ ) {
- elem = args[ i ];
- type = jQuery.type( elem );
- if ( type === "array" ) {
- // Inspect recursively
- add( elem );
- } else if ( type === "function" ) {
- // Add if not in unique mode and callback is not in
- if ( !flags.unique || !self.has( elem ) ) {
- list.push( elem );
- }
- }
- }
- },
- // Fire callbacks
- fire = function( context, args ) {
- args = args || [];
- memory = !flags.memory || [ context, args ];
- fired = true;
- firing = true;
- firingIndex = firingStart || 0;
- firingStart = 0;
- firingLength = list.length;
- for ( ; list && firingIndex < firingLength; firingIndex++ ) {
- if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
- memory = true; // Mark as halted
- break;
- }
- }
- firing = false;
- if ( list ) {
- if ( !flags.once ) {
- if ( stack && stack.length ) {
- memory = stack.shift();
- self.fireWith( memory[ 0 ], memory[ 1 ] );
- }
- } else if ( memory === true ) {
- self.disable();
- } else {
- list = [];
- }
- }
- },
- // Actual Callbacks object
- self = {
- // Add a callback or a collection of callbacks to the list
- add: function() {
- if ( list ) {
- var length = list.length;
- add( arguments );
- // Do we need to add the callbacks to the
- // current firing batch?
- if ( firing ) {
- firingLength = list.length;
- // With memory, if we're not firing then
- // we should call right away, unless previous
- // firing was halted (stopOnFalse)
- } else if ( memory && memory !== true ) {
- firingStart = length;
- fire( memory[ 0 ], memory[ 1 ] );
- }
- }
- return this;
- },
- // Remove a callback from the list
- remove: function() {
- if ( list ) {
- var args = arguments,
- argIndex = 0,
- argLength = args.length;
- for ( ; argIndex < argLength ; argIndex++ ) {
- for ( var i = 0; i < list.length; i++ ) {
- if ( args[ argIndex ] === list[ i ] ) {
- // Handle firingIndex and firingLength
- if ( firing ) {
- if ( i <= firingLength ) {
- firingLength--;
- if ( i <= firingIndex ) {
- firingIndex--;
- }
- }
- }
- // Remove the element
- list.splice( i--, 1 );
- // If we have some unicity property then
- // we only need to do this once
- if ( flags.unique ) {
- break;
- }
- }
- }
- }
- }
- return this;
- },
- // Control if a given callback is in the list
- has: function( fn ) {
- if ( list ) {
- var i = 0,
- length = list.length;
- for ( ; i < length; i++ ) {
- if ( fn === list[ i ] ) {
- return true;
- }
- }
- }
- return false;
- },
- // Remove all callbacks from the list
- empty: function() {
- list = [];
- return this;
- },
- // Have the list do nothing anymore
- disable: function() {
- list = stack = memory = undefined;
- return this;
- },
- // Is it disabled?
- disabled: function() {
- return !list;
- },
- // Lock the list in its current state
- lock: function() {
- stack = undefined;
- if ( !memory || memory === true ) {
- self.disable();
- }
- return this;
- },
- // Is it locked?
- locked: function() {
- return !stack;
- },
- // Call all callbacks with the given context and arguments
- fireWith: function( context, args ) {
- if ( stack ) {
- if ( firing ) {
- if ( !flags.once ) {
- stack.push( [ context, args ] );
- }
- } else if ( !( flags.once && memory ) ) {
- fire( context, args );
- }
- }
- return this;
- },
- // Call all the callbacks with the given arguments
- fire: function() {
- self.fireWith( this, arguments );
- return this;
- },
- // To know if the callbacks have already been called at least once
- fired: function() {
- return !!fired;
- }
- };
-
- return self;
-};
-
-
-
-
-var // Static reference to slice
- sliceDeferred = [].slice;
-
-jQuery.extend({
-
- Deferred: function( func ) {
- var doneList = jQuery.Callbacks( "once memory" ),
- failList = jQuery.Callbacks( "once memory" ),
- progressList = jQuery.Callbacks( "memory" ),
- state = "pending",
- lists = {
- resolve: doneList,
- reject: failList,
- notify: progressList
- },
- promise = {
- done: doneList.add,
- fail: failList.add,
- progress: progressList.add,
-
- state: function() {
- return state;
- },
-
- // Deprecated
- isResolved: doneList.fired,
- isRejected: failList.fired,
-
- then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
- deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
- return this;
- },
- always: function() {
- deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
- return this;
- },
- pipe: function( fnDone, fnFail, fnProgress ) {
- return jQuery.Deferred(function( newDefer ) {
- jQuery.each( {
- done: [ fnDone, "resolve" ],
- fail: [ fnFail, "reject" ],
- progress: [ fnProgress, "notify" ]
- }, function( handler, data ) {
- var fn = data[ 0 ],
- action = data[ 1 ],
- returned;
- if ( jQuery.isFunction( fn ) ) {
- deferred[ handler ](function() {
- returned = fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
- } else {
- newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
- }
- });
- } else {
- deferred[ handler ]( newDefer[ action ] );
- }
- });
- }).promise();
- },
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- if ( obj == null ) {
- obj = promise;
- } else {
- for ( var key in promise ) {
- obj[ key ] = promise[ key ];
- }
- }
- return obj;
- }
- },
- deferred = promise.promise({}),
- key;
-
- for ( key in lists ) {
- deferred[ key ] = lists[ key ].fire;
- deferred[ key + "With" ] = lists[ key ].fireWith;
- }
-
- // Handle state
- deferred.done( function() {
- state = "resolved";
- }, failList.disable, progressList.lock ).fail( function() {
- state = "rejected";
- }, doneList.disable, progressList.lock );
-
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- // All done!
- return deferred;
- },
-
- // Deferred helper
- when: function( firstParam ) {
- var args = sliceDeferred.call( arguments, 0 ),
- i = 0,
- length = args.length,
- pValues = new Array( length ),
- count = length,
- pCount = length,
- deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
- firstParam :
- jQuery.Deferred(),
- promise = deferred.promise();
- function resolveFunc( i ) {
- return function( value ) {
- args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
- if ( !( --count ) ) {
- deferred.resolveWith( deferred, args );
- }
- };
- }
- function progressFunc( i ) {
- return function( value ) {
- pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
- deferred.notifyWith( promise, pValues );
- };
- }
- if ( length > 1 ) {
- for ( ; i < length; i++ ) {
- if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
- args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
- } else {
- --count;
- }
- }
- if ( !count ) {
- deferred.resolveWith( deferred, args );
- }
- } else if ( deferred !== firstParam ) {
- deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
- }
- return promise;
- }
-});
-
-
-
-
-jQuery.support = (function() {
-
- var support,
- all,
- a,
- select,
- opt,
- input,
- fragment,
- tds,
- events,
- eventName,
- i,
- isSupported,
- div = document.createElement( "div" ),
- documentElement = document.documentElement;
-
- // Preliminary tests
- div.setAttribute("className", "t");
- div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-
- all = div.getElementsByTagName( "*" );
- a = div.getElementsByTagName( "a" )[ 0 ];
-
- // Can't get basic test support
- if ( !all || !all.length || !a ) {
- return {};
- }
-
- // First batch of supports tests
- select = document.createElement( "select" );
- opt = select.appendChild( document.createElement("option") );
- input = div.getElementsByTagName( "input" )[ 0 ];
-
- support = {
- // IE strips leading whitespace when .innerHTML is used
- leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- tbody: !div.getElementsByTagName("tbody").length,
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- htmlSerialize: !!div.getElementsByTagName("link").length,
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- style: /top/.test( a.getAttribute("style") ),
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- // Use a regex to work around a WebKit issue. See #5145
- opacity: /^0.55/.test( a.style.opacity ),
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- cssFloat: !!a.style.cssFloat,
-
- // Make sure that if no value is specified for a checkbox
- // that it defaults to "on".
- // (WebKit defaults to "" instead)
- checkOn: ( input.value === "on" ),
-
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- optSelected: opt.selected,
-
- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- getSetAttribute: div.className !== "t",
-
- // Tests for enctype support on a form(#6743)
- enctype: !!document.createElement("form").enctype,
-
- // Makes sure cloning an html5 element does not cause problems
- // Where outerHTML is undefined, this still works
- html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-
- // Will be defined later
- submitBubbles: true,
- changeBubbles: true,
- focusinBubbles: false,
- deleteExpando: true,
- noCloneEvent: true,
- inlineBlockNeedsLayout: false,
- shrinkWrapBlocks: false,
- reliableMarginRight: true,
- pixelMargin: true
- };
-
- // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
- jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
-
- // Make sure checked status is properly cloned
- input.checked = true;
- support.noCloneChecked = input.cloneNode( true ).checked;
-
- // Make sure that the options inside disabled selects aren't marked as disabled
- // (WebKit marks them as disabled)
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Test to see if it's possible to delete an expando from an element
- // Fails in Internet Explorer
- try {
- delete div.test;
- } catch( e ) {
- support.deleteExpando = false;
- }
-
- if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
- div.attachEvent( "onclick", function() {
- // Cloning a node shouldn't copy over any
- // bound event handlers (IE does this)
- support.noCloneEvent = false;
- });
- div.cloneNode( true ).fireEvent( "onclick" );
- }
-
- // Check if a radio maintains its value
- // after being appended to the DOM
- input = document.createElement("input");
- input.value = "t";
- input.setAttribute("type", "radio");
- support.radioValue = input.value === "t";
-
- input.setAttribute("checked", "checked");
-
- // #11217 - WebKit loses check when the name is after the checked attribute
- input.setAttribute( "name", "t" );
-
- div.appendChild( input );
- fragment = document.createDocumentFragment();
- fragment.appendChild( div.lastChild );
-
- // WebKit doesn't clone checked state correctly in fragments
- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Check if a disconnected checkbox will retain its checked
- // value of true after appended to the DOM (IE6/7)
- support.appendChecked = input.checked;
-
- fragment.removeChild( input );
- fragment.appendChild( div );
-
- // Technique from Juriy Zaytsev
- // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
- // We only care about the case where non-standard event systems
- // are used, namely in IE. Short-circuiting here helps us to
- // avoid an eval call (in setAttribute) which can cause CSP
- // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
- if ( div.attachEvent ) {
- for ( i in {
- submit: 1,
- change: 1,
- focusin: 1
- }) {
- eventName = "on" + i;
- isSupported = ( eventName in div );
- if ( !isSupported ) {
- div.setAttribute( eventName, "return;" );
- isSupported = ( typeof div[ eventName ] === "function" );
- }
- support[ i + "Bubbles" ] = isSupported;
- }
- }
-
- fragment.removeChild( div );
-
- // Null elements to avoid leaks in IE
- fragment = select = opt = div = input = null;
-
- // Run tests that need a body at doc ready
- jQuery(function() {
- var container, outer, inner, table, td, offsetSupport,
- marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
- paddingMarginBorderVisibility, paddingMarginBorder,
- body = document.getElementsByTagName("body")[0];
-
- if ( !body ) {
- // Return for frameset docs that don't have a body
- return;
- }
-
- conMarginTop = 1;
- paddingMarginBorder = "padding:0;margin:0;border:";
- positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
- paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
- style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
- html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
- "<table " + style + "' cellpadding='0' cellspacing='0'>" +
- "<tr><td></td></tr></table>";
-
- container = document.createElement("div");
- container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
- body.insertBefore( container, body.firstChild );
-
- // Construct the test element
- div = document.createElement("div");
- container.appendChild( div );
-
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- // (only IE 8 fails this test)
- div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
- tds = div.getElementsByTagName( "td" );
- isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
- tds[ 0 ].style.display = "";
- tds[ 1 ].style.display = "none";
-
- // Check if empty table cells still have offsetWidth/Height
- // (IE <= 8 fail this test)
- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. For more
- // info see bug #3333
- // Fails in WebKit before Feb 2011 nightlies
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- if ( window.getComputedStyle ) {
- div.innerHTML = "";
- marginDiv = document.createElement( "div" );
- marginDiv.style.width = "0";
- marginDiv.style.marginRight = "0";
- div.style.width = "2px";
- div.appendChild( marginDiv );
- support.reliableMarginRight =
- ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
- }
-
- if ( typeof div.style.zoom !== "undefined" ) {
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- // (IE < 8 does this)
- div.innerHTML = "";
- div.style.width = div.style.padding = "1px";
- div.style.border = 0;
- div.style.overflow = "hidden";
- div.style.display = "inline";
- div.style.zoom = 1;
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
- // Check if elements with layout shrink-wrap their children
- // (IE 6 does this)
- div.style.display = "block";
- div.style.overflow = "visible";
- div.innerHTML = "<div style='width:5px;'></div>";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
- }
-
- div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
- div.innerHTML = html;
-
- outer = div.firstChild;
- inner = outer.firstChild;
- td = outer.nextSibling.firstChild.firstChild;
-
- offsetSupport = {
- doesNotAddBorder: ( inner.offsetTop !== 5 ),
- doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
- };
-
- inner.style.position = "fixed";
- inner.style.top = "20px";
-
- // safari subtracts parent border width here which is 5px
- offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
- inner.style.position = inner.style.top = "";
-
- outer.style.overflow = "hidden";
- outer.style.position = "relative";
-
- offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
- offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
-
- if ( window.getComputedStyle ) {
- div.style.marginTop = "1%";
- support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
- }
-
- if ( typeof container.style.zoom !== "undefined" ) {
- container.style.zoom = 1;
- }
-
- body.removeChild( container );
- marginDiv = div = container = null;
-
- jQuery.extend( support, offsetSupport );
- });
-
- return support;
-})();
-
-
-
-
-var rbrace = /^(?:\{.*\}|\[.*\])$/,
- rmultiDash = /([A-Z])/g;
-
-jQuery.extend({
- cache: {},
-
- // Please use with caution
- uuid: 0,
-
- // Unique for each copy of jQuery on the page
- // Non-digits removed to match rinlinejQuery
- expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
- // The following elements throw uncatchable exceptions if you
- // attempt to add expando properties to them.
- noData: {
- "embed": true,
- // Ban all objects except for Flash (which handle expandos)
- "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
- "applet": true
- },
-
- hasData: function( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
- return !!elem && !isEmptyDataObject( elem );
- },
-
- data: function( elem, name, data, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var privateCache, thisCache, ret,
- internalKey = jQuery.expando,
- getByName = typeof name === "string",
-
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
-
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
-
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
- isEvents = name === "events";
-
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
- return;
- }
-
- if ( !id ) {
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- elem[ internalKey ] = id = ++jQuery.uuid;
- } else {
- id = internalKey;
- }
- }
-
- if ( !cache[ id ] ) {
- cache[ id ] = {};
-
- // Avoids exposing jQuery metadata on plain JS objects when the object
- // is serialized using JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
- }
-
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ] = jQuery.extend( cache[ id ], name );
- } else {
- cache[ id ].data = jQuery.extend( cache[ id ].data, name );
- }
- }
-
- privateCache = thisCache = cache[ id ];
-
- // jQuery data() is stored in a separate object inside the object's internal data
- // cache in order to avoid key collisions between internal data and user-defined
- // data.
- if ( !pvt ) {
- if ( !thisCache.data ) {
- thisCache.data = {};
- }
-
- thisCache = thisCache.data;
- }
-
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
-
- // Users should not attempt to inspect the internal events object using jQuery.data,
- // it is undocumented and subject to change. But does anyone listen? No.
- if ( isEvents && !thisCache[ name ] ) {
- return privateCache.events;
- }
-
- // Check for both converted-to-camel and non-converted data property names
- // If a data property was specified
- if ( getByName ) {
-
- // First Try to find as-is property data
- ret = thisCache[ name ];
-
- // Test for null|undefined property data
- if ( ret == null ) {
-
- // Try to find the camelCased property
- ret = thisCache[ jQuery.camelCase( name ) ];
- }
- } else {
- ret = thisCache;
- }
-
- return ret;
- },
-
- removeData: function( elem, name, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var thisCache, i, l,
-
- // Reference to internal data cache key
- internalKey = jQuery.expando,
-
- isNode = elem.nodeType,
-
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
-
- // See jQuery.data for more information
- id = isNode ? elem[ internalKey ] : internalKey;
-
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
-
- if ( name ) {
-
- thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
- if ( thisCache ) {
-
- // Support array or space separated string names for data keys
- if ( !jQuery.isArray( name ) ) {
-
- // try the string as a key before any manipulation
- if ( name in thisCache ) {
- name = [ name ];
- } else {
-
- // split the camel cased version by spaces unless a key with the spaces exists
- name = jQuery.camelCase( name );
- if ( name in thisCache ) {
- name = [ name ];
- } else {
- name = name.split( " " );
- }
- }
- }
-
- for ( i = 0, l = name.length; i < l; i++ ) {
- delete thisCache[ name[i] ];
- }
-
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
- return;
- }
- }
- }
-
- // See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
-
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject(cache[ id ]) ) {
- return;
- }
- }
-
- // Browsers that fail expando deletion also refuse to delete expandos on
- // the window, but it will allow it on all other JS objects; other browsers
- // don't care
- // Ensure that `cache` is not a window object #10080
- if ( jQuery.support.deleteExpando || !cache.setInterval ) {
- delete cache[ id ];
- } else {
- cache[ id ] = null;
- }
-
- // We destroyed the cache and need to eliminate the expando on the node to avoid
- // false lookups in the cache for entries that no longer exist
- if ( isNode ) {
- // IE does not allow us to delete expando properties from nodes,
- // nor does it have a removeAttribute function on Document nodes;
- // we must handle all of these cases
- if ( jQuery.support.deleteExpando ) {
- delete elem[ internalKey ];
- } else if ( elem.removeAttribute ) {
- elem.removeAttribute( internalKey );
- } else {
- elem[ internalKey ] = null;
- }
- }
- },
-
- // For internal use only.
- _data: function( elem, name, data ) {
- return jQuery.data( elem, name, data, true );
- },
-
- // A method for determining if a DOM node can handle the data expando
- acceptData: function( elem ) {
- if ( elem.nodeName ) {
- var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
- if ( match ) {
- return !(match === true || elem.getAttribute("classid") !== match);
- }
- }
-
- return true;
- }
-});
-
-jQuery.fn.extend({
- data: function( key, value ) {
- var parts, part, attr, name, l,
- elem = this[0],
- i = 0,
- data = null;
-
- // Gets all values
- if ( key === undefined ) {
- if ( this.length ) {
- data = jQuery.data( elem );
-
- if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
- attr = elem.attributes;
- for ( l = attr.length; i < l; i++ ) {
- name = attr[i].name;
-
- if ( name.indexOf( "data-" ) === 0 ) {
- name = jQuery.camelCase( name.substring(5) );
-
- dataAttr( elem, name, data[ name ] );
- }
- }
- jQuery._data( elem, "parsedAttrs", true );
- }
- }
-
- return data;
- }
-
- // Sets multiple values
- if ( typeof key === "object" ) {
- return this.each(function() {
- jQuery.data( this, key );
- });
- }
-
- parts = key.split( ".", 2 );
- parts[1] = parts[1] ? "." + parts[1] : "";
- part = parts[1] + "!";
-
- return jQuery.access( this, function( value ) {
-
- if ( value === undefined ) {
- data = this.triggerHandler( "getData" + part, [ parts[0] ] );
-
- // Try to fetch any internally stored data first
- if ( data === undefined && elem ) {
- data = jQuery.data( elem, key );
- data = dataAttr( elem, key, data );
- }
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
- }
-
- parts[1] = value;
- this.each(function() {
- var self = jQuery( this );
-
- self.triggerHandler( "setData" + part, parts );
- jQuery.data( this, key, value );
- self.triggerHandler( "changeData" + part, parts );
- });
- }, null, value, arguments.length > 1, null, false );
- },
-
- removeData: function( key ) {
- return this.each(function() {
- jQuery.removeData( this, key );
- });
- }
-});
-
-function dataAttr( elem, key, data ) {
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
-
- var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
- jQuery.isNumeric( data ) ? +data :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch( e ) {}
-
- // Make sure we set the data so it isn't changed later
- jQuery.data( elem, key, data );
-
- } else {
- data = undefined;
- }
- }
-
- return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
- for ( var name in obj ) {
-
- // if the public data object is empty, the private is still empty
- if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
- continue;
- }
- if ( name !== "toJSON" ) {
- return false;
- }
- }
-
- return true;
-}
-
-
-
-
-function handleQueueMarkDefer( elem, type, src ) {
- var deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- defer = jQuery._data( elem, deferDataKey );
- if ( defer &&
- ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
- ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
- // Give room for hard-coded callbacks to fire first
- // and eventually mark/queue something else on the element
- setTimeout( function() {
- if ( !jQuery._data( elem, queueDataKey ) &&
- !jQuery._data( elem, markDataKey ) ) {
- jQuery.removeData( elem, deferDataKey, true );
- defer.fire();
- }
- }, 0 );
- }
-}
-
-jQuery.extend({
-
- _mark: function( elem, type ) {
- if ( elem ) {
- type = ( type || "fx" ) + "mark";
- jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
- }
- },
-
- _unmark: function( force, elem, type ) {
- if ( force !== true ) {
- type = elem;
- elem = force;
- force = false;
- }
- if ( elem ) {
- type = type || "fx";
- var key = type + "mark",
- count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
- if ( count ) {
- jQuery._data( elem, key, count );
- } else {
- jQuery.removeData( elem, key, true );
- handleQueueMarkDefer( elem, type, "mark" );
- }
- }
- },
-
- queue: function( elem, type, data ) {
- var q;
- if ( elem ) {
- type = ( type || "fx" ) + "queue";
- q = jQuery._data( elem, type );
-
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !q || jQuery.isArray(data) ) {
- q = jQuery._data( elem, type, jQuery.makeArray(data) );
- } else {
- q.push( data );
- }
- }
- return q || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- fn = queue.shift(),
- hooks = {};
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- }
-
- if ( fn ) {
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift( "inprogress" );
- }
-
- jQuery._data( elem, type + ".run", hooks );
- fn.call( elem, function() {
- jQuery.dequeue( elem, type );
- }, hooks );
- }
-
- if ( !queue.length ) {
- jQuery.removeData( elem, type + "queue " + type + ".run", true );
- handleQueueMarkDefer( elem, type, "queue" );
- }
- }
-});
-
-jQuery.fn.extend({
- queue: function( type, data ) {
- var setter = 2;
-
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- setter--;
- }
-
- if ( arguments.length < setter ) {
- return jQuery.queue( this[0], type );
- }
-
- return data === undefined ?
- this :
- this.each(function() {
- var queue = jQuery.queue( this, type, data );
-
- if ( type === "fx" && queue[0] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- });
- },
- dequeue: function( type ) {
- return this.each(function() {
- jQuery.dequeue( this, type );
- });
- },
- // Based off of the plugin by Clint Helfers, with permission.
- // http://blindsignals.com/index.php/2009/07/jquery-delay/
- delay: function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
- type = type || "fx";
-
- return this.queue( type, function( next, hooks ) {
- var timeout = setTimeout( next, time );
- hooks.stop = function() {
- clearTimeout( timeout );
- };
- });
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, object ) {
- if ( typeof type !== "string" ) {
- object = type;
- type = undefined;
- }
- type = type || "fx";
- var defer = jQuery.Deferred(),
- elements = this,
- i = elements.length,
- count = 1,
- deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- tmp;
- function resolve() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- }
- while( i-- ) {
- if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
- ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
- jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
- jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
- count++;
- tmp.add( resolve );
- }
- }
- resolve();
- return defer.promise( object );
- }
-});
-
-
-
-
-var rclass = /[\n\t\r]/g,
- rspace = /\s+/,
- rreturn = /\r/g,
- rtype = /^(?:button|input)$/i,
- rfocusable = /^(?:button|input|object|select|textarea)$/i,
- rclickable = /^a(?:rea)?$/i,
- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- getSetAttribute = jQuery.support.getSetAttribute,
- nodeHook, boolHook, fixSpecified;
-
-jQuery.fn.extend({
- attr: function( name, value ) {
- return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
- },
-
- removeAttr: function( name ) {
- return this.each(function() {
- jQuery.removeAttr( this, name );
- });
- },
-
- prop: function( name, value ) {
- return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
- },
-
- removeProp: function( name ) {
- name = jQuery.propFix[ name ] || name;
- return this.each(function() {
- // try/catch handles cases where IE balks (such as removing a property on window)
- try {
- this[ name ] = undefined;
- delete this[ name ];
- } catch( e ) {}
- });
- },
-
- addClass: function( value ) {
- var classNames, i, l, elem,
- setClass, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).addClass( value.call(this, j, this.className) );
- });
- }
-
- if ( value && typeof value === "string" ) {
- classNames = value.split( rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 ) {
- if ( !elem.className && classNames.length === 1 ) {
- elem.className = value;
-
- } else {
- setClass = " " + elem.className + " ";
-
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
- setClass += classNames[ c ] + " ";
- }
- }
- elem.className = jQuery.trim( setClass );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var classNames, i, l, elem, className, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).removeClass( value.call(this, j, this.className) );
- });
- }
-
- if ( (value && typeof value === "string") || value === undefined ) {
- classNames = ( value || "" ).split( rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 && elem.className ) {
- if ( value ) {
- className = (" " + elem.className + " ").replace( rclass, " " );
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- className = className.replace(" " + classNames[ c ] + " ", " ");
- }
- elem.className = jQuery.trim( className );
-
- } else {
- elem.className = "";
- }
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value,
- isBool = typeof stateVal === "boolean";
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( i ) {
- jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
- });
- }
-
- return this.each(function() {
- if ( type === "string" ) {
- // toggle individual class names
- var className,
- i = 0,
- self = jQuery( this ),
- state = stateVal,
- classNames = value.split( rspace );
-
- while ( (className = classNames[ i++ ]) ) {
- // check each className given, space seperated list
- state = isBool ? state : !self.hasClass( className );
- self[ state ? "addClass" : "removeClass" ]( className );
- }
-
- } else if ( type === "undefined" || type === "boolean" ) {
- if ( this.className ) {
- // store className if set
- jQuery._data( this, "__className__", this.className );
- }
-
- // toggle whole className
- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
- }
- });
- },
-
- hasClass: function( selector ) {
- var className = " " + selector + " ",
- i = 0,
- l = this.length;
- for ( ; i < l; i++ ) {
- if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
- return true;
- }
- }
-
- return false;
- },
-
- val: function( value ) {
- var hooks, ret, isFunction,
- elem = this[0];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
- return ret;
- }
-
- ret = elem.value;
-
- return typeof ret === "string" ?
- // handle most common string cases
- ret.replace(rreturn, "") :
- // handle cases where value is null/undef or number
- ret == null ? "" : ret;
- }
-
- return;
- }
-
- isFunction = jQuery.isFunction( value );
-
- return this.each(function( i ) {
- var self = jQuery(this), val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, self.val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
- } else if ( typeof val === "number" ) {
- val += "";
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map(val, function ( value ) {
- return value == null ? "" : value + "";
- });
- }
-
- hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- });
- }
-});
-
-jQuery.extend({
- valHooks: {
- option: {
- get: function( elem ) {
- // attributes.value is undefined in Blackberry 4.7 but
- // uses .value. See #6932
- var val = elem.attributes.value;
- return !val || val.specified ? elem.value : elem.text;
- }
- },
- select: {
- get: function( elem ) {
- var value, i, max, option,
- index = elem.selectedIndex,
- values = [],
- options = elem.options,
- one = elem.type === "select-one";
-
- // Nothing was selected
- if ( index < 0 ) {
- return null;
- }
-
- // Loop through all the selected options
- i = one ? index : 0;
- max = one ? index + 1 : options.length;
- for ( ; i < max; i++ ) {
- option = options[ i ];
-
- // Don't return options that are disabled or in a disabled optgroup
- if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
- (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
- if ( one && !values.length && options.length ) {
- return jQuery( options[ index ] ).val();
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var values = jQuery.makeArray( value );
-
- jQuery(elem).find("option").each(function() {
- this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
- });
-
- if ( !values.length ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- },
-
- attrFn: {
- val: true,
- css: true,
- html: true,
- text: true,
- data: true,
- width: true,
- height: true,
- offset: true
- },
-
- attr: function( elem, name, value, pass ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set attributes on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- if ( pass && name in jQuery.attrFn ) {
- return jQuery( elem )[ name ]( value );
- }
-
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === "undefined" ) {
- return jQuery.prop( elem, name, value );
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- // All attributes are lowercase
- // Grab necessary hook if one is defined
- if ( notxml ) {
- name = name.toLowerCase();
- hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
- }
-
- if ( value !== undefined ) {
-
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return;
-
- } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- elem.setAttribute( name, "" + value );
- return value;
- }
-
- } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
-
- ret = elem.getAttribute( name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret === null ?
- undefined :
- ret;
- }
- },
-
- removeAttr: function( elem, value ) {
- var propName, attrNames, name, l, isBool,
- i = 0;
-
- if ( value && elem.nodeType === 1 ) {
- attrNames = value.toLowerCase().split( rspace );
- l = attrNames.length;
-
- for ( ; i < l; i++ ) {
- name = attrNames[ i ];
-
- if ( name ) {
- propName = jQuery.propFix[ name ] || name;
- isBool = rboolean.test( name );
-
- // See #9699 for explanation of this approach (setting first, then removal)
- // Do not do this for boolean attributes (see #10870)
- if ( !isBool ) {
- jQuery.attr( elem, name, "" );
- }
- elem.removeAttribute( getSetAttribute ? name : propName );
-
- // Set corresponding property to false for boolean attributes
- if ( isBool && propName in elem ) {
- elem[ propName ] = false;
- }
- }
- }
- }
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
- jQuery.error( "type property can't be changed" );
- } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
- // Setting the type on a radio button after the value resets the value in IE6-9
- // Reset value to it's default in case type is set after value
- // This is for element creation
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- },
- // Use the value property for back compat
- // Use the nodeHook for button elements in IE6/7 (#1954)
- value: {
- get: function( elem, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.get( elem, name );
- }
- return name in elem ?
- elem.value :
- null;
- },
- set: function( elem, value, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.set( elem, value, name );
- }
- // Does not return so that setAttribute is also used
- elem.value = value;
- }
- }
- },
-
- propFix: {
- tabindex: "tabIndex",
- readonly: "readOnly",
- "for": "htmlFor",
- "class": "className",
- maxlength: "maxLength",
- cellspacing: "cellSpacing",
- cellpadding: "cellPadding",
- rowspan: "rowSpan",
- colspan: "colSpan",
- usemap: "useMap",
- frameborder: "frameBorder",
- contenteditable: "contentEditable"
- },
-
- prop: function( elem, name, value ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set properties on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- if ( notxml ) {
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- return ( elem[ name ] = value );
- }
-
- } else {
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
- return elem[ name ];
- }
- }
- },
-
- propHooks: {
- tabIndex: {
- get: function( elem ) {
- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- var attributeNode = elem.getAttributeNode("tabindex");
-
- return attributeNode && attributeNode.specified ?
- parseInt( attributeNode.value, 10 ) :
- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- undefined;
- }
- }
- }
-});
-
-// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
-jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
-
-// Hook for boolean attributes
-boolHook = {
- get: function( elem, name ) {
- // Align boolean attributes with corresponding properties
- // Fall back to attribute presence where some booleans are not supported
- var attrNode,
- property = jQuery.prop( elem, name );
- return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
- name.toLowerCase() :
- undefined;
- },
- set: function( elem, value, name ) {
- var propName;
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = true;
- }
-
- elem.setAttribute( name, name.toLowerCase() );
- }
- return name;
- }
-};
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
- fixSpecified = {
- name: true,
- id: true,
- coords: true
- };
-
- // Use this for any attribute in IE6/7
- // This fixes almost every IE6/7 issue
- nodeHook = jQuery.valHooks.button = {
- get: function( elem, name ) {
- var ret;
- ret = elem.getAttributeNode( name );
- return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
- ret.nodeValue :
- undefined;
- },
- set: function( elem, value, name ) {
- // Set the existing or create a new attribute node
- var ret = elem.getAttributeNode( name );
- if ( !ret ) {
- ret = document.createAttribute( name );
- elem.setAttributeNode( ret );
- }
- return ( ret.nodeValue = value + "" );
- }
- };
-
- // Apply the nodeHook to tabindex
- jQuery.attrHooks.tabindex.set = nodeHook.set;
-
- // Set width and height to auto instead of 0 on empty string( Bug #8150 )
- // This is for removals
- jQuery.each([ "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- set: function( elem, value ) {
- if ( value === "" ) {
- elem.setAttribute( name, "auto" );
- return value;
- }
- }
- });
- });
-
- // Set contenteditable to false on removals(#10429)
- // Setting to empty string throws an error as an invalid value
- jQuery.attrHooks.contenteditable = {
- get: nodeHook.get,
- set: function( elem, value, name ) {
- if ( value === "" ) {
- value = "false";
- }
- nodeHook.set( elem, value, name );
- }
- };
-}
-
-
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
- jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- get: function( elem ) {
- var ret = elem.getAttribute( name, 2 );
- return ret === null ? undefined : ret;
- }
- });
- });
-}
-
-if ( !jQuery.support.style ) {
- jQuery.attrHooks.style = {
- get: function( elem ) {
- // Return undefined in the case of empty string
- // Normalize to lowercase since IE uppercases css property names
- return elem.style.cssText.toLowerCase() || undefined;
- },
- set: function( elem, value ) {
- return ( elem.style.cssText = "" + value );
- }
- };
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
- get: function( elem ) {
- var parent = elem.parentNode;
-
- if ( parent ) {
- parent.selectedIndex;
-
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- return null;
- }
- });
-}
-
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
- jQuery.propFix.enctype = "encoding";
-}
-
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
- jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- get: function( elem ) {
- // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute("value") === null ? "on" : elem.value;
- }
- };
- });
-}
-jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
- set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
- }
- }
- });
-});
-
-
-
-
-var rformElems = /^(?:textarea|input|select)$/i,
- rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
- rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|contextmenu)|click/,
- rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
- rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
- quickParse = function( selector ) {
- var quick = rquickIs.exec( selector );
- if ( quick ) {
- // 0 1 2 3
- // [ _, tag, id, class ]
- quick[1] = ( quick[1] || "" ).toLowerCase();
- quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
- }
- return quick;
- },
- quickIs = function( elem, m ) {
- var attrs = elem.attributes || {};
- return (
- (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
- (!m[2] || (attrs.id || {}).value === m[2]) &&
- (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
- );
- },
- hoverHack = function( events ) {
- return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
- };
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
- add: function( elem, types, handler, data, selector ) {
-
- var elemData, eventHandle, events,
- t, tns, type, namespaces, handleObj,
- handleObjIn, quick, handlers, special;
-
- // Don't attach events to noData or text/comment nodes (allow plain objects tho)
- if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
- return;
- }
-
- // Caller can pass in an object of custom data in lieu of the handler
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- selector = handleObjIn.selector;
- }
-
- // Make sure that the handler has a unique ID, used to find/remove it later
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure and main handler, if this is the first
- events = elemData.events;
- if ( !events ) {
- elemData.events = events = {};
- }
- eventHandle = elemData.handle;
- if ( !eventHandle ) {
- elemData.handle = eventHandle = function( e ) {
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
- undefined;
- };
- // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
- eventHandle.elem = elem;
- }
-
- // Handle multiple events separated by a space
- // jQuery(...).bind("mouseover mouseout", fn);
- types = jQuery.trim( hoverHack(types) ).split( " " );
- for ( t = 0; t < types.length; t++ ) {
-
- tns = rtypenamespace.exec( types[t] ) || [];
- type = tns[1];
- namespaces = ( tns[2] || "" ).split( "." ).sort();
-
- // If event changes its type, use the special event handlers for the changed type
- special = jQuery.event.special[ type ] || {};
-
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
-
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
-
- // handleObj is passed to all event handlers
- handleObj = jQuery.extend({
- type: type,
- origType: tns[1],
- data: data,
- handler: handler,
- guid: handler.guid,
- selector: selector,
- quick: selector && quickParse( selector ),
- namespace: namespaces.join(".")
- }, handleObjIn );
-
- // Init the event handler queue if we're the first
- handlers = events[ type ];
- if ( !handlers ) {
- handlers = events[ type ] = [];
- handlers.delegateCount = 0;
-
- // Only use addEventListener/attachEvent if the special events handler returns false
- if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
- // Bind the global event handler to the element
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle, false );
-
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
- } else {
- handlers.push( handleObj );
- }
-
- // Keep track of which events have ever been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- global: {},
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, selector, mappedTypes ) {
-
- var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
- t, tns, type, origType, namespaces, origCount,
- j, events, special, handle, eventType, handleObj;
-
- if ( !elemData || !(events = elemData.events) ) {
- return;
- }
-
- // Once for each type.namespace in types; type may be omitted
- types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
- for ( t = 0; t < types.length; t++ ) {
- tns = rtypenamespace.exec( types[t] ) || [];
- type = origType = tns[1];
- namespaces = tns[2];
-
- // Unbind all events (on this namespace, if provided) for the element
- if ( !type ) {
- for ( type in events ) {
- jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
- }
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
- type = ( selector? special.delegateType : special.bindType ) || type;
- eventType = events[ type ] || [];
- origCount = eventType.length;
- namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
-
- // Remove matching events
- for ( j = 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( ( mappedTypes || origType === handleObj.origType ) &&
- ( !handler || handler.guid === handleObj.guid ) &&
- ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
- ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
- eventType.splice( j--, 1 );
-
- if ( handleObj.selector ) {
- eventType.delegateCount--;
- }
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
- }
-
- // Remove generic event handler if we removed something and no more handlers exist
- // (avoids potential for endless recursion during removal of special event handlers)
- if ( eventType.length === 0 && origCount !== eventType.length ) {
- if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- delete events[ type ];
- }
- }
-
- // Remove the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- handle = elemData.handle;
- if ( handle ) {
- handle.elem = null;
- }
-
- // removeData also checks for emptiness and clears the expando if empty
- // so use it instead of delete
- jQuery.removeData( elem, [ "events", "handle" ], true );
- }
- },
-
- // Events that are safe to short-circuit if no handlers are attached.
- // Native DOM events should not be added, they may have inline handlers.
- customEvent: {
- "getData": true,
- "setData": true,
- "changeData": true
- },
-
- trigger: function( event, data, elem, onlyHandlers ) {
- // Don't do events on text and comment nodes
- if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
- return;
- }
-
- // Event object or event type
- var type = event.type || event,
- namespaces = [],
- cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
-
- // focus/blur morphs to focusin/out; ensure we're not firing them right now
- if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
- return;
- }
-
- if ( type.indexOf( "!" ) >= 0 ) {
- // Exclusive events trigger only for the exact event (no namespaces)
- type = type.slice(0, -1);
- exclusive = true;
- }
-
- if ( type.indexOf( "." ) >= 0 ) {
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split(".");
- type = namespaces.shift();
- namespaces.sort();
- }
-
- if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
- // No jQuery handlers for this event type, and it can't have inline handlers
- return;
- }
-
- // Caller can pass in an Event, Object, or just an event type string
- event = typeof event === "object" ?
- // jQuery.Event object
- event[ jQuery.expando ] ? event :
- // Object literal
- new jQuery.Event( type, event ) :
- // Just the event type (string)
- new jQuery.Event( type );
-
- event.type = type;
- event.isTrigger = true;
- event.exclusive = exclusive;
- event.namespace = namespaces.join( "." );
- event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
- ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
- // Handle a global trigger
- if ( !elem ) {
-
- // TODO: Stop taunting the data cache; remove global events and always attach to document
- cache = jQuery.cache;
- for ( i in cache ) {
- if ( cache[ i ].events && cache[ i ].events[ type ] ) {
- jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
- }
- }
- return;
- }
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- if ( !event.target ) {
- event.target = elem;
- }
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data != null ? jQuery.makeArray( data ) : [];
- data.unshift( event );
-
- // Allow special events to draw outside the lines
- special = jQuery.event.special[ type ] || {};
- if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
- return;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- eventPath = [[ elem, special.bindType || type ]];
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
- bubbleType = special.delegateType || type;
- cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
- old = null;
- for ( ; cur; cur = cur.parentNode ) {
- eventPath.push([ cur, bubbleType ]);
- old = cur;
- }
-
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( old && old === elem.ownerDocument ) {
- eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
- }
- }
-
- // Fire handlers on the event path
- for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
-
- cur = eventPath[i][0];
- event.type = eventPath[i][1];
-
- handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
- if ( handle ) {
- handle.apply( cur, data );
- }
- // Note that this is a bare JS function and not a jQuery handler
- handle = ontype && cur[ ontype ];
- if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
- event.preventDefault();
- }
- }
- event.type = type;
-
- // If nobody prevented the default action, do it now
- if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
- if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
- !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction() check here because IE6/7 fails that test.
- // Don't do default actions on window, that's where global variables be (#6170)
- // IE<9 dies on focus/blur to hidden element (#1486)
- if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-
- // Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
-
- if ( old ) {
- elem[ ontype ] = null;
- }
-
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
- elem[ type ]();
- jQuery.event.triggered = undefined;
-
- if ( old ) {
- elem[ ontype ] = old;
- }
- }
- }
- }
-
- return event.result;
- },
-
- dispatch: function( event ) {
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( event || window.event );
-
- var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
- delegateCount = handlers.delegateCount,
- args = [].slice.call( arguments, 0 ),
- run_all = !event.exclusive && !event.namespace,
- special = jQuery.event.special[ event.type ] || {},
- handlerQueue = [],
- i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
-
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
- args[0] = event;
- event.delegateTarget = this;
-
- // Call the preDispatch hook for the mapped type, and let it bail if desired
- if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
- return;
- }
-
- // Determine handlers that should run if there are delegated events
- // Avoid non-left-click bubbling in Firefox (#3861)
- if ( delegateCount && !(event.button && event.type === "click") ) {
-
- // Pregenerate a single jQuery object for reuse with .is()
- jqcur = jQuery(this);
- jqcur.context = this.ownerDocument || this;
-
- for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
-
- // Don't process events on disabled elements (#6911, #8165)
- if ( cur.disabled !== true ) {
- selMatch = {};
- matches = [];
- jqcur[0] = cur;
- for ( i = 0; i < delegateCount; i++ ) {
- handleObj = handlers[ i ];
- sel = handleObj.selector;
-
- if ( selMatch[ sel ] === undefined ) {
- selMatch[ sel ] = (
- handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
- );
- }
- if ( selMatch[ sel ] ) {
- matches.push( handleObj );
- }
- }
- if ( matches.length ) {
- handlerQueue.push({ elem: cur, matches: matches });
- }
- }
- }
- }
-
- // Add the remaining (directly-bound) handlers
- if ( handlers.length > delegateCount ) {
- handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
- }
-
- // Run delegates first; they may want to stop propagation beneath us
- for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
- matched = handlerQueue[ i ];
- event.currentTarget = matched.elem;
-
- for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
- handleObj = matched.matches[ j ];
-
- // Triggered event must either 1) be non-exclusive and have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
- if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
-
- event.data = handleObj.data;
- event.handleObj = handleObj;
-
- ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
- .apply( matched.elem, args );
-
- if ( ret !== undefined ) {
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
- }
- }
-
- // Call the postDispatch hook for the mapped type
- if ( special.postDispatch ) {
- special.postDispatch.call( this, event );
- }
-
- return event.result;
- },
-
- // Includes some event props shared by KeyEvent and MouseEvent
- // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
- props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
- fixHooks: {},
-
- keyHooks: {
- props: "char charCode key keyCode".split(" "),
- filter: function( event, original ) {
-
- // Add which for key events
- if ( event.which == null ) {
- event.which = original.charCode != null ? original.charCode : original.keyCode;
- }
-
- return event;
- }
- },
-
- mouseHooks: {
- props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
- filter: function( event, original ) {
- var eventDoc, doc, body,
- button = original.button,
- fromElement = original.fromElement;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && original.clientX != null ) {
- eventDoc = event.target.ownerDocument || document;
- doc = eventDoc.documentElement;
- body = eventDoc.body;
-
- event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
- event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
- }
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && fromElement ) {
- event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && button !== undefined ) {
- event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
- }
-
- return event;
- }
- },
-
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // Create a writable copy of the event object and normalize some properties
- var i, prop,
- originalEvent = event,
- fixHook = jQuery.event.fixHooks[ event.type ] || {},
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
- event = jQuery.Event( originalEvent );
-
- for ( i = copy.length; i; ) {
- prop = copy[ --i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
- if ( !event.target ) {
- event.target = originalEvent.srcElement || document;
- }
-
- // Target should not be a text node (#504, Safari)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
- if ( event.metaKey === undefined ) {
- event.metaKey = event.ctrlKey;
- }
-
- return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
- },
-
- special: {
- ready: {
- // Make sure the ready event is setup
- setup: jQuery.bindReady
- },
-
- load: {
- // Prevent triggered image.load events from bubbling to window.load
- noBubble: true
- },
-
- focus: {
- delegateType: "focusin"
- },
- blur: {
- delegateType: "focusout"
- },
-
- beforeunload: {
- setup: function( data, namespaces, eventHandle ) {
- // We only want to do this special case on windows
- if ( jQuery.isWindow( this ) ) {
- this.onbeforeunload = eventHandle;
- }
- },
-
- teardown: function( namespaces, eventHandle ) {
- if ( this.onbeforeunload === eventHandle ) {
- this.onbeforeunload = null;
- }
- }
- }
- },
-
- simulate: function( type, elem, event, bubble ) {
- // Piggyback on a donor event to simulate a different one.
- // Fake originalEvent to avoid donor's stopPropagation, but if the
- // simulated event prevents default then we do the same on the donor.
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- { type: type,
- isSimulated: true,
- originalEvent: {}
- }
- );
- if ( bubble ) {
- jQuery.event.trigger( e, null, elem );
- } else {
- jQuery.event.dispatch.call( elem, e );
- }
- if ( e.isDefaultPrevented() ) {
- event.preventDefault();
- }
- }
-};
-
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-jQuery.event.handle = jQuery.event.dispatch;
-
-jQuery.removeEvent = document.removeEventListener ?
- function( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
- }
- } :
- function( elem, type, handle ) {
- if ( elem.detachEvent ) {
- elem.detachEvent( "on" + type, handle );
- }
- };
-
-jQuery.Event = function( src, props ) {
- // Allow instantiation without the 'new' keyword
- if ( !(this instanceof jQuery.Event) ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-function returnFalse() {
- return false;
-}
-function returnTrue() {
- return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- preventDefault: function() {
- this.isDefaultPrevented = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
-
- // if preventDefault exists run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
-
- // otherwise set the returnValue property of the original event to false (IE)
- } else {
- e.returnValue = false;
- }
- },
- stopPropagation: function() {
- this.isPropagationStopped = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
- // if stopPropagation exists run it on the original event
- if ( e.stopPropagation ) {
- e.stopPropagation();
- }
- // otherwise set the cancelBubble property of the original event to true (IE)
- e.cancelBubble = true;
- },
- stopImmediatePropagation: function() {
- this.isImmediatePropagationStopped = returnTrue;
- this.stopPropagation();
- },
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = {
- delegateType: fix,
- bindType: fix,
-
- handle: function( event ) {
- var target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj,
- selector = handleObj.selector,
- ret;
-
- // For mousenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = fix;
- }
- return ret;
- }
- };
-});
-
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
- jQuery.event.special.submit = {
- setup: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Lazy-add a submit handler when a descendant form may potentially be submitted
- jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
- // Node name check avoids a VML-related crash in IE (#9807)
- var elem = e.target,
- form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
- if ( form && !form._submit_attached ) {
- jQuery.event.add( form, "submit._submit", function( event ) {
- event._submit_bubble = true;
- });
- form._submit_attached = true;
- }
- });
- // return undefined since we don't need an event listener
- },
-
- postDispatch: function( event ) {
- // If form was submitted by the user, bubble the event up the tree
- if ( event._submit_bubble ) {
- delete event._submit_bubble;
- if ( this.parentNode && !event.isTrigger ) {
- jQuery.event.simulate( "submit", this.parentNode, event, true );
- }
- }
- },
-
- teardown: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
- jQuery.event.remove( this, "._submit" );
- }
- };
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
- jQuery.event.special.change = {
-
- setup: function() {
-
- if ( rformElems.test( this.nodeName ) ) {
- // IE doesn't fire change on a check/radio until blur; trigger it on click
- // after a propertychange. Eat the blur-change in special.change.handle.
- // This still fires onchange a second time for check/radio after blur.
- if ( this.type === "checkbox" || this.type === "radio" ) {
- jQuery.event.add( this, "propertychange._change", function( event ) {
- if ( event.originalEvent.propertyName === "checked" ) {
- this._just_changed = true;
- }
- });
- jQuery.event.add( this, "click._change", function( event ) {
- if ( this._just_changed && !event.isTrigger ) {
- this._just_changed = false;
- jQuery.event.simulate( "change", this, event, true );
- }
- });
- }
- return false;
- }
- // Delegated event; lazy-add a change handler on descendant inputs
- jQuery.event.add( this, "beforeactivate._change", function( e ) {
- var elem = e.target;
-
- if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
- jQuery.event.add( elem, "change._change", function( event ) {
- if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
- jQuery.event.simulate( "change", this.parentNode, event, true );
- }
- });
- elem._change_attached = true;
- }
- });
- },
-
- handle: function( event ) {
- var elem = event.target;
-
- // Swallow native change events from checkbox/radio, we already triggered them above
- if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
- return event.handleObj.handler.apply( this, arguments );
- }
- },
-
- teardown: function() {
- jQuery.event.remove( this, "._change" );
-
- return rformElems.test( this.nodeName );
- }
- };
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
- jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0,
- handler = function( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
- };
-
- jQuery.event.special[ fix ] = {
- setup: function() {
- if ( attaches++ === 0 ) {
- document.addEventListener( orig, handler, true );
- }
- },
- teardown: function() {
- if ( --attaches === 0 ) {
- document.removeEventListener( orig, handler, true );
- }
- }
- };
- });
-}
-
-jQuery.fn.extend({
-
- on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
- var origFn, type;
-
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) { // && selector != null
- // ( types-Object, data )
- data = data || selector;
- selector = undefined;
- }
- for ( type in types ) {
- this.on( type, selector, data, types[ type ], one );
- }
- return this;
- }
-
- if ( data == null && fn == null ) {
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
- // ( types, selector, fn )
- fn = data;
- data = undefined;
- } else {
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
- }
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return this;
- }
-
- if ( one === 1 ) {
- origFn = fn;
- fn = function( event ) {
- // Can use an empty set, since event contains the info
- jQuery().off( event );
- return origFn.apply( this, arguments );
- };
- // Use same guid so caller can remove using origFn
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
- }
- return this.each( function() {
- jQuery.event.add( this, types, fn, data, selector );
- });
- },
- one: function( types, selector, data, fn ) {
- return this.on( types, selector, data, fn, 1 );
- },
- off: function( types, selector, fn ) {
- if ( types && types.preventDefault && types.handleObj ) {
- // ( event ) dispatched jQuery.Event
- var handleObj = types.handleObj;
- jQuery( types.delegateTarget ).off(
- handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
- handleObj.selector,
- handleObj.handler
- );
- return this;
- }
- if ( typeof types === "object" ) {
- // ( types-object [, selector] )
- for ( var type in types ) {
- this.off( type, selector, types[ type ] );
- }
- return this;
- }
- if ( selector === false || typeof selector === "function" ) {
- // ( types [, fn] )
- fn = selector;
- selector = undefined;
- }
- if ( fn === false ) {
- fn = returnFalse;
- }
- return this.each(function() {
- jQuery.event.remove( this, types, fn, selector );
- });
- },
-
- bind: function( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- return this.off( types, null, fn );
- },
-
- live: function( types, data, fn ) {
- jQuery( this.context ).on( types, this.selector, data, fn );
- return this;
- },
- die: function( types, fn ) {
- jQuery( this.context ).off( types, this.selector || "**", fn );
- return this;
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
- },
-
- trigger: function( type, data ) {
- return this.each(function() {
- jQuery.event.trigger( type, data, this );
- });
- },
- triggerHandler: function( type, data ) {
- if ( this[0] ) {
- return jQuery.event.trigger( type, data, this[0], true );
- }
- },
-
- toggle: function( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
- },
-
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-});
-
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- if ( fn == null ) {
- fn = data;
- data = null;
- }
-
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
-
- if ( jQuery.attrFn ) {
- jQuery.attrFn[ name ] = true;
- }
-
- if ( rkeyEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
- }
-
- if ( rmouseEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
- }
-});
-
-
-
-/*!
- * Sizzle CSS Selector Engine
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
-(function(){
-
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
- expando = "sizcache" + (Math.random() + '').replace('.', ''),
- done = 0,
- toString = Object.prototype.toString,
- hasDuplicate = false,
- baseHasDuplicate = true,
- rBackslash = /\\/g,
- rReturn = /\r\n/g,
- rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-// Thus far that includes Google Chrome.
-[0, 0].sort(function() {
- baseHasDuplicate = false;
- return 0;
-});
-
-var Sizzle = function( selector, context, results, seed ) {
- results = results || [];
- context = context || document;
-
- var origContext = context;
-
- if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
- return [];
- }
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- var m, set, checkSet, extra, ret, cur, pop, i,
- prune = true,
- contextXML = Sizzle.isXML( context ),
- parts = [],
- soFar = selector;
-
- // Reset the position of the chunker regexp (start from head)
- do {
- chunker.exec( "" );
- m = chunker.exec( soFar );
-
- if ( m ) {
- soFar = m[3];
-
- parts.push( m[1] );
-
- if ( m[2] ) {
- extra = m[3];
- break;
- }
- }
- } while ( m );
-
- if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context, seed );
-
- } else {
- set = Expr.relative[ parts[0] ] ?
- [ context ] :
- Sizzle( parts.shift(), context );
-
- while ( parts.length ) {
- selector = parts.shift();
-
- if ( Expr.relative[ selector ] ) {
- selector += parts.shift();
- }
-
- set = posProcess( selector, set, seed );
- }
- }
-
- } else {
- // Take a shortcut and set the context if the root selector is an ID
- // (but not if it'll be faster if the inner selector is an ID)
- if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
- Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
-
- ret = Sizzle.find( parts.shift(), context, contextXML );
- context = ret.expr ?
- Sizzle.filter( ret.expr, ret.set )[0] :
- ret.set[0];
- }
-
- if ( context ) {
- ret = seed ?
- { expr: parts.pop(), set: makeArray(seed) } :
- Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
- set = ret.expr ?
- Sizzle.filter( ret.expr, ret.set ) :
- ret.set;
-
- if ( parts.length > 0 ) {
- checkSet = makeArray( set );
-
- } else {
- prune = false;
- }
-
- while ( parts.length ) {
- cur = parts.pop();
- pop = cur;
-
- if ( !Expr.relative[ cur ] ) {
- cur = "";
- } else {
- pop = parts.pop();
- }
-
- if ( pop == null ) {
- pop = context;
- }
-
- Expr.relative[ cur ]( checkSet, pop, contextXML );
- }
-
- } else {
- checkSet = parts = [];
- }
- }
-
- if ( !checkSet ) {
- checkSet = set;
- }
-
- if ( !checkSet ) {
- Sizzle.error( cur || selector );
- }
-
- if ( toString.call(checkSet) === "[object Array]" ) {
- if ( !prune ) {
- results.push.apply( results, checkSet );
-
- } else if ( context && context.nodeType === 1 ) {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
- results.push( set[i] );
- }
- }
-
- } else {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
- results.push( set[i] );
- }
- }
- }
-
- } else {
- makeArray( checkSet, results );
- }
-
- if ( extra ) {
- Sizzle( extra, origContext, results, seed );
- Sizzle.uniqueSort( results );
- }
-
- return results;
-};
-
-Sizzle.uniqueSort = function( results ) {
- if ( sortOrder ) {
- hasDuplicate = baseHasDuplicate;
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- for ( var i = 1; i < results.length; i++ ) {
- if ( results[i] === results[ i - 1 ] ) {
- results.splice( i--, 1 );
- }
- }
- }
- }
-
- return results;
-};
-
-Sizzle.matches = function( expr, set ) {
- return Sizzle( expr, null, null, set );
-};
-
-Sizzle.matchesSelector = function( node, expr ) {
- return Sizzle( expr, null, null, [node] ).length > 0;
-};
-
-Sizzle.find = function( expr, context, isXML ) {
- var set, i, len, match, type, left;
-
- if ( !expr ) {
- return [];
- }
-
- for ( i = 0, len = Expr.order.length; i < len; i++ ) {
- type = Expr.order[i];
-
- if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
- left = match[1];
- match.splice( 1, 1 );
-
- if ( left.substr( left.length - 1 ) !== "\\" ) {
- match[1] = (match[1] || "").replace( rBackslash, "" );
- set = Expr.find[ type ]( match, context, isXML );
-
- if ( set != null ) {
- expr = expr.replace( Expr.match[ type ], "" );
- break;
- }
- }
- }
- }
-
- if ( !set ) {
- set = typeof context.getElementsByTagName !== "undefined" ?
- context.getElementsByTagName( "*" ) :
- [];
- }
-
- return { set: set, expr: expr };
-};
-
-Sizzle.filter = function( expr, set, inplace, not ) {
- var match, anyFound,
- type, found, item, filter, left,
- i, pass,
- old = expr,
- result = [],
- curLoop = set,
- isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
- while ( expr && set.length ) {
- for ( type in Expr.filter ) {
- if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
- filter = Expr.filter[ type ];
- left = match[1];
-
- anyFound = false;
-
- match.splice(1,1);
-
- if ( left.substr( left.length - 1 ) === "\\" ) {
- continue;
- }
-
- if ( curLoop === result ) {
- result = [];
- }
-
- if ( Expr.preFilter[ type ] ) {
- match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
- if ( !match ) {
- anyFound = found = true;
-
- } else if ( match === true ) {
- continue;
- }
- }
-
- if ( match ) {
- for ( i = 0; (item = curLoop[i]) != null; i++ ) {
- if ( item ) {
- found = filter( item, match, i, curLoop );
- pass = not ^ found;
-
- if ( inplace && found != null ) {
- if ( pass ) {
- anyFound = true;
-
- } else {
- curLoop[i] = false;
- }
-
- } else if ( pass ) {
- result.push( item );
- anyFound = true;
- }
- }
- }
- }
-
- if ( found !== undefined ) {
- if ( !inplace ) {
- curLoop = result;
- }
-
- expr = expr.replace( Expr.match[ type ], "" );
-
- if ( !anyFound ) {
- return [];
- }
-
- break;
- }
- }
- }
-
- // Improper expression
- if ( expr === old ) {
- if ( anyFound == null ) {
- Sizzle.error( expr );
-
- } else {
- break;
- }
- }
-
- old = expr;
- }
-
- return curLoop;
-};
-
-Sizzle.error = function( msg ) {
- throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Utility function for retreiving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-var getText = Sizzle.getText = function( elem ) {
- var i, node,
- nodeType = elem.nodeType,
- ret = "";
-
- if ( nodeType ) {
- if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
- // Use textContent || innerText for elements
- if ( typeof elem.textContent === 'string' ) {
- return elem.textContent;
- } else if ( typeof elem.innerText === 'string' ) {
- // Replace IE's carriage returns
- return elem.innerText.replace( rReturn, '' );
- } else {
- // Traverse it's children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
- ret += getText( elem );
- }
- }
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
- } else {
-
- // If no nodeType, this is expected to be an array
- for ( i = 0; (node = elem[i]); i++ ) {
- // Do not traverse comment nodes
- if ( node.nodeType !== 8 ) {
- ret += getText( node );
- }
- }
- }
- return ret;
-};
-
-var Expr = Sizzle.selectors = {
- order: [ "ID", "NAME", "TAG" ],
-
- match: {
- ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
- ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
- TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
- CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
- POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
- PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
- },
-
- leftMatch: {},
-
- attrMap: {
- "class": "className",
- "for": "htmlFor"
- },
-
- attrHandle: {
- href: function( elem ) {
- return elem.getAttribute( "href" );
- },
- type: function( elem ) {
- return elem.getAttribute( "type" );
- }
- },
-
- relative: {
- "+": function(checkSet, part){
- var isPartStr = typeof part === "string",
- isTag = isPartStr && !rNonWord.test( part ),
- isPartStrNotTag = isPartStr && !isTag;
-
- if ( isTag ) {
- part = part.toLowerCase();
- }
-
- for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
- if ( (elem = checkSet[i]) ) {
- while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
- checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
- elem || false :
- elem === part;
- }
- }
-
- if ( isPartStrNotTag ) {
- Sizzle.filter( part, checkSet, true );
- }
- },
-
- ">": function( checkSet, part ) {
- var elem,
- isPartStr = typeof part === "string",
- i = 0,
- l = checkSet.length;
-
- if ( isPartStr && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
-
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- var parent = elem.parentNode;
- checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
- }
- }
-
- } else {
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- checkSet[i] = isPartStr ?
- elem.parentNode :
- elem.parentNode === part;
- }
- }
-
- if ( isPartStr ) {
- Sizzle.filter( part, checkSet, true );
- }
- }
- },
-
- "": function(checkSet, part, isXML){
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
- },
-
- "~": function( checkSet, part, isXML ) {
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
- }
- },
-
- find: {
- ID: function( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- return m && m.parentNode ? [m] : [];
- }
- },
-
- NAME: function( match, context ) {
- if ( typeof context.getElementsByName !== "undefined" ) {
- var ret = [],
- results = context.getElementsByName( match[1] );
-
- for ( var i = 0, l = results.length; i < l; i++ ) {
- if ( results[i].getAttribute("name") === match[1] ) {
- ret.push( results[i] );
- }
- }
-
- return ret.length === 0 ? null : ret;
- }
- },
-
- TAG: function( match, context ) {
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- return context.getElementsByTagName( match[1] );
- }
- }
- },
- preFilter: {
- CLASS: function( match, curLoop, inplace, result, not, isXML ) {
- match = " " + match[1].replace( rBackslash, "" ) + " ";
-
- if ( isXML ) {
- return match;
- }
-
- for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
- if ( elem ) {
- if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
- if ( !inplace ) {
- result.push( elem );
- }
-
- } else if ( inplace ) {
- curLoop[i] = false;
- }
- }
- }
-
- return false;
- },
-
- ID: function( match ) {
- return match[1].replace( rBackslash, "" );
- },
-
- TAG: function( match, curLoop ) {
- return match[1].replace( rBackslash, "" ).toLowerCase();
- },
-
- CHILD: function( match ) {
- if ( match[1] === "nth" ) {
- if ( !match[2] ) {
- Sizzle.error( match[0] );
- }
-
- match[2] = match[2].replace(/^\+|\s*/g, '');
-
- // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
- var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
- match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
- !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
- // calculate the numbers (first)n+(last) including if they are negative
- match[2] = (test[1] + (test[2] || 1)) - 0;
- match[3] = test[3] - 0;
- }
- else if ( match[2] ) {
- Sizzle.error( match[0] );
- }
-
- // TODO: Move to normal caching system
- match[0] = done++;
-
- return match;
- },
-
- ATTR: function( match, curLoop, inplace, result, not, isXML ) {
- var name = match[1] = match[1].replace( rBackslash, "" );
-
- if ( !isXML && Expr.attrMap[name] ) {
- match[1] = Expr.attrMap[name];
- }
-
- // Handle if an un-quoted value was used
- match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
-
- if ( match[2] === "~=" ) {
- match[4] = " " + match[4] + " ";
- }
-
- return match;
- },
-
- PSEUDO: function( match, curLoop, inplace, result, not ) {
- if ( match[1] === "not" ) {
- // If we're dealing with a complex expression, or a simple one
- if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
- match[3] = Sizzle(match[3], null, null, curLoop);
-
- } else {
- var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
-
- if ( !inplace ) {
- result.push.apply( result, ret );
- }
-
- return false;
- }
-
- } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
- return true;
- }
-
- return match;
- },
-
- POS: function( match ) {
- match.unshift( true );
-
- return match;
- }
- },
-
- filters: {
- enabled: function( elem ) {
- return elem.disabled === false && elem.type !== "hidden";
- },
-
- disabled: function( elem ) {
- return elem.disabled === true;
- },
-
- checked: function( elem ) {
- return elem.checked === true;
- },
-
- selected: function( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- parent: function( elem ) {
- return !!elem.firstChild;
- },
-
- empty: function( elem ) {
- return !elem.firstChild;
- },
-
- has: function( elem, i, match ) {
- return !!Sizzle( match[3], elem ).length;
- },
-
- header: function( elem ) {
- return (/h\d/i).test( elem.nodeName );
- },
-
- text: function( elem ) {
- var attr = elem.getAttribute( "type" ), type = elem.type;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
- return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
- },
-
- radio: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
- },
-
- checkbox: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
- },
-
- file: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
- },
-
- password: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
- },
-
- submit: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "submit" === elem.type;
- },
-
- image: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
- },
-
- reset: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "reset" === elem.type;
- },
-
- button: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && "button" === elem.type || name === "button";
- },
-
- input: function( elem ) {
- return (/input|select|textarea|button/i).test( elem.nodeName );
- },
-
- focus: function( elem ) {
- return elem === elem.ownerDocument.activeElement;
- }
- },
- setFilters: {
- first: function( elem, i ) {
- return i === 0;
- },
-
- last: function( elem, i, match, array ) {
- return i === array.length - 1;
- },
-
- even: function( elem, i ) {
- return i % 2 === 0;
- },
-
- odd: function( elem, i ) {
- return i % 2 === 1;
- },
-
- lt: function( elem, i, match ) {
- return i < match[3] - 0;
- },
-
- gt: function( elem, i, match ) {
- return i > match[3] - 0;
- },
-
- nth: function( elem, i, match ) {
- return match[3] - 0 === i;
- },
-
- eq: function( elem, i, match ) {
- return match[3] - 0 === i;
- }
- },
- filter: {
- PSEUDO: function( elem, match, i, array ) {
- var name = match[1],
- filter = Expr.filters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
-
- } else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
-
- } else if ( name === "not" ) {
- var not = match[3];
-
- for ( var j = 0, l = not.length; j < l; j++ ) {
- if ( not[j] === elem ) {
- return false;
- }
- }
-
- return true;
-
- } else {
- Sizzle.error( name );
- }
- },
-
- CHILD: function( elem, match ) {
- var first, last,
- doneName, parent, cache,
- count, diff,
- type = match[1],
- node = elem;
-
- switch ( type ) {
- case "only":
- case "first":
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- if ( type === "first" ) {
- return true;
- }
-
- node = elem;
-
- /* falls through */
- case "last":
- while ( (node = node.nextSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- return true;
-
- case "nth":
- first = match[2];
- last = match[3];
-
- if ( first === 1 && last === 0 ) {
- return true;
- }
-
- doneName = match[0];
- parent = elem.parentNode;
-
- if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
- count = 0;
-
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- node.nodeIndex = ++count;
- }
- }
-
- parent[ expando ] = doneName;
- }
-
- diff = elem.nodeIndex - last;
-
- if ( first === 0 ) {
- return diff === 0;
-
- } else {
- return ( diff % first === 0 && diff / first >= 0 );
- }
- }
- },
-
- ID: function( elem, match ) {
- return elem.nodeType === 1 && elem.getAttribute("id") === match;
- },
-
- TAG: function( elem, match ) {
- return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
- },
-
- CLASS: function( elem, match ) {
- return (" " + (elem.className || elem.getAttribute("class")) + " ")
- .indexOf( match ) > -1;
- },
-
- ATTR: function( elem, match ) {
- var name = match[1],
- result = Sizzle.attr ?
- Sizzle.attr( elem, name ) :
- Expr.attrHandle[ name ] ?
- Expr.attrHandle[ name ]( elem ) :
- elem[ name ] != null ?
- elem[ name ] :
- elem.getAttribute( name ),
- value = result + "",
- type = match[2],
- check = match[4];
-
- return result == null ?
- type === "!=" :
- !type && Sizzle.attr ?
- result != null :
- type === "=" ?
- value === check :
- type === "*=" ?
- value.indexOf(check) >= 0 :
- type === "~=" ?
- (" " + value + " ").indexOf(check) >= 0 :
- !check ?
- value && result !== false :
- type === "!=" ?
- value !== check :
- type === "^=" ?
- value.indexOf(check) === 0 :
- type === "$=" ?
- value.substr(value.length - check.length) === check :
- type === "|=" ?
- value === check || value.substr(0, check.length + 1) === check + "-" :
- false;
- },
-
- POS: function( elem, match, i, array ) {
- var name = match[2],
- filter = Expr.setFilters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- }
- }
- }
-};
-
-var origPOS = Expr.match.POS,
- fescape = function(all, num){
- return "\\" + (num - 0 + 1);
- };
-
-for ( var type in Expr.match ) {
- Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
- Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
-}
-// Expose origPOS
-// "global" as in regardless of relation to brackets/parens
-Expr.match.globalPOS = origPOS;
-
-var makeArray = function( array, results ) {
- array = Array.prototype.slice.call( array, 0 );
-
- if ( results ) {
- results.push.apply( results, array );
- return results;
- }
-
- return array;
-};
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
-try {
- Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
-
-// Provide a fallback method if it does not work
-} catch( e ) {
- makeArray = function( array, results ) {
- var i = 0,
- ret = results || [];
-
- if ( toString.call(array) === "[object Array]" ) {
- Array.prototype.push.apply( ret, array );
-
- } else {
- if ( typeof array.length === "number" ) {
- for ( var l = array.length; i < l; i++ ) {
- ret.push( array[i] );
- }
-
- } else {
- for ( ; array[i]; i++ ) {
- ret.push( array[i] );
- }
- }
- }
-
- return ret;
- };
-}
-
-var sortOrder, siblingCheck;
-
-if ( document.documentElement.compareDocumentPosition ) {
- sortOrder = function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
- return a.compareDocumentPosition ? -1 : 1;
- }
-
- return a.compareDocumentPosition(b) & 4 ? -1 : 1;
- };
-
-} else {
- sortOrder = function( a, b ) {
- // The nodes are identical, we can exit early
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
- // Fallback to using sourceIndex (in IE) if it's available on both nodes
- } else if ( a.sourceIndex && b.sourceIndex ) {
- return a.sourceIndex - b.sourceIndex;
- }
-
- var al, bl,
- ap = [],
- bp = [],
- aup = a.parentNode,
- bup = b.parentNode,
- cur = aup;
-
- // If the nodes are siblings (or identical) we can do a quick check
- if ( aup === bup ) {
- return siblingCheck( a, b );
-
- // If no parents were found then the nodes are disconnected
- } else if ( !aup ) {
- return -1;
-
- } else if ( !bup ) {
- return 1;
- }
-
- // Otherwise they're somewhere else in the tree so we need
- // to build up a full list of the parentNodes for comparison
- while ( cur ) {
- ap.unshift( cur );
- cur = cur.parentNode;
- }
-
- cur = bup;
-
- while ( cur ) {
- bp.unshift( cur );
- cur = cur.parentNode;
- }
-
- al = ap.length;
- bl = bp.length;
-
- // Start walking down the tree looking for a discrepancy
- for ( var i = 0; i < al && i < bl; i++ ) {
- if ( ap[i] !== bp[i] ) {
- return siblingCheck( ap[i], bp[i] );
- }
- }
-
- // We ended someplace up the tree so do a sibling check
- return i === al ?
- siblingCheck( a, bp[i], -1 ) :
- siblingCheck( ap[i], b, 1 );
- };
-
- siblingCheck = function( a, b, ret ) {
- if ( a === b ) {
- return ret;
- }
-
- var cur = a.nextSibling;
-
- while ( cur ) {
- if ( cur === b ) {
- return -1;
- }
-
- cur = cur.nextSibling;
- }
-
- return 1;
- };
-}
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-(function(){
- // We're going to inject a fake input element with a specified name
- var form = document.createElement("div"),
- id = "script" + (new Date()).getTime(),
- root = document.documentElement;
-
- form.innerHTML = "<a name='" + id + "'/>";
-
- // Inject it into the root element, check its status, and remove it quickly
- root.insertBefore( form, root.firstChild );
-
- // The workaround has to do additional checks after a getElementById
- // Which slows things down for other browsers (hence the branching)
- if ( document.getElementById( id ) ) {
- Expr.find.ID = function( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
-
- return m ?
- m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
- [m] :
- undefined :
- [];
- }
- };
-
- Expr.filter.ID = function( elem, match ) {
- var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
-
- return elem.nodeType === 1 && node && node.nodeValue === match;
- };
- }
-
- root.removeChild( form );
-
- // release memory in IE
- root = form = null;
-})();
-
-(function(){
- // Check to see if the browser returns only elements
- // when doing getElementsByTagName("*")
-
- // Create a fake element
- var div = document.createElement("div");
- div.appendChild( document.createComment("") );
-
- // Make sure no comments are found
- if ( div.getElementsByTagName("*").length > 0 ) {
- Expr.find.TAG = function( match, context ) {
- var results = context.getElementsByTagName( match[1] );
-
- // Filter out possible comments
- if ( match[1] === "*" ) {
- var tmp = [];
-
- for ( var i = 0; results[i]; i++ ) {
- if ( results[i].nodeType === 1 ) {
- tmp.push( results[i] );
- }
- }
-
- results = tmp;
- }
-
- return results;
- };
- }
-
- // Check to see if an attribute returns normalized href attributes
- div.innerHTML = "<a href='#'></a>";
-
- if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
- div.firstChild.getAttribute("href") !== "#" ) {
-
- Expr.attrHandle.href = function( elem ) {
- return elem.getAttribute( "href", 2 );
- };
- }
-
- // release memory in IE
- div = null;
-})();
-
-if ( document.querySelectorAll ) {
- (function(){
- var oldSizzle = Sizzle,
- div = document.createElement("div"),
- id = "__sizzle__";
-
- div.innerHTML = "<p class='TEST'></p>";
-
- // Safari can't handle uppercase or unicode characters when
- // in quirks mode.
- if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
- return;
- }
-
- Sizzle = function( query, context, extra, seed ) {
- context = context || document;
-
- // Only use querySelectorAll on non-XML documents
- // (ID selectors don't work in non-HTML documents)
- if ( !seed && !Sizzle.isXML(context) ) {
- // See if we find a selector to speed up
- var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
-
- if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
- // Speed-up: Sizzle("TAG")
- if ( match[1] ) {
- return makeArray( context.getElementsByTagName( query ), extra );
-
- // Speed-up: Sizzle(".CLASS")
- } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
- return makeArray( context.getElementsByClassName( match[2] ), extra );
- }
- }
-
- if ( context.nodeType === 9 ) {
- // Speed-up: Sizzle("body")
- // The body element only exists once, optimize finding it
- if ( query === "body" && context.body ) {
- return makeArray( [ context.body ], extra );
-
- // Speed-up: Sizzle("#ID")
- } else if ( match && match[3] ) {
- var elem = context.getElementById( match[3] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id === match[3] ) {
- return makeArray( [ elem ], extra );
- }
-
- } else {
- return makeArray( [], extra );
- }
- }
-
- try {
- return makeArray( context.querySelectorAll(query), extra );
- } catch(qsaError) {}
-
- // qSA works strangely on Element-rooted queries
- // We can work around this by specifying an extra ID on the root
- // and working up from there (Thanks to Andrew Dupont for the technique)
- // IE 8 doesn't work on object elements
- } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
- var oldContext = context,
- old = context.getAttribute( "id" ),
- nid = old || id,
- hasParent = context.parentNode,
- relativeHierarchySelector = /^\s*[+~]/.test( query );
-
- if ( !old ) {
- context.setAttribute( "id", nid );
- } else {
- nid = nid.replace( /'/g, "\\$&" );
- }
- if ( relativeHierarchySelector && hasParent ) {
- context = context.parentNode;
- }
-
- try {
- if ( !relativeHierarchySelector || hasParent ) {
- return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
- }
-
- } catch(pseudoError) {
- } finally {
- if ( !old ) {
- oldContext.removeAttribute( "id" );
- }
- }
- }
- }
-
- return oldSizzle(query, context, extra, seed);
- };
-
- for ( var prop in oldSizzle ) {
- Sizzle[ prop ] = oldSizzle[ prop ];
- }
-
- // release memory in IE
- div = null;
- })();
-}
-
-(function(){
- var html = document.documentElement,
- matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
-
- if ( matches ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9 fails this)
- var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
- pseudoWorks = false;
-
- try {
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( document.documentElement, "[test!='']:sizzle" );
-
- } catch( pseudoError ) {
- pseudoWorks = true;
- }
-
- Sizzle.matchesSelector = function( node, expr ) {
- // Make sure that attribute selectors are quoted
- expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
-
- if ( !Sizzle.isXML( node ) ) {
- try {
- if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
- var ret = matches.call( node, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || !disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9, so check for that
- node.document && node.document.nodeType !== 11 ) {
- return ret;
- }
- }
- } catch(e) {}
- }
-
- return Sizzle(expr, null, null, [node]).length > 0;
- };
- }
-})();
-
-(function(){
- var div = document.createElement("div");
-
- div.innerHTML = "<div class='test e'></div><div class='test'></div>";
-
- // Opera can't find a second classname (in 9.6)
- // Also, make sure that getElementsByClassName actually exists
- if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
- return;
- }
-
- // Safari caches class attributes, doesn't catch changes (in 3.2)
- div.lastChild.className = "e";
-
- if ( div.getElementsByClassName("e").length === 1 ) {
- return;
- }
-
- Expr.order.splice(1, 0, "CLASS");
- Expr.find.CLASS = function( match, context, isXML ) {
- if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
- return context.getElementsByClassName(match[1]);
- }
- };
-
- // release memory in IE
- div = null;
-})();
-
-function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem[ expando ] === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 && !isXML ){
- elem[ expando ] = doneName;
- elem.sizset = i;
- }
-
- if ( elem.nodeName.toLowerCase() === cur ) {
- match = elem;
- break;
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem[ expando ] === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 ) {
- if ( !isXML ) {
- elem[ expando ] = doneName;
- elem.sizset = i;
- }
-
- if ( typeof cur !== "string" ) {
- if ( elem === cur ) {
- match = true;
- break;
- }
-
- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
- match = elem;
- break;
- }
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-if ( document.documentElement.contains ) {
- Sizzle.contains = function( a, b ) {
- return a !== b && (a.contains ? a.contains(b) : true);
- };
-
-} else if ( document.documentElement.compareDocumentPosition ) {
- Sizzle.contains = function( a, b ) {
- return !!(a.compareDocumentPosition(b) & 16);
- };
-
-} else {
- Sizzle.contains = function() {
- return false;
- };
-}
-
-Sizzle.isXML = function( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
-
- return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-var posProcess = function( selector, context, seed ) {
- var match,
- tmpSet = [],
- later = "",
- root = context.nodeType ? [context] : context;
-
- // Position selectors must be done after the filter
- // And so must :not(positional) so we move all PSEUDOs to the end
- while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
- later += match[0];
- selector = selector.replace( Expr.match.PSEUDO, "" );
- }
-
- selector = Expr.relative[selector] ? selector + "*" : selector;
-
- for ( var i = 0, l = root.length; i < l; i++ ) {
- Sizzle( selector, root[i], tmpSet, seed );
- }
-
- return Sizzle.filter( later, tmpSet );
-};
-
-// EXPOSE
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-Sizzle.selectors.attrMap = {};
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.filters;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})();
-
-
-var runtil = /Until$/,
- rparentsprev = /^(?:parents|prevUntil|prevAll)/,
- // Note: This RegExp should be improved, or likely pulled from Sizzle
- rmultiselector = /,/,
- isSimple = /^.[^:#\[\.,]*$/,
- slice = Array.prototype.slice,
- POS = jQuery.expr.match.globalPOS,
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend({
- find: function( selector ) {
- var self = this,
- i, l;
-
- if ( typeof selector !== "string" ) {
- return jQuery( selector ).filter(function() {
- for ( i = 0, l = self.length; i < l; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- });
- }
-
- var ret = this.pushStack( "", "find", selector ),
- length, n, r;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- length = ret.length;
- jQuery.find( selector, this[i], ret );
-
- if ( i > 0 ) {
- // Make sure that the results are unique
- for ( n = length; n < ret.length; n++ ) {
- for ( r = 0; r < length; r++ ) {
- if ( ret[r] === ret[n] ) {
- ret.splice(n--, 1);
- break;
- }
- }
- }
- }
- }
-
- return ret;
- },
-
- has: function( target ) {
- var targets = jQuery( target );
- return this.filter(function() {
- for ( var i = 0, l = targets.length; i < l; i++ ) {
- if ( jQuery.contains( this, targets[i] ) ) {
- return true;
- }
- }
- });
- },
-
- not: function( selector ) {
- return this.pushStack( winnow(this, selector, false), "not", selector);
- },
-
- filter: function( selector ) {
- return this.pushStack( winnow(this, selector, true), "filter", selector );
- },
-
- is: function( selector ) {
- return !!selector && (
- typeof selector === "string" ?
- // If this is a positional selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- POS.test( selector ) ?
- jQuery( selector, this.context ).index( this[0] ) >= 0 :
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
- },
-
- closest: function( selectors, context ) {
- var ret = [], i, l, cur = this[0];
-
- // Array (deprecated as of jQuery 1.7)
- if ( jQuery.isArray( selectors ) ) {
- var level = 1;
-
- while ( cur && cur.ownerDocument && cur !== context ) {
- for ( i = 0; i < selectors.length; i++ ) {
-
- if ( jQuery( cur ).is( selectors[ i ] ) ) {
- ret.push({ selector: selectors[ i ], elem: cur, level: level });
- }
- }
-
- cur = cur.parentNode;
- level++;
- }
-
- return ret;
- }
-
- // String
- var pos = POS.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- cur = this[i];
-
- while ( cur ) {
- if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
- ret.push( cur );
- break;
-
- } else {
- cur = cur.parentNode;
- if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
- break;
- }
- }
- }
- }
-
- ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
- return this.pushStack( ret, "closest", selectors );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
- }
-
- // index in selector
- if ( typeof elem === "string" ) {
- return jQuery.inArray( this[0], jQuery( elem ) );
- }
-
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[0] : elem, this );
- },
-
- add: function( selector, context ) {
- var set = typeof selector === "string" ?
- jQuery( selector, context ) :
- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
- all = jQuery.merge( this.get(), set );
-
- return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
- all :
- jQuery.unique( all ) );
- },
-
- andSelf: function() {
- return this.add( this.prevObject );
- }
-});
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
- return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-jQuery.each({
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return jQuery.dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return jQuery.nth( elem, 2, "nextSibling" );
- },
- prev: function( elem ) {
- return jQuery.nth( elem, 2, "previousSibling" );
- },
- nextAll: function( elem ) {
- return jQuery.dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return jQuery.dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
- },
- children: function( elem ) {
- return jQuery.sibling( elem.firstChild );
- },
- contents: function( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.makeArray( elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until );
-
- if ( !runtil.test( name ) ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
-
- ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
- if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
- ret = ret.reverse();
- }
-
- return this.pushStack( ret, name, slice.call( arguments ).join(",") );
- };
-});
-
-jQuery.extend({
- filter: function( expr, elems, not ) {
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 ?
- jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
- jQuery.find.matches(expr, elems);
- },
-
- dir: function( elem, dir, until ) {
- var matched = [],
- cur = elem[ dir ];
-
- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
- if ( cur.nodeType === 1 ) {
- matched.push( cur );
- }
- cur = cur[dir];
- }
- return matched;
- },
-
- nth: function( cur, result, dir, elem ) {
- result = result || 1;
- var num = 0;
-
- for ( ; cur; cur = cur[dir] ) {
- if ( cur.nodeType === 1 && ++num === result ) {
- break;
- }
- }
-
- return cur;
- },
-
- sibling: function( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
- }
- }
-
- return r;
- }
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
- // Can't pass null or undefined to indexOf in Firefox 4
- // Set to 0 to skip string check
- qualifier = qualifier || 0;
-
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep(elements, function( elem, i ) {
- var retVal = !!qualifier.call( elem, i, elem );
- return retVal === keep;
- });
-
- } else if ( qualifier.nodeType ) {
- return jQuery.grep(elements, function( elem, i ) {
- return ( elem === qualifier ) === keep;
- });
-
- } else if ( typeof qualifier === "string" ) {
- var filtered = jQuery.grep(elements, function( elem ) {
- return elem.nodeType === 1;
- });
-
- if ( isSimple.test( qualifier ) ) {
- return jQuery.filter(qualifier, filtered, !keep);
- } else {
- qualifier = jQuery.filter( qualifier, filtered );
- }
- }
-
- return jQuery.grep(elements, function( elem, i ) {
- return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
- });
-}
-
-
-
-
-function createSafeFragment( document ) {
- var list = nodeNames.split( "|" ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
- }
- }
- return safeFrag;
-}
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
- "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
- rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
- rleadingWhitespace = /^\s+/,
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
- rtagName = /<([\w:]+)/,
- rtbody = /<tbody/i,
- rhtml = /<|&#?\w+;/,
- rnoInnerhtml = /<(?:script|style)/i,
- rnocache = /<(?:script|object|embed|option|style)/i,
- rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptType = /\/(java|ecma)script/i,
- rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
- wrapMap = {
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
- legend: [ 1, "<fieldset>", "</fieldset>" ],
- thead: [ 1, "<table>", "</table>" ],
- tr: [ 2, "<table><tbody>", "</tbody></table>" ],
- td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
- col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
- area: [ 1, "<map>", "</map>" ],
- _default: [ 0, "", "" ]
- },
- safeFragment = createSafeFragment( document );
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE can't serialize <link> and <script> tags normally
-if ( !jQuery.support.htmlSerialize ) {
- wrapMap._default = [ 1, "div<div>", "</div>" ];
-}
-
-jQuery.fn.extend({
- text: function( value ) {
- return jQuery.access( this, function( value ) {
- return value === undefined ?
- jQuery.text( this ) :
- this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
- }, null, value, arguments.length );
- },
-
- wrapAll: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapAll( html.call(this, i) );
- });
- }
-
- if ( this[0] ) {
- // The elements to wrap the target around
- var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
- if ( this[0].parentNode ) {
- wrap.insertBefore( this[0] );
- }
-
- wrap.map(function() {
- var elem = this;
-
- while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
- elem = elem.firstChild;
- }
-
- return elem;
- }).append( this );
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapInner( html.call(this, i) );
- });
- }
-
- return this.each(function() {
- var self = jQuery( this ),
- contents = self.contents();
-
- if ( contents.length ) {
- contents.wrapAll( html );
-
- } else {
- self.append( html );
- }
- });
- },
-
- wrap: function( html ) {
- var isFunction = jQuery.isFunction( html );
-
- return this.each(function(i) {
- jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
- });
- },
-
- unwrap: function() {
- return this.parent().each(function() {
- if ( !jQuery.nodeName( this, "body" ) ) {
- jQuery( this ).replaceWith( this.childNodes );
- }
- }).end();
- },
-
- append: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 ) {
- this.appendChild( elem );
- }
- });
- },
-
- prepend: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 ) {
- this.insertBefore( elem, this.firstChild );
- }
- });
- },
-
- before: function() {
- if ( this[0] && this[0].parentNode ) {
- return this.domManip(arguments, false, function( elem ) {
- this.parentNode.insertBefore( elem, this );
- });
- } else if ( arguments.length ) {
- var set = jQuery.clean( arguments );
- set.push.apply( set, this.toArray() );
- return this.pushStack( set, "before", arguments );
- }
- },
-
- after: function() {
- if ( this[0] && this[0].parentNode ) {
- return this.domManip(arguments, false, function( elem ) {
- this.parentNode.insertBefore( elem, this.nextSibling );
- });
- } else if ( arguments.length ) {
- var set = this.pushStack( this, "after", arguments );
- set.push.apply( set, jQuery.clean(arguments) );
- return set;
- }
- },
-
- // keepData is for internal use only--do not document
- remove: function( selector, keepData ) {
- for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
- if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
- if ( !keepData && elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- jQuery.cleanData( [ elem ] );
- }
-
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
- }
- }
- }
-
- return this;
- },
-
- empty: function() {
- for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
- // Remove element nodes and prevent memory leaks
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- }
-
- // Remove any remaining nodes
- while ( elem.firstChild ) {
- elem.removeChild( elem.firstChild );
- }
- }
-
- return this;
- },
-
- clone: function( dataAndEvents, deepDataAndEvents ) {
- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
- return this.map( function () {
- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
- });
- },
-
- html: function( value ) {
- return jQuery.access( this, function( value ) {
- var elem = this[0] || {},
- i = 0,
- l = this.length;
-
- if ( value === undefined ) {
- return elem.nodeType === 1 ?
- elem.innerHTML.replace( rinlinejQuery, "" ) :
- null;
- }
-
-
- if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
- ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
- !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
-
- value = value.replace( rxhtmlTag, "<$1></$2>" );
-
- try {
- for (; i < l; i++ ) {
- // Remove element nodes and prevent memory leaks
- elem = this[i] || {};
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName( "*" ) );
- elem.innerHTML = value;
- }
- }
-
- elem = 0;
-
- // If using innerHTML throws an exception, use the fallback method
- } catch(e) {}
- }
-
- if ( elem ) {
- this.empty().append( value );
- }
- }, null, value, arguments.length );
- },
-
- replaceWith: function( value ) {
- if ( this[0] && this[0].parentNode ) {
- // Make sure that the elements are removed from the DOM before they are inserted
- // this can help fix replacing a parent with child elements
- if ( jQuery.isFunction( value ) ) {
- return this.each(function(i) {
- var self = jQuery(this), old = self.html();
- self.replaceWith( value.call( this, i, old ) );
- });
- }
-
- if ( typeof value !== "string" ) {
- value = jQuery( value ).detach();
- }
-
- return this.each(function() {
- var next = this.nextSibling,
- parent = this.parentNode;
-
- jQuery( this ).remove();
-
- if ( next ) {
- jQuery(next).before( value );
- } else {
- jQuery(parent).append( value );
- }
- });
- } else {
- return this.length ?
- this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
- this;
- }
- },
-
- detach: function( selector ) {
- return this.remove( selector, true );
- },
-
- domManip: function( args, table, callback ) {
- var results, first, fragment, parent,
- value = args[0],
- scripts = [];
-
- // We can't cloneNode fragments that contain checked, in WebKit
- if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
- return this.each(function() {
- jQuery(this).domManip( args, table, callback, true );
- });
- }
-
- if ( jQuery.isFunction(value) ) {
- return this.each(function(i) {
- var self = jQuery(this);
- args[0] = value.call(this, i, table ? self.html() : undefined);
- self.domManip( args, table, callback );
- });
- }
-
- if ( this[0] ) {
- parent = value && value.parentNode;
-
- // If we're in a fragment, just use that instead of building a new one
- if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
- results = { fragment: parent };
-
- } else {
- results = jQuery.buildFragment( args, this, scripts );
- }
-
- fragment = results.fragment;
-
- if ( fragment.childNodes.length === 1 ) {
- first = fragment = fragment.firstChild;
- } else {
- first = fragment.firstChild;
- }
-
- if ( first ) {
- table = table && jQuery.nodeName( first, "tr" );
-
- for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
- callback.call(
- table ?
- root(this[i], first) :
- this[i],
- // Make sure that we do not leak memory by inadvertently discarding
- // the original fragment (which might have attached data) instead of
- // using it; in addition, use the original fragment object for the last
- // item instead of first because it can end up being emptied incorrectly
- // in certain situations (Bug #8070).
- // Fragments from the fragment cache must always be cloned and never used
- // in place.
- results.cacheable || ( l > 1 && i < lastIndex ) ?
- jQuery.clone( fragment, true, true ) :
- fragment
- );
- }
- }
-
- if ( scripts.length ) {
- jQuery.each( scripts, function( i, elem ) {
- if ( elem.src ) {
- jQuery.ajax({
- type: "GET",
- global: false,
- url: elem.src,
- async: false,
- dataType: "script"
- });
- } else {
- jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
- }
-
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
- }
- });
- }
- }
-
- return this;
- }
-});
-
-function root( elem, cur ) {
- return jQuery.nodeName(elem, "table") ?
- (elem.getElementsByTagName("tbody")[0] ||
- elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
- elem;
-}
-
-function cloneCopyEvent( src, dest ) {
-
- if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
- return;
- }
-
- var type, i, l,
- oldData = jQuery._data( src ),
- curData = jQuery._data( dest, oldData ),
- events = oldData.events;
-
- if ( events ) {
- delete curData.handle;
- curData.events = {};
-
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type, events[ type ][ i ] );
- }
- }
- }
-
- // make the cloned public data object a copy from the original
- if ( curData.data ) {
- curData.data = jQuery.extend( {}, curData.data );
- }
-}
-
-function cloneFixAttributes( src, dest ) {
- var nodeName;
-
- // We do not need to do anything for non-Elements
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- // clearAttributes removes the attributes, which we don't want,
- // but also removes the attachEvent events, which we *do* want
- if ( dest.clearAttributes ) {
- dest.clearAttributes();
- }
-
- // mergeAttributes, in contrast, only merges back on the
- // original attributes, not the events
- if ( dest.mergeAttributes ) {
- dest.mergeAttributes( src );
- }
-
- nodeName = dest.nodeName.toLowerCase();
-
- // IE6-8 fail to clone children inside object elements that use
- // the proprietary classid attribute value (rather than the type
- // attribute) to identify the type of content to display
- if ( nodeName === "object" ) {
- dest.outerHTML = src.outerHTML;
-
- } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
- // IE6-8 fails to persist the checked state of a cloned checkbox
- // or radio button. Worse, IE6-7 fail to give the cloned element
- // a checked appearance if the defaultChecked value isn't also set
- if ( src.checked ) {
- dest.defaultChecked = dest.checked = src.checked;
- }
-
- // IE6-7 get confused and end up setting the value of a cloned
- // checkbox/radio button to an empty string instead of "on"
- if ( dest.value !== src.value ) {
- dest.value = src.value;
- }
-
- // IE6-8 fails to return the selected option to the default selected
- // state when cloning options
- } else if ( nodeName === "option" ) {
- dest.selected = src.defaultSelected;
-
- // IE6-8 fails to set the defaultValue to the correct value when
- // cloning other types of input fields
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
-
- // IE blanks contents when cloning scripts
- } else if ( nodeName === "script" && dest.text !== src.text ) {
- dest.text = src.text;
- }
-
- // Event data gets referenced instead of copied if the expando
- // gets copied too
- dest.removeAttribute( jQuery.expando );
-
- // Clear flags for bubbling special change/submit events, they must
- // be reattached when the newly cloned events are first activated
- dest.removeAttribute( "_submit_attached" );
- dest.removeAttribute( "_change_attached" );
-}
-
-jQuery.buildFragment = function( args, nodes, scripts ) {
- var fragment, cacheable, cacheresults, doc,
- first = args[ 0 ];
-
- // nodes may contain either an explicit document object,
- // a jQuery collection or context object.
- // If nodes[0] contains a valid object to assign to doc
- if ( nodes && nodes[0] ) {
- doc = nodes[0].ownerDocument || nodes[0];
- }
-
- // Ensure that an attr object doesn't incorrectly stand in as a document object
- // Chrome and Firefox seem to allow this to occur and will throw exception
- // Fixes #8950
- if ( !doc.createDocumentFragment ) {
- doc = document;
- }
-
- // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
- // Cloning options loses the selected state, so don't cache them
- // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
- // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
- // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
- if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
- first.charAt(0) === "<" && !rnocache.test( first ) &&
- (jQuery.support.checkClone || !rchecked.test( first )) &&
- (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
-
- cacheable = true;
-
- cacheresults = jQuery.fragments[ first ];
- if ( cacheresults && cacheresults !== 1 ) {
- fragment = cacheresults;
- }
- }
-
- if ( !fragment ) {
- fragment = doc.createDocumentFragment();
- jQuery.clean( args, doc, fragment, scripts );
- }
-
- if ( cacheable ) {
- jQuery.fragments[ first ] = cacheresults ? fragment : 1;
- }
-
- return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
-
-jQuery.each({
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function( name, original ) {
- jQuery.fn[ name ] = function( selector ) {
- var ret = [],
- insert = jQuery( selector ),
- parent = this.length === 1 && this[0].parentNode;
-
- if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
- insert[ original ]( this[0] );
- return this;
-
- } else {
- for ( var i = 0, l = insert.length; i < l; i++ ) {
- var elems = ( i > 0 ? this.clone(true) : this ).get();
- jQuery( insert[i] )[ original ]( elems );
- ret = ret.concat( elems );
- }
-
- return this.pushStack( ret, name, insert.selector );
- }
- };
-});
-
-function getAll( elem ) {
- if ( typeof elem.getElementsByTagName !== "undefined" ) {
- return elem.getElementsByTagName( "*" );
-
- } else if ( typeof elem.querySelectorAll !== "undefined" ) {
- return elem.querySelectorAll( "*" );
-
- } else {
- return [];
- }
-}
-
-// Used in clean, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
- if ( elem.type === "checkbox" || elem.type === "radio" ) {
- elem.defaultChecked = elem.checked;
- }
-}
-// Finds all inputs and passes them to fixDefaultChecked
-function findInputs( elem ) {
- var nodeName = ( elem.nodeName || "" ).toLowerCase();
- if ( nodeName === "input" ) {
- fixDefaultChecked( elem );
- // Skip scripts, get other children
- } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
- jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
- }
-}
-
-// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
-function shimCloneNode( elem ) {
- var div = document.createElement( "div" );
- safeFragment.appendChild( div );
-
- div.innerHTML = elem.outerHTML;
- return div.firstChild;
-}
-
-jQuery.extend({
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var srcElements,
- destElements,
- i,
- // IE<=8 does not properly clone detached, unknown element nodes
- clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
- elem.cloneNode( true ) :
- shimCloneNode( elem );
-
- if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
- (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
- // IE copies events bound via attachEvent when using cloneNode.
- // Calling detachEvent on the clone will also remove the events
- // from the original. In order to get around this, we use some
- // proprietary methods to clear the events. Thanks to MooTools
- // guys for this hotness.
-
- cloneFixAttributes( elem, clone );
-
- // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
- srcElements = getAll( elem );
- destElements = getAll( clone );
-
- // Weird iteration because IE will replace the length property
- // with an element if you are cloning the body and one of the
- // elements on the page has a name or id of "length"
- for ( i = 0; srcElements[i]; ++i ) {
- // Ensure that the destination node is not null; Fixes #9587
- if ( destElements[i] ) {
- cloneFixAttributes( srcElements[i], destElements[i] );
- }
- }
- }
-
- // Copy the events from the original to the clone
- if ( dataAndEvents ) {
- cloneCopyEvent( elem, clone );
-
- if ( deepDataAndEvents ) {
- srcElements = getAll( elem );
- destElements = getAll( clone );
-
- for ( i = 0; srcElements[i]; ++i ) {
- cloneCopyEvent( srcElements[i], destElements[i] );
- }
- }
- }
-
- srcElements = destElements = null;
-
- // Return the cloned set
- return clone;
- },
-
- clean: function( elems, context, fragment, scripts ) {
- var checkScriptType, script, j,
- ret = [];
-
- context = context || document;
-
- // !context.createElement fails in IE with an error but returns typeof 'object'
- if ( typeof context.createElement === "undefined" ) {
- context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
- }
-
- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
- if ( typeof elem === "number" ) {
- elem += "";
- }
-
- if ( !elem ) {
- continue;
- }
-
- // Convert html string into DOM nodes
- if ( typeof elem === "string" ) {
- if ( !rhtml.test( elem ) ) {
- elem = context.createTextNode( elem );
- } else {
- // Fix "XHTML"-style tags in all browsers
- elem = elem.replace(rxhtmlTag, "<$1></$2>");
-
- // Trim whitespace, otherwise indexOf won't work as expected
- var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
- wrap = wrapMap[ tag ] || wrapMap._default,
- depth = wrap[0],
- div = context.createElement("div"),
- safeChildNodes = safeFragment.childNodes,
- remove;
-
- // Append wrapper element to unknown element safe doc fragment
- if ( context === document ) {
- // Use the fragment we've already created for this document
- safeFragment.appendChild( div );
- } else {
- // Use a fragment created with the owner document
- createSafeFragment( context ).appendChild( div );
- }
-
- // Go to html and back, then peel off extra wrappers
- div.innerHTML = wrap[1] + elem + wrap[2];
-
- // Move to the right depth
- while ( depth-- ) {
- div = div.lastChild;
- }
-
- // Remove IE's autoinserted <tbody> from table fragments
- if ( !jQuery.support.tbody ) {
-
- // String was a <table>, *may* have spurious <tbody>
- var hasBody = rtbody.test(elem),
- tbody = tag === "table" && !hasBody ?
- div.firstChild && div.firstChild.childNodes :
-
- // String was a bare <thead> or <tfoot>
- wrap[1] === "<table>" && !hasBody ?
- div.childNodes :
- [];
-
- for ( j = tbody.length - 1; j >= 0 ; --j ) {
- if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
- tbody[ j ].parentNode.removeChild( tbody[ j ] );
- }
- }
- }
-
- // IE completely kills leading whitespace when innerHTML is used
- if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
- div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
- }
-
- elem = div.childNodes;
-
- // Clear elements from DocumentFragment (safeFragment or otherwise)
- // to avoid hoarding elements. Fixes #11356
- if ( div ) {
- div.parentNode.removeChild( div );
-
- // Guard against -1 index exceptions in FF3.6
- if ( safeChildNodes.length > 0 ) {
- remove = safeChildNodes[ safeChildNodes.length - 1 ];
-
- if ( remove && remove.parentNode ) {
- remove.parentNode.removeChild( remove );
- }
- }
- }
- }
- }
-
- // Resets defaultChecked for any radios and checkboxes
- // about to be appended to the DOM in IE 6/7 (#8060)
- var len;
- if ( !jQuery.support.appendChecked ) {
- if ( elem[0] && typeof (len = elem.length) === "number" ) {
- for ( j = 0; j < len; j++ ) {
- findInputs( elem[j] );
- }
- } else {
- findInputs( elem );
- }
- }
-
- if ( elem.nodeType ) {
- ret.push( elem );
- } else {
- ret = jQuery.merge( ret, elem );
- }
- }
-
- if ( fragment ) {
- checkScriptType = function( elem ) {
- return !elem.type || rscriptType.test( elem.type );
- };
- for ( i = 0; ret[i]; i++ ) {
- script = ret[i];
- if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
- scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
-
- } else {
- if ( script.nodeType === 1 ) {
- var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
-
- ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
- }
- fragment.appendChild( script );
- }
- }
- }
-
- return ret;
- },
-
- cleanData: function( elems ) {
- var data, id,
- cache = jQuery.cache,
- special = jQuery.event.special,
- deleteExpando = jQuery.support.deleteExpando;
-
- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
- if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
- continue;
- }
-
- id = elem[ jQuery.expando ];
-
- if ( id ) {
- data = cache[ id ];
-
- if ( data && data.events ) {
- for ( var type in data.events ) {
- if ( special[ type ] ) {
- jQuery.event.remove( elem, type );
-
- // This is a shortcut to avoid jQuery.event.remove's overhead
- } else {
- jQuery.removeEvent( elem, type, data.handle );
- }
- }
-
- // Null the DOM reference to avoid IE6/7/8 leak (#7054)
- if ( data.handle ) {
- data.handle.elem = null;
- }
- }
-
- if ( deleteExpando ) {
- delete elem[ jQuery.expando ];
-
- } else if ( elem.removeAttribute ) {
- elem.removeAttribute( jQuery.expando );
- }
-
- delete cache[ id ];
- }
- }
- }
-});
-
-
-
-
-var ralpha = /alpha\([^)]*\)/i,
- ropacity = /opacity=([^)]*)/,
- // fixed for IE9, see #8346
- rupper = /([A-Z]|^ms)/g,
- rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
- rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
- rrelNum = /^([\-+])=([\-+.\de]+)/,
- rmargin = /^margin/,
-
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-
- // order is important!
- cssExpand = [ "Top", "Right", "Bottom", "Left" ],
-
- curCSS,
-
- getComputedStyle,
- currentStyle;
-
-jQuery.fn.css = function( name, value ) {
- return jQuery.access( this, function( elem, name, value ) {
- return value !== undefined ?
- jQuery.style( elem, name, value ) :
- jQuery.css( elem, name );
- }, name, value, arguments.length > 1 );
-};
-
-jQuery.extend({
- // Add in style property hooks for overriding the default
- // behavior of getting and setting a style property
- cssHooks: {
- opacity: {
- get: function( elem, computed ) {
- if ( computed ) {
- // We should always get a number back from opacity
- var ret = curCSS( elem, "opacity" );
- return ret === "" ? "1" : ret;
-
- } else {
- return elem.style.opacity;
- }
- }
- }
- },
-
- // Exclude the following css properties to add px
- cssNumber: {
- "fillOpacity": true,
- "fontWeight": true,
- "lineHeight": true,
- "opacity": true,
- "orphans": true,
- "widows": true,
- "zIndex": true,
- "zoom": true
- },
-
- // Add in properties whose names you wish to fix before
- // setting or getting the value
- cssProps: {
- // normalize float css property
- "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
- },
-
- // Get and set the style property on a DOM Node
- style: function( elem, name, value, extra ) {
- // Don't set styles on text and comment nodes
- if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
- return;
- }
-
- // Make sure that we're working with the right name
- var ret, type, origName = jQuery.camelCase( name ),
- style = elem.style, hooks = jQuery.cssHooks[ origName ];
-
- name = jQuery.cssProps[ origName ] || origName;
-
- // Check if we're setting a value
- if ( value !== undefined ) {
- type = typeof value;
-
- // convert relative number strings (+= or -=) to relative numbers. #7345
- if ( type === "string" && (ret = rrelNum.exec( value )) ) {
- value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
- // Fixes bug #9237
- type = "number";
- }
-
- // Make sure that NaN and null values aren't set. See: #7116
- if ( value == null || type === "number" && isNaN( value ) ) {
- return;
- }
-
- // If a number was passed in, add 'px' to the (except for certain CSS properties)
- if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
- value += "px";
- }
-
- // If a hook was provided, use that value, otherwise just set the specified value
- if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
- // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
- // Fixes bug #5509
- try {
- style[ name ] = value;
- } catch(e) {}
- }
-
- } else {
- // If a hook was provided get the non-computed value from there
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
- return ret;
- }
-
- // Otherwise just get the value from the style object
- return style[ name ];
- }
- },
-
- css: function( elem, name, extra ) {
- var ret, hooks;
-
- // Make sure that we're working with the right name
- name = jQuery.camelCase( name );
- hooks = jQuery.cssHooks[ name ];
- name = jQuery.cssProps[ name ] || name;
-
- // cssFloat needs a special treatment
- if ( name === "cssFloat" ) {
- name = "float";
- }
-
- // If a hook was provided get the computed value from there
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
- return ret;
-
- // Otherwise, if a way to get the computed value exists, use that
- } else if ( curCSS ) {
- return curCSS( elem, name );
- }
- },
-
- // A method for quickly swapping in/out CSS properties to get correct calculations
- swap: function( elem, options, callback ) {
- var old = {},
- ret, name;
-
- // Remember the old values, and insert the new ones
- for ( name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- ret = callback.call( elem );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
-
- return ret;
- }
-});
-
-// DEPRECATED in 1.3, Use jQuery.css() instead
-jQuery.curCSS = jQuery.css;
-
-if ( document.defaultView && document.defaultView.getComputedStyle ) {
- getComputedStyle = function( elem, name ) {
- var ret, defaultView, computedStyle, width,
- style = elem.style;
-
- name = name.replace( rupper, "-$1" ).toLowerCase();
-
- if ( (defaultView = elem.ownerDocument.defaultView) &&
- (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
-
- ret = computedStyle.getPropertyValue( name );
- if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
- ret = jQuery.style( elem, name );
- }
- }
-
- // A tribute to the "awesome hack by Dean Edwards"
- // WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
- // which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
- if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
- width = style.width;
- style.width = ret;
- ret = computedStyle.width;
- style.width = width;
- }
-
- return ret;
- };
-}
-
-if ( document.documentElement.currentStyle ) {
- currentStyle = function( elem, name ) {
- var left, rsLeft, uncomputed,
- ret = elem.currentStyle && elem.currentStyle[ name ],
- style = elem.style;
-
- // Avoid setting ret to empty string here
- // so we don't default to auto
- if ( ret == null && style && (uncomputed = style[ name ]) ) {
- ret = uncomputed;
- }
-
- // From the awesome hack by Dean Edwards
- // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
- // If we're not dealing with a regular pixel number
- // but a number that has a weird ending, we need to convert it to pixels
- if ( rnumnonpx.test( ret ) ) {
-
- // Remember the original values
- left = style.left;
- rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
-
- // Put in the new values to get a computed value out
- if ( rsLeft ) {
- elem.runtimeStyle.left = elem.currentStyle.left;
- }
- style.left = name === "fontSize" ? "1em" : ret;
- ret = style.pixelLeft + "px";
-
- // Revert the changed values
- style.left = left;
- if ( rsLeft ) {
- elem.runtimeStyle.left = rsLeft;
- }
- }
-
- return ret === "" ? "auto" : ret;
- };
-}
-
-curCSS = getComputedStyle || currentStyle;
-
-function getWidthOrHeight( elem, name, extra ) {
-
- // Start with offset property
- var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
- i = name === "width" ? 1 : 0,
- len = 4;
-
- if ( val > 0 ) {
- if ( extra !== "border" ) {
- for ( ; i < len; i += 2 ) {
- if ( !extra ) {
- val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
- }
- if ( extra === "margin" ) {
- val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
- } else {
- val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
- }
- }
- }
-
- return val + "px";
- }
-
- // Fall back to computed then uncomputed css if necessary
- val = curCSS( elem, name );
- if ( val < 0 || val == null ) {
- val = elem.style[ name ];
- }
-
- // Computed unit is not pixels. Stop here and return.
- if ( rnumnonpx.test(val) ) {
- return val;
- }
-
- // Normalize "", auto, and prepare for extra
- val = parseFloat( val ) || 0;
-
- // Add padding, border, margin
- if ( extra ) {
- for ( ; i < len; i += 2 ) {
- val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
- if ( extra !== "padding" ) {
- val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
- }
- if ( extra === "margin" ) {
- val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
- }
- }
- }
-
- return val + "px";
-}
-
-jQuery.each([ "height", "width" ], function( i, name ) {
- jQuery.cssHooks[ name ] = {
- get: function( elem, computed, extra ) {
- if ( computed ) {
- if ( elem.offsetWidth !== 0 ) {
- return getWidthOrHeight( elem, name, extra );
- } else {
- return jQuery.swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, name, extra );
- });
- }
- }
- },
-
- set: function( elem, value ) {
- return rnum.test( value ) ?
- value + "px" :
- value;
- }
- };
-});
-
-if ( !jQuery.support.opacity ) {
- jQuery.cssHooks.opacity = {
- get: function( elem, computed ) {
- // IE uses filters for opacity
- return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
- ( parseFloat( RegExp.$1 ) / 100 ) + "" :
- computed ? "1" : "";
- },
-
- set: function( elem, value ) {
- var style = elem.style,
- currentStyle = elem.currentStyle,
- opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
- filter = currentStyle && currentStyle.filter || style.filter || "";
-
- // IE has trouble with opacity if it does not have layout
- // Force it by setting the zoom level
- style.zoom = 1;
-
- // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
- if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
-
- // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
- // if "filter:" is present at all, clearType is disabled, we want to avoid this
- // style.removeAttribute is IE Only, but so apparently is this code path...
- style.removeAttribute( "filter" );
-
- // if there there is no filter style applied in a css rule, we are done
- if ( currentStyle && !currentStyle.filter ) {
- return;
- }
- }
-
- // otherwise, set new filter values
- style.filter = ralpha.test( filter ) ?
- filter.replace( ralpha, opacity ) :
- filter + " " + opacity;
- }
- };
-}
-
-jQuery(function() {
- // This hook cannot be added until DOM ready because the support test
- // for it is not run until after DOM ready
- if ( !jQuery.support.reliableMarginRight ) {
- jQuery.cssHooks.marginRight = {
- get: function( elem, computed ) {
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- // Work around by temporarily setting element display to inline-block
- return jQuery.swap( elem, { "display": "inline-block" }, function() {
- if ( computed ) {
- return curCSS( elem, "margin-right" );
- } else {
- return elem.style.marginRight;
- }
- });
- }
- };
- }
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.hidden = function( elem ) {
- var width = elem.offsetWidth,
- height = elem.offsetHeight;
-
- return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
- };
-
- jQuery.expr.filters.visible = function( elem ) {
- return !jQuery.expr.filters.hidden( elem );
- };
-}
-
-// These hooks are used by animate to expand properties
-jQuery.each({
- margin: "",
- padding: "",
- border: "Width"
-}, function( prefix, suffix ) {
-
- jQuery.cssHooks[ prefix + suffix ] = {
- expand: function( value ) {
- var i,
-
- // assumes a single number if not a string
- parts = typeof value === "string" ? value.split(" ") : [ value ],
- expanded = {};
-
- for ( i = 0; i < 4; i++ ) {
- expanded[ prefix + cssExpand[ i ] + suffix ] =
- parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
- }
-
- return expanded;
- }
- };
-});
-
-
-
-
-var r20 = /%20/g,
- rbracket = /\[\]$/,
- rCRLF = /\r?\n/g,
- rhash = /#.*$/,
- rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
- // #7653, #8125, #8152: local protocol detection
- rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
- rnoContent = /^(?:GET|HEAD)$/,
- rprotocol = /^\/\//,
- rquery = /\?/,
- rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
- rselectTextarea = /^(?:select|textarea)/i,
- rspacesAjax = /\s+/,
- rts = /([?&])_=[^&]*/,
- rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
-
- // Keep a copy of the old load method
- _load = jQuery.fn.load,
-
- /* Prefilters
- * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
- * 2) These are called:
- * - BEFORE asking for a transport
- * - AFTER param serialization (s.data is a string if s.processData is true)
- * 3) key is the dataType
- * 4) the catchall symbol "*" can be used
- * 5) execution will start with transport dataType and THEN continue down to "*" if needed
- */
- prefilters = {},
-
- /* Transports bindings
- * 1) key is the dataType
- * 2) the catchall symbol "*" can be used
- * 3) selection will start with transport dataType and THEN go to "*" if needed
- */
- transports = {},
-
- // Document location
- ajaxLocation,
-
- // Document location segments
- ajaxLocParts,
-
- // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
- allTypes = ["*/"] + ["*"];
-
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
- ajaxLocation = location.href;
-} catch( e ) {
- // Use the href attribute of an A element
- // since IE will modify it given document.location
- ajaxLocation = document.createElement( "a" );
- ajaxLocation.href = "";
- ajaxLocation = ajaxLocation.href;
-}
-
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
- // dataTypeExpression is optional and defaults to "*"
- return function( dataTypeExpression, func ) {
-
- if ( typeof dataTypeExpression !== "string" ) {
- func = dataTypeExpression;
- dataTypeExpression = "*";
- }
-
- if ( jQuery.isFunction( func ) ) {
- var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
- i = 0,
- length = dataTypes.length,
- dataType,
- list,
- placeBefore;
-
- // For each dataType in the dataTypeExpression
- for ( ; i < length; i++ ) {
- dataType = dataTypes[ i ];
- // We control if we're asked to add before
- // any existing element
- placeBefore = /^\+/.test( dataType );
- if ( placeBefore ) {
- dataType = dataType.substr( 1 ) || "*";
- }
- list = structure[ dataType ] = structure[ dataType ] || [];
- // then we add to the structure accordingly
- list[ placeBefore ? "unshift" : "push" ]( func );
- }
- }
- };
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
- dataType /* internal */, inspected /* internal */ ) {
-
- dataType = dataType || options.dataTypes[ 0 ];
- inspected = inspected || {};
-
- inspected[ dataType ] = true;
-
- var list = structure[ dataType ],
- i = 0,
- length = list ? list.length : 0,
- executeOnly = ( structure === prefilters ),
- selection;
-
- for ( ; i < length && ( executeOnly || !selection ); i++ ) {
- selection = list[ i ]( options, originalOptions, jqXHR );
- // If we got redirected to another dataType
- // we try there if executing only and not done already
- if ( typeof selection === "string" ) {
- if ( !executeOnly || inspected[ selection ] ) {
- selection = undefined;
- } else {
- options.dataTypes.unshift( selection );
- selection = inspectPrefiltersOrTransports(
- structure, options, originalOptions, jqXHR, selection, inspected );
- }
- }
- }
- // If we're only executing or nothing was selected
- // we try the catchall dataType if not done already
- if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
- selection = inspectPrefiltersOrTransports(
- structure, options, originalOptions, jqXHR, "*", inspected );
- }
- // unnecessary when only executing (prefilters)
- // but it'll be ignored by the caller in that case
- return selection;
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
- var key, deep,
- flatOptions = jQuery.ajaxSettings.flatOptions || {};
- for ( key in src ) {
- if ( src[ key ] !== undefined ) {
- ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
- }
- }
- if ( deep ) {
- jQuery.extend( true, target, deep );
- }
-}
-
-jQuery.fn.extend({
- load: function( url, params, callback ) {
- if ( typeof url !== "string" && _load ) {
- return _load.apply( this, arguments );
-
- // Don't do a request if no elements are being requested
- } else if ( !this.length ) {
- return this;
- }
-
- var off = url.indexOf( " " );
- if ( off >= 0 ) {
- var selector = url.slice( off, url.length );
- url = url.slice( 0, off );
- }
-
- // Default to a GET request
- var type = "GET";
-
- // If the second parameter was provided
- if ( params ) {
- // If it's a function
- if ( jQuery.isFunction( params ) ) {
- // We assume that it's the callback
- callback = params;
- params = undefined;
-
- // Otherwise, build a param string
- } else if ( typeof params === "object" ) {
- params = jQuery.param( params, jQuery.ajaxSettings.traditional );
- type = "POST";
- }
- }
-
- var self = this;
-
- // Request the remote document
- jQuery.ajax({
- url: url,
- type: type,
- dataType: "html",
- data: params,
- // Complete callback (responseText is used internally)
- complete: function( jqXHR, status, responseText ) {
- // Store the response as specified by the jqXHR object
- responseText = jqXHR.responseText;
- // If successful, inject the HTML into all the matched elements
- if ( jqXHR.isResolved() ) {
- // #4825: Get the actual response in case
- // a dataFilter is present in ajaxSettings
- jqXHR.done(function( r ) {
- responseText = r;
- });
- // See if a selector was specified
- self.html( selector ?
- // Create a dummy div to hold the results
- jQuery("<div>")
- // inject the contents of the document in, removing the scripts
- // to avoid any 'Permission Denied' errors in IE
- .append(responseText.replace(rscript, ""))
-
- // Locate the specified elements
- .find(selector) :
-
- // If not, just inject the full result
- responseText );
- }
-
- if ( callback ) {
- self.each( callback, [ responseText, status, jqXHR ] );
- }
- }
- });
-
- return this;
- },
-
- serialize: function() {
- return jQuery.param( this.serializeArray() );
- },
-
- serializeArray: function() {
- return this.map(function(){
- return this.elements ? jQuery.makeArray( this.elements ) : this;
- })
- .filter(function(){
- return this.name && !this.disabled &&
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
- rinput.test( this.type ) );
- })
- .map(function( i, elem ){
- var val = jQuery( this ).val();
-
- return val == null ?
- null :
- jQuery.isArray( val ) ?
- jQuery.map( val, function( val, i ){
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }) :
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }).get();
- }
-});
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
- jQuery.fn[ o ] = function( f ){
- return this.on( o, f );
- };
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
- jQuery[ method ] = function( url, data, callback, type ) {
- // shift arguments if data argument was omitted
- if ( jQuery.isFunction( data ) ) {
- type = type || callback;
- callback = data;
- data = undefined;
- }
-
- return jQuery.ajax({
- type: method,
- url: url,
- data: data,
- success: callback,
- dataType: type
- });
- };
-});
-
-jQuery.extend({
-
- getScript: function( url, callback ) {
- return jQuery.get( url, undefined, callback, "script" );
- },
-
- getJSON: function( url, data, callback ) {
- return jQuery.get( url, data, callback, "json" );
- },
-
- // Creates a full fledged settings object into target
- // with both ajaxSettings and settings fields.
- // If target is omitted, writes into ajaxSettings.
- ajaxSetup: function( target, settings ) {
- if ( settings ) {
- // Building a settings object
- ajaxExtend( target, jQuery.ajaxSettings );
- } else {
- // Extending ajaxSettings
- settings = target;
- target = jQuery.ajaxSettings;
- }
- ajaxExtend( target, settings );
- return target;
- },
-
- ajaxSettings: {
- url: ajaxLocation,
- isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
- global: true,
- type: "GET",
- contentType: "application/x-www-form-urlencoded; charset=UTF-8",
- processData: true,
- async: true,
- /*
- timeout: 0,
- data: null,
- dataType: null,
- username: null,
- password: null,
- cache: null,
- traditional: false,
- headers: {},
- */
-
- accepts: {
- xml: "application/xml, text/xml",
- html: "text/html",
- text: "text/plain",
- json: "application/json, text/javascript",
- "*": allTypes
- },
-
- contents: {
- xml: /xml/,
- html: /html/,
- json: /json/
- },
-
- responseFields: {
- xml: "responseXML",
- text: "responseText"
- },
-
- // List of data converters
- // 1) key format is "source_type destination_type" (a single space in-between)
- // 2) the catchall symbol "*" can be used for source_type
- converters: {
-
- // Convert anything to text
- "* text": window.String,
-
- // Text to html (true = no transformation)
- "text html": true,
-
- // Evaluate text as a json expression
- "text json": jQuery.parseJSON,
-
- // Parse text as xml
- "text xml": jQuery.parseXML
- },
-
- // For options that shouldn't be deep extended:
- // you can add your own custom options here if
- // and when you create one that shouldn't be
- // deep extended (see ajaxExtend)
- flatOptions: {
- context: true,
- url: true
- }
- },
-
- ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
- ajaxTransport: addToPrefiltersOrTransports( transports ),
-
- // Main method
- ajax: function( url, options ) {
-
- // If url is an object, simulate pre-1.5 signature
- if ( typeof url === "object" ) {
- options = url;
- url = undefined;
- }
-
- // Force options to be an object
- options = options || {};
-
- var // Create the final options object
- s = jQuery.ajaxSetup( {}, options ),
- // Callbacks context
- callbackContext = s.context || s,
- // Context for global events
- // It's the callbackContext if one was provided in the options
- // and if it's a DOM node or a jQuery collection
- globalEventContext = callbackContext !== s &&
- ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
- jQuery( callbackContext ) : jQuery.event,
- // Deferreds
- deferred = jQuery.Deferred(),
- completeDeferred = jQuery.Callbacks( "once memory" ),
- // Status-dependent callbacks
- statusCode = s.statusCode || {},
- // ifModified key
- ifModifiedKey,
- // Headers (they are sent all at once)
- requestHeaders = {},
- requestHeadersNames = {},
- // Response headers
- responseHeadersString,
- responseHeaders,
- // transport
- transport,
- // timeout handle
- timeoutTimer,
- // Cross-domain detection vars
- parts,
- // The jqXHR state
- state = 0,
- // To know if global events are to be dispatched
- fireGlobals,
- // Loop variable
- i,
- // Fake xhr
- jqXHR = {
-
- readyState: 0,
-
- // Caches the header
- setRequestHeader: function( name, value ) {
- if ( !state ) {
- var lname = name.toLowerCase();
- name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
- requestHeaders[ name ] = value;
- }
- return this;
- },
-
- // Raw string
- getAllResponseHeaders: function() {
- return state === 2 ? responseHeadersString : null;
- },
-
- // Builds headers hashtable if needed
- getResponseHeader: function( key ) {
- var match;
- if ( state === 2 ) {
- if ( !responseHeaders ) {
- responseHeaders = {};
- while( ( match = rheaders.exec( responseHeadersString ) ) ) {
- responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
- }
- }
- match = responseHeaders[ key.toLowerCase() ];
- }
- return match === undefined ? null : match;
- },
-
- // Overrides response content-type header
- overrideMimeType: function( type ) {
- if ( !state ) {
- s.mimeType = type;
- }
- return this;
- },
-
- // Cancel the request
- abort: function( statusText ) {
- statusText = statusText || "abort";
- if ( transport ) {
- transport.abort( statusText );
- }
- done( 0, statusText );
- return this;
- }
- };
-
- // Callback for when everything is done
- // It is defined here because jslint complains if it is declared
- // at the end of the function (which would be more logical and readable)
- function done( status, nativeStatusText, responses, headers ) {
-
- // Called once
- if ( state === 2 ) {
- return;
- }
-
- // State is "done" now
- state = 2;
-
- // Clear timeout if it exists
- if ( timeoutTimer ) {
- clearTimeout( timeoutTimer );
- }
-
- // Dereference transport for early garbage collection
- // (no matter how long the jqXHR object will be used)
- transport = undefined;
-
- // Cache response headers
- responseHeadersString = headers || "";
-
- // Set readyState
- jqXHR.readyState = status > 0 ? 4 : 0;
-
- var isSuccess,
- success,
- error,
- statusText = nativeStatusText,
- response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
- lastModified,
- etag;
-
- // If successful, handle type chaining
- if ( status >= 200 && status < 300 || status === 304 ) {
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
-
- if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
- jQuery.lastModified[ ifModifiedKey ] = lastModified;
- }
- if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
- jQuery.etag[ ifModifiedKey ] = etag;
- }
- }
-
- // If not modified
- if ( status === 304 ) {
-
- statusText = "notmodified";
- isSuccess = true;
-
- // If we have data
- } else {
-
- try {
- success = ajaxConvert( s, response );
- statusText = "success";
- isSuccess = true;
- } catch(e) {
- // We have a parsererror
- statusText = "parsererror";
- error = e;
- }
- }
- } else {
- // We extract error from statusText
- // then normalize statusText and status for non-aborts
- error = statusText;
- if ( !statusText || status ) {
- statusText = "error";
- if ( status < 0 ) {
- status = 0;
- }
- }
- }
-
- // Set data for the fake xhr object
- jqXHR.status = status;
- jqXHR.statusText = "" + ( nativeStatusText || statusText );
-
- // Success/Error
- if ( isSuccess ) {
- deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
- } else {
- deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
- }
-
- // Status-dependent callbacks
- jqXHR.statusCode( statusCode );
- statusCode = undefined;
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
- [ jqXHR, s, isSuccess ? success : error ] );
- }
-
- // Complete
- completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
- // Handle the global AJAX counter
- if ( !( --jQuery.active ) ) {
- jQuery.event.trigger( "ajaxStop" );
- }
- }
- }
-
- // Attach deferreds
- deferred.promise( jqXHR );
- jqXHR.success = jqXHR.done;
- jqXHR.error = jqXHR.fail;
- jqXHR.complete = completeDeferred.add;
-
- // Status-dependent callbacks
- jqXHR.statusCode = function( map ) {
- if ( map ) {
- var tmp;
- if ( state < 2 ) {
- for ( tmp in map ) {
- statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
- }
- } else {
- tmp = map[ jqXHR.status ];
- jqXHR.then( tmp, tmp );
- }
- }
- return this;
- };
-
- // Remove hash character (#7531: and string promotion)
- // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
- // We also use the url parameter if available
- s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
- // Extract dataTypes list
- s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
-
- // Determine if a cross-domain request is in order
- if ( s.crossDomain == null ) {
- parts = rurl.exec( s.url.toLowerCase() );
- s.crossDomain = !!( parts &&
- ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
- ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
- ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
- );
- }
-
- // Convert data if not already a string
- if ( s.data && s.processData && typeof s.data !== "string" ) {
- s.data = jQuery.param( s.data, s.traditional );
- }
-
- // Apply prefilters
- inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
- // If request was aborted inside a prefilter, stop there
- if ( state === 2 ) {
- return false;
- }
-
- // We can fire global events as of now if asked to
- fireGlobals = s.global;
-
- // Uppercase the type
- s.type = s.type.toUpperCase();
-
- // Determine if request has content
- s.hasContent = !rnoContent.test( s.type );
-
- // Watch for a new set of requests
- if ( fireGlobals && jQuery.active++ === 0 ) {
- jQuery.event.trigger( "ajaxStart" );
- }
-
- // More options handling for requests with no content
- if ( !s.hasContent ) {
-
- // If data is available, append data to url
- if ( s.data ) {
- s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
- // #9682: remove data so that it's not used in an eventual retry
- delete s.data;
- }
-
- // Get ifModifiedKey before adding the anti-cache parameter
- ifModifiedKey = s.url;
-
- // Add anti-cache in url if needed
- if ( s.cache === false ) {
-
- var ts = jQuery.now(),
- // try replacing _= if it is there
- ret = s.url.replace( rts, "$1_=" + ts );
-
- // if nothing was replaced, add timestamp to the end
- s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
- }
- }
-
- // Set the correct header, if data is being sent
- if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
- jqXHR.setRequestHeader( "Content-Type", s.contentType );
- }
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- ifModifiedKey = ifModifiedKey || s.url;
- if ( jQuery.lastModified[ ifModifiedKey ] ) {
- jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
- }
- if ( jQuery.etag[ ifModifiedKey ] ) {
- jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
- }
- }
-
- // Set the Accepts header for the server, depending on the dataType
- jqXHR.setRequestHeader(
- "Accept",
- s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
- s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
- s.accepts[ "*" ]
- );
-
- // Check for headers option
- for ( i in s.headers ) {
- jqXHR.setRequestHeader( i, s.headers[ i ] );
- }
-
- // Allow custom headers/mimetypes and early abort
- if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
- // Abort if not done already
- jqXHR.abort();
- return false;
-
- }
-
- // Install callbacks on deferreds
- for ( i in { success: 1, error: 1, complete: 1 } ) {
- jqXHR[ i ]( s[ i ] );
- }
-
- // Get transport
- transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
- // If no transport, we auto-abort
- if ( !transport ) {
- done( -1, "No Transport" );
- } else {
- jqXHR.readyState = 1;
- // Send global event
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
- }
- // Timeout
- if ( s.async && s.timeout > 0 ) {
- timeoutTimer = setTimeout( function(){
- jqXHR.abort( "timeout" );
- }, s.timeout );
- }
-
- try {
- state = 1;
- transport.send( requestHeaders, done );
- } catch (e) {
- // Propagate exception as error if not done
- if ( state < 2 ) {
- done( -1, e );
- // Simply rethrow otherwise
- } else {
- throw e;
- }
- }
- }
-
- return jqXHR;
- },
-
- // Serialize an array of form elements or a set of
- // key/values into a query string
- param: function( a, traditional ) {
- var s = [],
- add = function( key, value ) {
- // If value is a function, invoke it and return its value
- value = jQuery.isFunction( value ) ? value() : value;
- s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
- };
-
- // Set traditional to true for jQuery <= 1.3.2 behavior.
- if ( traditional === undefined ) {
- traditional = jQuery.ajaxSettings.traditional;
- }
-
- // If an array was passed in, assume that it is an array of form elements.
- if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
- // Serialize the form elements
- jQuery.each( a, function() {
- add( this.name, this.value );
- });
-
- } else {
- // If traditional, encode the "old" way (the way 1.3.2 or older
- // did it), otherwise encode params recursively.
- for ( var prefix in a ) {
- buildParams( prefix, a[ prefix ], traditional, add );
- }
- }
-
- // Return the resulting serialization
- return s.join( "&" ).replace( r20, "+" );
- }
-});
-
-function buildParams( prefix, obj, traditional, add ) {
- if ( jQuery.isArray( obj ) ) {
- // Serialize array item.
- jQuery.each( obj, function( i, v ) {
- if ( traditional || rbracket.test( prefix ) ) {
- // Treat each array item as a scalar.
- add( prefix, v );
-
- } else {
- // If array item is non-scalar (array or object), encode its
- // numeric index to resolve deserialization ambiguity issues.
- // Note that rack (as of 1.0.0) can't currently deserialize
- // nested arrays properly, and attempting to do so may cause
- // a server error. Possible fixes are to modify rack's
- // deserialization algorithm or to provide an option or flag
- // to force array serialization to be shallow.
- buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
- }
- });
-
- } else if ( !traditional && jQuery.type( obj ) === "object" ) {
- // Serialize object item.
- for ( var name in obj ) {
- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
- }
-
- } else {
- // Serialize scalar item.
- add( prefix, obj );
- }
-}
-
-// This is still on the jQuery object... for now
-// Want to move this to jQuery.ajax some day
-jQuery.extend({
-
- // Counter for holding the number of active queries
- active: 0,
-
- // Last-Modified header cache for next request
- lastModified: {},
- etag: {}
-
-});
-
-/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
- var contents = s.contents,
- dataTypes = s.dataTypes,
- responseFields = s.responseFields,
- ct,
- type,
- finalDataType,
- firstDataType;
-
- // Fill responseXXX fields
- for ( type in responseFields ) {
- if ( type in responses ) {
- jqXHR[ responseFields[type] ] = responses[ type ];
- }
- }
-
- // Remove auto dataType and get content-type in the process
- while( dataTypes[ 0 ] === "*" ) {
- dataTypes.shift();
- if ( ct === undefined ) {
- ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
- }
- }
-
- // Check if we're dealing with a known content-type
- if ( ct ) {
- for ( type in contents ) {
- if ( contents[ type ] && contents[ type ].test( ct ) ) {
- dataTypes.unshift( type );
- break;
- }
- }
- }
-
- // Check to see if we have a response for the expected dataType
- if ( dataTypes[ 0 ] in responses ) {
- finalDataType = dataTypes[ 0 ];
- } else {
- // Try convertible dataTypes
- for ( type in responses ) {
- if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
- finalDataType = type;
- break;
- }
- if ( !firstDataType ) {
- firstDataType = type;
- }
- }
- // Or just use first one
- finalDataType = finalDataType || firstDataType;
- }
-
- // If we found a dataType
- // We add the dataType to the list if needed
- // and return the corresponding response
- if ( finalDataType ) {
- if ( finalDataType !== dataTypes[ 0 ] ) {
- dataTypes.unshift( finalDataType );
- }
- return responses[ finalDataType ];
- }
-}
-
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
-
- // Apply the dataFilter if provided
- if ( s.dataFilter ) {
- response = s.dataFilter( response, s.dataType );
- }
-
- var dataTypes = s.dataTypes,
- converters = {},
- i,
- key,
- length = dataTypes.length,
- tmp,
- // Current and previous dataTypes
- current = dataTypes[ 0 ],
- prev,
- // Conversion expression
- conversion,
- // Conversion function
- conv,
- // Conversion functions (transitive conversion)
- conv1,
- conv2;
-
- // For each dataType in the chain
- for ( i = 1; i < length; i++ ) {
-
- // Create converters map
- // with lowercased keys
- if ( i === 1 ) {
- for ( key in s.converters ) {
- if ( typeof key === "string" ) {
- converters[ key.toLowerCase() ] = s.converters[ key ];
- }
- }
- }
-
- // Get the dataTypes
- prev = current;
- current = dataTypes[ i ];
-
- // If current is auto dataType, update it to prev
- if ( current === "*" ) {
- current = prev;
- // If no auto and dataTypes are actually different
- } else if ( prev !== "*" && prev !== current ) {
-
- // Get the converter
- conversion = prev + " " + current;
- conv = converters[ conversion ] || converters[ "* " + current ];
-
- // If there is no direct converter, search transitively
- if ( !conv ) {
- conv2 = undefined;
- for ( conv1 in converters ) {
- tmp = conv1.split( " " );
- if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
- conv2 = converters[ tmp[1] + " " + current ];
- if ( conv2 ) {
- conv1 = converters[ conv1 ];
- if ( conv1 === true ) {
- conv = conv2;
- } else if ( conv2 === true ) {
- conv = conv1;
- }
- break;
- }
- }
- }
- }
- // If we found no converter, dispatch an error
- if ( !( conv || conv2 ) ) {
- jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
- }
- // If found converter is not an equivalence
- if ( conv !== true ) {
- // Convert with 1 or 2 converters accordingly
- response = conv ? conv( response ) : conv2( conv1(response) );
- }
- }
- }
- return response;
-}
-
-
-
-
-var jsc = jQuery.now(),
- jsre = /(\=)\?(&|$)|\?\?/i;
-
-// Default jsonp settings
-jQuery.ajaxSetup({
- jsonp: "callback",
- jsonpCallback: function() {
- return jQuery.expando + "_" + ( jsc++ );
- }
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
- var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
-
- if ( s.dataTypes[ 0 ] === "jsonp" ||
- s.jsonp !== false && ( jsre.test( s.url ) ||
- inspectData && jsre.test( s.data ) ) ) {
-
- var responseContainer,
- jsonpCallback = s.jsonpCallback =
- jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
- previous = window[ jsonpCallback ],
- url = s.url,
- data = s.data,
- replace = "$1" + jsonpCallback + "$2";
-
- if ( s.jsonp !== false ) {
- url = url.replace( jsre, replace );
- if ( s.url === url ) {
- if ( inspectData ) {
- data = data.replace( jsre, replace );
- }
- if ( s.data === data ) {
- // Add callback manually
- url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
- }
- }
- }
-
- s.url = url;
- s.data = data;
-
- // Install callback
- window[ jsonpCallback ] = function( response ) {
- responseContainer = [ response ];
- };
-
- // Clean-up function
- jqXHR.always(function() {
- // Set callback back to previous value
- window[ jsonpCallback ] = previous;
- // Call if it was a function and we have a response
- if ( responseContainer && jQuery.isFunction( previous ) ) {
- window[ jsonpCallback ]( responseContainer[ 0 ] );
- }
- });
-
- // Use data converter to retrieve json after script execution
- s.converters["script json"] = function() {
- if ( !responseContainer ) {
- jQuery.error( jsonpCallback + " was not called" );
- }
- return responseContainer[ 0 ];
- };
-
- // force json dataType
- s.dataTypes[ 0 ] = "json";
-
- // Delegate to script
- return "script";
- }
-});
-
-
-
-
-// Install script dataType
-jQuery.ajaxSetup({
- accepts: {
- script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
- },
- contents: {
- script: /javascript|ecmascript/
- },
- converters: {
- "text script": function( text ) {
- jQuery.globalEval( text );
- return text;
- }
- }
-});
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
- if ( s.cache === undefined ) {
- s.cache = false;
- }
- if ( s.crossDomain ) {
- s.type = "GET";
- s.global = false;
- }
-});
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
- // This transport only deals with cross domain requests
- if ( s.crossDomain ) {
-
- var script,
- head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
-
- return {
-
- send: function( _, callback ) {
-
- script = document.createElement( "script" );
-
- script.async = "async";
-
- if ( s.scriptCharset ) {
- script.charset = s.scriptCharset;
- }
-
- script.src = s.url;
-
- // Attach handlers for all browsers
- script.onload = script.onreadystatechange = function( _, isAbort ) {
-
- if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
- // Handle memory leak in IE
- script.onload = script.onreadystatechange = null;
-
- // Remove the script
- if ( head && script.parentNode ) {
- head.removeChild( script );
- }
-
- // Dereference the script
- script = undefined;
-
- // Callback if not abort
- if ( !isAbort ) {
- callback( 200, "success" );
- }
- }
- };
- // Use insertBefore instead of appendChild to circumvent an IE6 bug.
- // This arises when a base node is used (#2709 and #4378).
- head.insertBefore( script, head.firstChild );
- },
-
- abort: function() {
- if ( script ) {
- script.onload( 0, 1 );
- }
- }
- };
- }
-});
-
-
-
-
-var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
- xhrOnUnloadAbort = window.ActiveXObject ? function() {
- // Abort all pending requests
- for ( var key in xhrCallbacks ) {
- xhrCallbacks[ key ]( 0, 1 );
- }
- } : false,
- xhrId = 0,
- xhrCallbacks;
-
-// Functions to create xhrs
-function createStandardXHR() {
- try {
- return new window.XMLHttpRequest();
- } catch( e ) {}
-}
-
-function createActiveXHR() {
- try {
- return new window.ActiveXObject( "Microsoft.XMLHTTP" );
- } catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
- /* Microsoft failed to properly
- * implement the XMLHttpRequest in IE7 (can't request local files),
- * so we use the ActiveXObject when it is available
- * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
- * we need a fallback.
- */
- function() {
- return !this.isLocal && createStandardXHR() || createActiveXHR();
- } :
- // For all other browsers, use the standard XMLHttpRequest object
- createStandardXHR;
-
-// Determine support properties
-(function( xhr ) {
- jQuery.extend( jQuery.support, {
- ajax: !!xhr,
- cors: !!xhr && ( "withCredentials" in xhr )
- });
-})( jQuery.ajaxSettings.xhr() );
-
-// Create transport if the browser can provide an xhr
-if ( jQuery.support.ajax ) {
-
- jQuery.ajaxTransport(function( s ) {
- // Cross domain only allowed if supported through XMLHttpRequest
- if ( !s.crossDomain || jQuery.support.cors ) {
-
- var callback;
-
- return {
- send: function( headers, complete ) {
-
- // Get a new xhr
- var xhr = s.xhr(),
- handle,
- i;
-
- // Open the socket
- // Passing null username, generates a login popup on Opera (#2865)
- if ( s.username ) {
- xhr.open( s.type, s.url, s.async, s.username, s.password );
- } else {
- xhr.open( s.type, s.url, s.async );
- }
-
- // Apply custom fields if provided
- if ( s.xhrFields ) {
- for ( i in s.xhrFields ) {
- xhr[ i ] = s.xhrFields[ i ];
- }
- }
-
- // Override mime type if needed
- if ( s.mimeType && xhr.overrideMimeType ) {
- xhr.overrideMimeType( s.mimeType );
- }
-
- // X-Requested-With header
- // For cross-domain requests, seeing as conditions for a preflight are
- // akin to a jigsaw puzzle, we simply never set it to be sure.
- // (it can always be set on a per-request basis or even using ajaxSetup)
- // For same-domain requests, won't change header if already provided.
- if ( !s.crossDomain && !headers["X-Requested-With"] ) {
- headers[ "X-Requested-With" ] = "XMLHttpRequest";
- }
-
- // Need an extra try/catch for cross domain requests in Firefox 3
- try {
- for ( i in headers ) {
- xhr.setRequestHeader( i, headers[ i ] );
- }
- } catch( _ ) {}
-
- // Do send the request
- // This may raise an exception which is actually
- // handled in jQuery.ajax (so no try/catch here)
- xhr.send( ( s.hasContent && s.data ) || null );
-
- // Listener
- callback = function( _, isAbort ) {
-
- var status,
- statusText,
- responseHeaders,
- responses,
- xml;
-
- // Firefox throws exceptions when accessing properties
- // of an xhr when a network error occured
- // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
- try {
-
- // Was never called and is aborted or complete
- if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
- // Only called once
- callback = undefined;
-
- // Do not keep as active anymore
- if ( handle ) {
- xhr.onreadystatechange = jQuery.noop;
- if ( xhrOnUnloadAbort ) {
- delete xhrCallbacks[ handle ];
- }
- }
-
- // If it's an abort
- if ( isAbort ) {
- // Abort it manually if needed
- if ( xhr.readyState !== 4 ) {
- xhr.abort();
- }
- } else {
- status = xhr.status;
- responseHeaders = xhr.getAllResponseHeaders();
- responses = {};
- xml = xhr.responseXML;
-
- // Construct response list
- if ( xml && xml.documentElement /* #4958 */ ) {
- responses.xml = xml;
- }
-
- // When requesting binary data, IE6-9 will throw an exception
- // on any attempt to access responseText (#11426)
- try {
- responses.text = xhr.responseText;
- } catch( _ ) {
- }
-
- // Firefox throws an exception when accessing
- // statusText for faulty cross-domain requests
- try {
- statusText = xhr.statusText;
- } catch( e ) {
- // We normalize with Webkit giving an empty statusText
- statusText = "";
- }
-
- // Filter status for non standard behaviors
-
- // If the request is local and we have data: assume a success
- // (success with no data won't get notified, that's the best we
- // can do given current implementations)
- if ( !status && s.isLocal && !s.crossDomain ) {
- status = responses.text ? 200 : 404;
- // IE - #1450: sometimes returns 1223 when it should be 204
- } else if ( status === 1223 ) {
- status = 204;
- }
- }
- }
- } catch( firefoxAccessException ) {
- if ( !isAbort ) {
- complete( -1, firefoxAccessException );
- }
- }
-
- // Call complete if needed
- if ( responses ) {
- complete( status, statusText, responses, responseHeaders );
- }
- };
-
- // if we're in sync mode or it's in cache
- // and has been retrieved directly (IE6 & IE7)
- // we need to manually fire the callback
- if ( !s.async || xhr.readyState === 4 ) {
- callback();
- } else {
- handle = ++xhrId;
- if ( xhrOnUnloadAbort ) {
- // Create the active xhrs callbacks list if needed
- // and attach the unload handler
- if ( !xhrCallbacks ) {
- xhrCallbacks = {};
- jQuery( window ).unload( xhrOnUnloadAbort );
- }
- // Add to list of active xhrs callbacks
- xhrCallbacks[ handle ] = callback;
- }
- xhr.onreadystatechange = callback;
- }
- },
-
- abort: function() {
- if ( callback ) {
- callback(0,1);
- }
- }
- };
- }
- });
-}
-
-
-
-
-var elemdisplay = {},
- iframe, iframeDoc,
- rfxtypes = /^(?:toggle|show|hide)$/,
- rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
- timerId,
- fxAttrs = [
- // height animations
- [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
- // width animations
- [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
- // opacity animations
- [ "opacity" ]
- ],
- fxNow;
-
-jQuery.fn.extend({
- show: function( speed, easing, callback ) {
- var elem, display;
-
- if ( speed || speed === 0 ) {
- return this.animate( genFx("show", 3), speed, easing, callback );
-
- } else {
- for ( var i = 0, j = this.length; i < j; i++ ) {
- elem = this[ i ];
-
- if ( elem.style ) {
- display = elem.style.display;
-
- // Reset the inline display of this element to learn if it is
- // being hidden by cascaded rules or not
- if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
- display = elem.style.display = "";
- }
-
- // Set elements which have been overridden with display: none
- // in a stylesheet to whatever the default browser style is
- // for such an element
- if ( (display === "" && jQuery.css(elem, "display") === "none") ||
- !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
- jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
- }
- }
- }
-
- // Set the display of most of the elements in a second loop
- // to avoid the constant reflow
- for ( i = 0; i < j; i++ ) {
- elem = this[ i ];
-
- if ( elem.style ) {
- display = elem.style.display;
-
- if ( display === "" || display === "none" ) {
- elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
- }
- }
- }
-
- return this;
- }
- },
-
- hide: function( speed, easing, callback ) {
- if ( speed || speed === 0 ) {
- return this.animate( genFx("hide", 3), speed, easing, callback);
-
- } else {
- var elem, display,
- i = 0,
- j = this.length;
-
- for ( ; i < j; i++ ) {
- elem = this[i];
- if ( elem.style ) {
- display = jQuery.css( elem, "display" );
-
- if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
- jQuery._data( elem, "olddisplay", display );
- }
- }
- }
-
- // Set the display of the elements in a second loop
- // to avoid the constant reflow
- for ( i = 0; i < j; i++ ) {
- if ( this[i].style ) {
- this[i].style.display = "none";
- }
- }
-
- return this;
- }
- },
-
- // Save the old toggle function
- _toggle: jQuery.fn.toggle,
-
- toggle: function( fn, fn2, callback ) {
- var bool = typeof fn === "boolean";
-
- if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
- this._toggle.apply( this, arguments );
-
- } else if ( fn == null || bool ) {
- this.each(function() {
- var state = bool ? fn : jQuery(this).is(":hidden");
- jQuery(this)[ state ? "show" : "hide" ]();
- });
-
- } else {
- this.animate(genFx("toggle", 3), fn, fn2, callback);
- }
-
- return this;
- },
-
- fadeTo: function( speed, to, easing, callback ) {
- return this.filter(":hidden").css("opacity", 0).show().end()
- .animate({opacity: to}, speed, easing, callback);
- },
-
- animate: function( prop, speed, easing, callback ) {
- var optall = jQuery.speed( speed, easing, callback );
-
- if ( jQuery.isEmptyObject( prop ) ) {
- return this.each( optall.complete, [ false ] );
- }
-
- // Do not change referenced properties as per-property easing will be lost
- prop = jQuery.extend( {}, prop );
-
- function doAnimation() {
- // XXX 'this' does not always have a nodeName when running the
- // test suite
-
- if ( optall.queue === false ) {
- jQuery._mark( this );
- }
-
- var opt = jQuery.extend( {}, optall ),
- isElement = this.nodeType === 1,
- hidden = isElement && jQuery(this).is(":hidden"),
- name, val, p, e, hooks, replace,
- parts, start, end, unit,
- method;
-
- // will store per property easing and be used to determine when an animation is complete
- opt.animatedProperties = {};
-
- // first pass over propertys to expand / normalize
- for ( p in prop ) {
- name = jQuery.camelCase( p );
- if ( p !== name ) {
- prop[ name ] = prop[ p ];
- delete prop[ p ];
- }
-
- if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
- replace = hooks.expand( prop[ name ] );
- delete prop[ name ];
-
- // not quite $.extend, this wont overwrite keys already present.
- // also - reusing 'p' from above because we have the correct "name"
- for ( p in replace ) {
- if ( ! ( p in prop ) ) {
- prop[ p ] = replace[ p ];
- }
- }
- }
- }
-
- for ( name in prop ) {
- val = prop[ name ];
- // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
- if ( jQuery.isArray( val ) ) {
- opt.animatedProperties[ name ] = val[ 1 ];
- val = prop[ name ] = val[ 0 ];
- } else {
- opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
- }
-
- if ( val === "hide" && hidden || val === "show" && !hidden ) {
- return opt.complete.call( this );
- }
-
- if ( isElement && ( name === "height" || name === "width" ) ) {
- // Make sure that nothing sneaks out
- // Record all 3 overflow attributes because IE does not
- // change the overflow attribute when overflowX and
- // overflowY are set to the same value
- opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
-
- // Set display property to inline-block for height/width
- // animations on inline elements that are having width/height animated
- if ( jQuery.css( this, "display" ) === "inline" &&
- jQuery.css( this, "float" ) === "none" ) {
-
- // inline-level elements accept inline-block;
- // block-level elements need to be inline with layout
- if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
- this.style.display = "inline-block";
-
- } else {
- this.style.zoom = 1;
- }
- }
- }
- }
-
- if ( opt.overflow != null ) {
- this.style.overflow = "hidden";
- }
-
- for ( p in prop ) {
- e = new jQuery.fx( this, opt, p );
- val = prop[ p ];
-
- if ( rfxtypes.test( val ) ) {
-
- // Tracks whether to show or hide based on private
- // data attached to the element
- method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
- if ( method ) {
- jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
- e[ method ]();
- } else {
- e[ val ]();
- }
-
- } else {
- parts = rfxnum.exec( val );
- start = e.cur();
-
- if ( parts ) {
- end = parseFloat( parts[2] );
- unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
-
- // We need to compute starting value
- if ( unit !== "px" ) {
- jQuery.style( this, p, (end || 1) + unit);
- start = ( (end || 1) / e.cur() ) * start;
- jQuery.style( this, p, start + unit);
- }
-
- // If a +=/-= token was provided, we're doing a relative animation
- if ( parts[1] ) {
- end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
- }
-
- e.custom( start, end, unit );
-
- } else {
- e.custom( start, val, "" );
- }
- }
- }
-
- // For JS strict compliance
- return true;
- }
-
- return optall.queue === false ?
- this.each( doAnimation ) :
- this.queue( optall.queue, doAnimation );
- },
-
- stop: function( type, clearQueue, gotoEnd ) {
- if ( typeof type !== "string" ) {
- gotoEnd = clearQueue;
- clearQueue = type;
- type = undefined;
- }
- if ( clearQueue && type !== false ) {
- this.queue( type || "fx", [] );
- }
-
- return this.each(function() {
- var index,
- hadTimers = false,
- timers = jQuery.timers,
- data = jQuery._data( this );
-
- // clear marker counters if we know they won't be
- if ( !gotoEnd ) {
- jQuery._unmark( true, this );
- }
-
- function stopQueue( elem, data, index ) {
- var hooks = data[ index ];
- jQuery.removeData( elem, index, true );
- hooks.stop( gotoEnd );
- }
-
- if ( type == null ) {
- for ( index in data ) {
- if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
- stopQueue( this, data, index );
- }
- }
- } else if ( data[ index = type + ".run" ] && data[ index ].stop ){
- stopQueue( this, data, index );
- }
-
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
- if ( gotoEnd ) {
-
- // force the next step to be the last
- timers[ index ]( true );
- } else {
- timers[ index ].saveState();
- }
- hadTimers = true;
- timers.splice( index, 1 );
- }
- }
-
- // start the next in the queue if the last step wasn't forced
- // timers currently will call their complete callbacks, which will dequeue
- // but only if they were gotoEnd
- if ( !( gotoEnd && hadTimers ) ) {
- jQuery.dequeue( this, type );
- }
- });
- }
-
-});
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
- setTimeout( clearFxNow, 0 );
- return ( fxNow = jQuery.now() );
-}
-
-function clearFxNow() {
- fxNow = undefined;
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, num ) {
- var obj = {};
-
- jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
- obj[ this ] = type;
- });
-
- return obj;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
- slideDown: genFx( "show", 1 ),
- slideUp: genFx( "hide", 1 ),
- slideToggle: genFx( "toggle", 1 ),
- fadeIn: { opacity: "show" },
- fadeOut: { opacity: "hide" },
- fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return this.animate( props, speed, easing, callback );
- };
-});
-
-jQuery.extend({
- speed: function( speed, easing, fn ) {
- var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
- complete: fn || !fn && easing ||
- jQuery.isFunction( speed ) && speed,
- duration: speed,
- easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
- };
-
- opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
- opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
- // normalize opt.queue - true/undefined/null -> "fx"
- if ( opt.queue == null || opt.queue === true ) {
- opt.queue = "fx";
- }
-
- // Queueing
- opt.old = opt.complete;
-
- opt.complete = function( noUnmark ) {
- if ( jQuery.isFunction( opt.old ) ) {
- opt.old.call( this );
- }
-
- if ( opt.queue ) {
- jQuery.dequeue( this, opt.queue );
- } else if ( noUnmark !== false ) {
- jQuery._unmark( this );
- }
- };
-
- return opt;
- },
-
- easing: {
- linear: function( p ) {
- return p;
- },
- swing: function( p ) {
- return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
- }
- },
-
- timers: [],
-
- fx: function( elem, options, prop ) {
- this.options = options;
- this.elem = elem;
- this.prop = prop;
-
- options.orig = options.orig || {};
- }
-
-});
-
-jQuery.fx.prototype = {
- // Simple function for setting a style value
- update: function() {
- if ( this.options.step ) {
- this.options.step.call( this.elem, this.now, this );
- }
-
- ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
- },
-
- // Get the current size
- cur: function() {
- if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
- return this.elem[ this.prop ];
- }
-
- var parsed,
- r = jQuery.css( this.elem, this.prop );
- // Empty strings, null, undefined and "auto" are converted to 0,
- // complex values such as "rotate(1rad)" are returned as is,
- // simple values such as "10px" are parsed to Float.
- return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
- },
-
- // Start an animation from one number to another
- custom: function( from, to, unit ) {
- var self = this,
- fx = jQuery.fx;
-
- this.startTime = fxNow || createFxNow();
- this.end = to;
- this.now = this.start = from;
- this.pos = this.state = 0;
- this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
-
- function t( gotoEnd ) {
- return self.step( gotoEnd );
- }
-
- t.queue = this.options.queue;
- t.elem = this.elem;
- t.saveState = function() {
- if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
- if ( self.options.hide ) {
- jQuery._data( self.elem, "fxshow" + self.prop, self.start );
- } else if ( self.options.show ) {
- jQuery._data( self.elem, "fxshow" + self.prop, self.end );
- }
- }
- };
-
- if ( t() && jQuery.timers.push(t) && !timerId ) {
- timerId = setInterval( fx.tick, fx.interval );
- }
- },
-
- // Simple 'show' function
- show: function() {
- var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
-
- // Remember where we started, so that we can go back to it later
- this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
- this.options.show = true;
-
- // Begin the animation
- // Make sure that we start at a small width/height to avoid any flash of content
- if ( dataShow !== undefined ) {
- // This show is picking up where a previous hide or show left off
- this.custom( this.cur(), dataShow );
- } else {
- this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
- }
-
- // Start by showing the element
- jQuery( this.elem ).show();
- },
-
- // Simple 'hide' function
- hide: function() {
- // Remember where we started, so that we can go back to it later
- this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
- this.options.hide = true;
-
- // Begin the animation
- this.custom( this.cur(), 0 );
- },
-
- // Each step of an animation
- step: function( gotoEnd ) {
- var p, n, complete,
- t = fxNow || createFxNow(),
- done = true,
- elem = this.elem,
- options = this.options;
-
- if ( gotoEnd || t >= options.duration + this.startTime ) {
- this.now = this.end;
- this.pos = this.state = 1;
- this.update();
-
- options.animatedProperties[ this.prop ] = true;
-
- for ( p in options.animatedProperties ) {
- if ( options.animatedProperties[ p ] !== true ) {
- done = false;
- }
- }
-
- if ( done ) {
- // Reset the overflow
- if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
-
- jQuery.each( [ "", "X", "Y" ], function( index, value ) {
- elem.style[ "overflow" + value ] = options.overflow[ index ];
- });
- }
-
- // Hide the element if the "hide" operation was done
- if ( options.hide ) {
- jQuery( elem ).hide();
- }
-
- // Reset the properties, if the item has been hidden or shown
- if ( options.hide || options.show ) {
- for ( p in options.animatedProperties ) {
- jQuery.style( elem, p, options.orig[ p ] );
- jQuery.removeData( elem, "fxshow" + p, true );
- // Toggle data is no longer needed
- jQuery.removeData( elem, "toggle" + p, true );
- }
- }
-
- // Execute the complete function
- // in the event that the complete function throws an exception
- // we must ensure it won't be called twice. #5684
-
- complete = options.complete;
- if ( complete ) {
-
- options.complete = false;
- complete.call( elem );
- }
- }
-
- return false;
-
- } else {
- // classical easing cannot be used with an Infinity duration
- if ( options.duration == Infinity ) {
- this.now = t;
- } else {
- n = t - this.startTime;
- this.state = n / options.duration;
-
- // Perform the easing function, defaults to swing
- this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
- this.now = this.start + ( (this.end - this.start) * this.pos );
- }
- // Perform the next step of the animation
- this.update();
- }
-
- return true;
- }
-};
-
-jQuery.extend( jQuery.fx, {
- tick: function() {
- var timer,
- timers = jQuery.timers,
- i = 0;
-
- for ( ; i < timers.length; i++ ) {
- timer = timers[ i ];
- // Checks the timer has not already been removed
- if ( !timer() && timers[ i ] === timer ) {
- timers.splice( i--, 1 );
- }
- }
-
- if ( !timers.length ) {
- jQuery.fx.stop();
- }
- },
-
- interval: 13,
-
- stop: function() {
- clearInterval( timerId );
- timerId = null;
- },
-
- speeds: {
- slow: 600,
- fast: 200,
- // Default speed
- _default: 400
- },
-
- step: {
- opacity: function( fx ) {
- jQuery.style( fx.elem, "opacity", fx.now );
- },
-
- _default: function( fx ) {
- if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
- fx.elem.style[ fx.prop ] = fx.now + fx.unit;
- } else {
- fx.elem[ fx.prop ] = fx.now;
- }
- }
- }
-});
-
-// Ensure props that can't be negative don't go there on undershoot easing
-jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
- // exclude marginTop, marginLeft, marginBottom and marginRight from this list
- if ( prop.indexOf( "margin" ) ) {
- jQuery.fx.step[ prop ] = function( fx ) {
- jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
- };
- }
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.animated = function( elem ) {
- return jQuery.grep(jQuery.timers, function( fn ) {
- return elem === fn.elem;
- }).length;
- };
-}
-
-// Try to restore the default display value of an element
-function defaultDisplay( nodeName ) {
-
- if ( !elemdisplay[ nodeName ] ) {
-
- var body = document.body,
- elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
- display = elem.css( "display" );
- elem.remove();
-
- // If the simple way fails,
- // get element's real default display by attaching it to a temp iframe
- if ( display === "none" || display === "" ) {
- // No iframe to use yet, so create it
- if ( !iframe ) {
- iframe = document.createElement( "iframe" );
- iframe.frameBorder = iframe.width = iframe.height = 0;
- }
-
- body.appendChild( iframe );
-
- // Create a cacheable copy of the iframe document on first call.
- // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
- // document to it; WebKit & Firefox won't allow reusing the iframe document.
- if ( !iframeDoc || !iframe.createElement ) {
- iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
- iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
- iframeDoc.close();
- }
-
- elem = iframeDoc.createElement( nodeName );
-
- iframeDoc.body.appendChild( elem );
-
- display = jQuery.css( elem, "display" );
- body.removeChild( iframe );
- }
-
- // Store the correct default display
- elemdisplay[ nodeName ] = display;
- }
-
- return elemdisplay[ nodeName ];
-}
-
-
-
-
-var getOffset,
- rtable = /^t(?:able|d|h)$/i,
- rroot = /^(?:body|html)$/i;
-
-if ( "getBoundingClientRect" in document.documentElement ) {
- getOffset = function( elem, doc, docElem, box ) {
- try {
- box = elem.getBoundingClientRect();
- } catch(e) {}
-
- // Make sure we're not dealing with a disconnected DOM node
- if ( !box || !jQuery.contains( docElem, elem ) ) {
- return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
- }
-
- var body = doc.body,
- win = getWindow( doc ),
- clientTop = docElem.clientTop || body.clientTop || 0,
- clientLeft = docElem.clientLeft || body.clientLeft || 0,
- scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
- scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
- top = box.top + scrollTop - clientTop,
- left = box.left + scrollLeft - clientLeft;
-
- return { top: top, left: left };
- };
-
-} else {
- getOffset = function( elem, doc, docElem ) {
- var computedStyle,
- offsetParent = elem.offsetParent,
- prevOffsetParent = elem,
- body = doc.body,
- defaultView = doc.defaultView,
- prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
- top = elem.offsetTop,
- left = elem.offsetLeft;
-
- while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
- if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
- break;
- }
-
- computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
- top -= elem.scrollTop;
- left -= elem.scrollLeft;
-
- if ( elem === offsetParent ) {
- top += elem.offsetTop;
- left += elem.offsetLeft;
-
- if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
- top += parseFloat( computedStyle.borderTopWidth ) || 0;
- left += parseFloat( computedStyle.borderLeftWidth ) || 0;
- }
-
- prevOffsetParent = offsetParent;
- offsetParent = elem.offsetParent;
- }
-
- if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
- top += parseFloat( computedStyle.borderTopWidth ) || 0;
- left += parseFloat( computedStyle.borderLeftWidth ) || 0;
- }
-
- prevComputedStyle = computedStyle;
- }
-
- if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
- top += body.offsetTop;
- left += body.offsetLeft;
- }
-
- if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
- top += Math.max( docElem.scrollTop, body.scrollTop );
- left += Math.max( docElem.scrollLeft, body.scrollLeft );
- }
-
- return { top: top, left: left };
- };
-}
-
-jQuery.fn.offset = function( options ) {
- if ( arguments.length ) {
- return options === undefined ?
- this :
- this.each(function( i ) {
- jQuery.offset.setOffset( this, options, i );
- });
- }
-
- var elem = this[0],
- doc = elem && elem.ownerDocument;
-
- if ( !doc ) {
- return null;
- }
-
- if ( elem === doc.body ) {
- return jQuery.offset.bodyOffset( elem );
- }
-
- return getOffset( elem, doc, doc.documentElement );
-};
-
-jQuery.offset = {
-
- bodyOffset: function( body ) {
- var top = body.offsetTop,
- left = body.offsetLeft;
-
- if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
- top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
- left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
- }
-
- return { top: top, left: left };
- },
-
- setOffset: function( elem, options, i ) {
- var position = jQuery.css( elem, "position" );
-
- // set position first, in-case top/left are set even on static elem
- if ( position === "static" ) {
- elem.style.position = "relative";
- }
-
- var curElem = jQuery( elem ),
- curOffset = curElem.offset(),
- curCSSTop = jQuery.css( elem, "top" ),
- curCSSLeft = jQuery.css( elem, "left" ),
- calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
- props = {}, curPosition = {}, curTop, curLeft;
-
- // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
- if ( calculatePosition ) {
- curPosition = curElem.position();
- curTop = curPosition.top;
- curLeft = curPosition.left;
- } else {
- curTop = parseFloat( curCSSTop ) || 0;
- curLeft = parseFloat( curCSSLeft ) || 0;
- }
-
- if ( jQuery.isFunction( options ) ) {
- options = options.call( elem, i, curOffset );
- }
-
- if ( options.top != null ) {
- props.top = ( options.top - curOffset.top ) + curTop;
- }
- if ( options.left != null ) {
- props.left = ( options.left - curOffset.left ) + curLeft;
- }
-
- if ( "using" in options ) {
- options.using.call( elem, props );
- } else {
- curElem.css( props );
- }
- }
-};
-
-
-jQuery.fn.extend({
-
- position: function() {
- if ( !this[0] ) {
- return null;
- }
-
- var elem = this[0],
-
- // Get *real* offsetParent
- offsetParent = this.offsetParent(),
-
- // Get correct offsets
- offset = this.offset(),
- parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
-
- // Subtract element margins
- // note: when an element has margin: auto the offsetLeft and marginLeft
- // are the same in Safari causing offset.left to incorrectly be 0
- offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
- offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
-
- // Add offsetParent borders
- parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
- parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
-
- // Subtract the two offsets
- return {
- top: offset.top - parentOffset.top,
- left: offset.left - parentOffset.left
- };
- },
-
- offsetParent: function() {
- return this.map(function() {
- var offsetParent = this.offsetParent || document.body;
- while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
- offsetParent = offsetParent.offsetParent;
- }
- return offsetParent;
- });
- }
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
- var top = /Y/.test( prop );
-
- jQuery.fn[ method ] = function( val ) {
- return jQuery.access( this, function( elem, method, val ) {
- var win = getWindow( elem );
-
- if ( val === undefined ) {
- return win ? (prop in win) ? win[ prop ] :
- jQuery.support.boxModel && win.document.documentElement[ method ] ||
- win.document.body[ method ] :
- elem[ method ];
- }
-
- if ( win ) {
- win.scrollTo(
- !top ? val : jQuery( win ).scrollLeft(),
- top ? val : jQuery( win ).scrollTop()
- );
-
- } else {
- elem[ method ] = val;
- }
- }, method, val, arguments.length, null );
- };
-});
-
-function getWindow( elem ) {
- return jQuery.isWindow( elem ) ?
- elem :
- elem.nodeType === 9 ?
- elem.defaultView || elem.parentWindow :
- false;
-}
-
-
-
-
-// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- var clientProp = "client" + name,
- scrollProp = "scroll" + name,
- offsetProp = "offset" + name;
-
- // innerHeight and innerWidth
- jQuery.fn[ "inner" + name ] = function() {
- var elem = this[0];
- return elem ?
- elem.style ?
- parseFloat( jQuery.css( elem, type, "padding" ) ) :
- this[ type ]() :
- null;
- };
-
- // outerHeight and outerWidth
- jQuery.fn[ "outer" + name ] = function( margin ) {
- var elem = this[0];
- return elem ?
- elem.style ?
- parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
- this[ type ]() :
- null;
- };
-
- jQuery.fn[ type ] = function( value ) {
- return jQuery.access( this, function( elem, type, value ) {
- var doc, docElemProp, orig, ret;
-
- if ( jQuery.isWindow( elem ) ) {
- // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
- doc = elem.document;
- docElemProp = doc.documentElement[ clientProp ];
- return jQuery.support.boxModel && docElemProp ||
- doc.body && doc.body[ clientProp ] || docElemProp;
- }
-
- // Get document width or height
- if ( elem.nodeType === 9 ) {
- // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
- doc = elem.documentElement;
-
- // when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
- // so we can't use max, as it'll choose the incorrect offset[Width/Height]
- // instead we use the correct client[Width/Height]
- // support:IE6
- if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
- return doc[ clientProp ];
- }
-
- return Math.max(
- elem.body[ scrollProp ], doc[ scrollProp ],
- elem.body[ offsetProp ], doc[ offsetProp ]
- );
- }
-
- // Get width or height on the element
- if ( value === undefined ) {
- orig = jQuery.css( elem, type );
- ret = parseFloat( orig );
- return jQuery.isNumeric( ret ) ? ret : orig;
- }
-
- // Set the width or height on the element
- jQuery( elem ).css( type, value );
- }, type, value, arguments.length, null );
- };
-});
-
-
-
-
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
-
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-// Do this after creating the global so that if an AMD module wants to call
-// noConflict to hide this version of jQuery, it will work.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
- define( "jquery", [], function () { return jQuery; } );
-}
-
-
-
-})( window );
diff --git a/WebContent/VAADIN/jquery.atmosphere.js b/WebContent/VAADIN/jquery.atmosphere.js
deleted file mode 100644
index 520e63d7cb..0000000000
--- a/WebContent/VAADIN/jquery.atmosphere.js
+++ /dev/null
@@ -1,2748 +0,0 @@
-/**
- * Copyright 2012 Jeanfrancois Arcand
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * IE streaming/XDR supports is copied/highly inspired by http://code.google.com/p/jquery-stream/
- *
- * Copyright 2011, Donghwan Kim
- * Licensed under the Apache License, Version 2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * LocalStorage supports is copied/highly inspired by https://github.com/flowersinthesand/jquery-socket
- * Copyright 2011, Donghwan Kim
- * Licensed under the Apache License, Version 2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- * */
-/**
- * Official documentation of this library: https://github.com/Atmosphere/atmosphere/wiki/jQuery.atmosphere.js-API
- */
-jQuery.atmosphere = function() {
- jQuery(window).bind("unload.atmosphere", function() {
- jQuery.atmosphere.unsubscribe();
- });
-
- // Prevent ESC to kill the connection from Firefox.
- jQuery(window).keypress(function(e){
- if(e.keyCode == 27){
- e.preventDefault();
- }
- });
-
- var parseHeaders = function(headerString) {
- var match, rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, headers = {};
- while (match = rheaders.exec(headerString)) {
- headers[match[1]] = match[2];
- }
- return headers;
- };
-
- return {
- // Keep the version number in sync with push/build.xml and other locations listed in that file
- version : "1.0.14.vaadin4",
- requests : [],
- callbacks : [],
-
- onError : function(response) {
- },
- onClose : function(response) {
- },
- onOpen : function(response) {
- },
- onMessage : function(response) {
- },
- onReconnect : function(request, response) {
- },
- onMessagePublished : function(response) {
- },
- onTransportFailure : function (reason, request) {
- },
- onLocalMessage : function (response) {
- },
-
- AtmosphereRequest : function(options) {
-
- /**
- * {Object} Request parameters.
- * @private
- */
- var _request = {
- timeout: 300000,
- method: 'GET',
- headers: {},
- contentType : '',
- callback: null,
- url : '',
- data : '',
- suspend : true,
- maxRequest : -1,
- reconnect : true,
- maxStreamingLength : 10000000,
- lastIndex : 0,
- logLevel : 'info',
- requestCount : 0,
- fallbackMethod: 'GET',
- fallbackTransport : 'streaming',
- transport : 'long-polling',
- webSocketImpl: null,
- webSocketUrl: null,
- webSocketPathDelimiter: "@@",
- enableXDR : false,
- rewriteURL : false,
- attachHeadersAsQueryString : true,
- executeCallbackBeforeReconnect : false,
- readyState : 0,
- lastTimestamp : 0,
- withCredentials : false,
- trackMessageLength : false ,
- messageDelimiter : '|',
- connectTimeout : -1,
- reconnectInterval : 0,
- dropAtmosphereHeaders : true,
- uuid : 0,
- shared : false,
- readResponsesHeaders : true,
- maxReconnectOnClose: 5,
- enableProtocol: false,
- onError : function(response) {
- },
- onClose : function(response) {
- },
- onOpen : function(response) {
- },
- onMessage : function(response) {
- },
- onReconnect : function(request, response) {
- },
- onMessagePublished : function(response) {
- },
- onTransportFailure : function (reason, request) {
- },
- onLocalMessage : function (request) {
- }
- };
-
- /**
- * {Object} Request's last response.
- * @private
- */
- var _response = {
- status: 200,
- reasonPhrase : "OK",
- responseBody : '',
- messages : [],
- headers : [],
- state : "messageReceived",
- transport : "polling",
- error: null,
- request : null,
- partialMessage : "",
- errorHandled: false,
- id : 0
- };
-
- /**
- * {websocket} Opened web socket.
- *
- * @private
- */
- var _websocket = null;
-
- /**
- * {SSE} Opened SSE.
- *
- * @private
- */
- var _sse = null;
-
- /**
- * {XMLHttpRequest, ActiveXObject} Opened ajax request (in case of
- * http-streaming or long-polling)
- *
- * @private
- */
- var _activeRequest = null;
-
- /**
- * {Object} Object use for streaming with IE.
- *
- * @private
- */
- var _ieStream = null;
-
- /**
- * {Object} Object use for jsonp transport.
- *
- * @private
- */
- var _jqxhr = null;
-
- /**
- * {boolean} If request has been subscribed or not.
- *
- * @private
- */
- var _subscribed = true;
-
- /**
- * {number} Number of test reconnection.
- *
- * @private
- */
- var _requestCount = 0;
-
- /**
- * {boolean} If request is currently aborded.
- *
- * @private
- */
- var _abordingConnection = false;
-
- /**
- * A local "channel' of communication.
- * @private
- */
- var _localSocketF = null;
-
- /**
- * The storage used.
- * @private
- */
- var _storageService;
-
- /**
- * Local communication
- * @private
- */
- var _localStorageService = null;
-
- /**
- * A Unique ID
- * @private
- */
- var guid = jQuery.now();
-
- /** Trace time */
- var _traceTimer;
-
- // Automatic call to subscribe
- _subscribe(options);
-
- /**
- * Initialize atmosphere request object.
- *
- * @private
- */
- function _init() {
- _subscribed = true;
- _abordingConnection = false;
- _requestCount = 0;
-
- _websocket = null;
- _sse = null;
- _activeRequest = null;
- _ieStream = null;
- }
-
- /**
- * Re-initialize atmosphere object.
- * @private
- */
- function _reinit() {
- _clearState();
- _init();
- }
-
- /**
- * Subscribe request using request transport. <br>
- * If request is currently opened, this one will be closed.
- *
- * @param {Object}
- * Request parameters.
- * @private
- */
- function _subscribe(options) {
- _reinit();
-
- _request = jQuery.extend(_request, options);
- // Allow at least 1 request
- _request.mrequest = _request.reconnect;
- if (!_request.reconnect) {
- _request.reconnect = true;
- }
- }
-
- /**
- * Check if web socket is supported (check for custom implementation
- * provided by request object or browser implementation).
- *
- * @returns {boolean} True if web socket is supported, false
- * otherwise.
- * @private
- */
- function _supportWebsocket() {
- return _request.webSocketImpl != null || window.WebSocket || window.MozWebSocket;
- }
-
- /**
- * Check if server side events (SSE) is supported (check for custom implementation
- * provided by request object or browser implementation).
- *
- * @returns {boolean} True if web socket is supported, false
- * otherwise.
- * @private
- */
- function _supportSSE() {
- return window.EventSource;
- }
-
- /**
- * Open request using request transport. <br>
- * If request transport is 'websocket' but websocket can't be
- * opened, request will automatically reconnect using fallback
- * transport.
- *
- * @private
- */
- function _execute() {
- // Shared across multiple tabs/windows.
- if (_request.shared) {
- _localStorageService = _local(_request);
- if (_localStorageService != null) {
- if (_request.logLevel == 'debug') {
- jQuery.atmosphere.debug("Storage service available. All communication will be local");
- }
-
- if (_localStorageService.open(_request)) {
- // Local connection.
- return;
- }
- }
-
- if (_request.logLevel == 'debug') {
- jQuery.atmosphere.debug("No Storage service available.");
- }
- // Wasn't local or an error occurred
- _localStorageService = null;
- }
-
- // Protocol
- _request.firstMessage= true;
- _request.ctime = jQuery.now();
-
- if (_request.transport != 'websocket' && _request.transport != 'sse') {
- _executeRequest();
- } else if (_request.transport == 'websocket') {
- if (!_supportWebsocket()) {
- _reconnectWithFallbackTransport("Websocket is not supported, using request.fallbackTransport (" + _request.fallbackTransport + ")");
- } else {
- _executeWebSocket(false);
- }
- } else if (_request.transport == 'sse') {
- if (!_supportSSE()) {
- _reconnectWithFallbackTransport("Server Side Events(SSE) is not supported, using request.fallbackTransport (" + _request.fallbackTransport + ")");
- } else {
- _executeSSE(false);
- }
- }
- }
-
- function _local(request) {
- var trace, connector, orphan, name = "atmosphere-" + request.url, connectors = {
- storage: function() {
- if (!jQuery.atmosphere.supportStorage()) {
- return;
- }
-
- var storage = window.localStorage,
- get = function(key) {
- return jQuery.parseJSON(storage.getItem(name + "-" + key));
- },
- set = function(key, value) {
- storage.setItem(name + "-" + key, jQuery.stringifyJSON(value));
- };
-
- return {
- init: function() {
- set("children", get("children").concat([guid]));
- jQuery(window).on("storage.socket", function(event) {
- event = event.originalEvent;
- if (event.key === name && event.newValue) {
- listener(event.newValue);
- }
- });
- return get("opened");
- },
- signal: function(type, data) {
- storage.setItem(name, jQuery.stringifyJSON({target: "p", type: type, data: data}));
- },
- close: function() {
- var index, children = get("children");
-
- jQuery(window).off("storage.socket");
- if (children) {
- index = jQuery.inArray(request.id, children);
- if (index > -1) {
- children.splice(index, 1);
- set("children", children);
- }
- }
- }
- };
- },
- windowref: function() {
- var win = window.open("", name.replace(/\W/g, ""));
-
- if (!win || win.closed || !win.callbacks) {
- return;
- }
-
- return {
- init: function() {
- win.callbacks.push(listener);
- win.children.push(guid);
- return win.opened;
- },
- signal: function(type, data) {
- if (!win.closed && win.fire) {
- win.fire(jQuery.stringifyJSON({target: "p", type: type, data: data}));
- }
- },
- close : function() {
- function remove(array, e) {
- var index = jQuery.inArray(e, array);
- if (index > -1) {
- array.splice(index, 1);
- }
- }
-
- // Removes traces only if the parent is alive
- if (!orphan) {
- remove(win.callbacks, listener);
- remove(win.children, guid);
- }
- }
-
- };
- }
- };
-
- // Receives open, close and message command from the parent
- function listener(string) {
- var command = jQuery.parseJSON(string), data = command.data;
-
- if (command.target === "c") {
- switch (command.type) {
- case "open":
- _open("opening", 'local', _request)
- break;
- case "close":
- if (!orphan) {
- orphan = true;
- if (data.reason === "aborted") {
- _close();
- } else {
- // Gives the heir some time to reconnect
- if (data.heir === guid) {
- _execute();
- } else {
- setTimeout(function() {
- _execute();
- }, 100);
- }
- }
- }
- break;
- case "message":
- _prepareCallback(data, "messageReceived", 200, request.transport);
- break;
- case "localMessage":
- _localMessage(data);
- break;
- }
- }
- }
-
- function findTrace() {
- var matcher = new RegExp("(?:^|; )(" + encodeURIComponent(name) + ")=([^;]*)").exec(document.cookie);
- if (matcher) {
- return jQuery.parseJSON(decodeURIComponent(matcher[2]));
- }
- }
-
- // Finds and validates the parent socket's trace from the cookie
- trace = findTrace();
- if (!trace || jQuery.now() - trace.ts > 1000) {
- return;
- }
-
- // Chooses a connector
- connector = connectors.storage() || connectors.windowref();
- if (!connector) {
- return;
- }
-
- return {
- open: function() {
- var parentOpened;
-
- // Checks the shared one is alive
- _traceTimer = setInterval(function() {
- var oldTrace = trace;
- trace = findTrace();
- if (!trace || oldTrace.ts === trace.ts) {
- // Simulates a close signal
- listener(jQuery.stringifyJSON({target: "c", type: "close", data: {reason: "error", heir: oldTrace.heir}}));
- }
- }, 1000);
-
- parentOpened = connector.init();
- if (parentOpened) {
- // Firing the open event without delay robs the user of the opportunity to bind connecting event handlers
- setTimeout(function() {
- _open("opening", 'local', request)
- }, 50);
- }
- return parentOpened;
- },
- send: function(event) {
- connector.signal("send", event);
- },
- localSend: function(event) {
- connector.signal("localSend", jQuery.stringifyJSON({id: guid , event: event}));
- },
- close: function() {
- // Do not signal the parent if this method is executed by the unload event handler
- if (!_abordingConnection) {
- clearInterval(_traceTimer);
- connector.signal("close");
- connector.close();
- }
- }
- };
- };
-
- function share() {
- var storageService, name = "atmosphere-" + _request.url, servers = {
- // Powered by the storage event and the localStorage
- // http://www.w3.org/TR/webstorage/#event-storage
- storage: function() {
- if (!jQuery.atmosphere.supportStorage()) {
- return;
- }
-
- var storage = window.localStorage;
-
- return {
- init: function() {
- // Handles the storage event
- jQuery(window).on("storage.socket", function(event) {
- event = event.originalEvent;
- // When a deletion, newValue initialized to null
- if (event.key === name && event.newValue) {
- listener(event.newValue);
- }
- });
- },
- signal: function(type, data) {
- storage.setItem(name, jQuery.stringifyJSON({target: "c", type: type, data: data}));
- },
- get: function(key) {
- return jQuery.parseJSON(storage.getItem(name + "-" + key));
- },
- set: function(key, value) {
- storage.setItem(name + "-" + key, jQuery.stringifyJSON(value));
- },
- close : function() {
- jQuery(window).off("storage.socket");
- storage.removeItem(name);
- storage.removeItem(name + "-opened");
- storage.removeItem(name + "-children");
- }
-
- };
- },
- // Powered by the window.open method
- // https://developer.mozilla.org/en/DOM/window.open
- windowref: function() {
- // Internet Explorer raises an invalid argument error
- // when calling the window.open method with the name containing non-word characters
- var neim = name.replace(/\W/g, ""), win = (jQuery('iframe[name="' + neim + '"]')[0]
- || jQuery('<iframe name="' + neim + '" />').hide().appendTo("body")[0]).contentWindow;
-
- return {
- init: function() {
- // Callbacks from different windows
- win.callbacks = [listener];
- // In IE 8 and less, only string argument can be safely passed to the function in other window
- win.fire = function(string) {
- var i;
-
- for (i = 0; i < win.callbacks.length; i++) {
- win.callbacks[i](string);
- }
- };
- },
- signal: function(type, data) {
- if (!win.closed && win.fire) {
- win.fire(jQuery.stringifyJSON({target: "c", type: type, data: data}));
- }
- },
- get: function(key) {
- return !win.closed ? win[key] : null;
- },
- set: function(key, value) {
- if (!win.closed) {
- win[key] = value;
- }
- },
- close : function() {}
- };
- }
- };
-
-
- // Receives send and close command from the children
- function listener(string) {
- var command = jQuery.parseJSON(string), data = command.data;
-
- if (command.target === "p") {
- switch (command.type) {
- case "send":
- _push(data);
- break;
- case "localSend":
- _localMessage(data);
- break;
- case "close":
- _close();
- break;
- }
- }
- }
-
- _localSocketF = function propagateMessageEvent(context) {
- storageService.signal("message", context);
- }
-
- function leaveTrace() {
- document.cookie = encodeURIComponent(name) + "=" +
- // Opera's JSON implementation ignores a number whose a last digit of 0 strangely
- // but has no problem with a number whose a last digit of 9 + 1
- encodeURIComponent(jQuery.stringifyJSON({ts: jQuery.now() + 1, heir: (storageService.get("children") || [])[0]}));
- }
-
- // Chooses a storageService
- storageService = servers.storage() || servers.windowref();
- storageService.init();
-
- if (_request.logLevel == 'debug') {
- jQuery.atmosphere.debug("Installed StorageService " + storageService);
- }
-
- // List of children sockets
- storageService.set("children", []);
-
- if (storageService.get("opened") != null && !storageService.get("opened")) {
- // Flag indicating the parent socket is opened
- storageService.set("opened", false);
- }
- // Leaves traces
- leaveTrace();
- _traceTimer = setInterval(leaveTrace, 1000);
-
- _storageService = storageService;
- }
-
- /**
- * @private
- */
- function _open(state, transport, request) {
- if (_request.shared && transport != 'local') {
- share();
- }
-
- if (_storageService != null) {
- _storageService.set("opened", true);
- }
-
- request.close = function() {
- _close();
- };
-
- if (_response.error == null) {
- _response.request = request;
- var prevState = _response.state;
- _response.state = state;
- _response.status = 200;
- var prevTransport = _response.transport;
- _response.transport = transport;
-
- var _body = _response.responseBody;
- _invokeCallback();
- _response.responseBody = _body;
-
- _response.state = prevState;
- _response.transport = prevTransport;
- }
- }
-
- /**
- * Execute request using jsonp transport.
- *
- * @param request
- * {Object} request Request parameters, if
- * undefined _request object will be used.
- * @private
- */
- function _jsonp(request) {
- // When CORS is enabled, make sure we force the proper transport.
- request.transport="jsonp";
-
- var rq = _request;
- if ((request != null) && (typeof(request) != 'undefined')) {
- rq = request;
- }
-
- var url = rq.url;
- var data = rq.data;
- if (rq.attachHeadersAsQueryString) {
- url = _attachHeaders(rq);
- if (data != '') {
- url += "&X-Atmosphere-Post-Body=" + encodeURIComponent(data);
- }
- data = '';
- }
-
- _jqxhr = jQuery.ajax({
- url : url,
- type : rq.method,
- dataType: "jsonp",
- error : function(jqXHR, textStatus, errorThrown) {
- _response.error = true;
- if (jqXHR.status < 300 && rq.reconnect && _requestCount++ < rq.maxReconnectOnClose) {
- _reconnect(_jqxhr, rq);
- } else {
- _onError(jqXHR.status, errorThrown);
- }
- },
- jsonp : "jsonpTransport",
- success: function(json) {
- if (rq.reconnect) {
- if (rq.maxRequest == -1 || rq.requestCount++ < rq.maxRequest) {
- _readHeaders(_jqxhr, rq);
-
- if (!rq.executeCallbackBeforeReconnect) {
- _reconnect(_jqxhr, rq);
- }
-
- var msg = json.message;
- if (msg != null && typeof msg != 'string') {
- try {
- msg = jQuery.stringifyJSON(msg);
- } catch (err) {
- // The message was partial
- }
- }
-
- if (_handleProtocol(rq, msg)) {
- _prepareCallback(msg, "messageReceived", 200, rq.transport);
- }
-
- if (rq.executeCallbackBeforeReconnect) {
- _reconnect(_jqxhr, rq);
- }
- } else {
- jQuery.atmosphere.log(_request.logLevel, ["JSONP reconnect maximum try reached " + _request.requestCount]);
- _onError(0, "maxRequest reached");
- }
- }
- },
- data : rq.data,
- beforeSend : function(jqXHR) {
- _doRequest(jqXHR, rq, false);
- }
- });
- }
-
- /**
- * Execute request using ajax transport.
- *
- * @param request
- * {Object} request Request parameters, if
- * undefined _request object will be used.
- * @private
- */
- function _ajax(request) {
- var rq = _request;
- if ((request != null) && (typeof(request) != 'undefined')) {
- rq = request;
- }
-
- var url = rq.url;
- var data = rq.data;
- if (rq.attachHeadersAsQueryString) {
- url = _attachHeaders(rq);
- if (data != '') {
- url += "&X-Atmosphere-Post-Body=" + encodeURIComponent(data);
- }
- data = '';
- }
-
- var async = typeof(rq.async) != 'undefined' ? rq.async : true;
- _jqxhr = jQuery.ajax({
- url : url,
- type : rq.method,
- error : function(jqXHR, textStatus, errorThrown) {
- _response.error = true;
- if (jqXHR.status < 300) {
- _reconnect(_jqxhr, rq);
- } else {
- _onError(jqXHR.status, errorThrown);
- }
- },
- success: function(data, textStatus, jqXHR) {
-
- if (rq.reconnect) {
- if (rq.maxRequest == -1 || rq.requestCount++ < rq.maxRequest) {
- if (!rq.executeCallbackBeforeReconnect) {
- _reconnect(_jqxhr, rq);
- }
-
- if (_handleProtocol(rq, data)) {
- _prepareCallback(data, "messageReceived", 200, rq.transport);
- }
-
- if (rq.executeCallbackBeforeReconnect) {
- _reconnect(_jqxhr, rq);
- }
- } else {
- jQuery.atmosphere.log(_request.logLevel, ["AJAX reconnect maximum try reached " + _request.requestCount]);
- _onError(0, "maxRequest reached");
- }
- }
- },
- beforeSend : function(jqXHR) {
- _doRequest(jqXHR, rq, false);
- },
- crossDomain : rq.enableXDR,
- async: async
- });
- }
-
- /**
- * Build websocket object.
- *
- * @param location
- * {string} Web socket url.
- * @returns {websocket} Web socket object.
- * @private
- */
- function _getWebSocket(location) {
- if (_request.webSocketImpl != null) {
- return _request.webSocketImpl;
- } else {
- if (window.WebSocket) {
- return new WebSocket(location);
- } else {
- return new MozWebSocket(location);
- }
- }
- }
-
- /**
- * Build web socket url from request url.
- *
- * @return {string} Web socket url (start with "ws" or "wss" for
- * secure web socket).
- * @private
- */
- function _buildWebSocketUrl() {
- var url = _attachHeaders(_request);
-
- return decodeURI(jQuery('<a href="' + url + '"/>')[0].href.replace(/^http/, "ws"));
- }
-
- /**
- * Build SSE url from request url.
- *
- * @return a url with Atmosphere's headers
- * @private
- */
- function _buildSSEUrl() {
- var url = _attachHeaders(_request);
- return url;
- }
-
- /**
- * Open SSE. <br>
- * Automatically use fallback transport if SSE can't be
- * opened.
- *
- * @private
- */
- function _executeSSE(sseOpened) {
-
- _response.transport = "sse";
-
- var location = _buildSSEUrl(_request.url);
-
- if (_request.logLevel == 'debug') {
- jQuery.atmosphere.debug("Invoking executeSSE");
- jQuery.atmosphere.debug("Using URL: " + location);
- }
-
- if (sseOpened) {
- _open('re-opening', "sse", _request);
- }
-
- if (_request.enableProtocol && sseOpened) {
- var time = jQuery.now() - _request.ctime;
- _request.lastTimestamp = Number(_request.stime) + Number(time);
- }
-
- if (sseOpened && !_request.reconnect) {
- if (_sse != null) {
- _clearState();
- }
- return;
- }
-
- try {
- _sse = new EventSource(location, {withCredentials: _request.withCredentials});
- } catch (e) {
- _onError(0, e);
- _reconnectWithFallbackTransport("SSE failed. Downgrading to fallback transport and resending");
- return;
- }
-
- if (_request.connectTimeout > 0) {
- _request.id = setTimeout(function() {
- if (!sseOpened) {
- _clearState();
- }
- }, _request.connectTimeout);
- }
-
- _sse.onopen = function(event) {
- if (_request.logLevel == 'debug') {
- jQuery.atmosphere.debug("SSE successfully opened");
- }
-
- if (!sseOpened) {
- _open('opening', "sse", _request);
- }
- sseOpened = true;
-
- if (_request.method == 'POST') {
- _response.state = "messageReceived";
- _sse.send(_request.data);
- }
- };
-
- _sse.onmessage = function(message) {
- if (message.origin != window.location.protocol + "//" + window.location.host) {
- jQuery.atmosphere.log(_request.logLevel, ["Origin was not " + window.location.protocol + "//" + window.location.host]);
- return;
- }
-
- var data = message.data;
-
- if (!_handleProtocol(_request, data)) return;
-
- _response.state = 'messageReceived';
- _response.status = 200;
-
- var skipCallbackInvocation = _trackMessageSize(data, _request, _response);
- if (!skipCallbackInvocation) {
- _invokeCallback();
- _response.responseBody = '';
- _response.messages = [];
- }
- };
-
- _sse.onerror = function(message) {
-
- clearTimeout(_request.id);
- _invokeClose(sseOpened);
- _clearState();
-
- if (_abordingConnection) {
- jQuery.atmosphere.log(_request.logLevel, ["SSE closed normally"]);
- } else if (!sseOpened) {
- _reconnectWithFallbackTransport("SSE failed. Downgrading to fallback transport and resending");
- } else if (_request.reconnect && (_response.transport == 'sse')) {
- if (_requestCount++ < _request.maxReconnectOnClose) {
- _request.id = setTimeout(function() {
- _executeSSE(true);
- }, _request.reconnectInterval);
- _response.responseBody = "";
- _response.messages = [];
- } else {
- jQuery.atmosphere.log(_request.logLevel, ["SSE reconnect maximum try reached " + _requestCount]);
- _onError(0, "maxReconnectOnClose reached");
- }
- }
- };
- }
-
- /**
- * Open web socket. <br>
- * Automatically use fallback transport if web socket can't be
- * opened.
- *
- * @private
- */
- function _executeWebSocket(webSocketOpened) {
-
- _response.transport = "websocket";
-
- if (_request.enableProtocol && webSocketOpened) {
- var time = jQuery.now() - _request.ctime;
- _request.lastTimestamp = Number(_request.stime) + Number(time);
- }
-
- var location = _buildWebSocketUrl(_request.url);
- var closed = false;
-
- if (_request.logLevel == 'debug') {
- jQuery.atmosphere.debug("Invoking executeWebSocket");
- jQuery.atmosphere.debug("Using URL: " + location);
- }
-
- if (webSocketOpened && !_request.reconnect) {
- if (_websocket != null) {
- _clearState();
- }
- return;
- }
-
- _websocket = _getWebSocket(location);
- if (_request.connectTimeout > 0) {
- _request.id = setTimeout(function() {
- if (!webSocketOpened) {
- var _message = {
- code : 1002,
- reason : "",
- wasClean : false
- };
- _websocket.onclose(_message);
- // Close it anyway
- try {
- _clearState();
- } catch (e) {
- }
- return;
- }
-
- }, _request.connectTimeout);
- }
-
- _request.id = setTimeout(function() {
- setTimeout(function () {
- _clearState();
- }, _request.reconnectInterval)
- }, _request.timeout);
-
- _websocket.onopen = function(message) {
- if (_request.logLevel == 'debug') {
- jQuery.atmosphere.debug("Websocket successfully opened");
- }
-
- _open('opening', 'websocket', _request);
-
- webSocketOpened = true;
- _websocket.webSocketOpened = webSocketOpened;
-
- if (_request.method == 'POST') {
- _response.state = "messageReceived";
- _websocket.send(_request.data);
- }
- };
-
- _websocket.onmessage = function(message) {
-
- clearTimeout(_request.id);
- _request.id = setTimeout(function() {
- setTimeout(function () {
- _clearState();
- }, _request.reconnectInterval)
- }, _request.timeout);
-
- var data = message.data;
-
- if (!_handleProtocol(_request, data)) return;
-
- _response.state = 'messageReceived';
- _response.status = 200;
-
- var skipCallbackInvocation = _trackMessageSize(data, _request, _response);
- if (!skipCallbackInvocation) {
- _invokeCallback();
- _response.responseBody = '';
- _response.messages = [];
- }
- };
-
- _websocket.onerror = function(message) {
- clearTimeout(_request.id)
- };
-
- _websocket.onclose = function(message) {
- if (closed) return
- clearTimeout(_request.id);
-
- var reason = message.reason;
- if (reason === "") {
- switch (message.code) {
- case 1000:
- reason = "Normal closure; the connection successfully completed whatever purpose for which " +
- "it was created.";
- break;
- case 1001:
- reason = "The endpoint is going away, either because of a server failure or because the " +
- "browser is navigating away from the page that opened the connection.";
- break;
- case 1002:
- reason = "The endpoint is terminating the connection due to a protocol error.";
- break;
- case 1003:
- reason = "The connection is being terminated because the endpoint received data of a type it " +
- "cannot accept (for example, a text-only endpoint received binary data).";
- break;
- case 1004:
- reason = "The endpoint is terminating the connection because a data frame was received that " +
- "is too large.";
- break;
- case 1005:
- reason = "Unknown: no status code was provided even though one was expected.";
- break;
- case 1006:
- reason = "Connection was closed abnormally (that is, with no close frame being sent).";
- break;
- }
- }
-
- jQuery.atmosphere.warn("Websocket closed, reason: " + reason);
- jQuery.atmosphere.warn("Websocket closed, wasClean: " + message.wasClean);
-
- _invokeClose(webSocketOpened);
- closed = true;
-
- if (_abordingConnection) {
- jQuery.atmosphere.log(_request.logLevel, ["Websocket closed normally"]);
- } else if (!webSocketOpened) {
- _reconnectWithFallbackTransport("Websocket failed. Downgrading to Comet and resending");
-
- } else if (_request.reconnect && _response.transport == 'websocket') {
- _clearState();
- if (_request.reconnect && _requestCount++ < _request.maxReconnectOnClose) {
- _request.id = setTimeout(function() {
- _response.responseBody = "";
- _response.messages = [];
- _executeWebSocket(true);
- }, _request.reconnectInterval);
- } else {
- jQuery.atmosphere.log(_request.logLevel, ["Websocket reconnect maximum try reached " + _requestCount]);
- jQuery.atmosphere.warn("Websocket error, reason: " + message.reason);
- _onError(0, "maxReconnectOnClose reached");
- }
- }
- };
- if (_websocket.url === undefined) {
- // Android 4.1 does not really support websockets and fails silently
- _websocket.onclose({reason:"Android 4.1 does not support websockets.", wasClean: false});
- }
- }
-
- function _handleProtocol(request, message) {
- // The first messages is always the uuid.
- if (jQuery.trim(message) != 0 && request.enableProtocol && request.firstMessage) {
- request.firstMessage = false;
- var messages = message.split(request.messageDelimiter);
- var pos = messages.length == 2 ? 0 : 1;
- request.uuid = jQuery.trim(messages[pos]);
- request.stime = jQuery.trim(messages[pos + 1]);
- return false;
- }
- return true;
- }
-
- function _onError(code, reason) {
- _clearState();
-
- _response.state = 'error';
- _response.reasonPhrase = reason;
- _response.responseBody = "";
- _response.messages = [];
- _response.status = code;
- _invokeCallback();
- }
-
- /**
- * Track received message and make sure callbacks/functions are only invoked when the complete message
- * has been received.
- *
- * @param message
- * @param request
- * @param response
- */
- function _trackMessageSize(message, request, response) {
- if (message.length === 0)
- return true;
-
- if (request.trackMessageLength) {
-
- // If we have found partial message, prepend them.
- if (response.partialMessage.length != 0) {
- message = response.partialMessage + message;
- }
-
- var messages = [];
- var messageStart = message.indexOf(request.messageDelimiter);
- while (messageStart !== -1) {
- var str = jQuery.trim(message.substring(0, messageStart));
- var messageLength = parseInt(str, 10);
- if (isNaN(messageLength))
- throw 'message length "' + str + '" is not a number';
- messageStart += request.messageDelimiter.length;
- if (messageStart + messageLength > message.length) {
- // message not complete, so there is no trailing messageDelimiter
- messageStart = -1;
- } else {
- // message complete, so add it
- messages.push(message.substring(messageStart, messageStart + messageLength));
- // remove consumed characters
- message = message.substring(messageStart + messageLength, message.length);
- messageStart = message.indexOf(request.messageDelimiter);
- }
- }
-
- /* keep any remaining data */
- response.partialMessage = message;
-
- if (messages.length !== 0) {
- response.responseBody = messages.join(request.messageDelimiter);
- response.messages = messages;
- return false;
- } else {
- response.responseBody = "";
- response.messages = [];
- return true;
- }
- } else {
- response.responseBody = message;
- }
- return false;
- }
-
- /**
- * Reconnect request with fallback transport. <br>
- * Used in case websocket can't be opened.
- *
- * @private
- */
- function _reconnectWithFallbackTransport(errorMessage) {
- jQuery.atmosphere.log(_request.logLevel, [errorMessage]);
-
- if (typeof(_request.onTransportFailure) != 'undefined') {
- _request.onTransportFailure(errorMessage, _request);
- } else if (typeof(jQuery.atmosphere.onTransportFailure) != 'undefined') {
- jQuery.atmosphere.onTransportFailure(errorMessage, _request);
- }
-
- _request.transport = _request.fallbackTransport;
- var reconnectInterval = _request.connectTimeout == -1 ? 0 : _request.connectTimeout;
- if (_request.reconnect && _request.transport != 'none' || _request.transport == null) {
- _request.method = _request.fallbackMethod;
- _response.transport = _request.fallbackTransport;
- _request.fallbackTransport = 'none';
- _request.id = setTimeout(function() {
- _execute();
- }, reconnectInterval);
- } else {
- _onError(500, "Unable to reconnect with fallback transport");
- }
- }
-
- /**
- * Get url from request and attach headers to it.
- *
- * @param request
- * {Object} request Request parameters, if
- * undefined _request object will be used.
- *
- * @returns {Object} Request object, if undefined,
- * _request object will be used.
- * @private
- */
- function _attachHeaders(request) {
- var rq = _request;
- if ((request != null) && (typeof(request) != 'undefined')) {
- rq = request;
- }
-
- var url = rq.url;
-
- // If not enabled
- if (!rq.attachHeadersAsQueryString) return url;
-
- // If already added
- if (url.indexOf("X-Atmosphere-Framework") != -1) {
- return url;
- }
-
- url += (url.indexOf('?') != -1) ? '&' : '?';
- url += "X-Atmosphere-tracking-id=" + rq.uuid;
- url += "&X-Atmosphere-Framework=" + jQuery.atmosphere.version;
- url += "&X-Atmosphere-Transport=" + rq.transport;
-
- if (rq.trackMessageLength) {
- url += "&X-Atmosphere-TrackMessageSize=" + "true";
- }
-
- if (rq.lastTimestamp != undefined) {
- url += "&X-Cache-Date=" + rq.lastTimestamp;
- } else {
- url += "&X-Cache-Date=" + 0;
- }
-
- if (rq.contentType != '') {
- url += "&Content-Type=" + rq.contentType;
- }
-
- if (rq.enableProtocol) {
- url += "&X-atmo-protocol=true";
- }
-
- jQuery.each(rq.headers, function(name, value) {
- var h = jQuery.isFunction(value) ? value.call(this, rq, request, _response) : value;
- if (h != null) {
- url += "&" + encodeURIComponent(name) + "=" + encodeURIComponent(h);
- }
- });
-
- return url;
- }
-
- /**
- * Build ajax request. <br>
- * Ajax Request is an XMLHttpRequest object, except for IE6 where
- * ajax request is an ActiveXObject.
- *
- * @return {XMLHttpRequest, ActiveXObject} Ajax request.
- * @private
- */
- function _buildAjaxRequest() {
- if (jQuery.browser.msie) {
- if (typeof XMLHttpRequest == "undefined")
- XMLHttpRequest = function () {
- try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
- catch (e) {}
- try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
- catch (e) {}
- try { return new ActiveXObject("Microsoft.XMLHTTP"); }
- catch (e) {}
- //Microsoft.XMLHTTP points to Msxml2.XMLHTTP and is redundant
- throw new Error("This browser does not support XMLHttpRequest.");
- };
- }
- return new XMLHttpRequest();
- }
-
- /**
- * Execute ajax request. <br>
- *
- * @param request
- * {Object} request Request parameters, if
- * undefined _request object will be used.
- * @private
- */
- function _executeRequest(request) {
- var rq = _request;
- if ((request != null) || (typeof(request) != 'undefined')) {
- rq = request;
- }
-
- rq.lastIndex = 0;
- rq.readyState = 0;
-
- // CORS fake using JSONP
- if ((rq.transport == 'jsonp') || ((rq.enableXDR) && (jQuery.atmosphere.checkCORSSupport()))) {
- _jsonp(rq);
- return;
- }
-
- if (rq.transport == 'ajax') {
- _ajax(request);
- return;
- }
-
- if (jQuery.browser.msie && jQuery.browser.version < 10) {
- if ((rq.transport == 'streaming')) {
- rq.enableXDR && window.XDomainRequest ? _ieXDR(rq) : _ieStreaming(rq);
- return;
- }
-
- if ((rq.enableXDR) && (window.XDomainRequest)) {
- _ieXDR(rq);
- return;
- }
- }
-
- var reconnectF = function() {
- if (rq.reconnect && _requestCount++ < rq.maxReconnectOnClose) {
- _reconnect(ajaxRequest, rq, true);
- } else {
- _onError(0, "maxReconnectOnClose reached");
- }
- };
-
- if (rq.reconnect && ( rq.maxRequest == -1 || rq.requestCount++ < rq.maxRequest)) {
- var ajaxRequest = _buildAjaxRequest();
- _doRequest(ajaxRequest, rq, true);
-
- if (rq.suspend) {
- _activeRequest = ajaxRequest;
- }
-
- if (rq.transport != 'polling') {
- _response.transport = rq.transport;
- }
-
- ajaxRequest.onabort = function () {
- _invokeClose(true);
- };
-
- ajaxRequest.onerror = function() {
- _response.error = true;
- try {
- _response.status = XMLHttpRequest.status;
- } catch(e) {
- _response.status = 500;
- }
-
- if (!_response.status) {
- _response.status = 500;
- }
- _clearState();
- if (!_response.errorHandled) {
- reconnectF();
- }
- };
-
- ajaxRequest.onreadystatechange = function() {
- if (_abordingConnection) {
- return;
- }
-
- _response.error = null;
- var skipCallbackInvocation = false;
- var update = false;
-
- if (rq.transport == 'streaming' && ajaxRequest.readyState == 2) {
- _open('opening', rq.transport, rq);
- }
-
- // Opera doesn't call onerror if the server disconnect.
- if (jQuery.browser.opera
- && rq.transport == 'streaming'
- && rq.readyState > 2
- && ajaxRequest.readyState == 4) {
-
- rq.readyState = 0;
- rq.lastIndex = 0;
-
- reconnectF();
- return;
- }
-
- rq.readyState = ajaxRequest.readyState;
-
- if (rq.transport == 'streaming' && ajaxRequest.readyState >= 3) {
- update = true;
- } else if (rq.transport == 'long-polling' && ajaxRequest.readyState === 4) {
- update = true;
- }
- clearTimeout(rq.id);
-
- if (update) {
- // MSIE 9 and lower status can be higher than 1000, Chrome can be 0
- var status = 0;
- if (ajaxRequest.readyState != 0) {
- status = ajaxRequest.status > 1000 ? 0 : ajaxRequest.status;
- }
-
- if (status >= 300 || status == 0) {
- // Prevent onerror callback to be called
- _response.errorHandled = true;
- _clearState();
- _invokeClose(true);
- reconnectF();
- return;
- }
- var responseText = ajaxRequest.responseText;
-
- if (jQuery.trim(responseText.length) == 0 && rq.transport == 'long-polling') {
- // For browser that aren't support onabort
- if (!ajaxRequest.hasData) {
- reconnectF();
- } else {
- ajaxRequest.hasData = false;
- }
- return;
- }
- ajaxRequest.hasData = true;
-
- _readHeaders(ajaxRequest, _request);
-
- if (rq.transport == 'streaming') {
- if (!jQuery.browser.opera) {
- var message = responseText.substring(rq.lastIndex, responseText.length);
- rq.lastIndex = responseText.length;
- if (!_handleProtocol(_request, message)) {
- return;
- }
- skipCallbackInvocation = _trackMessageSize(message, rq, _response);
- } else {
- jQuery.atmosphere.iterate(function () {
- if (_response.status != 500 && ajaxRequest.responseText.length > rq.lastIndex) {
- try {
- _response.status = ajaxRequest.status;
- }
- catch (e) {
- _response.status = 404;
- }
- _response.state = "messageReceived";
-
- var message = ajaxRequest.responseText.substring(rq.lastIndex);
- rq.lastIndex = ajaxRequest.responseText.length;
- if (_handleProtocol(_request, message)) {
- skipCallbackInvocation = _trackMessageSize(message, rq, _response);
- if (!skipCallbackInvocation) {
- _invokeCallback();
- }
-
- _verifyStreamingLength(ajaxRequest, rq);
- }
- } else if (_response.status > 400){
- rq.lastIndex = ajaxRequest.responseText.length;
- return false;
- }
- }, 0);
- }
- } else {
- if (!_handleProtocol( _request, responseText)) {
- _reconnect(ajaxRequest, rq, false);
- return;
- }
-
- skipCallbackInvocation = _trackMessageSize(responseText, rq, _response);
- rq.lastIndex = responseText.length;
- }
-
- try {
- _response.status = ajaxRequest.status;
- _response.headers = parseHeaders(ajaxRequest.getAllResponseHeaders());
-
- _readHeaders(ajaxRequest, rq);
- } catch(e) {
- _response.status = 404;
- }
-
- if (rq.suspend) {
- _response.state = _response.status == 0 ? "closed" : "messageReceived";
- } else {
- _response.state = "messagePublished";
- }
-
- if (!rq.executeCallbackBeforeReconnect) {
- _reconnect(ajaxRequest, rq, false);
- }
-
- // For backward compatibility with Atmosphere < 0.8
- if (_response.responseBody.indexOf("parent.callback") != -1) {
- jQuery.atmosphere.log(rq.logLevel, ["parent.callback no longer supported with 0.8 version and up. Please upgrade"]);
- }
-
- if (!skipCallbackInvocation) {
- _invokeCallback();
- }
-
- if (rq.executeCallbackBeforeReconnect) {
- _reconnect(ajaxRequest, rq, false);
- }
-
- _verifyStreamingLength(ajaxRequest, rq);
-
- if (rq.transport == 'streaming' && rq.readyState == 4) {
- _invokeClose(true);
- reconnectF();
- }
- }
- };
- ajaxRequest.send(rq.data);
-
- if (rq.suspend) {
- rq.id = setTimeout(function() {
- if (_subscribed) {
- setTimeout(function () {
- _clearState();
- _executeRequest(rq);
- }, rq.reconnectInterval)
- }
- }, rq.timeout);
- }
- _subscribed = true;
-
- } else {
- if (rq.logLevel == 'debug') {
- jQuery.atmosphere.log(rq.logLevel, ["Max re-connection reached."]);
- }
- _onError(0, "maxRequest reached");
- }
- }
-
- /**
- * Do ajax request.
- * @param ajaxRequest Ajax request.
- * @param request Request parameters.
- * @param create If ajax request has to be open.
- */
- function _doRequest(ajaxRequest, request, create) {
- // Prevent Android to cache request
- var url = _attachHeaders(request);
- url = jQuery.atmosphere.prepareURL(url);
-
- if (create) {
- ajaxRequest.open(request.method, url, true);
- if (request.connectTimeout > -1) {
- request.id = setTimeout(function() {
- if (request.requestCount == 0) {
- _clearState();
- _prepareCallback("Connect timeout", "closed", 200, request.transport);
- }
- }, request.connectTimeout);
- }
- }
-
- if (_request.withCredentials) {
- if ("withCredentials" in ajaxRequest) {
- ajaxRequest.withCredentials = true;
- }
- }
-
- if (!_request.dropAtmosphereHeaders) {
- ajaxRequest.setRequestHeader("X-Atmosphere-Framework", jQuery.atmosphere.version);
- ajaxRequest.setRequestHeader("X-Atmosphere-Transport", request.transport);
- if (request.lastTimestamp != undefined) {
- ajaxRequest.setRequestHeader("X-Cache-Date", request.lastTimestamp);
- } else {
- ajaxRequest.setRequestHeader("X-Cache-Date", 0);
- }
-
- if (request.trackMessageLength) {
- ajaxRequest.setRequestHeader("X-Atmosphere-TrackMessageSize", "true")
- }
- ajaxRequest.setRequestHeader("X-Atmosphere-tracking-id", request.uuid);
- }
-
- if (request.contentType != '') {
- ajaxRequest.setRequestHeader("Content-Type", request.contentType);
- }
-
- jQuery.each(request.headers, function(name, value) {
- var h = jQuery.isFunction(value) ? value.call(this, ajaxRequest, request, create, _response) : value;
- if (h != null) {
- ajaxRequest.setRequestHeader(name, h);
- }
- });
- }
-
- function _reconnect(ajaxRequest, request, force) {
- if (force || request.transport != 'streaming') {
- if ( request.reconnect || (request.suspend && _subscribed)) {
- var status = 0;
- if (ajaxRequest.readyState != 0) {
- status = ajaxRequest.status > 1000 ? 0 : ajaxRequest.status;
- }
- _response.status = status == 0 ? 204 : status;
- _response.reason = status == 0 ? "Server resumed the connection or down." : "OK";
-
- var reconnectInterval = request.reconnectInterval;
-
- // Reconnect immedialtely
- request.id = setTimeout(function () {
- _executeRequest(request);
- }, reconnectInterval);
- }
- }
- }
-
- // From jquery-stream, which is APL2 licensed as well.
- function _ieXDR(request) {
- if (request.transport != "polling") {
- _ieStream = _configureXDR(request);
- _ieStream.open();
- } else {
- _configureXDR(request).open();
- }
- }
-
- // From jquery-stream
- function _configureXDR(request) {
- var rq = _request;
- if ((request != null) && (typeof(request) != 'undefined')) {
- rq = request;
- }
-
- var transport = rq.transport;
- var lastIndex = 0;
- var xdrCallback = function (xdr) {
- var responseBody = xdr.responseText;
-
- if (!_handleProtocol(request, responseBody)) return;
-
- _prepareCallback(responseBody, "messageReceived", 200, transport);
- };
-
- var xdr = new window.XDomainRequest();
- var rewriteURL = rq.rewriteURL || function(url) {
- // Maintaining session by rewriting URL
- // http://stackoverflow.com/questions/6453779/maintaining-session-by-rewriting-url
- var match = /(?:^|;\s*)(JSESSIONID|PHPSESSID)=([^;]*)/.exec(document.cookie);
-
- switch (match && match[1]) {
- case "JSESSIONID":
- return url.replace(/;jsessionid=[^\?]*|(\?)|$/, ";jsessionid=" + match[2] + "$1");
- case "PHPSESSID":
- return url.replace(/\?PHPSESSID=[^&]*&?|\?|$/, "?PHPSESSID=" + match[2] + "&").replace(/&$/, "");
- }
- return url;
- };
-
- // Handles open and message event
- xdr.onprogress = function() {
- handle(xdr);
- };
-
- // Handles error event
- xdr.onerror = function() {
- // If the server doesn't send anything back to XDR will fail with polling
- if (rq.transport != 'polling') {
- _reconnect(xdr, rq, false);
- }
- };
-
- // Handles close event
- xdr.onload = function() {
- handle(xdr);
- };
-
- var handle = function (xdr) {
- // XDomain loop forever on itself without this.
- // TODO: Clearly I need to come with something better than that solution
- if (rq.lastMessage == xdr.responseText) return;
-
- if (rq.executeCallbackBeforeReconnect) {
- xdrCallback(xdr);
- }
-
- if (rq.transport == "long-polling" && (rq.reconnect && (rq.maxRequest == -1 || rq.requestCount++ < rq.maxRequest))) {
- xdr.status = 200;
- _reconnect(xdr, rq, false);
- }
-
- if (!rq.executeCallbackBeforeReconnect) {
- xdrCallback(xdr);
- }
- rq.lastMessage = xdr.responseText;
- };
-
- return {
- open: function() {
- if (rq.method == 'POST') {
- rq.attachHeadersAsQueryString = true;
- }
- var url = _attachHeaders(rq);
- if (rq.method == 'POST') {
- url += "&X-Atmosphere-Post-Body=" + encodeURIComponent(rq.data);
- }
- xdr.open(rq.method, rewriteURL(url));
- xdr.send();
- if (rq.connectTimeout > -1) {
- rq.id = setTimeout(function() {
- if (rq.requestCount == 0) {
- _clearState();
- _prepareCallback("Connect timeout", "closed", 200, rq.transport);
- }
- }, rq.connectTimeout);
- }
- },
- close: function() {
- xdr.abort();
- _prepareCallback(xdr.responseText, "closed", 200, transport);
- }
- };
- }
-
- // From jquery-stream, which is APL2 licensed as well.
- function _ieStreaming(request) {
- _ieStream = _configureIE(request);
- _ieStream.open();
- }
-
- function _configureIE(request) {
- var rq = _request;
- if ((request != null) && (typeof(request) != 'undefined')) {
- rq = request;
- }
-
- var stop;
- var doc = new window.ActiveXObject("htmlfile");
-
- doc.open();
- doc.close();
-
- var url = rq.url;
-
- if (rq.transport != 'polling') {
- _response.transport = rq.transport;
- }
-
- return {
- open: function() {
- var iframe = doc.createElement("iframe");
-
- url = _attachHeaders(rq);
- if (rq.data != '') {
- url += "&X-Atmosphere-Post-Body=" + encodeURIComponent(rq.data);
- }
-
- // Finally attach a timestamp to prevent Android and IE caching.
- url = jQuery.atmosphere.prepareURL(url);
-
- iframe.src = url;
- doc.body.appendChild(iframe);
-
- // For the server to respond in a consistent format regardless of user agent, we polls response text
- var cdoc = iframe.contentDocument || iframe.contentWindow.document;
-
- stop = jQuery.atmosphere.iterate(function() {
- try {
- if (!cdoc.firstChild) {
- return;
- }
-
- // Detects connection failure
- if (cdoc.readyState === "complete") {
- try {
- jQuery.noop(cdoc.fileSize);
- } catch(e) {
- _prepareCallback("Connection Failure", "error", 500, rq.transport);
- return false;
- }
- }
-
- var res = cdoc.body ? cdoc.body.lastChild : cdoc;
- var readResponse = function() {
- // Clones the element not to disturb the original one
- var clone = res.cloneNode(true);
-
- // If the last character is a carriage return or a line feed, IE ignores it in the innerText property
- // therefore, we add another non-newline character to preserve it
- clone.appendChild(cdoc.createTextNode("."));
-
- var text = clone.innerText;
- text = text.substring(0, text.length - 1);
- return text;
-
- };
-
- //To support text/html content type
- if (!jQuery.nodeName(res, "pre")) {
- // Injects a plaintext element which renders text without interpreting the HTML and cannot be stopped
- // it is deprecated in HTML5, but still works
- var head = cdoc.head || cdoc.getElementsByTagName("head")[0] || cdoc.documentElement || cdoc;
- var script = cdoc.createElement("script");
-
- script.text = "document.write('<plaintext>')";
-
- head.insertBefore(script, head.firstChild);
- head.removeChild(script);
-
- // The plaintext element will be the response container
- res = cdoc.body.lastChild;
- }
-
- // Handles open event
- _prepareCallback(readResponse(), "opening", 200, rq.transport);
-
- // Handles message and close event
- stop = jQuery.atmosphere.iterate(function() {
- var text = readResponse();
- if (text.length > rq.lastIndex) {
- _response.status = 200;
- _response.error = null;
-
- var message = text;
- if (message.length != 0 && _handleProtocol(rq, message)) {
- // Empties response every time that it is handled
- res.innerText = "";
- _prepareCallback(message, "messageReceived", 200, rq.transport);
- }
- rq.lastIndex = 0;
- }
-
- if (cdoc.readyState === "complete") {
- _prepareCallback("", "closed", 200, rq.transport);
- _prepareCallback("", "re-opening", 200, rq.transport);
- rq.id = setTimeout(function() {
- _ieStreaming(rq);
- }, rq.reconnectInterval);
- return false;
- }
- }, null);
-
- return false;
- } catch (err) {
- _response.error = true;
- if (_requestCount++ < rq.maxReconnectOnClose) {
- rq.id = setTimeout(function() {
- _ieStreaming(rq);
- }, rq.reconnectInterval);
- } else {
- _onError(0, "maxReconnectOnClose reached");
- }
- doc.execCommand("Stop");
- doc.close();
- return false;
- }
- });
- },
-
- close: function() {
- if (stop) {
- stop();
- }
-
- doc.execCommand("Stop");
- _prepareCallback("", "closed", 200, rq.transport);
- }
- };
- }
-
- /*
- * Send message. <br>
- * Will be automatically dispatch to other connected.
- *
- * @param {Object,string} Message to send.
- * @private
- */
- function _push(message) {
-
- if (_response.status == 408) {
- _pushOnClose(message);
- } else if (_localStorageService != null) {
- _pushLocal(message);
- } else if (_activeRequest != null || _sse != null) {
- _pushAjaxMessage(message);
- } else if (_ieStream != null) {
- _pushIE(message);
- } else if (_jqxhr != null) {
- _pushJsonp(message);
- } else if (_websocket != null) {
- _pushWebSocket(message);
- }
- }
-
- function _pushOnClose(message) {
- var rq = _getPushRequest(message);
- rq.transport = "ajax";
- rq.method = "GET";
- rq.async = false;
- rq.reconnect = false;
- _executeRequest(rq);
- }
-
- function _pushLocal(message) {
- _localStorageService.send(message);
- }
-
- function _intraPush(message) {
- // IE 9 will crash if not.
- if (message.length == 0) return;
-
- try {
- if (_localStorageService) {
- _localStorageService.localSend(message);
- } else if (_storageService) {
- _storageService.signal("localMessage", jQuery.stringifyJSON({id: guid , event: message}));
- }
- } catch (err) {
- jQuery.atmosphere.error(err);
- }
- }
-
- /**
- * Send a message using currently opened ajax request (using
- * http-streaming or long-polling). <br>
- *
- * @param {string, Object} Message to send. This is an object, string
- * message is saved in data member.
- * @private
- */
- function _pushAjaxMessage(message) {
- var rq = _getPushRequest(message);
- _executeRequest(rq);
- }
-
- /**
- * Send a message using currently opened ie streaming (using
- * http-streaming or long-polling). <br>
- *
- * @param {string, Object} Message to send. This is an object, string
- * message is saved in data member.
- * @private
- */
- function _pushIE(message) {
- if (_request.enableXDR && jQuery.atmosphere.checkCORSSupport()) {
- var rq = _getPushRequest(message);
- // Do not reconnect since we are pushing.
- rq.reconnect = false;
- _jsonp(rq);
- } else {
- _pushAjaxMessage(message);
- }
- }
-
- /**
- * Send a message using jsonp transport. <br>
- *
- * @param {string, Object} Message to send. This is an object, string
- * message is saved in data member.
- * @private
- */
- function _pushJsonp(message) {
- _pushAjaxMessage(message);
- }
-
- function _getStringMessage(message) {
- var msg = message;
- if (typeof(msg) == 'object') {
- msg = message.data;
- }
- return msg;
- }
-
- /**
- * Build request use to push message using method 'POST' <br>.
- * Transport is defined as 'polling' and 'suspend' is set to false.
- *
- * @return {Object} Request object use to push message.
- * @private
- */
- function _getPushRequest(message) {
- var msg = _getStringMessage(message);
-
- var rq = {
- connected: false,
- timeout: 60000,
- method: 'POST',
- url: _request.url,
- contentType : _request.contentType,
- headers: {},
- reconnect : true,
- callback: null,
- data : msg,
- suspend : false,
- maxRequest : -1,
- logLevel : 'info',
- requestCount : 0,
- withCredentials : _request.withCredentials,
- transport: 'polling',
- attachHeadersAsQueryString: true,
- enableXDR: _request.enableXDR,
- uuid : _request.uuid,
- messageDelimiter : '|',
- enableProtocol : false,
- maxReconnectOnClose : _request.maxReconnectOnClose
- };
-
- if (typeof(message) == 'object') {
- rq = jQuery.extend(rq, message);
- }
-
- return rq;
- }
-
- /**
- * Send a message using currently opened websocket. <br>
- *
- */
- function _pushWebSocket(message) {
- var msg = _getStringMessage(message);
- var data;
- try {
- if (_request.webSocketUrl != null) {
- data = _request.webSocketPathDelimiter
- + _request.webSocketUrl
- + _request.webSocketPathDelimiter
- + msg;
- } else {
- data = msg;
- }
-
- _websocket.send(data);
-
- } catch (e) {
- _websocket.onclose = function(message) {
- };
- _clearState();
-
- _reconnectWithFallbackTransport("Websocket failed. Downgrading to Comet and resending " + data);
- _pushAjaxMessage(message);
- }
- }
-
- function _localMessage(message) {
- var m = jQuery.parseJSON(message);
- if (m.id != guid) {
- if (typeof(_request.onLocalMessage) != 'undefined') {
- _request.onLocalMessage(m.event);
- } else if (typeof(jQuery.atmosphere.onLocalMessage) != 'undefined') {
- jQuery.atmosphere.onLocalMessage(m.event);
- }
- }
- }
-
- function _prepareCallback(messageBody, state, errorCode, transport) {
-
- if (state == "messageReceived") {
- if (_trackMessageSize(messageBody, _request, _response)) return;
- } else {
- _response.responseBody = messageBody;
- }
-
- _response.transport = transport;
- _response.status = errorCode;
- _response.state = state;
-
- _invokeCallback();
- }
-
- function _readHeaders(xdr, request) {
- if (!request.readResponsesHeaders && !request.enableProtocol) {
- request.lastTimestamp = jQuery.now();
- request.uuid = jQuery.atmosphere.guid();
- return;
- }
-
- try {
- var tempDate = xdr.getResponseHeader('X-Cache-Date');
- if (tempDate && tempDate != null && tempDate.length > 0 ) {
- request.lastTimestamp = tempDate.split(" ").pop();
- }
-
- var tempUUID = xdr.getResponseHeader('X-Atmosphere-tracking-id');
- if (tempUUID && tempUUID != null) {
- request.uuid = tempUUID.split(" ").pop();
- }
-
- // HOTFIX for firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=608735
- if (request.headers) {
- jQuery.each(_request.headers, function (name) {
- var v = xdr.getResponseHeader(name);
- if (v) {
- _response.headers[name] = v;
- }
- });
- }
- } catch (e) {
- }
- }
-
- function _invokeFunction(response) {
- _f(response, _request);
- // Global
- _f(response, jQuery.atmosphere);
- }
-
- function _f(response, f) {
- switch (response.state) {
- case "messageReceived" :
- _requestCount = 0;
- if (typeof(f.onMessage) != 'undefined') f.onMessage(response);
- break;
- case "error" :
- if (typeof(f.onError) != 'undefined') f.onError(response);
- break;
- case "opening" :
- _request.closed = false;
- if (typeof(f.onOpen) != 'undefined') f.onOpen(response);
- break;
- case "messagePublished" :
- if (typeof(f.onMessagePublished) != 'undefined') f.onMessagePublished(response);
- break;
- case "re-opening" :
- if (typeof(f.onReconnect) != 'undefined') f.onReconnect(_request, response);
- break;
- case "unsubscribe" :
- case "closed" :
- var closed = typeof(_request.closed) != 'undefined' ? _request.closed : false;
- if (typeof(f.onClose) != 'undefined' && !closed) f.onClose(response);
- _request.closed = true;
- break;
- }
- }
-
- function _invokeClose(wasOpen) {
- _response.state = 'closed';
- _response.responseBody = "";
- _response.messages = [];
- _response.status = !wasOpen ? 501 : 200;
- _invokeCallback();
- }
-
- /**
- * Invoke request callbacks.
- *
- * @private
- */
- function _invokeCallback() {
- var call = function (index, func) {
- func(_response);
- };
-
- if (_localStorageService == null && _localSocketF != null) {
- _localSocketF(_response.responseBody);
- }
-
- _request.reconnect = _request.mrequest;
-
- var messages = (typeof(_response.responseBody) == 'string' && _request.trackMessageLength) ?
- (_response.messages.length>0 ? _response.messages : ['']) : new Array(_response.responseBody);
- for (var i = 0; i < messages.length; i++) {
-
- if (messages.length > 1 && messages[i].length == 0) {
- continue;
- }
- _response.responseBody = jQuery.trim(messages[i]);
-
- if (_response.responseBody.length == 0 && _response.state == "messageReceived") {
- continue;
- }
-
- _invokeFunction(_response);
-
- // Invoke global callbacks
- if (jQuery.atmosphere.callbacks.length > 0) {
- if (_request.logLevel == 'debug') {
- jQuery.atmosphere.debug("Invoking " + jQuery.atmosphere.callbacks.length + " global callbacks: " + _response.state);
- }
- try {
- jQuery.each(jQuery.atmosphere.callbacks, call);
- } catch (e) {
- jQuery.atmosphere.log(_request.logLevel, ["Callback exception" + e]);
- }
- }
-
- // Invoke request callback
- if (typeof(_request.callback) == 'function') {
- if (_request.logLevel == 'debug') {
- jQuery.atmosphere.debug("Invoking request callbacks");
- }
- try {
- _request.callback(_response);
- } catch (e) {
- jQuery.atmosphere.log(_request.logLevel, ["Callback exception" + e]);
- }
- }
- }
-
- }
-
- /**
- *
- * @private
- */
- function _verifyStreamingLength(ajaxRequest, rq){
- // Wait to be sure we have the full message before closing.
- if (_response.partialMessage == "" &&
- (rq.transport == 'streaming') &&
- (ajaxRequest.responseText.length > rq.maxStreamingLength)) {
- _response.messages = [];
- _invokeClose(true);
- _disconnect();
- _clearState();
- _reconnect(ajaxRequest, rq, true);
- }
- }
-
- /**
- * Disconnect
- * @private
- */
- function _disconnect() {
- if (_request.enableProtocol) {
- var query = "X-Atmosphere-Transport=close&X-Atmosphere-tracking-id=" + _request.uuid;
- var url = _request.url.replace(/([?&])_=[^&]*/, query);
- url = url + (url === _request.url ? (/\?/.test(_request.url) ? "&" : "?") + query : "");
-
- if (_request.connectTimeout > -1) {
- jQuery.ajax({url: url, async: false, timeout: _request.connectTimeout});
- } else {
- jQuery.ajax({url: url, async: false});
- }
- }
- }
-
- /**
- * Close request.
- *
- * @private
- */
- function _close() {
- _request.reconnect = false;
- _abordingConnection = true;
- _response.request = _request;
- _response.state = 'unsubscribe';
- _response.responseBody = "";
- _response.messages = [];
- _response.status = 408;
- _invokeCallback();
-
- _clearState();
- }
-
- function _clearState() {
- if (_ieStream != null) {
- _ieStream.close();
- _ieStream = null;
- }
- if (_jqxhr != null) {
- _jqxhr.abort();
- _jqxhr = null;
- }
- if (_activeRequest != null) {
- _activeRequest.abort();
- _activeRequest = null;
- }
- if (_websocket != null) {
- if (_websocket.webSocketOpened) {
- _websocket.close();
- }
- _websocket = null;
- }
- if (_sse != null) {
- _sse.close();
- _sse = null;
- }
- _clearStorage();
- }
-
- function _clearStorage() {
- // Stop sharing a connection
- if (_storageService != null) {
- // Clears trace timer
- clearInterval(_traceTimer);
- // Removes the trace
- document.cookie = encodeURIComponent("atmosphere-" + _request.url) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
- // The heir is the parent unless unloading
- _storageService.signal("close", {reason: "", heir: !_abordingConnection ? guid : (_storageService.get("children") || [])[0]});
- _storageService.close();
- }
- if (_localStorageService != null) {
- _localStorageService.close();
- }
- };
-
- this.subscribe = function(options) {
- _subscribe(options);
- _execute();
- };
-
- this.execute = function() {
- _execute();
- };
-
- this.invokeCallback = function() {
- _invokeCallback();
- };
-
- this.close = function() {
- _close();
- };
-
- this.disconnect = function () {
- _disconnect();
- };
-
- this.getUrl = function() {
- return _request.url;
- };
-
- this.getUUID = function() {
- return _request.uuid;
- };
-
- this.push = function(message) {
- _push(message);
- };
-
- this.pushLocal = function(message) {
- _intraPush(message);
- };
-
- this.enableProtocol = function(message) {
- return _request.enableProtocol;
- };
-
- this.response = _response;
- },
-
- subscribe: function(url, callback, request) {
- if (typeof(callback) == 'function') {
- jQuery.atmosphere.addCallback(callback);
- }
-
- if (typeof(url) != "string") {
- request = url;
- } else {
- request.url = url;
- }
-
- var rq = new jQuery.atmosphere.AtmosphereRequest(request);
- rq.execute();
-
- jQuery.atmosphere.requests[jQuery.atmosphere.requests.length] = rq;
- return rq;
- },
-
- addCallback: function(func) {
- if (jQuery.inArray(func, jQuery.atmosphere.callbacks) == -1) {
- jQuery.atmosphere.callbacks.push(func);
- }
- },
-
- removeCallback: function(func) {
- var index = jQuery.inArray(func, jQuery.atmosphere.callbacks);
- if (index != -1) {
- jQuery.atmosphere.callbacks.splice(index, 1);
- }
- },
-
- unsubscribe : function() {
- if (jQuery.atmosphere.requests.length > 0) {
- var requestsClone = [].concat(jQuery.atmosphere.requests);
- for (var i = 0; i < requestsClone.length; i++) {
- var rq = requestsClone[i];
- rq.disconnect();
- rq.close();
- clearTimeout(rq.response.request.id);
- }
- }
- jQuery.atmosphere.requests = [];
- jQuery.atmosphere.callbacks = [];
- },
-
- unsubscribeUrl: function(url) {
- var idx = -1;
- if (jQuery.atmosphere.requests.length > 0) {
- for (var i = 0; i < jQuery.atmosphere.requests.length; i++) {
- var rq = jQuery.atmosphere.requests[i];
-
- // Suppose you can subscribe once to an url
- if (rq.getUrl() == url) {
- rq.disconnect();
- rq.close();
- clearTimeout(rq.response.request.id);
- idx = i;
- break;
- }
- }
- }
- if (idx >= 0) {
- jQuery.atmosphere.requests.splice(idx, 1);
- }
- },
-
- publish: function(request) {
- if (typeof(request.callback) == 'function') {
- jQuery.atmosphere.addCallback(callback);
- }
- request.transport = "polling";
-
- var rq = new jQuery.atmosphere.AtmosphereRequest(request);
- jQuery.atmosphere.requests[jQuery.atmosphere.requests.length] = rq;
- return rq;
- },
-
- checkCORSSupport : function() {
- if (jQuery.browser.msie && !window.XDomainRequest) {
- return true;
- } else if (jQuery.browser.opera && jQuery.browser.version < 12.0) {
- return true;
- }
-
- // Force Android to use CORS as some version like 2.2.3 fail otherwise
- var ua = navigator.userAgent.toLowerCase();
- var isAndroid = ua.indexOf("android") > -1;
- if (isAndroid) {
- return true;
- }
- return false;
- },
-
- S4 : function() {
- return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
- },
-
- guid : function() {
- return (jQuery.atmosphere.S4() + jQuery.atmosphere.S4() + "-" + jQuery.atmosphere.S4() + "-" + jQuery.atmosphere.S4() + "-" + jQuery.atmosphere.S4() + "-" + jQuery.atmosphere.S4() + jQuery.atmosphere.S4() + jQuery.atmosphere.S4());
- },
-
- // From jQuery-Stream
- prepareURL: function(url) {
- // Attaches a time stamp to prevent caching
- var ts = jQuery.now();
- var ret = url.replace(/([?&])_=[^&]*/, "$1_=" + ts);
-
- return ret + (ret === url ? (/\?/.test(url) ? "&" : "?") + "_=" + ts : "");
- },
-
- // From jQuery-Stream
- param : function(data) {
- return jQuery.param(data, jQuery.ajaxSettings.traditional);
- },
-
- supportStorage : function() {
- var storage = window.localStorage;
- if (storage) {
- try {
- storage.setItem("t", "t");
- storage.removeItem("t");
- // The storage event of Internet Explorer and Firefox 3 works strangely
- return window.StorageEvent && !jQuery.browser.msie && !(jQuery.browser.mozilla && jQuery.browser.version.split(".")[0] === "1");
- } catch (e) {
- }
- }
-
- return false;
- },
-
- iterate : function (fn, interval) {
- var timeoutId;
-
- // Though the interval is 0 for real-time application, there is a delay between setTimeout calls
- // For detail, see https://developer.mozilla.org/en/window.setTimeout#Minimum_delay_and_timeout_nesting
- interval = interval || 0;
-
- (function loop() {
- timeoutId = setTimeout(function() {
- if (fn() === false) {
- return;
- }
-
- loop();
- }, interval);
- })();
-
- return function() {
- clearTimeout(timeoutId);
- };
- },
-
- log: function (level, args) {
- if (window.console) {
- var logger = window.console[level];
- if (typeof logger == 'function') {
- logger.apply(window.console, args);
- }
- }
- },
-
- warn: function() {
- jQuery.atmosphere.log('warn', arguments);
- },
-
- info :function() {
- jQuery.atmosphere.log('info', arguments);
- },
-
- debug: function() {
- jQuery.atmosphere.log('debug', arguments);
- },
-
- error: function() {
- jQuery.atmosphere.log('error', arguments);
- }
- };
-}();
-
-// http://stackoverflow.com/questions/9645803/whats-the-replacement-for-browser
-// Limit scope pollution from any deprecated API
-(function () {
-
- var matched, browser;
-
-// Use of jQuery.browser is frowned upon.
-// More details: http://api.jquery.com/jQuery.browser
-// jQuery.uaMatch maintained for back-compat
- jQuery.uaMatch = function (ua) {
- ua = ua.toLowerCase();
-
- var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
- /(webkit)[ \/]([\w.]+)/.exec(ua) ||
- /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
- /(msie) ([\w.]+)/.exec(ua) ||
- ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
- [];
-
- return {
- browser: match[ 1 ] || "",
- version: match[ 2 ] || "0"
- };
- };
-
- matched = jQuery.uaMatch(navigator.userAgent);
- browser = {};
-
- if (matched.browser) {
- browser[ matched.browser ] = true;
- browser.version = matched.version;
- }
-
-// Chrome is Webkit, but Webkit is also Safari.
- if (browser.chrome) {
- browser.webkit = true;
- } else if (browser.webkit) {
- browser.safari = true;
- }
-
- jQuery.browser = browser;
-
- jQuery.sub = function () {
- function jQuerySub(selector, context) {
- return new jQuerySub.fn.init(selector, context);
- }
-
- jQuery.extend(true, jQuerySub, this);
- jQuerySub.superclass = this;
- jQuerySub.fn = jQuerySub.prototype = this();
- jQuerySub.fn.constructor = jQuerySub;
- jQuerySub.sub = this.sub;
- jQuerySub.fn.init = function init(selector, context) {
- if (context && context instanceof jQuery && !(context instanceof jQuerySub)) {
- context = jQuerySub(context);
- }
-
- return jQuery.fn.init.call(this, selector, context, rootjQuerySub);
- };
- jQuerySub.fn.init.prototype = jQuerySub.fn;
- var rootjQuerySub = jQuerySub(document);
- return jQuerySub;
- };
-
-})();
-
-/*
- * jQuery stringifyJSON
- * http://github.com/flowersinthesand/jquery-stringifyJSON
- *
- * Copyright 2011, Donghwan Kim
- * Licensed under the Apache License, Version 2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- */
-// This plugin is heavily based on Douglas Crockford's reference implementation
-(function(jQuery) {
-
- var escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, meta = {
- '\b' : '\\b',
- '\t' : '\\t',
- '\n' : '\\n',
- '\f' : '\\f',
- '\r' : '\\r',
- '"' : '\\"',
- '\\' : '\\\\'
- };
-
- function quote(string) {
- return '"' + string.replace(escapable, function(a) {
- var c = meta[a];
- return typeof c === "string" ? c : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
- }) + '"';
- }
-
- function f(n) {
- return n < 10 ? "0" + n : n;
- }
-
- function str(key, holder) {
- var i, v, len, partial, value = holder[key], type = typeof value;
-
- if (value && typeof value === "object" && typeof value.toJSON === "function") {
- value = value.toJSON(key);
- type = typeof value;
- }
-
- switch (type) {
- case "string":
- return quote(value);
- case "number":
- return isFinite(value) ? String(value) : "null";
- case "boolean":
- return String(value);
- case "object":
- if (!value) {
- return "null";
- }
-
- switch (Object.prototype.toString.call(value)) {
- case "[object Date]":
- return isFinite(value.valueOf()) ? '"' + value.getUTCFullYear() + "-" + f(value.getUTCMonth() + 1) + "-" + f(value.getUTCDate()) + "T" +
- f(value.getUTCHours()) + ":" + f(value.getUTCMinutes()) + ":" + f(value.getUTCSeconds()) + "Z" + '"' : "null";
- case "[object Array]":
- len = value.length;
- partial = [];
- for (i = 0; i < len; i++) {
- partial.push(str(i, value) || "null");
- }
-
- return "[" + partial.join(",") + "]";
- default:
- partial = [];
- for (i in value) {
- if (Object.prototype.hasOwnProperty.call(value, i)) {
- v = str(i, value);
- if (v) {
- partial.push(quote(i) + ":" + v);
- }
- }
- }
-
- return "{" + partial.join(",") + "}";
- }
- }
- }
-
- jQuery.stringifyJSON = function(value) {
- if (window.JSON && window.JSON.stringify) {
- return window.JSON.stringify(value);
- }
-
- return str("", {"": value});
- };
-
-}(jQuery));
diff --git a/WebContent/VAADIN/themes/base/base.scss b/WebContent/VAADIN/themes/base/base.scss
index 2ea70036c4..5f33d8116f 100644
--- a/WebContent/VAADIN/themes/base/base.scss
+++ b/WebContent/VAADIN/themes/base/base.scss
@@ -40,6 +40,7 @@
@import "widget/widget.scss";
@import "window/window.scss";
@import "debug/debug.scss";
+@import "browserframe/browserframe.scss";
.v-vaadin-version:after {
content: "@version@";
@@ -65,6 +66,7 @@ $line-height: normal;
@include base-absolutelayout;
@include base-accordion;
+ @include base-browserframe;
@include base-button;
@include base-nativebutton;
@include base-checkbox;
diff --git a/WebContent/VAADIN/themes/base/browserframe/browserframe.scss b/WebContent/VAADIN/themes/base/browserframe/browserframe.scss
new file mode 100644
index 0000000000..aa4225cf00
--- /dev/null
+++ b/WebContent/VAADIN/themes/base/browserframe/browserframe.scss
@@ -0,0 +1,7 @@
+@mixin base-browserframe {
+
+ /* Removes duplicate scrollbars in some cases */
+ .v-browserframe {
+ font-size: 0;
+ }
+} \ No newline at end of file
diff --git a/WebContent/VAADIN/themes/base/common/common.scss b/WebContent/VAADIN/themes/base/common/common.scss
index cb3645c9d8..07e244a76f 100644
--- a/WebContent/VAADIN/themes/base/common/common.scss
+++ b/WebContent/VAADIN/themes/base/common/common.scss
@@ -227,11 +227,13 @@ input::-ms-clear {
font-size: 0;
line-height: normal;
}
-
-/* Enable kinetic scrolling on iOS 6 */
-.v-ios6.v-webkit & .v-scrollable {
+.v-ios.v-webkit & .v-scrollable {
-webkit-overflow-scrolling: touch;
}
+/* Disable native scrolling on iOS 5 due to #8792 */
+.v-ios5.v-webkit & .v-scrollable {
+ -webkit-overflow-scrolling: none;
+}
&.v-overlay-container {
width: 0;
diff --git a/WebContent/VAADIN/themes/base/customcomponent/customcomponent.scss b/WebContent/VAADIN/themes/base/customcomponent/customcomponent.scss
index 461e1b1246..d672254a86 100644
--- a/WebContent/VAADIN/themes/base/customcomponent/customcomponent.scss
+++ b/WebContent/VAADIN/themes/base/customcomponent/customcomponent.scss
@@ -1,7 +1,6 @@
@mixin base-customcomponent($primaryStyleName : v-customcomponent) {
.#{$primaryStyleName} {
- overflow: hidden;
}
} \ No newline at end of file
diff --git a/WebContent/WEB-INF/web.xml b/WebContent/WEB-INF/web.xml
index ba948968e2..8a917966a1 100644
--- a/WebContent/WEB-INF/web.xml
+++ b/WebContent/WEB-INF/web.xml
@@ -24,6 +24,7 @@
<param-name>application</param-name>
<param-value>com.vaadin.tests.components.button.Buttons</param-value>
</init-param>
+ <async-supported>true</async-supported>
</servlet>
<servlet>
<servlet-name>Embed App 2</servlet-name>
@@ -32,6 +33,7 @@
<param-name>UI</param-name>
<param-value>com.vaadin.tests.components.label.MarginsInLabels</param-value>
</init-param>
+ <async-supported>true</async-supported>
</servlet>
<servlet>
<servlet-name>UI provider app</servlet-name>
@@ -44,6 +46,7 @@
<param-name>UI</param-name>
<param-value>com.vaadin.tests.VerifyAssertionsEnabled</param-value>
</init-param>
+ <async-supported>true</async-supported>
</servlet>
<servlet>
@@ -70,6 +73,7 @@
<param-name>testParam</param-name>
<param-value>42</param-value>
</init-param>
+ <async-supported>true</async-supported>
</servlet>
<servlet>
@@ -88,7 +92,7 @@
<servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
<init-param>
<param-name>UI</param-name>
- <param-value>com.vaadin.tests.integration.IntegrationTestUI</param-value>
+ <param-value>com.vaadin.tests.integration.ServletIntegrationUI</param-value>
</init-param>
<async-supported>true</async-supported>
</servlet>
diff --git a/WebContent/WEB-INF/web.xml.2.4 b/WebContent/WEB-INF/web.xml.2.4
index bcc5f3a651..96144b8036 100644
--- a/WebContent/WEB-INF/web.xml.2.4
+++ b/WebContent/WEB-INF/web.xml.2.4
@@ -86,7 +86,7 @@
<servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
<init-param>
<param-name>UI</param-name>
- <param-value>com.vaadin.tests.integration.IntegrationTestUI</param-value>
+ <param-value>com.vaadin.tests.integration.ServletIntegrationUI</param-value>
</init-param>
</servlet>
<servlet-mapping>
diff --git a/WebContent/release-notes.html b/WebContent/release-notes.html
index 387a5121cb..a11e526c3f 100644
--- a/WebContent/release-notes.html
+++ b/WebContent/release-notes.html
@@ -41,10 +41,10 @@
<ul>
<li><a href="#overview">Overview of Vaadin
@version@ Release</a></li>
+ <li><a href="#changelog">Change log for Vaadin
+ @version@</a></li>
<li><a href="#enhancements">Enhancements in Vaadin
@version-minor@</a></li>
- <li><a href="#changelog">Complete change log for
- Vaadin @version@</a></li>
<li><a href="#limitations">Limitations in
@version-minor@</a></li>
<li><a href="#vaadin">Vaadin Installation</a></li>
@@ -63,11 +63,30 @@
<h2 id="overview">Overview of Vaadin @version@ Release</h2>
<p>
- Vaadin @version@ is a maintenance release that includes a number
- of important bug fixes, as listed in the <a href="#changelog">change
- log</a> below. You can also view the <a
- href="http://dev.vaadin.com/query?status=closed&resolution=fixed&milestone=Vaadin+@version@&order=priority">list
- of the closed issues</a> at the Vaadin developer's site.
+ Vaadin @version@ is a maintenance release that includes a
+ number of important bug fixes, as listed in the <a
+ href="#changelog">change log</a> below.
+ </p>
+
+ <p>
+ For a list of enhancements in the last feature release, see
+ <a href="#enhancements">Enhancements in Vaadin
+ @version-minor@</a> and the <a
+ href="http://vaadin.com/download/release/@version-minor@/@version-minor@.0/release-notes.html">Release
+ Notes for Vaadin @version-minor@.0</a>.
+ </p>
+
+ <h3 id="changelog">Change log for Vaadin @version@</h3>
+
+ <p>This release includes the following closed issues:</p>
+
+ <ul>@release-notes-tickets@
+ </ul>
+
+ <p>
+ You can also view the <a
+ href="http://dev.vaadin.com/query?status=closed&resolution=fixed&milestone=Vaadin+@version@&order=id">list
+ of the closed issues</a> at the Vaadin developer's site. .
</p>
<h2 id="enhancements">Enhancements in Vaadin
@@ -191,21 +210,6 @@
streaming to work.</li>
</ul>
- <h3 id="changelog">ChangeLog</h3>
-
- <p>This release includes the following closed issues:</p>
-
- <ul>@release-notes-tickets@
- </ul>
-
- <p>
- The <a
- href="http://dev.vaadin.com/query?status=closed&resolution=fixed&milestone=Vaadin+7.1.0.beta1&milestone=Vaadin+7.1.0&order=id">full
- list of the closed issues</a> can also be found at
- <tt>dev.vaadin.com</tt>
- .
- </p>
-
<h2 id="vaadin">Vaadin Installation</h2>
<p>
@@ -573,11 +577,11 @@
</p>
<ul>
- <li>Mozilla Firefox 18-23</li>
+ <li>Mozilla Firefox 18-24</li>
<li>Mozilla Firefox 17 ESR</li>
<li>Internet Explorer 8-10</li>
<li>Safari 6</li>
- <li>Opera 12</li>
+ <li>Opera 12,16</li>
<li>Google Chrome 23-29</li>
</ul>
@@ -587,7 +591,7 @@
</p>
<ul>
- <li>iOS 5-6</li>
+ <li>iOS 5-7</li>
<li>Android 2.3-4</li>
</ul>
diff --git a/WebContent/statictestfiles/long-html.htm b/WebContent/statictestfiles/long-html.htm
new file mode 100644
index 0000000000..daeb744778
--- /dev/null
+++ b/WebContent/statictestfiles/long-html.htm
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html lang="en">
+<body>
+<p>
+Bacon ipsum dolor sit amet leberkas tri-tip bacon, shank frankfurter kevin tongue. Minim voluptate drumstick ham ullamco. Dolore t-bone capicola tongue shankle eu adipisicing enim tri-tip. Doner shank in cillum enim qui ham hock in anim cow ham laborum prosciutto minim. Brisket ad jowl, ground round id irure in tenderloin pariatur tongue strip steak exercitation magna aliquip. Exercitation labore dolore kevin anim frankfurter.
+</p><p>
+Ea veniam beef ribs jerky andouille. Beef short ribs reprehenderit bacon eiusmod sunt. Aliqua bacon proident brisket. Proident irure flank pork loin excepteur pork cillum incididunt pig ad laborum velit do dolor. Incididunt non filet mignon duis, eiusmod bacon beef esse tenderloin biltong fatback adipisicing sausage ham hock. Labore dolor occaecat nulla ea pariatur quis qui. Ad ut short ribs, doner incididunt bresaola aliqua mollit veniam jowl et biltong frankfurter sed nostrud.
+</p><p>
+Quis nulla tri-tip veniam, sint mollit fugiat shank frankfurter pariatur minim. Aute est ut enim pig, chicken in cillum prosciutto. Meatloaf pork chop aute, hamburger adipisicing pig exercitation qui eu irure jowl shankle flank ad sirloin. Culpa pancetta ball tip duis meatball swine turkey ullamco tongue in ut excepteur veniam sausage boudin. Laborum eiusmod mollit sed tempor velit ex in tenderloin meatloaf bresaola elit ut shank consequat. Sirloin pancetta in aliqua kielbasa.
+</p><p>
+Officia short ribs doner elit id t-bone shank venison reprehenderit jowl deserunt ut. Ham hock dolore venison, pork chop boudin dolore strip steak eiusmod sunt mollit beef ribs hamburger sint irure. Brisket laboris strip steak boudin velit cillum jowl occaecat veniam ullamco swine eiusmod duis mollit ut. Exercitation chicken tongue minim cupidatat in, ut in drumstick boudin meatball. Chuck pancetta spare ribs meatball velit filet mignon. Eiusmod jowl reprehenderit jerky, est turducken kevin pork belly anim drumstick ut aliqua rump.
+</p><p>
+Esse meatloaf sint elit exercitation, sunt ex turkey andouille capicola sausage beef. Exercitation pancetta corned beef enim officia andouille, laboris ea tempor filet mignon. Pork excepteur incididunt, mollit do exercitation t-bone. Tempor in irure laborum. Anim in laborum, brisket enim beef short ribs. Ut corned beef deserunt dolore occaecat andouille swine shankle short loin meatloaf pig beef ribs sint.
+</p><p>
+Reprehenderit exercitation meatball sausage laborum. Kevin rump bacon, labore turkey ad elit officia dolore ex ut. Pork loin brisket spare ribs deserunt consectetur sint pancetta ribeye ham hock sausage anim laborum meatloaf. Quis id salami frankfurter. Aliquip ground round tenderloin jerky.
+</p><p>
+Enim aute leberkas nulla, dolor prosciutto meatball. Shankle turkey irure ut pork loin, pork chop fugiat minim. Turkey shank leberkas incididunt ut, venison dolor in swine rump. Ground round nostrud incididunt, shank filet mignon shankle tail sunt proident rump. In duis quis tongue nulla tempor cillum capicola sausage. Short ribs leberkas prosciutto sirloin enim anim veniam tri-tip.
+</p><p>
+Occaecat pork loin ad in, commodo chicken chuck dolor ex kielbasa. Pariatur rump consequat short loin turducken cow. Pancetta turkey shank eiusmod consectetur aute. Consectetur shoulder short ribs, velit frankfurter officia swine. Flank leberkas sausage drumstick. Aute do non short ribs sirloin meatloaf, et consequat. Mollit aute meatloaf ut shoulder consectetur.
+</p><p>
+Sausage hamburger aliquip kevin turducken. Nostrud irure id est. Capicola beef ribs prosciutto, shank exercitation t-bone ex andouille. Enim short loin shoulder, pork loin ut tongue tempor doner. Boudin tongue beef venison dolor, nostrud sausage corned beef dolore ut spare ribs. Magna kielbasa beef ham ut shoulder fugiat frankfurter esse doner aliquip voluptate in non. Pork belly adipisicing culpa, quis short loin drumstick ut sed sirloin minim pancetta fatback id jerky ham.
+</p><p>
+Cupidatat spare ribs officia turkey. Kielbasa pork chop fugiat flank. Id boudin ground round aute pancetta sausage quis frankfurter fatback andouille salami sunt magna voluptate short ribs. Shankle pastrami pancetta laborum ex kielbasa short ribs venison est consequat in. Andouille sausage quis velit. In culpa turkey hamburger incididunt occaecat est esse meatball nostrud kielbasa in jowl. Capicola dolore labore pork loin cow nisi, reprehenderit tempor.
+</p><p>
+Kielbasa spare ribs tail, esse aliqua elit tri-tip pork belly tenderloin duis consequat. Voluptate laborum cupidatat boudin shoulder pig. Pariatur fatback doner drumstick in dolor. Laborum tail chuck veniam, dolore short ribs eiusmod. Incididunt eu quis, pastrami ea excepteur enim pork belly.
+</p><p>
+Exercitation proident ullamco chuck shank ut dolore fugiat. Jowl ut reprehenderit ham hock short loin boudin. Capicola fugiat commodo laboris tail voluptate dolore chicken sirloin pastrami biltong andouille. Spare ribs consectetur sausage chuck frankfurter aute proident magna tenderloin minim.
+</p><p>
+Andouille dolor ad, hamburger anim do shank adipisicing corned beef leberkas dolore pancetta bresaola. In meatloaf sint beef. Pork chop eiusmod cupidatat, t-bone culpa chuck fatback brisket. Dolore rump eiusmod quis, labore ribeye doner strip steak boudin ex pariatur brisket.
+</p><p>
+Pastrami reprehenderit elit sirloin. Adipisicing cillum labore enim chuck, jowl consequat ex beef laborum esse ullamco anim. Elit tenderloin reprehenderit nostrud tail. Shank meatloaf irure, tempor enim pork belly beef pork chop proident.
+</p><p>
+Sint aliqua doner biltong aliquip short loin ad id ut short ribs. Jerky officia esse ribeye venison t-bone. Bresaola dolor ham, boudin meatloaf rump culpa in sed ut do exercitation short ribs minim irure. Filet mignon frankfurter chuck turducken ut chicken ea. Sirloin labore pastrami ham hock pork belly dolore pork chop proident eu ea flank turducken cupidatat rump salami. Tongue commodo et, doner mollit ea duis pork chop turducken culpa.
+</p><p>
+Pariatur ex spare ribs jerky pork loin short ribs. Do meatloaf in qui sed adipisicing pig chicken tempor commodo ex boudin laborum tongue. Jerky laboris dolor tongue ribeye, salami aute commodo deserunt. Nulla tri-tip tempor, in turkey sint labore occaecat. Ex sed chicken qui, in pork loin beef ribs eiusmod sunt. Prosciutto corned beef short ribs consequat mollit, sed sunt strip steak nulla esse fatback sausage. Chicken culpa incididunt duis do cow frankfurter.
+</p><p>
+Prosciutto duis irure rump sunt. Kielbasa jerky dolore non biltong nisi esse dolor turkey elit nostrud aliqua tempor. Dolor in chicken, pork cupidatat kielbasa enim veniam. Sausage ut jowl fatback. Andouille t-bone non corned beef pork chop enim. Minim sirloin voluptate pastrami pork loin shankle.
+</p><p>
+Sirloin labore consectetur drumstick qui ut turducken pariatur boudin leberkas. Aliqua andouille ball tip jerky leberkas qui, doner nostrud cow adipisicing ham hock voluptate irure. Ham sirloin ham hock boudin ut sint. Exercitation ball tip velit fugiat leberkas.
+</p><p>
+Do pork cow, elit aliquip in beef ribs. Boudin bacon minim laborum, eiusmod drumstick frankfurter aute exercitation rump adipisicing andouille. Meatloaf esse ribeye dolore ad, cow beef flank frankfurter et sed deserunt ground round. Prosciutto ex pariatur short ribs non. Tongue shank sirloin qui incididunt commodo laborum venison corned beef pariatur. Dolore culpa turducken leberkas, eu sunt kevin.
+</p><p>
+Capicola dolor rump, non consectetur reprehenderit qui laborum pariatur aute cow swine. Ball tip pork belly elit jowl t-bone. Nisi ex in ullamco ad nostrud frankfurter proident et eu sausage. T-bone beef ribs pancetta voluptate rump ut irure minim pork chop consequat short ribs dolor occaecat id cow.
+</p>
+<p>
+Bacon ipsum dolor sit amet leberkas tri-tip bacon, shank frankfurter kevin tongue. Minim voluptate drumstick ham ullamco. Dolore t-bone capicola tongue shankle eu adipisicing enim tri-tip. Doner shank in cillum enim qui ham hock in anim cow ham laborum prosciutto minim. Brisket ad jowl, ground round id irure in tenderloin pariatur tongue strip steak exercitation magna aliquip. Exercitation labore dolore kevin anim frankfurter.
+</p><p>
+Ea veniam beef ribs jerky andouille. Beef short ribs reprehenderit bacon eiusmod sunt. Aliqua bacon proident brisket. Proident irure flank pork loin excepteur pork cillum incididunt pig ad laborum velit do dolor. Incididunt non filet mignon duis, eiusmod bacon beef esse tenderloin biltong fatback adipisicing sausage ham hock. Labore dolor occaecat nulla ea pariatur quis qui. Ad ut short ribs, doner incididunt bresaola aliqua mollit veniam jowl et biltong frankfurter sed nostrud.
+</p><p>
+Quis nulla tri-tip veniam, sint mollit fugiat shank frankfurter pariatur minim. Aute est ut enim pig, chicken in cillum prosciutto. Meatloaf pork chop aute, hamburger adipisicing pig exercitation qui eu irure jowl shankle flank ad sirloin. Culpa pancetta ball tip duis meatball swine turkey ullamco tongue in ut excepteur veniam sausage boudin. Laborum eiusmod mollit sed tempor velit ex in tenderloin meatloaf bresaola elit ut shank consequat. Sirloin pancetta in aliqua kielbasa.
+</p><p>
+Officia short ribs doner elit id t-bone shank venison reprehenderit jowl deserunt ut. Ham hock dolore venison, pork chop boudin dolore strip steak eiusmod sunt mollit beef ribs hamburger sint irure. Brisket laboris strip steak boudin velit cillum jowl occaecat veniam ullamco swine eiusmod duis mollit ut. Exercitation chicken tongue minim cupidatat in, ut in drumstick boudin meatball. Chuck pancetta spare ribs meatball velit filet mignon. Eiusmod jowl reprehenderit jerky, est turducken kevin pork belly anim drumstick ut aliqua rump.
+</p><p>
+Esse meatloaf sint elit exercitation, sunt ex turkey andouille capicola sausage beef. Exercitation pancetta corned beef enim officia andouille, laboris ea tempor filet mignon. Pork excepteur incididunt, mollit do exercitation t-bone. Tempor in irure laborum. Anim in laborum, brisket enim beef short ribs. Ut corned beef deserunt dolore occaecat andouille swine shankle short loin meatloaf pig beef ribs sint.
+</p><p>
+Reprehenderit exercitation meatball sausage laborum. Kevin rump bacon, labore turkey ad elit officia dolore ex ut. Pork loin brisket spare ribs deserunt consectetur sint pancetta ribeye ham hock sausage anim laborum meatloaf. Quis id salami frankfurter. Aliquip ground round tenderloin jerky.
+</p><p>
+Enim aute leberkas nulla, dolor prosciutto meatball. Shankle turkey irure ut pork loin, pork chop fugiat minim. Turkey shank leberkas incididunt ut, venison dolor in swine rump. Ground round nostrud incididunt, shank filet mignon shankle tail sunt proident rump. In duis quis tongue nulla tempor cillum capicola sausage. Short ribs leberkas prosciutto sirloin enim anim veniam tri-tip.
+</p><p>
+Occaecat pork loin ad in, commodo chicken chuck dolor ex kielbasa. Pariatur rump consequat short loin turducken cow. Pancetta turkey shank eiusmod consectetur aute. Consectetur shoulder short ribs, velit frankfurter officia swine. Flank leberkas sausage drumstick. Aute do non short ribs sirloin meatloaf, et consequat. Mollit aute meatloaf ut shoulder consectetur.
+</p><p>
+Sausage hamburger aliquip kevin turducken. Nostrud irure id est. Capicola beef ribs prosciutto, shank exercitation t-bone ex andouille. Enim short loin shoulder, pork loin ut tongue tempor doner. Boudin tongue beef venison dolor, nostrud sausage corned beef dolore ut spare ribs. Magna kielbasa beef ham ut shoulder fugiat frankfurter esse doner aliquip voluptate in non. Pork belly adipisicing culpa, quis short loin drumstick ut sed sirloin minim pancetta fatback id jerky ham.
+</p><p>
+Cupidatat spare ribs officia turkey. Kielbasa pork chop fugiat flank. Id boudin ground round aute pancetta sausage quis frankfurter fatback andouille salami sunt magna voluptate short ribs. Shankle pastrami pancetta laborum ex kielbasa short ribs venison est consequat in. Andouille sausage quis velit. In culpa turkey hamburger incididunt occaecat est esse meatball nostrud kielbasa in jowl. Capicola dolore labore pork loin cow nisi, reprehenderit tempor.
+</p><p>
+Kielbasa spare ribs tail, esse aliqua elit tri-tip pork belly tenderloin duis consequat. Voluptate laborum cupidatat boudin shoulder pig. Pariatur fatback doner drumstick in dolor. Laborum tail chuck veniam, dolore short ribs eiusmod. Incididunt eu quis, pastrami ea excepteur enim pork belly.
+</p><p>
+Exercitation proident ullamco chuck shank ut dolore fugiat. Jowl ut reprehenderit ham hock short loin boudin. Capicola fugiat commodo laboris tail voluptate dolore chicken sirloin pastrami biltong andouille. Spare ribs consectetur sausage chuck frankfurter aute proident magna tenderloin minim.
+</p><p>
+Andouille dolor ad, hamburger anim do shank adipisicing corned beef leberkas dolore pancetta bresaola. In meatloaf sint beef. Pork chop eiusmod cupidatat, t-bone culpa chuck fatback brisket. Dolore rump eiusmod quis, labore ribeye doner strip steak boudin ex pariatur brisket.
+</p><p>
+Pastrami reprehenderit elit sirloin. Adipisicing cillum labore enim chuck, jowl consequat ex beef laborum esse ullamco anim. Elit tenderloin reprehenderit nostrud tail. Shank meatloaf irure, tempor enim pork belly beef pork chop proident.
+</p><p>
+Sint aliqua doner biltong aliquip short loin ad id ut short ribs. Jerky officia esse ribeye venison t-bone. Bresaola dolor ham, boudin meatloaf rump culpa in sed ut do exercitation short ribs minim irure. Filet mignon frankfurter chuck turducken ut chicken ea. Sirloin labore pastrami ham hock pork belly dolore pork chop proident eu ea flank turducken cupidatat rump salami. Tongue commodo et, doner mollit ea duis pork chop turducken culpa.
+</p><p>
+Pariatur ex spare ribs jerky pork loin short ribs. Do meatloaf in qui sed adipisicing pig chicken tempor commodo ex boudin laborum tongue. Jerky laboris dolor tongue ribeye, salami aute commodo deserunt. Nulla tri-tip tempor, in turkey sint labore occaecat. Ex sed chicken qui, in pork loin beef ribs eiusmod sunt. Prosciutto corned beef short ribs consequat mollit, sed sunt strip steak nulla esse fatback sausage. Chicken culpa incididunt duis do cow frankfurter.
+</p><p>
+Prosciutto duis irure rump sunt. Kielbasa jerky dolore non biltong nisi esse dolor turkey elit nostrud aliqua tempor. Dolor in chicken, pork cupidatat kielbasa enim veniam. Sausage ut jowl fatback. Andouille t-bone non corned beef pork chop enim. Minim sirloin voluptate pastrami pork loin shankle.
+</p><p>
+Sirloin labore consectetur drumstick qui ut turducken pariatur boudin leberkas. Aliqua andouille ball tip jerky leberkas qui, doner nostrud cow adipisicing ham hock voluptate irure. Ham sirloin ham hock boudin ut sint. Exercitation ball tip velit fugiat leberkas.
+</p><p>
+Do pork cow, elit aliquip in beef ribs. Boudin bacon minim laborum, eiusmod drumstick frankfurter aute exercitation rump adipisicing andouille. Meatloaf esse ribeye dolore ad, cow beef flank frankfurter et sed deserunt ground round. Prosciutto ex pariatur short ribs non. Tongue shank sirloin qui incididunt commodo laborum venison corned beef pariatur. Dolore culpa turducken leberkas, eu sunt kevin.
+</p><p>
+Capicola dolor rump, non consectetur reprehenderit qui laborum pariatur aute cow swine. Ball tip pork belly elit jowl t-bone. Nisi ex in ullamco ad nostrud frankfurter proident et eu sausage. T-bone beef ribs pancetta voluptate rump ut irure minim pork chop consequat short ribs dolor occaecat id cow.
+</p>
+<p>
+Bacon ipsum dolor sit amet leberkas tri-tip bacon, shank frankfurter kevin tongue. Minim voluptate drumstick ham ullamco. Dolore t-bone capicola tongue shankle eu adipisicing enim tri-tip. Doner shank in cillum enim qui ham hock in anim cow ham laborum prosciutto minim. Brisket ad jowl, ground round id irure in tenderloin pariatur tongue strip steak exercitation magna aliquip. Exercitation labore dolore kevin anim frankfurter.
+</p><p>
+Ea veniam beef ribs jerky andouille. Beef short ribs reprehenderit bacon eiusmod sunt. Aliqua bacon proident brisket. Proident irure flank pork loin excepteur pork cillum incididunt pig ad laborum velit do dolor. Incididunt non filet mignon duis, eiusmod bacon beef esse tenderloin biltong fatback adipisicing sausage ham hock. Labore dolor occaecat nulla ea pariatur quis qui. Ad ut short ribs, doner incididunt bresaola aliqua mollit veniam jowl et biltong frankfurter sed nostrud.
+</p><p>
+Quis nulla tri-tip veniam, sint mollit fugiat shank frankfurter pariatur minim. Aute est ut enim pig, chicken in cillum prosciutto. Meatloaf pork chop aute, hamburger adipisicing pig exercitation qui eu irure jowl shankle flank ad sirloin. Culpa pancetta ball tip duis meatball swine turkey ullamco tongue in ut excepteur veniam sausage boudin. Laborum eiusmod mollit sed tempor velit ex in tenderloin meatloaf bresaola elit ut shank consequat. Sirloin pancetta in aliqua kielbasa.
+</p><p>
+Officia short ribs doner elit id t-bone shank venison reprehenderit jowl deserunt ut. Ham hock dolore venison, pork chop boudin dolore strip steak eiusmod sunt mollit beef ribs hamburger sint irure. Brisket laboris strip steak boudin velit cillum jowl occaecat veniam ullamco swine eiusmod duis mollit ut. Exercitation chicken tongue minim cupidatat in, ut in drumstick boudin meatball. Chuck pancetta spare ribs meatball velit filet mignon. Eiusmod jowl reprehenderit jerky, est turducken kevin pork belly anim drumstick ut aliqua rump.
+</p><p>
+Esse meatloaf sint elit exercitation, sunt ex turkey andouille capicola sausage beef. Exercitation pancetta corned beef enim officia andouille, laboris ea tempor filet mignon. Pork excepteur incididunt, mollit do exercitation t-bone. Tempor in irure laborum. Anim in laborum, brisket enim beef short ribs. Ut corned beef deserunt dolore occaecat andouille swine shankle short loin meatloaf pig beef ribs sint.
+</p><p>
+Reprehenderit exercitation meatball sausage laborum. Kevin rump bacon, labore turkey ad elit officia dolore ex ut. Pork loin brisket spare ribs deserunt consectetur sint pancetta ribeye ham hock sausage anim laborum meatloaf. Quis id salami frankfurter. Aliquip ground round tenderloin jerky.
+</p><p>
+Enim aute leberkas nulla, dolor prosciutto meatball. Shankle turkey irure ut pork loin, pork chop fugiat minim. Turkey shank leberkas incididunt ut, venison dolor in swine rump. Ground round nostrud incididunt, shank filet mignon shankle tail sunt proident rump. In duis quis tongue nulla tempor cillum capicola sausage. Short ribs leberkas prosciutto sirloin enim anim veniam tri-tip.
+</p><p>
+Occaecat pork loin ad in, commodo chicken chuck dolor ex kielbasa. Pariatur rump consequat short loin turducken cow. Pancetta turkey shank eiusmod consectetur aute. Consectetur shoulder short ribs, velit frankfurter officia swine. Flank leberkas sausage drumstick. Aute do non short ribs sirloin meatloaf, et consequat. Mollit aute meatloaf ut shoulder consectetur.
+</p><p>
+Sausage hamburger aliquip kevin turducken. Nostrud irure id est. Capicola beef ribs prosciutto, shank exercitation t-bone ex andouille. Enim short loin shoulder, pork loin ut tongue tempor doner. Boudin tongue beef venison dolor, nostrud sausage corned beef dolore ut spare ribs. Magna kielbasa beef ham ut shoulder fugiat frankfurter esse doner aliquip voluptate in non. Pork belly adipisicing culpa, quis short loin drumstick ut sed sirloin minim pancetta fatback id jerky ham.
+</p><p>
+Cupidatat spare ribs officia turkey. Kielbasa pork chop fugiat flank. Id boudin ground round aute pancetta sausage quis frankfurter fatback andouille salami sunt magna voluptate short ribs. Shankle pastrami pancetta laborum ex kielbasa short ribs venison est consequat in. Andouille sausage quis velit. In culpa turkey hamburger incididunt occaecat est esse meatball nostrud kielbasa in jowl. Capicola dolore labore pork loin cow nisi, reprehenderit tempor.
+</p><p>
+Kielbasa spare ribs tail, esse aliqua elit tri-tip pork belly tenderloin duis consequat. Voluptate laborum cupidatat boudin shoulder pig. Pariatur fatback doner drumstick in dolor. Laborum tail chuck veniam, dolore short ribs eiusmod. Incididunt eu quis, pastrami ea excepteur enim pork belly.
+</p><p>
+Exercitation proident ullamco chuck shank ut dolore fugiat. Jowl ut reprehenderit ham hock short loin boudin. Capicola fugiat commodo laboris tail voluptate dolore chicken sirloin pastrami biltong andouille. Spare ribs consectetur sausage chuck frankfurter aute proident magna tenderloin minim.
+</p><p>
+Andouille dolor ad, hamburger anim do shank adipisicing corned beef leberkas dolore pancetta bresaola. In meatloaf sint beef. Pork chop eiusmod cupidatat, t-bone culpa chuck fatback brisket. Dolore rump eiusmod quis, labore ribeye doner strip steak boudin ex pariatur brisket.
+</p><p>
+Pastrami reprehenderit elit sirloin. Adipisicing cillum labore enim chuck, jowl consequat ex beef laborum esse ullamco anim. Elit tenderloin reprehenderit nostrud tail. Shank meatloaf irure, tempor enim pork belly beef pork chop proident.
+</p><p>
+Sint aliqua doner biltong aliquip short loin ad id ut short ribs. Jerky officia esse ribeye venison t-bone. Bresaola dolor ham, boudin meatloaf rump culpa in sed ut do exercitation short ribs minim irure. Filet mignon frankfurter chuck turducken ut chicken ea. Sirloin labore pastrami ham hock pork belly dolore pork chop proident eu ea flank turducken cupidatat rump salami. Tongue commodo et, doner mollit ea duis pork chop turducken culpa.
+</p><p>
+Pariatur ex spare ribs jerky pork loin short ribs. Do meatloaf in qui sed adipisicing pig chicken tempor commodo ex boudin laborum tongue. Jerky laboris dolor tongue ribeye, salami aute commodo deserunt. Nulla tri-tip tempor, in turkey sint labore occaecat. Ex sed chicken qui, in pork loin beef ribs eiusmod sunt. Prosciutto corned beef short ribs consequat mollit, sed sunt strip steak nulla esse fatback sausage. Chicken culpa incididunt duis do cow frankfurter.
+</p><p>
+Prosciutto duis irure rump sunt. Kielbasa jerky dolore non biltong nisi esse dolor turkey elit nostrud aliqua tempor. Dolor in chicken, pork cupidatat kielbasa enim veniam. Sausage ut jowl fatback. Andouille t-bone non corned beef pork chop enim. Minim sirloin voluptate pastrami pork loin shankle.
+</p><p>
+Sirloin labore consectetur drumstick qui ut turducken pariatur boudin leberkas. Aliqua andouille ball tip jerky leberkas qui, doner nostrud cow adipisicing ham hock voluptate irure. Ham sirloin ham hock boudin ut sint. Exercitation ball tip velit fugiat leberkas.
+</p><p>
+Do pork cow, elit aliquip in beef ribs. Boudin bacon minim laborum, eiusmod drumstick frankfurter aute exercitation rump adipisicing andouille. Meatloaf esse ribeye dolore ad, cow beef flank frankfurter et sed deserunt ground round. Prosciutto ex pariatur short ribs non. Tongue shank sirloin qui incididunt commodo laborum venison corned beef pariatur. Dolore culpa turducken leberkas, eu sunt kevin.
+</p><p>
+Capicola dolor rump, non consectetur reprehenderit qui laborum pariatur aute cow swine. Ball tip pork belly elit jowl t-bone. Nisi ex in ullamco ad nostrud frankfurter proident et eu sausage. T-bone beef ribs pancetta voluptate rump ut irure minim pork chop consequat short ribs dolor occaecat id cow.
+</p>
+</body>
+</html> \ No newline at end of file
diff --git a/build.xml b/build.xml
index 5f748d8f40..bef7f7a2f3 100644
--- a/build.xml
+++ b/build.xml
@@ -43,19 +43,16 @@
<target name="test" depends="buildorder">
<subant buildpathref="build-path" target="test" />
</target>
+
<target name="test-all" depends="buildorder">
<property name="war.file" location="result/artifacts/${vaadin.version}/vaadin-uitest/vaadin-uitest-${vaadin.version}.war" />
+
<parallel>
- <sequential>
- <!-- Sleep before running integration tests so testbench
- tests have time to compile and start -->
- <sleep minutes="4" />
- <ant antfile="uitest/integration_tests.xml" target="integration-test-all" inheritall="false" inheritrefs="false">
- <property name="demo.war" value="${war.file}" />
- </ant>
- </sequential>
+ <!-- JUnit tests, can be run without a server -->
<subant buildpathref="build-path" target="test" />
- <ant antfile="uitest/test.xml" target="test-package">
+
+ <!-- Server deployment + TestBench tests -->
+ <ant antfile="uitest/build.xml" target="test-testbench">
<property name="war.file" location="${war.file}" />
</ant>
</parallel>
diff --git a/build/ide.xml b/build/ide.xml
index 2605bf2cdd..22e6818bea 100755
--- a/build/ide.xml
+++ b/build/ide.xml
@@ -130,24 +130,16 @@
<jvmarg value="-XX:MaxPermSize=256M" />
<jvmarg value="-Djava.awt.headless=true" />
<jvmarg value="-Dgwt.usearchives=false" />
+ <jvmarg value="-Dgwt.persistentunitcache=false" />
</java>
</target>
<target name="vaadinPush.js">
- <property name="vaadinPush.js.output" location="WebContent/VAADIN/vaadinPush.js" />
- <property name="vaadinPush.debug.js.output" location="WebContent/VAADIN/vaadinPush.debug.js" />
-
- <loadfile srcfile="WebContent/VAADIN/jquery-1.7.2.js" property="jquery.js.contents" />
- <loadfile srcfile="WebContent/VAADIN/jquery.atmosphere.js" property="jquery.atmosphere.js.contents" />
- <loadfile srcfile="WebContent/VAADIN/vaadinPush.js.tpl" property="vaadinPush.js.contents">
- <filterchain>
- <replacetokens begintoken="@" endtoken="@">
- <token key="jquery.js" value="${jquery.js.contents}" />
- <token key="jquery.atmosphere.js" value="${jquery.atmosphere.js.contents}" />
- </replacetokens>
- </filterchain>
- </loadfile>
- <echo file="${vaadinPush.js.output}">${vaadinPush.js.contents}</echo>
- <!-- This vaadinPush.js is not obfuscated so the debug version is the same-->
- <copy file="${vaadinPush.js.output}" tofile="${vaadinPush.debug.js.output}"/>
+ <ant antfile="${basedir}/push/build.xml" target="vaadinPush.js" dir="${basedir}/push" />
+ <property name="js.output.dir" location="WebContent" />
+ <property name="push.js.dir" location="${basedir}/push/result/js" />
+ <copy todir="${js.output.dir}">
+ <fileset dir="${push.js.dir}" includes="VAADIN/vaadinPush*">
+ </fileset>
+ </copy>
</target>
</project>
diff --git a/client/ivy.xml b/client/ivy.xml
index 5d079537b9..ccc304be3d 100644
--- a/client/ivy.xml
+++ b/client/ivy.xml
@@ -32,7 +32,7 @@
<!-- gwt-user dependencies -->
<dependency org="org.w3c.css" name="sac" rev="1.3" />
- <dependency org="junit" name="junit" rev="4.5"
+ <dependency org="junit" name="junit" rev="4.11"
conf="test->default" />
<dependency org="javax.validation" name="validation-api"
diff --git a/client/src/com/vaadin/client/ApplicationConfiguration.java b/client/src/com/vaadin/client/ApplicationConfiguration.java
index da8f521799..7a70080c7e 100644
--- a/client/src/com/vaadin/client/ApplicationConfiguration.java
+++ b/client/src/com/vaadin/client/ApplicationConfiguration.java
@@ -246,6 +246,23 @@ public class ApplicationConfiguration implements EntryPoint {
ApplicationConstants.SERVICE_URL_PATH_AS_PARAMETER) == Boolean.TRUE;
}
+ /**
+ * Return the name of the parameter used to to send data to the service url.
+ * This method should only be called if {@link #useServiceUrlPathParam()} is
+ * true.
+ *
+ * @since 7.1.6
+ * @return The parameter name, by default <code>v-resourcePath</code>
+ */
+ public String getServiceUrlParameterName() {
+ String prefix = getJsoConfiguration(id).getConfigString(
+ ApplicationConstants.SERVICE_URL_PARAMETER_NAMESPACE);
+ if (prefix == null) {
+ prefix = "";
+ }
+ return prefix + ApplicationConstants.V_RESOURCE_PATH;
+ }
+
public String getRootPanelId() {
return id;
}
diff --git a/client/src/com/vaadin/client/ApplicationConnection.java b/client/src/com/vaadin/client/ApplicationConnection.java
index cd1f8a206d..da41543894 100644
--- a/client/src/com/vaadin/client/ApplicationConnection.java
+++ b/client/src/com/vaadin/client/ApplicationConnection.java
@@ -26,6 +26,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.logging.Logger;
import com.google.gwt.aria.client.LiveValue;
import com.google.gwt.aria.client.RelevantValue;
@@ -64,6 +65,7 @@ import com.google.gwt.user.client.Window.ClosingHandler;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ApplicationConfiguration.ErrorMessage;
+import com.vaadin.client.ApplicationConnection.ApplicationStoppedEvent;
import com.vaadin.client.ResourceLoader.ResourceLoadEvent;
import com.vaadin.client.ResourceLoader.ResourceLoadListener;
import com.vaadin.client.communication.HasJavaScriptConnectorHelper;
@@ -290,7 +292,7 @@ public class ApplicationConnection {
}
@Override
- public com.google.gwt.event.shared.GwtEvent.Type<CommunicationHandler> getAssociatedType() {
+ public Type<CommunicationHandler> getAssociatedType() {
return TYPE;
}
@@ -310,7 +312,7 @@ public class ApplicationConnection {
}
@Override
- public com.google.gwt.event.shared.GwtEvent.Type<CommunicationHandler> getAssociatedType() {
+ public Type<CommunicationHandler> getAssociatedType() {
return TYPE;
}
@@ -345,7 +347,7 @@ public class ApplicationConnection {
public static Type<CommunicationHandler> TYPE = new Type<CommunicationHandler>();
@Override
- public com.google.gwt.event.shared.GwtEvent.Type<CommunicationHandler> getAssociatedType() {
+ public Type<CommunicationHandler> getAssociatedType() {
return TYPE;
}
@@ -356,6 +358,34 @@ public class ApplicationConnection {
}
/**
+ * Event triggered when a application is stopped by calling
+ * {@link ApplicationConnection#setApplicationRunning(false)}.
+ *
+ * To listen for the event add a {@link ApplicationStoppedHandler} by
+ * invoking
+ * {@link ApplicationConnection#addHandler(ApplicationStoppedEvent.Type, ApplicationStoppedHandler)}
+ * to the {@link ApplicationConnection}
+ *
+ * @since 7.1.8
+ * @author Vaadin Ltd
+ */
+ public static class ApplicationStoppedEvent extends
+ GwtEvent<ApplicationStoppedHandler> {
+
+ public static Type<ApplicationStoppedHandler> TYPE = new Type<ApplicationStoppedHandler>();
+
+ @Override
+ public Type<ApplicationStoppedHandler> getAssociatedType() {
+ return TYPE;
+ }
+
+ @Override
+ protected void dispatch(ApplicationStoppedHandler listener) {
+ listener.onApplicationStopped(this);
+ }
+ }
+
+ /**
* Allows custom handling of communication errors.
*/
public interface CommunicationErrorHandler {
@@ -373,6 +403,27 @@ public class ApplicationConnection {
public boolean onError(String details, int statusCode);
}
+ /**
+ * A listener for listening to application stopped events. The listener can
+ * be added to a {@link ApplicationConnection} by invoking
+ * {@link ApplicationConnection#addHandler(ApplicationStoppedEvent.Type, ApplicationStoppedHandler)}
+ *
+ * @since 7.1.8
+ * @author Vaadin Ltd
+ */
+ public interface ApplicationStoppedHandler extends EventHandler {
+
+ /**
+ * Triggered when the {@link ApplicationConnection} marks a previously
+ * running application as stopped by invoking
+ * {@link ApplicationConnection#setApplicationRunning(false)}
+ *
+ * @param event
+ * the event triggered by the {@link ApplicationConnection}
+ */
+ void onApplicationStopped(ApplicationStoppedEvent event);
+ }
+
private CommunicationErrorHandler communicationErrorDelegate = null;
private VLoadingIndicator loadingIndicator;
@@ -756,6 +807,10 @@ public class ApplicationConnection {
showCommunicationError(details, statusCode);
}
endRequest();
+
+ // Consider application not running any more and prevent all
+ // future requests
+ setApplicationRunning(false);
}
@Override
@@ -887,10 +942,10 @@ public class ApplicationConnection {
VConsole.log("JSON parsing took "
+ (new Date().getTime() - start.getTime()) + "ms");
- if (applicationRunning) {
+ if (isApplicationRunning()) {
handleReceivedJSONMessage(start, jsonText, json);
} else {
- applicationRunning = true;
+ setApplicationRunning(true);
handleWhenCSSLoaded(jsonText, json);
}
}
@@ -1149,7 +1204,7 @@ public class ApplicationConnection {
retryCanceledActiveRequest = false;
webkitMaybeIgnoringRequests = false;
- if (applicationRunning) {
+ if (isApplicationRunning()) {
checkForPendingVariableBursts();
runPostRequestHooks(configuration.getRootPanelId());
}
@@ -1499,7 +1554,7 @@ public class ApplicationConnection {
error.getString("message"),
error.getString("url"));
- applicationRunning = false;
+ setApplicationRunning(false);
}
Profiler.leave("Error handling");
}
@@ -2422,6 +2477,12 @@ public class ApplicationConnection {
*/
public void addMethodInvocationToQueue(MethodInvocation invocation,
boolean delayed, boolean lastOnly) {
+ if (!isApplicationRunning()) {
+ getLogger()
+ .warning(
+ "Trying to invoke method on not yet started or stopped application");
+ return;
+ }
String tag;
if (lastOnly) {
tag = invocation.getLastOnlyTag();
@@ -2480,7 +2541,7 @@ public class ApplicationConnection {
private boolean deferedSendPending = false;
private void doSendPendingVariableChanges() {
- if (applicationRunning) {
+ if (isApplicationRunning()) {
if (hasActiveRequest() || (push != null && !push.isActive())) {
// skip empty queues if there are pending bursts to be sent
if (pendingInvocations.size() > 0 || pendingBursts.size() == 0) {
@@ -2492,6 +2553,11 @@ public class ApplicationConnection {
} else {
buildAndSendVariableBurst(pendingInvocations);
}
+ } else {
+ getLogger()
+ .warning(
+ "Trying to send variable changes from not yet started or stopped application");
+ return;
}
}
@@ -3003,7 +3069,7 @@ public class ApplicationConnection {
if (!path.startsWith("/")) {
path = '/' + path;
}
- String pathParam = ApplicationConstants.V_RESOURCE_PATH + "="
+ String pathParam = conf.getServiceUrlParameterName() + "="
+ URL.encodeQueryString(path);
serviceUrl = addGetParameters(serviceUrl, pathParam);
uidlUri = serviceUrl;
@@ -3393,6 +3459,9 @@ public class ApplicationConnection {
}
public void setApplicationRunning(boolean running) {
+ if (applicationRunning && !running) {
+ eventBus.fireEvent(new ApplicationStoppedEvent());
+ }
applicationRunning = running;
}
@@ -3495,4 +3564,8 @@ public class ApplicationConnection {
}
}
+ private static Logger getLogger() {
+ return Logger.getLogger(ApplicationConnection.class.getName());
+ }
+
}
diff --git a/client/src/com/vaadin/client/BrowserInfo.java b/client/src/com/vaadin/client/BrowserInfo.java
index 5d588f6f8b..78c5c1f59f 100644
--- a/client/src/com/vaadin/client/BrowserInfo.java
+++ b/client/src/com/vaadin/client/BrowserInfo.java
@@ -207,10 +207,7 @@ public class BrowserInfo {
return prefix + OS_ANDROID;
} else if (browserDetails.isIOS()) {
String iosClass = prefix + OS_IOS;
- if (isIOS6()) {
- iosClass += " " + prefix + OS_IOS + "6";
- }
- return iosClass;
+ return iosClass + " " + iosClass + getOperatingSystemMajorVersion();
} else if (browserDetails.isWindows()) {
return prefix + OS_WINDOWS;
} else if (browserDetails.isLinux()) {
@@ -350,6 +347,22 @@ public class BrowserInfo {
}
/**
+ * Indicates whether the browser might require juggling to properly update
+ * sizes inside elements with overflow: auto when adjusting absolutely
+ * positioned elements.
+ * <p>
+ * See https://bugs.webkit.org/show_bug.cgi?id=123958 and
+ * http://code.google.com/p/chromium/issues/detail?id=316549
+ *
+ * @since 7.1.8
+ * @return <code>true</code> if the browser requires the workaround,
+ * otherwise <code>false</code>
+ */
+ public boolean requiresPositionAbsoluteOverflowAutoFix() {
+ return (getWebkitVersion() > 0) && Util.getNativeScrollbarSize() > 0;
+ }
+
+ /**
* Checks if the browser is run on iOS
*
* @return true if the browser is run on iOS, false otherwise
@@ -392,9 +405,9 @@ public class BrowserInfo {
if (isAndroid() && isWebkit() && getWebkitVersion() >= 534) {
return false;
}
- // iOS 6 Safari supports native scrolling; iOS 5 suffers from #8792
+ // iOS 6+ Safari supports native scrolling; iOS 5 suffers from #8792
// TODO Should test other iOS browsers
- if (isIOS6() && isWebkit()) {
+ if (isIOS() && isWebkit() && getOperatingSystemMajorVersion() >= 6) {
return false;
}
return true;
diff --git a/client/src/com/vaadin/client/LayoutManager.java b/client/src/com/vaadin/client/LayoutManager.java
index 5d27527793..4fb656b16d 100644
--- a/client/src/com/vaadin/client/LayoutManager.java
+++ b/client/src/com/vaadin/client/LayoutManager.java
@@ -1029,6 +1029,98 @@ public class LayoutManager {
}
/**
+ * Gets the top border of the given element, provided that it has been
+ * measured. These elements are guaranteed to be measured:
+ * <ul>
+ * <li>ManagedLayotus and their child Connectors
+ * <li>Elements for which there is at least one ElementResizeListener
+ * <li>Elements for which at least one ManagedLayout has registered a
+ * dependency
+ * </ul>
+ *
+ * A negative number is returned if the element has not been measured. If 0
+ * is returned, it might indicate that the element is not attached to the
+ * DOM.
+ *
+ * @param element
+ * the element to get the measured size for
+ * @return the measured top border of the element in pixels.
+ */
+ public int getBorderTop(Element element) {
+ assert needsMeasure(element) : "Getting measurement for element that is not measured";
+ return getMeasuredSize(element, nullSize).getBorderTop();
+ }
+
+ /**
+ * Gets the left border of the given element, provided that it has been
+ * measured. These elements are guaranteed to be measured:
+ * <ul>
+ * <li>ManagedLayotus and their child Connectors
+ * <li>Elements for which there is at least one ElementResizeListener
+ * <li>Elements for which at least one ManagedLayout has registered a
+ * dependency
+ * </ul>
+ *
+ * A negative number is returned if the element has not been measured. If 0
+ * is returned, it might indicate that the element is not attached to the
+ * DOM.
+ *
+ * @param element
+ * the element to get the measured size for
+ * @return the measured left border of the element in pixels.
+ */
+ public int getBorderLeft(Element element) {
+ assert needsMeasure(element) : "Getting measurement for element that is not measured";
+ return getMeasuredSize(element, nullSize).getBorderLeft();
+ }
+
+ /**
+ * Gets the bottom border of the given element, provided that it has been
+ * measured. These elements are guaranteed to be measured:
+ * <ul>
+ * <li>ManagedLayotus and their child Connectors
+ * <li>Elements for which there is at least one ElementResizeListener
+ * <li>Elements for which at least one ManagedLayout has registered a
+ * dependency
+ * </ul>
+ *
+ * A negative number is returned if the element has not been measured. If 0
+ * is returned, it might indicate that the element is not attached to the
+ * DOM.
+ *
+ * @param element
+ * the element to get the measured size for
+ * @return the measured bottom border of the element in pixels.
+ */
+ public int getBorderBottom(Element element) {
+ assert needsMeasure(element) : "Getting measurement for element that is not measured";
+ return getMeasuredSize(element, nullSize).getBorderBottom();
+ }
+
+ /**
+ * Gets the right border of the given element, provided that it has been
+ * measured. These elements are guaranteed to be measured:
+ * <ul>
+ * <li>ManagedLayotus and their child Connectors
+ * <li>Elements for which there is at least one ElementResizeListener
+ * <li>Elements for which at least one ManagedLayout has registered a
+ * dependency
+ * </ul>
+ *
+ * A negative number is returned if the element has not been measured. If 0
+ * is returned, it might indicate that the element is not attached to the
+ * DOM.
+ *
+ * @param element
+ * the element to get the measured size for
+ * @return the measured right border of the element in pixels.
+ */
+ public int getBorderRight(Element element) {
+ assert needsMeasure(element) : "Getting measurement for element that is not measured";
+ return getMeasuredSize(element, nullSize).getBorderRight();
+ }
+
+ /**
* Gets the padding width (left padding + right padding) of the given
* element, provided that it has been measured. These elements are
* guaranteed to be measured:
diff --git a/client/src/com/vaadin/client/Util.java b/client/src/com/vaadin/client/Util.java
index 8972670232..7c7978be09 100644
--- a/client/src/com/vaadin/client/Util.java
+++ b/client/src/com/vaadin/client/Util.java
@@ -448,6 +448,35 @@ public class Util {
}
/**
+ * Calculates maximum horizontal scrolling value for the given element.
+ *
+ * @since 7.1.9
+ * @param element
+ * which scrollLeft should be calculated
+ * @return maximum value for scrollLeft of the given element
+ */
+ public static int getMaxScrollLeft(final Element element) {
+ int scrollWidth = element.getScrollWidth();
+ int clientWidth = element.getClientWidth();
+ return scrollWidth - clientWidth;
+ }
+
+ /**
+ * Checks if scrollLeft of the element is at its maximum value. Returns
+ * false if the element can't be scrolled horizontally.
+ *
+ * @since 7.1.9
+ * @param element
+ * which scrollLeft should be checked
+ * @return true, if scrollLeft is at maximum (false if element can't be
+ * scrolled horizontally)
+ */
+ public static boolean isScrollLeftAtMax(final Element element) {
+ int scrollLeft = element.getScrollLeft();
+ return scrollLeft != 0 && scrollLeft == getMaxScrollLeft(element);
+ }
+
+ /**
* Run workaround for webkits overflow auto issue.
*
* See: our bug #2138 and https://bugs.webkit.org/show_bug.cgi?id=21462
@@ -468,6 +497,8 @@ public class Util {
// check the scrolltop value before hiding the element
final int scrolltop = elem.getScrollTop();
final int scrollleft = elem.getScrollLeft();
+ final boolean scrollLeftAtMax = isScrollLeftAtMax(elem);
+
elem.getStyle().setProperty("overflow", "hidden");
Scheduler.get().scheduleDeferred(new Command() {
@@ -491,6 +522,12 @@ public class Util {
elem.setScrollTop(scrollvalue);
}
+ // keep horizontal scroll at max if it was before vertical
+ // scroll bar was added/removed
+ if (scrollLeftAtMax) {
+ elem.setScrollLeft(getMaxScrollLeft(elem));
+ }
+
// fix for #6940 : Table horizontal scroll sometimes not
// updated when collapsing/expanding columns
// Also appeared in Safari 5.1 with webkit 534 (#7667)
diff --git a/client/src/com/vaadin/client/VConsole.java b/client/src/com/vaadin/client/VConsole.java
index 37ed8e6370..32eb206a70 100644
--- a/client/src/com/vaadin/client/VConsole.java
+++ b/client/src/com/vaadin/client/VConsole.java
@@ -41,25 +41,35 @@ public class VConsole {
public static void log(String msg) {
if (LogConfiguration.loggingIsEnabled(Level.INFO)) {
- getLogger().log(Level.INFO, msg);
+ // Check for null, so no NullPointerException is generated when
+ // formatting (#12588)
+ getLogger().log(Level.INFO, msg == null ? "null" : msg);
}
}
public static void log(Throwable e) {
if (LogConfiguration.loggingIsEnabled(Level.INFO)) {
- getLogger().log(Level.INFO, e.getMessage(), e);
+ // Check for null, so no NullPointerException is generated when
+ // formatting (#12588)
+ getLogger().log(Level.INFO,
+ e.getMessage() == null ? "" : e.getMessage(), e);
}
}
public static void error(Throwable e) {
if (LogConfiguration.loggingIsEnabled(Level.SEVERE)) {
- getLogger().log(Level.SEVERE, e.getMessage(), e);
+ // Check for null, so no NullPointerException is generated when
+ // formatting (#12588)
+ getLogger().log(Level.SEVERE,
+ e.getMessage() == null ? "" : e.getMessage(), e);
}
}
public static void error(String msg) {
if (LogConfiguration.loggingIsEnabled(Level.SEVERE)) {
- getLogger().log(Level.SEVERE, msg);
+ // Check for null, so no NullPointerException is generated when
+ // formatting (#12588)
+ getLogger().log(Level.SEVERE, msg == null ? "null" : msg);
}
}
diff --git a/client/src/com/vaadin/client/VTooltip.java b/client/src/com/vaadin/client/VTooltip.java
index e687712b9c..e5c2ba117a 100644
--- a/client/src/com/vaadin/client/VTooltip.java
+++ b/client/src/com/vaadin/client/VTooltip.java
@@ -428,7 +428,7 @@ public class VTooltip extends VWindowOverlay {
} else {
updatePosition(event, isFocused);
- if (isShowing()) {
+ if (isShowing() && !isFocused) {
replaceCurrentTooltip();
} else {
showTooltip();
diff --git a/client/src/com/vaadin/client/communication/AtmospherePushConnection.java b/client/src/com/vaadin/client/communication/AtmospherePushConnection.java
index ccb01c5a30..c9b9e46cd5 100644
--- a/client/src/com/vaadin/client/communication/AtmospherePushConnection.java
+++ b/client/src/com/vaadin/client/communication/AtmospherePushConnection.java
@@ -225,12 +225,14 @@ public class AtmospherePushConnection implements PushConnection {
}
protected void onReopen(AtmosphereResponse response) {
- VConsole.log("Push connection re-established using " + transport);
+ VConsole.log("Push connection re-established using "
+ + response.getTransport());
onConnect(response);
}
protected void onOpen(AtmosphereResponse response) {
- VConsole.log("Push connection established using " + transport);
+ VConsole.log("Push connection established using "
+ + response.getTransport());
onConnect(response);
}
@@ -344,6 +346,10 @@ public class AtmospherePushConnection implements PushConnection {
protected void onReconnect(JavaScriptObject request,
final AtmosphereResponse response) {
+ if (state == State.CONNECTED) {
+ VConsole.log("No onClose was received before reconnect. Forcing state to closed.");
+ state = State.CONNECT_PENDING;
+ }
VConsole.log("Reopening push connection");
}
diff --git a/client/src/com/vaadin/client/debug/internal/LogSection.java b/client/src/com/vaadin/client/debug/internal/LogSection.java
index 1e7524b56d..f792ec95be 100644
--- a/client/src/com/vaadin/client/debug/internal/LogSection.java
+++ b/client/src/com/vaadin/client/debug/internal/LogSection.java
@@ -73,6 +73,12 @@ public class LogSection implements Section {
return;
}
+ // If no message is provided, record.getMessage will be null and so
+ // the formatter.format will fail with NullPointerException (#12588)
+ if (record.getMessage() == null) {
+ record.setMessage("");
+ }
+
Formatter formatter = getFormatter();
String msg = formatter.format(record);
diff --git a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
index 6f98e29d03..8fdaf0a5be 100644
--- a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
+++ b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
@@ -15,6 +15,7 @@
*/
package com.vaadin.client.ui;
+import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.ui.Focusable;
@@ -68,8 +69,16 @@ public abstract class AbstractComponentConnector extends AbstractConnector
/**
* Creates and returns the widget for this VPaintableWidget. This method
* should only be called once when initializing the paintable.
+ * <p>
+ * You should typically not override this method since the framework by
+ * default generates an implementation that uses {@link GWT#create(Class)}
+ * to create a widget of the same type as returned by the most specific
+ * override of {@link #getWidget()}. If you do override the method, you
+ * can't call <code>super.createWidget()</code> since the metadata needed
+ * for that implementation is not generated if there's an override of the
+ * method.
*
- * @return
+ * @return a new widget instance to use for this component connector
*/
protected Widget createWidget() {
Type type = TypeData.getType(getClass());
@@ -79,10 +88,12 @@ public abstract class AbstractComponentConnector extends AbstractConnector
return (Widget) instance;
} catch (NoDataException e) {
throw new IllegalStateException(
- "There is no information about the widget for "
+ "Default implementation of createWidget() does not work for "
+ Util.getSimpleName(this)
- + ". Did you remember to compile the right widgetset?",
- e);
+ + ". This might be caused by explicitely using "
+ + "super.createWidget(), using a widget type with "
+ + "generics or some unspecified problem with the "
+ + "widgetset compilation.", e);
}
}
diff --git a/client/src/com/vaadin/client/ui/PostLayoutListener.java b/client/src/com/vaadin/client/ui/PostLayoutListener.java
index d60360747c..3da2358b0c 100644
--- a/client/src/com/vaadin/client/ui/PostLayoutListener.java
+++ b/client/src/com/vaadin/client/ui/PostLayoutListener.java
@@ -15,6 +15,24 @@
*/
package com.vaadin.client.ui;
+import com.vaadin.client.ComponentConnector;
+import com.vaadin.client.LayoutManager;
+
+/**
+ * Interface implemented by {@link ComponentConnector} implementations that want
+ * to know whenever a layout phase has ended. At the end of each layout phase,
+ * {@link LayoutManager} invokes the {@link #postLayout()} method for all
+ * registered component connectors implementing this interface.
+ *
+ * @since 7.0
+ * @author Vaadin Ltd
+ */
public interface PostLayoutListener {
+ /**
+ * Method invoked by {@link LayoutManager} to notify the connector that a
+ * layout phase has ended. This method can be used to finalize internal
+ * layouting, but it is not allowed to change the its own external size or
+ * modify the conditions for any children.
+ */
public void postLayout();
}
diff --git a/client/src/com/vaadin/client/ui/VCalendarPanel.java b/client/src/com/vaadin/client/ui/VCalendarPanel.java
index 1f40298760..96678fd133 100644
--- a/client/src/com/vaadin/client/ui/VCalendarPanel.java
+++ b/client/src/com/vaadin/client/ui/VCalendarPanel.java
@@ -56,6 +56,7 @@ import com.vaadin.client.DateTimeService;
import com.vaadin.client.Util;
import com.vaadin.client.VConsole;
import com.vaadin.shared.ui.datefield.Resolution;
+import com.vaadin.shared.util.SharedUtil;
@SuppressWarnings("deprecation")
public class VCalendarPanel extends FocusableFlexTable implements
@@ -2214,12 +2215,14 @@ public class VCalendarPanel extends FocusableFlexTable implements
* @param startDate
* - the allowed range's start date
*/
- public void setRangeStart(Date rangeStart) {
- this.rangeStart = rangeStart;
- if (initialRenderDone) {
- // Dynamic updates to the range needs to render the calendar to
- // update the element stylenames
- renderCalendar();
+ public void setRangeStart(Date newRangeStart) {
+ if (!SharedUtil.equals(rangeStart, newRangeStart)) {
+ rangeStart = newRangeStart;
+ if (initialRenderDone) {
+ // Dynamic updates to the range needs to render the calendar to
+ // update the element stylenames
+ renderCalendar();
+ }
}
}
@@ -2231,12 +2234,14 @@ public class VCalendarPanel extends FocusableFlexTable implements
* @param endDate
* - the allowed range's end date
*/
- public void setRangeEnd(Date rangeEnd) {
- this.rangeEnd = rangeEnd;
- if (initialRenderDone) {
- // Dynamic updates to the range needs to render the calendar to
- // update the element stylenames
- renderCalendar();
+ public void setRangeEnd(Date newRangeEnd) {
+ if (!SharedUtil.equals(rangeEnd, newRangeEnd)) {
+ rangeEnd = newRangeEnd;
+ if (initialRenderDone) {
+ // Dynamic updates to the range needs to render the calendar to
+ // update the element stylenames
+ renderCalendar();
+ }
}
}
}
diff --git a/client/src/com/vaadin/client/ui/VDragAndDropWrapper.java b/client/src/com/vaadin/client/ui/VDragAndDropWrapper.java
index 1c1173c295..ccd7e2758e 100644
--- a/client/src/com/vaadin/client/ui/VDragAndDropWrapper.java
+++ b/client/src/com/vaadin/client/ui/VDragAndDropWrapper.java
@@ -332,11 +332,16 @@ public class VDragAndDropWrapper extends VCustomComponent implements
vaadinDragEvent.setCurrentGwtEvent(event);
getDropHandler().dragOver(vaadinDragEvent);
- String s = event.getEffectAllowed();
- if ("all".equals(s) || s.contains("opy")) {
- event.setDropEffect("copy");
- } else {
- event.setDropEffect(s);
+ try {
+ String s = event.getEffectAllowed();
+ if ("all".equals(s) || s.contains("opy")) {
+ event.setDropEffect("copy");
+ } else {
+ event.setDropEffect(s);
+ }
+ } catch (Exception e) {
+ // IE10 throws exception here in getEffectAllowed, ignore it, let
+ // drop effect be whatever it is
}
try {
diff --git a/client/src/com/vaadin/client/ui/VLink.java b/client/src/com/vaadin/client/ui/VLink.java
index fa4ee36bcf..064a012873 100644
--- a/client/src/com/vaadin/client/ui/VLink.java
+++ b/client/src/com/vaadin/client/ui/VLink.java
@@ -23,7 +23,6 @@ import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
-import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.Util;
import com.vaadin.shared.ui.BorderStyle;
@@ -70,9 +69,6 @@ public class VLink extends HTML implements ClickHandler {
/** For internal use only. May be removed or replaced in the future. */
public Icon icon;
- /** For internal use only. May be removed or replaced in the future. */
- public ApplicationConnection client;
-
public VLink() {
super();
getElement().appendChild(anchor);
diff --git a/client/src/com/vaadin/client/ui/VNativeButton.java b/client/src/com/vaadin/client/ui/VNativeButton.java
index 67fa6f2ee3..d38e4c3374 100644
--- a/client/src/com/vaadin/client/ui/VNativeButton.java
+++ b/client/src/com/vaadin/client/ui/VNativeButton.java
@@ -33,8 +33,6 @@ public class VNativeButton extends Button implements ClickHandler {
public static final String CLASSNAME = "v-nativebutton";
- protected String width = null;
-
/** For internal use only. May be removed or replaced in the future. */
public String paintableId;
@@ -123,12 +121,6 @@ public class VNativeButton extends Button implements ClickHandler {
}
}
- @Override
- public void setWidth(String width) {
- this.width = width;
- super.setWidth(width);
- }
-
/*
* (non-Javadoc)
*
diff --git a/client/src/com/vaadin/client/ui/VOptionGroup.java b/client/src/com/vaadin/client/ui/VOptionGroup.java
index a4c8b6733c..fee1c313f5 100644
--- a/client/src/com/vaadin/client/ui/VOptionGroup.java
+++ b/client/src/com/vaadin/client/ui/VOptionGroup.java
@@ -87,19 +87,42 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler,
/** For internal use only. May be removed or replaced in the future. */
public boolean htmlContentAllowed = false;
+ private boolean wasHtmlContentAllowed = false;
+ private boolean wasMultiselect = false;
+
public VOptionGroup() {
super(CLASSNAME);
panel = (Panel) optionsContainer;
optionsToKeys = new HashMap<CheckBox, String>();
optionsEnabled = new ArrayList<Boolean>();
+
+ wasMultiselect = isMultiselect();
}
/*
- * Return true if no elements were changed, false otherwise.
+ * Try to update content of existing elements, rebuild panel entirely
+ * otherwise
*/
@Override
public void buildOptions(UIDL uidl) {
- panel.clear();
+ /*
+ * In order to retain focus, we need to update values rather than
+ * recreate panel from scratch (#10451). However, the panel will be
+ * rebuilt (losing focus) if number of elements or their order is
+ * changed.
+ */
+ HashMap<String, CheckBox> keysToOptions = new HashMap<String, CheckBox>();
+ for (Map.Entry<CheckBox, String> entry : optionsToKeys.entrySet()) {
+ keysToOptions.put(entry.getValue(), entry.getKey());
+ }
+ ArrayList<Widget> existingwidgets = new ArrayList<Widget>();
+ ArrayList<Widget> newwidgets = new ArrayList<Widget>();
+
+ // Get current order of elements
+ for (Widget wid : panel) {
+ existingwidgets.add(wid);
+ }
+
optionsEnabled.clear();
if (isMultiselect()) {
@@ -110,7 +133,6 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler,
for (final Iterator<?> it = uidl.getChildIterator(); it.hasNext();) {
final UIDL opUidl = (UIDL) it.next();
- CheckBox op;
String itemHtml = opUidl.getStringAttribute("caption");
if (!htmlContentAllowed) {
@@ -124,33 +146,56 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler,
+ Icon.CLASSNAME + "\" alt=\"\" />" + itemHtml;
}
- if (isMultiselect()) {
- op = new VCheckBox();
- op.setHTML(itemHtml);
- } else {
- op = new RadioButton(paintableId, itemHtml, true);
- op.setStyleName("v-radiobutton");
- }
+ String key = opUidl.getStringAttribute("key");
+ CheckBox op = keysToOptions.get(key);
- if (icon != null && icon.length() != 0) {
- Util.sinkOnloadForImages(op.getElement());
- op.addHandler(iconLoadHandler, LoadEvent.getType());
+ // Need to recreate object if isMultiselect is changed (#10451)
+ // OR if htmlContentAllowed changed due to Safari 5 issue
+ if ((op == null) || (htmlContentAllowed != wasHtmlContentAllowed)
+ || (isMultiselect() != wasMultiselect)) {
+ // Create a new element
+ if (isMultiselect()) {
+ op = new VCheckBox();
+ } else {
+ op = new RadioButton(paintableId);
+ op.setStyleName("v-radiobutton");
+ }
+ if (icon != null && icon.length() != 0) {
+ Util.sinkOnloadForImages(op.getElement());
+ op.addHandler(iconLoadHandler, LoadEvent.getType());
+ }
+
+ op.addStyleName(CLASSNAME_OPTION);
+ op.addClickHandler(this);
+
+ optionsToKeys.put(op, key);
}
- op.addStyleName(CLASSNAME_OPTION);
+ op.setHTML(itemHtml);
op.setValue(opUidl.getBooleanAttribute("selected"));
boolean optionEnabled = !opUidl
.getBooleanAttribute(OptionGroupConstants.ATTRIBUTE_OPTION_DISABLED);
boolean enabled = optionEnabled && !isReadonly() && isEnabled();
op.setEnabled(enabled);
optionsEnabled.add(optionEnabled);
+
setStyleName(op.getElement(),
ApplicationConnection.DISABLED_CLASSNAME,
!(optionEnabled && isEnabled()));
- op.addClickHandler(this);
- optionsToKeys.put(op, opUidl.getStringAttribute("key"));
- panel.add(op);
+
+ newwidgets.add(op);
}
+
+ if (!newwidgets.equals(existingwidgets)) {
+ // Rebuild the panel, losing focus
+ panel.clear();
+ for (Widget wid : newwidgets) {
+ panel.add(wid);
+ }
+ }
+
+ wasHtmlContentAllowed = htmlContentAllowed;
+ wasMultiselect = isMultiselect();
}
@Override
diff --git a/client/src/com/vaadin/client/ui/VOverlay.java b/client/src/com/vaadin/client/ui/VOverlay.java
index 206e26b960..9f84c16020 100644
--- a/client/src/com/vaadin/client/ui/VOverlay.java
+++ b/client/src/com/vaadin/client/ui/VOverlay.java
@@ -229,6 +229,10 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
return shadow != null;
}
+ protected boolean isShimElementEnabled() {
+ return shimElement != null;
+ }
+
private void removeShimElement() {
if (shimElement != null) {
shimElement.removeFromParent();
@@ -248,10 +252,6 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
return isShadowEnabled() && shadow.getParentElement() != null;
}
- private boolean isShimElementAttached() {
- return shimElement != null && shimElement.hasParentElement();
- }
-
private void adjustZIndex() {
setZIndex(Z_INDEX);
}
@@ -386,6 +386,10 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
shadow.getStyle().setProperty("visibility",
visible ? "visible" : "hidden");
}
+ if (isShimElementEnabled()) {
+ shimElement.getStyle().setProperty("visibility",
+ visible ? "visible" : "hidden");
+ }
}
@Override
@@ -469,36 +473,51 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
getOffsetWidth();
}
- PositionAndSize positionAndSize = new PositionAndSize(getActualLeft(),
- getActualTop(), getOffsetWidth(), getOffsetHeight());
+ if (isShadowEnabled() || needsShimElement()) {
- // Animate the size
- positionAndSize.setAnimationFromCenterProgress(progress);
+ PositionAndSize positionAndSize = new PositionAndSize(
+ getActualLeft(), getActualTop(), getOffsetWidth(),
+ getOffsetHeight());
+ // Animate the size
+ positionAndSize.setAnimationFromCenterProgress(progress);
+
+ Element container = getElement().getParentElement().cast();
+
+ if (isShadowEnabled()) {
+ updateShadowPosition(progress, zIndex, positionAndSize);
+ if (shadow.getParentElement() == null) {
+ container.insertBefore(shadow, getElement());
+ sinkShadowEvents();
+ }
+ }
+
+ if (needsShimElement()) {
+ updateShimPosition(positionAndSize);
+ if (shimElement.getParentElement() == null) {
+ container.insertBefore(shimElement, getElement());
+ }
+ }
+ }
+ }
+
+ private void updateShadowPosition(final double progress, String zIndex,
+ PositionAndSize positionAndSize) {
// Opera needs some shaking to get parts of the shadow showing
- // properly
- // (ticket #2704)
- if (BrowserInfo.get().isOpera() && isShadowEnabled()) {
+ // properly (ticket #2704)
+ if (BrowserInfo.get().isOpera()) {
// Clear the height of all middle elements
DOM.getChild(shadow, 3).getStyle().setProperty("height", "auto");
DOM.getChild(shadow, 4).getStyle().setProperty("height", "auto");
DOM.getChild(shadow, 5).getStyle().setProperty("height", "auto");
}
- // Update correct values
- if (isShadowEnabled()) {
- updatePositionAndSize(shadow, positionAndSize);
- DOM.setStyleAttribute(shadow, "zIndex", zIndex);
- DOM.setStyleAttribute(shadow, "display", progress < 0.9 ? "none"
- : "");
- }
- if (needsShimElement()) {
- updatePositionAndSize((Element) Element.as(getShimElement()),
- positionAndSize);
- }
+ updatePositionAndSize(shadow, positionAndSize);
+ DOM.setStyleAttribute(shadow, "zIndex", zIndex);
+ DOM.setStyleAttribute(shadow, "display", progress < 0.9 ? "none" : "");
// Opera fix, part 2 (ticket #2704)
- if (BrowserInfo.get().isOpera() && isShadowEnabled()) {
+ if (BrowserInfo.get().isOpera()) {
// We'll fix the height of all the middle elements
DOM.getChild(shadow, 3)
.getStyle()
@@ -513,17 +532,11 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
.setPropertyPx("height",
DOM.getChild(shadow, 5).getOffsetHeight());
}
+ }
- Element container = getElement().getParentElement().cast();
- // Attach to dom if not there already
- if (isShadowEnabled() && !isShadowAttached()) {
- container.insertBefore(shadow, getElement());
- sinkShadowEvents();
- }
- if (needsShimElement() && !isShimElementAttached()) {
- container.insertBefore(getShimElement(), getElement());
- }
-
+ private void updateShimPosition(PositionAndSize positionAndSize) {
+ updatePositionAndSize((Element) Element.as(getShimElement()),
+ positionAndSize);
}
/**
diff --git a/client/src/com/vaadin/client/ui/VScrollTable.java b/client/src/com/vaadin/client/ui/VScrollTable.java
index 3733ee204a..0e64c71005 100644
--- a/client/src/com/vaadin/client/ui/VScrollTable.java
+++ b/client/src/com/vaadin/client/ui/VScrollTable.java
@@ -71,7 +71,6 @@ import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.PopupPanel;
-import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ApplicationConnection;
@@ -80,6 +79,7 @@ import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ConnectorMap;
import com.vaadin.client.Focusable;
import com.vaadin.client.MouseEventDetailsBuilder;
+import com.vaadin.client.StyleConstants;
import com.vaadin.client.TooltipInfo;
import com.vaadin.client.UIDL;
import com.vaadin.client.Util;
@@ -176,6 +176,8 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
private int firstRowInViewPort = 0;
private int pageLength = 15;
private int lastRequestedFirstvisible = 0; // to detect "serverside scroll"
+ private int firstvisibleOnLastPage = -1; // To detect if the first visible
+ // is on the last page
/** For internal use only. May be removed or replaced in the future. */
public boolean showRowHeaders = false;
@@ -274,6 +276,10 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
*/
private int detachedScrollPosition = 0;
+ // fields used in fixing erroneously lost scrollLeft
+ int lastScrollBodyHeight = 0;
+ boolean lastScrollLeftWasAtMax = false;
+
/**
* Represents a select range of rows
*/
@@ -1003,6 +1009,15 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
initialContentReceived = true;
sizeNeedsInit = true;
scrollBody.restoreRowVisibility();
+
+ // At least FireFox requires that scrollLeft is restored deferred after
+ // scrollBody is recreated
+ Scheduler.get().scheduleFinally(new ScheduledCommand() {
+ @Override
+ public void execute() {
+ restoreScrollLeft();
+ }
+ });
}
/** For internal use only. May be removed or replaced in the future. */
@@ -1070,6 +1085,17 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
}
if (selected != row.isSelected()) {
row.toggleSelection();
+
+ if (selected) {
+ if (focusedRow == null
+ || !selectedRowKeys.contains(focusedRow
+ .getKey())) {
+ // The focus is no longer on a selected row,
+ // move focus to first selected row
+ setRowFocus(row);
+ }
+ }
+
if (!isSingleSelectMode() && !selected) {
// Update selection range in case a row is
// unselected from the middle of a range - #8076
@@ -1111,8 +1137,16 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
private ScheduledCommand lazyScroller = new ScheduledCommand() {
@Override
public void execute() {
- int offsetTop = measureRowHeightOffset(firstvisible);
- scrollBodyPanel.setScrollPosition(offsetTop);
+ if (firstvisible > 0) {
+ firstRowInViewPort = firstvisible;
+ if (firstvisibleOnLastPage > -1) {
+ scrollBodyPanel
+ .setScrollPosition(measureRowHeightOffset(firstvisibleOnLastPage));
+ } else {
+ scrollBodyPanel
+ .setScrollPosition(measureRowHeightOffset(firstvisible));
+ }
+ }
}
};
@@ -1120,18 +1154,18 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
public void updateFirstVisibleAndScrollIfNeeded(UIDL uidl) {
firstvisible = uidl.hasVariable("firstvisible") ? uidl
.getIntVariable("firstvisible") : 0;
+ firstvisibleOnLastPage = uidl.hasVariable("firstvisibleonlastpage") ? uidl
+ .getIntVariable("firstvisibleonlastpage") : -1;
if (firstvisible != lastRequestedFirstvisible && scrollBody != null) {
- // received 'surprising' firstvisible from server: scroll there
- firstRowInViewPort = firstvisible;
+
// Update lastRequestedFirstvisible right away here
// (don't rely on update in the timer which could be cancelled).
lastRequestedFirstvisible = firstRowInViewPort;
- /*
- * Schedule the scrolling to be executed last so no updates to the
- * rows affect scrolling measurements.
- */
- Scheduler.get().scheduleFinally(lazyScroller);
+ // Only scroll if the first visible changes from the server side.
+ // Else we might unintentionally scroll even when the scroll
+ // position has not changed.
+ Scheduler.get().scheduleDeferred(lazyScroller);
}
}
@@ -2151,16 +2185,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
isNewBody = false;
if (firstvisible > 0) {
- // Deferred due to some Firefox oddities
- Scheduler.get().scheduleDeferred(new Command() {
-
- @Override
- public void execute() {
- scrollBodyPanel
- .setScrollPosition(measureRowHeightOffset(firstvisible));
- firstRowInViewPort = firstvisible;
- }
- });
+ Scheduler.get().scheduleDeferred(lazyScroller);
}
if (enabled) {
@@ -2262,7 +2287,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
private int reqFirstRow = 0;
private int reqRows = 0;
- private boolean isRunning = false;
+ private boolean isRequestHandlerRunning = false;
public void triggerRowFetch(int first, int rows) {
setReqFirstRow(first);
@@ -2280,12 +2305,12 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
deferRowFetch(250);
}
- public boolean isRunning() {
- return isRunning;
+ public boolean isRequestHandlerRunning() {
+ return isRequestHandlerRunning;
}
public void deferRowFetch(int msec) {
- isRunning = true;
+ isRequestHandlerRunning = true;
if (reqRows > 0 && reqFirstRow < totalRows) {
schedule(msec);
@@ -2427,7 +2452,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
unSyncedselectionsBeforeRowFetch = new HashSet<Object>(
selectedRowKeys);
}
- isRunning = false;
+ isRequestHandlerRunning = false;
}
}
@@ -2435,7 +2460,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
* Sends request to refresh content at this position.
*/
public void refreshContent() {
- isRunning = true;
+ isRequestHandlerRunning = true;
int first = (int) (firstRowInViewPort - pageLength * cache_rate);
int reqRows = (int) (2 * pageLength * cache_rate + pageLength);
if (first < 0) {
@@ -2759,13 +2784,27 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
DOM.setInnerHTML(floatingCopyOfHeaderCell, DOM.getInnerHTML(td));
floatingCopyOfHeaderCell = DOM
.getChild(floatingCopyOfHeaderCell, 2);
- DOM.setElementProperty(floatingCopyOfHeaderCell, "className",
- VScrollTable.this.getStylePrimaryName() + "-header-drag");
+ // #12714 the shown "ghost element" should be inside
+ // v-overlay-container, and it should contain the same styles as the
+ // table to enable theming (except v-table & v-widget).
+ String stylePrimaryName = VScrollTable.this.getStylePrimaryName();
+ StringBuilder sb = new StringBuilder();
+ for (String s : VScrollTable.this.getStyleName().split(" ")) {
+ if (!s.equals(StyleConstants.UI_WIDGET)) {
+ sb.append(s);
+ if (s.equals(stylePrimaryName)) {
+ sb.append("-header-drag ");
+ } else {
+ sb.append(" ");
+ }
+ }
+ }
+ floatingCopyOfHeaderCell.setClassName(sb.toString().trim());
// otherwise might wrap or be cut if narrow column
DOM.setStyleAttribute(floatingCopyOfHeaderCell, "width", "auto");
updateFloatingCopysPosition(DOM.getAbsoluteLeft(td),
DOM.getAbsoluteTop(td));
- DOM.appendChild(RootPanel.get().getElement(),
+ DOM.appendChild(VOverlay.getOverlayContainer(client),
floatingCopyOfHeaderCell);
}
@@ -2780,8 +2819,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
}
private void hideFloatingCopy() {
- DOM.removeChild(RootPanel.get().getElement(),
- floatingCopyOfHeaderCell);
+ floatingCopyOfHeaderCell.removeFromParent();
floatingCopyOfHeaderCell = null;
}
@@ -6109,7 +6147,13 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
.next();
setRowFocus(endRow);
}
+ } else if (!startRow.isSelected()) {
+ // The start row is no longer selected (probably removed)
+ // and so we select from above
+ startRow = (VScrollTableRow) scrollBody.iterator().next();
+ setRowFocus(endRow);
}
+
// Deselect previous items if so desired
if (deselectPrevious) {
deselectAll();
@@ -6847,12 +6891,44 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
}
/**
+ * Tries to restore horizontal scroll position if it was lost due to change
+ * in the height of scrollBody (#12652).
+ */
+ private void restoreScrollLeft() {
+ int upcomingScrollLeft = scrollLeft;
+
+ if (lastScrollLeftWasAtMax) {
+ upcomingScrollLeft = Util.getMaxScrollLeft(scrollBodyPanel
+ .getElement());
+ }
+ scrollBodyPanel.getElement().setScrollLeft(upcomingScrollLeft);
+ }
+
+ /**
+ * Checks if restore of scrollLeft is needed by checking if height of the
+ * scrollBody has changed.
+ *
+ * @return true, if restore is required
+ */
+ private boolean isScrollLeftRestoreRequired() {
+ return (scrollBody.getElement().getClientHeight() != lastScrollBodyHeight);
+ }
+
+ /**
* This method has logic which rows needs to be requested from server when
* user scrolls
*/
-
@Override
public void onScroll(ScrollEvent event) {
+ // restore in initializeRows() doesn't work right with Chrome
+ if (isScrollLeftRestoreRequired()) {
+ restoreScrollLeft();
+ }
+
+ lastScrollBodyHeight = scrollBody.getElement().getClientHeight();
+ lastScrollLeftWasAtMax = Util.isScrollLeftAtMax(scrollBodyPanel
+ .getElement());
+
scrollLeft = scrollBodyPanel.getElement().getScrollLeft();
scrollTop = scrollBodyPanel.getScrollPosition();
/*
@@ -6895,6 +6971,11 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
// fix footers horizontal scrolling
tFoot.setHorizontalScrollPosition(scrollLeft);
+ if (totalRows == 0) {
+ // No rows, no need to fetch new rows
+ return;
+ }
+
firstRowInViewPort = calcFirstRowInViewPort();
if (firstRowInViewPort > totalRows - pageLength) {
firstRowInViewPort = totalRows - pageLength;
@@ -7070,7 +7151,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
private void deEmphasis() {
UIObject.setStyleName(getElement(),
- VScrollTable.this.getStylePrimaryName() + "-drag", false);
+ getStylePrimaryName() + "-drag", false);
if (lastEmphasized == null) {
return;
}
@@ -7096,7 +7177,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
private void emphasis(TableDDDetails details) {
deEmphasis();
UIObject.setStyleName(getElement(),
- VScrollTable.this.getStylePrimaryName() + "-drag", true);
+ getStylePrimaryName() + "-drag", true);
// iterate old and new emphasized row
for (Widget w : scrollBody.renderedRows) {
VScrollTableRow row = (VScrollTableRow) w;
diff --git a/client/src/com/vaadin/client/ui/VTabsheet.java b/client/src/com/vaadin/client/ui/VTabsheet.java
index 2a949c31af..9ad518b85b 100644
--- a/client/src/com/vaadin/client/ui/VTabsheet.java
+++ b/client/src/com/vaadin/client/ui/VTabsheet.java
@@ -324,7 +324,8 @@ public class VTabsheet extends VTabsheetBase implements Focusable,
}
public boolean updateCaption(UIDL uidl) {
- if (uidl.hasAttribute(TabsheetBaseConstants.ATTRIBUTE_TAB_DESCRIPTION)) {
+ if (uidl.hasAttribute(TabsheetBaseConstants.ATTRIBUTE_TAB_DESCRIPTION)
+ || uidl.hasAttribute(TabsheetBaseConstants.ATTRIBUTE_TAB_ERROR_MESSAGE)) {
setTooltipInfo(new TooltipInfo(
uidl.getStringAttribute(TabsheetBaseConstants.ATTRIBUTE_TAB_DESCRIPTION),
uidl.getStringAttribute(TabsheetBaseConstants.ATTRIBUTE_TAB_ERROR_MESSAGE)));
@@ -1233,19 +1234,21 @@ public class VTabsheet extends VTabsheetBase implements Focusable,
if (event.getSource() instanceof Tab) {
int keycode = event.getNativeEvent().getKeyCode();
- if (keycode == getPreviousTabKey()) {
- selectPreviousTab();
- event.stopPropagation();
- } else if (keycode == getNextTabKey()) {
- selectNextTab();
- event.stopPropagation();
- } else if (keycode == getCloseTabKey()) {
- Tab tab = tb.getTab(activeTabIndex);
- if (tab.isClosable()) {
- tab.onClose();
+ if (!event.isAnyModifierKeyDown()) {
+ if (keycode == getPreviousTabKey()) {
+ selectPreviousTab();
+ event.stopPropagation();
+ } else if (keycode == getNextTabKey()) {
+ selectNextTab();
+ event.stopPropagation();
+ } else if (keycode == getCloseTabKey()) {
+ Tab tab = tb.getTab(activeTabIndex);
+ if (tab.isClosable()) {
+ tab.onClose();
+ }
+ } else if (keycode == getSelectTabKey()) {
+ loadTabSheet(focusedTabIndex);
}
- } else if (keycode == getSelectTabKey()) {
- loadTabSheet(focusedTabIndex);
}
}
}
diff --git a/client/src/com/vaadin/client/ui/VUI.java b/client/src/com/vaadin/client/ui/VUI.java
index 1a84613a5d..590263a5ed 100644
--- a/client/src/com/vaadin/client/ui/VUI.java
+++ b/client/src/com/vaadin/client/ui/VUI.java
@@ -103,9 +103,6 @@ public class VUI extends SimplePanel implements ResizeHandler,
private int parentHeight;
/** For internal use only. May be removed or replaced in the future. */
- public boolean rendering;
-
- /** For internal use only. May be removed or replaced in the future. */
public boolean immediate;
/** For internal use only. May be removed or replaced in the future. */
diff --git a/client/src/com/vaadin/client/ui/VWindow.java b/client/src/com/vaadin/client/ui/VWindow.java
index 03ad8d03c8..c4b2af76e7 100644
--- a/client/src/com/vaadin/client/ui/VWindow.java
+++ b/client/src/com/vaadin/client/ui/VWindow.java
@@ -61,6 +61,8 @@ import com.vaadin.client.Util;
import com.vaadin.client.debug.internal.VDebugWindow;
import com.vaadin.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner;
import com.vaadin.client.ui.aria.AriaHelper;
+import com.vaadin.client.ui.window.WindowMoveEvent;
+import com.vaadin.client.ui.window.WindowMoveHandler;
import com.vaadin.shared.Connector;
import com.vaadin.shared.EventId;
import com.vaadin.shared.ui.window.WindowMode;
@@ -537,7 +539,8 @@ public class VWindow extends VWindowOverlay implements
super.setVisible(visible);
}
- if (visible && BrowserInfo.get().isWebkit()) {
+ if (visible
+ && BrowserInfo.get().requiresPositionAbsoluteOverflowAutoFix()) {
/*
* Shake up the DOM a bit to make the window shed unnecessary
@@ -551,6 +554,12 @@ public class VWindow extends VWindowOverlay implements
public void execute() {
final com.google.gwt.dom.client.Element scrollable = contents
.getFirstChildElement();
+
+ // Adjusting the width or height may change the scroll
+ // position, so store the current position
+ int horizontalScrollPosition = scrollable.getScrollLeft();
+ int verticalScrollPosition = scrollable.getScrollTop();
+
final String oldWidth = scrollable.getStyle().getWidth();
final String oldHeight = scrollable.getStyle().getHeight();
@@ -562,6 +571,10 @@ public class VWindow extends VWindowOverlay implements
scrollable.getOffsetHeight();
scrollable.getStyle().setProperty("height", oldHeight);
+ // Restore the scroll position
+ scrollable.setScrollLeft(horizontalScrollPosition);
+ scrollable.setScrollTop(verticalScrollPosition);
+
updateContentsSize();
positionOrSizeUpdated();
}
@@ -1197,6 +1210,9 @@ public class VWindow extends VWindowOverlay implements
dragging = false;
hideDraggingCurtain();
DOM.releaseCapture(getElement());
+
+ // fire move event
+ fireEvent(new WindowMoveEvent(uidlPositionX, uidlPositionY));
}
@Override
@@ -1412,4 +1428,16 @@ public class VWindow extends VWindowOverlay implements
removeTabBlockHandlers();
}
}
+
+ /**
+ * Adds a Handler for when user moves the window.
+ *
+ * @since 7.1.9
+ *
+ * @return {@link HandlerRegistration} used to remove the handler
+ */
+ public HandlerRegistration addMoveHandler(WindowMoveHandler handler) {
+ return addHandler(handler, WindowMoveEvent.getType());
+ }
+
}
diff --git a/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java b/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java
index 627478ebe5..d2aadca99b 100644
--- a/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java
+++ b/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java
@@ -77,9 +77,6 @@ public class PopupDateFieldConnector extends TextualDateConnector {
String oldLocale = getWidget().getCurrentLocale();
- boolean lastReadOnlyState = getWidget().isReadonly();
- boolean lastEnabledState = getWidget().isEnabled();
-
getWidget().parsable = uidl.getBooleanAttribute("parsable");
super.updateFromUIDL(uidl, client);
@@ -92,7 +89,8 @@ public class PopupDateFieldConnector extends TextualDateConnector {
.getCurrentResolution()) {
getWidget().calendar.setResolution(getWidget()
.getCurrentResolution());
- if (getWidget().calendar.getDate() != null) {
+ if (getWidget().calendar.getDate() != null
+ && getWidget().getCurrentDate() != null) {
getWidget().calendar.setDate((Date) getWidget()
.getCurrentDate().clone());
// force re-render when changing resolution only
@@ -101,7 +99,7 @@ public class PopupDateFieldConnector extends TextualDateConnector {
}
// Force re-render of calendar if locale has changed (#12153)
- if (getWidget().getCurrentLocale() != oldLocale) {
+ if (!getWidget().getCurrentLocale().equals(oldLocale)) {
getWidget().calendar.renderCalendar();
}
@@ -113,6 +111,7 @@ public class PopupDateFieldConnector extends TextualDateConnector {
.setFocusChangeListener(new FocusChangeListener() {
@Override
public void focusChanged(Date date) {
+
getWidget().updateValue(date);
getWidget().buildDate();
Date date2 = getWidget().calendar.getDate();
@@ -179,8 +178,16 @@ public class PopupDateFieldConnector extends TextualDateConnector {
public void onStateChanged(StateChangeEvent stateChangeEvent) {
super.onStateChanged(stateChangeEvent);
getWidget().setTextFieldEnabled(getState().textFieldEnabled);
- getWidget().setRangeStart(getState().rangeStart);
- getWidget().setRangeEnd(getState().rangeEnd);
+ getWidget().setRangeStart(nullSafeDateClone(getState().rangeStart));
+ getWidget().setRangeEnd(nullSafeDateClone(getState().rangeEnd));
+ }
+
+ private Date nullSafeDateClone(Date date) {
+ if (date == null) {
+ return null;
+ } else {
+ return (Date) date.clone();
+ }
}
@Override
diff --git a/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java b/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java
index b4cf008a38..b911c28a07 100644
--- a/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java
+++ b/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java
@@ -374,6 +374,17 @@ public class VDragAndDropManager {
public void onPreviewNativeEvent(
NativePreviewEvent event) {
int typeInt = event.getTypeInt();
+ if (typeInt == -1
+ && event.getNativeEvent().getType()
+ .contains("MSPointer")) {
+ /*
+ * Ignore MSPointer events, until they are
+ * properly used (might improve usability on
+ * touch devices).
+ */
+ return;
+ }
+
switch (typeInt) {
case Event.ONMOUSEOVER:
if (dragElement == null) {
diff --git a/client/src/com/vaadin/client/ui/dd/VTargetInSubtree.java b/client/src/com/vaadin/client/ui/dd/VTargetInSubtree.java
index e9061114aa..c3f56b410d 100644
--- a/client/src/com/vaadin/client/ui/dd/VTargetInSubtree.java
+++ b/client/src/com/vaadin/client/ui/dd/VTargetInSubtree.java
@@ -32,7 +32,7 @@ final public class VTargetInSubtree extends VAcceptCriterion {
protected boolean accept(VDragEvent drag, UIDL configuration) {
VTree tree = (VTree) VDragAndDropManager.get().getCurrentDropHandler()
- .getConnector();
+ .getConnector().getWidget();
TreeNode treeNode = tree.getNodeByKey((String) drag.getDropDetails()
.get("itemIdOver"));
if (treeNode != null) {
@@ -53,4 +53,4 @@ final public class VTargetInSubtree extends VAcceptCriterion {
return false;
}
-} \ No newline at end of file
+}
diff --git a/client/src/com/vaadin/client/ui/link/LinkConnector.java b/client/src/com/vaadin/client/ui/link/LinkConnector.java
index 228897278e..d2c41e9f38 100644
--- a/client/src/com/vaadin/client/ui/link/LinkConnector.java
+++ b/client/src/com/vaadin/client/ui/link/LinkConnector.java
@@ -17,38 +17,21 @@
package com.vaadin.client.ui.link;
import com.google.gwt.user.client.DOM;
-import com.vaadin.client.ApplicationConnection;
-import com.vaadin.client.Paintable;
-import com.vaadin.client.UIDL;
import com.vaadin.client.communication.StateChangeEvent;
-import com.vaadin.client.communication.StateChangeEvent.StateChangeHandler;
import com.vaadin.client.ui.AbstractComponentConnector;
import com.vaadin.client.ui.Icon;
import com.vaadin.client.ui.VLink;
-import com.vaadin.shared.ui.BorderStyle;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.link.LinkConstants;
import com.vaadin.shared.ui.link.LinkState;
import com.vaadin.ui.Link;
@Connect(Link.class)
-public class LinkConnector extends AbstractComponentConnector implements
- Paintable {
+public class LinkConnector extends AbstractComponentConnector {
@Override
protected void init() {
super.init();
- addStateChangeHandler("resources", new StateChangeHandler() {
- @Override
- public void onStateChanged(StateChangeEvent stateChangeEvent) {
- getWidget().src = getResourceUrl(LinkConstants.HREF_RESOURCE);
- if (getWidget().src == null) {
- getWidget().anchor.removeAttribute("href");
- } else {
- getWidget().anchor.setAttribute("href", getWidget().src);
- }
- }
- });
}
@Override
@@ -62,35 +45,30 @@ public class LinkConnector extends AbstractComponentConnector implements
}
@Override
- public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
-
- if (!isRealUpdate(uidl)) {
- return;
- }
-
- getWidget().client = client;
+ public void onStateChanged(StateChangeEvent stateChangeEvent) {
+ super.onStateChanged(stateChangeEvent);
getWidget().enabled = isEnabled();
- if (uidl.hasAttribute("name")) {
- getWidget().target = uidl.getStringAttribute("name");
- getWidget().anchor.setAttribute("target", getWidget().target);
- }
-
- if (uidl.hasAttribute("border")) {
- if ("none".equals(uidl.getStringAttribute("border"))) {
- getWidget().borderStyle = BorderStyle.NONE;
+ if (stateChangeEvent.hasPropertyChanged("resources")) {
+ getWidget().src = getResourceUrl(LinkConstants.HREF_RESOURCE);
+ if (getWidget().src == null) {
+ getWidget().anchor.removeAttribute("href");
} else {
- getWidget().borderStyle = BorderStyle.MINIMAL;
+ getWidget().anchor.setAttribute("href", getWidget().src);
}
+ }
+
+ getWidget().target = getState().target;
+ if (getWidget().target == null) {
+ getWidget().anchor.removeAttribute("target");
} else {
- getWidget().borderStyle = BorderStyle.DEFAULT;
+ getWidget().anchor.setAttribute("target", getWidget().target);
}
- getWidget().targetHeight = uidl.hasAttribute("targetHeight") ? uidl
- .getIntAttribute("targetHeight") : -1;
- getWidget().targetWidth = uidl.hasAttribute("targetWidth") ? uidl
- .getIntAttribute("targetWidth") : -1;
+ getWidget().borderStyle = getState().targetBorder;
+ getWidget().targetWidth = getState().targetWidth;
+ getWidget().targetHeight = getState().targetHeight;
// Set link caption
getWidget().captionElement.setInnerText(getState().caption);
@@ -111,13 +89,12 @@ public class LinkConnector extends AbstractComponentConnector implements
if (getIcon() != null) {
if (getWidget().icon == null) {
- getWidget().icon = new Icon(client);
+ getWidget().icon = new Icon(getConnection());
getWidget().anchor.insertBefore(getWidget().icon.getElement(),
getWidget().captionElement);
}
getWidget().icon.setUri(getIcon());
}
-
}
@Override
diff --git a/client/src/com/vaadin/client/ui/nativebutton/NativeButtonConnector.java b/client/src/com/vaadin/client/ui/nativebutton/NativeButtonConnector.java
index 11a76b483b..2253397b16 100644
--- a/client/src/com/vaadin/client/ui/nativebutton/NativeButtonConnector.java
+++ b/client/src/com/vaadin/client/ui/nativebutton/NativeButtonConnector.java
@@ -94,7 +94,7 @@ public class NativeButtonConnector extends AbstractComponentConnector implements
getWidget().icon.getElement(),
getWidget().captionElement);
}
- getWidget().icon.setUri(getIcon());
+ getWidget().icon.setUri(getIcon(), getState().iconAltText);
} else {
if (getWidget().icon != null) {
getWidget().getElement().removeChild(
diff --git a/client/src/com/vaadin/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java b/client/src/com/vaadin/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java
index e0dc0d51df..ec4307e50b 100644
--- a/client/src/com/vaadin/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java
+++ b/client/src/com/vaadin/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java
@@ -19,6 +19,7 @@ import java.util.List;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ConnectorHierarchyChangeEvent;
@@ -611,13 +612,14 @@ public abstract class AbstractOrderedLayoutConnector extends
LayoutManager layoutManager = getLayoutManager();
for (ComponentConnector child : getChildComponents()) {
- Slot slot = getWidget().getSlot(child.getWidget());
+ Widget childWidget = child.getWidget();
+ Slot slot = getWidget().getSlot(childWidget);
Element captionElement = slot.getCaptionElement();
- CaptionPosition pos = slot.getCaptionPosition();
+ CaptionPosition captionPosition = slot.getCaptionPosition();
- Element childElement = child.getWidget().getElement();
- int h = layoutManager.getOuterHeight(childElement);
- if (h == -1) {
+ int pixelHeight = layoutManager.getOuterHeight(childWidget
+ .getElement());
+ if (pixelHeight == -1) {
// Height has not yet been measured -> postpone actions that
// depend on the max height
return -1;
@@ -625,14 +627,10 @@ public abstract class AbstractOrderedLayoutConnector extends
boolean hasRelativeHeight = slot.hasRelativeHeight();
+ boolean captionSizeShouldBeAddedtoComponentHeight = captionPosition == CaptionPosition.TOP
+ || captionPosition == CaptionPosition.BOTTOM;
boolean includeCaptionHeight = captionElement != null
- && (pos == CaptionPosition.TOP || pos == CaptionPosition.BOTTOM);
- if (!hasRelativeHeight && !includeCaptionHeight
- && captionElement != null) {
- String sHeight = childElement.getStyle().getHeight();
- includeCaptionHeight = (sHeight == null || !sHeight
- .endsWith("%"));
- }
+ && captionSizeShouldBeAddedtoComponentHeight;
if (includeCaptionHeight) {
int captionHeight = layoutManager
@@ -643,16 +641,16 @@ public abstract class AbstractOrderedLayoutConnector extends
// depend on the max height
return -1;
}
- h += captionHeight;
+ pixelHeight += captionHeight;
}
if (!hasRelativeHeight) {
- if (h > highestNonRelative) {
- highestNonRelative = h;
+ if (pixelHeight > highestNonRelative) {
+ highestNonRelative = pixelHeight;
}
} else {
- if (h > highestRelative) {
- highestRelative = h;
+ if (pixelHeight > highestRelative) {
+ highestRelative = pixelHeight;
}
}
}
diff --git a/client/src/com/vaadin/client/ui/slider/SliderConnector.java b/client/src/com/vaadin/client/ui/slider/SliderConnector.java
index e6e3e0467d..71462d69f0 100644
--- a/client/src/com/vaadin/client/ui/slider/SliderConnector.java
+++ b/client/src/com/vaadin/client/ui/slider/SliderConnector.java
@@ -52,6 +52,7 @@ public class SliderConnector extends AbstractFieldConnector implements
@Override
public void onValueChange(ValueChangeEvent<Double> event) {
+ getState().value = event.getValue();
rpc.valueChanged(event.getValue());
}
diff --git a/client/src/com/vaadin/client/ui/table/TableConnector.java b/client/src/com/vaadin/client/ui/table/TableConnector.java
index 47229dc9c7..eacd5bc77a 100644
--- a/client/src/com/vaadin/client/ui/table/TableConnector.java
+++ b/client/src/com/vaadin/client/ui/table/TableConnector.java
@@ -264,7 +264,7 @@ public class TableConnector extends AbstractHasComponentsConnector implements
if (getWidget().focusedRow != null) {
if (!getWidget().focusedRow.isAttached()
- && !getWidget().rowRequestHandler.isRunning()) {
+ && !getWidget().rowRequestHandler.isRequestHandlerRunning()) {
// focused row has been orphaned, can't focus
if (getWidget().selectedRowKeys.contains(getWidget().focusedRow
.getKey())) {
@@ -343,6 +343,9 @@ public class TableConnector extends AbstractHasComponentsConnector implements
Scheduler.get().scheduleFinally(new ScheduledCommand() {
@Override
public void execute() {
+ // IE8 needs some hacks to measure sizes correctly
+ Util.forceIE8Redraw(getWidget().getElement());
+
getLayoutManager().setNeedsMeasure(TableConnector.this);
ServerConnector parent = getParent();
if (parent instanceof ComponentConnector) {
diff --git a/client/src/com/vaadin/client/ui/ui/UIConnector.java b/client/src/com/vaadin/client/ui/ui/UIConnector.java
index 45005ddd9f..d0f3c8603f 100644
--- a/client/src/com/vaadin/client/ui/ui/UIConnector.java
+++ b/client/src/com/vaadin/client/ui/ui/UIConnector.java
@@ -45,6 +45,7 @@ import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.event.shared.HandlerRegistration;
import com.vaadin.client.ApplicationConnection;
+import com.vaadin.client.ApplicationConnection.ApplicationStoppedEvent;
import com.vaadin.client.BrowserInfo;
import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ConnectorHierarchyChangeEvent;
@@ -125,11 +126,16 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
- if (sessionExpired) {
- getConnection().showSessionExpiredError(null);
- } else {
- getState().enabled = false;
- updateEnabledState(getState().enabled);
+ // Only notify user if we're still running and not eg.
+ // navigating away (#12298)
+ if (getConnection().isApplicationRunning()) {
+ if (sessionExpired) {
+ getConnection().showSessionExpiredError(null);
+ } else {
+ getState().enabled = false;
+ updateEnabledState(getState().enabled);
+ }
+ getConnection().setApplicationRunning(false);
}
}
});
@@ -187,7 +193,6 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
@Override
public void updateFromUIDL(final UIDL uidl, ApplicationConnection client) {
ConnectorMap paintableMap = ConnectorMap.get(getConnection());
- getWidget().rendering = true;
getWidget().id = getConnectorId();
boolean firstPaint = getWidget().connection == null;
getWidget().connection = client;
@@ -280,9 +285,8 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
childIndex++;
}
if (isClosed) {
- // don't render the content, something else will be opened to this
- // browser view
- getWidget().rendering = false;
+ // We're navigating away, so stop the application.
+ client.setApplicationRunning(false);
return;
}
@@ -315,6 +319,12 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
ComponentConnector paintable = (ComponentConnector) uidl
.getPaintableAttribute("focused", getConnection());
+ if (paintable == null) {
+ // Do not try to focus invisible components which not
+ // present in UIDL
+ return;
+ }
+
final Widget toBeFocused = paintable.getWidget();
/*
* Two types of Widgets can be focused, either implementing
@@ -386,7 +396,6 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
}
});
}
- getWidget().rendering = false;
}
/**
@@ -458,6 +467,21 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
// side-effects from focusing (scrollIntoView).
getWidget().getElement().focus();
}
+
+ applicationConnection.addHandler(
+ ApplicationConnection.ApplicationStoppedEvent.TYPE,
+ new ApplicationConnection.ApplicationStoppedHandler() {
+
+ @Override
+ public void onApplicationStopped(
+ ApplicationStoppedEvent event) {
+ // Stop any polling
+ if (pollTimer != null) {
+ pollTimer.cancel();
+ pollTimer = null;
+ }
+ }
+ });
}
private ClickEventHandler clickEventHandler = new ClickEventHandler(this) {
@@ -682,6 +706,12 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
pollTimer = new Timer() {
@Override
public void run() {
+ if (getState().pollInterval < 0) {
+ // Polling has been cancelled server side
+ pollTimer.cancel();
+ pollTimer = null;
+ return;
+ }
getRpcProxy(UIServerRpc.class).poll();
// Send changes even though poll is @Delayed
getConnection().sendPendingVariableChanges();
diff --git a/client/src/com/vaadin/client/ui/window/WindowConnector.java b/client/src/com/vaadin/client/ui/window/WindowConnector.java
index 464ab386c1..788799d81c 100644
--- a/client/src/com/vaadin/client/ui/window/WindowConnector.java
+++ b/client/src/com/vaadin/client/ui/window/WindowConnector.java
@@ -34,6 +34,7 @@ import com.vaadin.client.LayoutManager;
import com.vaadin.client.Paintable;
import com.vaadin.client.UIDL;
import com.vaadin.client.Util;
+import com.vaadin.client.communication.RpcProxy;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.AbstractSingleComponentContainerConnector;
import com.vaadin.client.ui.ClickEventHandler;
@@ -52,7 +53,8 @@ import com.vaadin.shared.ui.window.WindowState;
@Connect(value = com.vaadin.ui.Window.class)
public class WindowConnector extends AbstractSingleComponentContainerConnector
implements Paintable, BeforeShortcutActionListener,
- SimpleManagedLayout, PostLayoutListener, MayScrollChildren {
+ SimpleManagedLayout, PostLayoutListener, MayScrollChildren,
+ WindowMoveHandler {
private ClickEventHandler clickEventHandler = new ClickEventHandler(this) {
@Override
@@ -99,6 +101,8 @@ public class WindowConnector extends AbstractSingleComponentContainerConnector
super.init();
VWindow window = getWidget();
+ window.id = getConnectorId();
+ window.client = getConnection();
getLayoutManager().registerDependency(this,
window.contentPanel.getElement());
@@ -110,6 +114,8 @@ public class WindowConnector extends AbstractSingleComponentContainerConnector
DoubleClickEvent.getType());
window.setOwner(getConnection().getUIConnector().getWidget());
+
+ window.addMoveHandler(this);
}
@Override
@@ -127,9 +133,6 @@ public class WindowConnector extends AbstractSingleComponentContainerConnector
VWindow window = getWidget();
String connectorId = getConnectorId();
- window.id = getConnectorId();
- window.client = client;
-
// Workaround needed for Testing Tools (GWT generates window DOM
// slightly different in different browsers).
window.closeBox.setId(connectorId + "_window_close");
@@ -411,4 +414,11 @@ public class WindowConnector extends AbstractSingleComponentContainerConnector
*/
return true;
}
+
+ @Override
+ public void onWindowMove(WindowMoveEvent event) {
+ RpcProxy.create(WindowServerRpc.class, this).windowMoved(
+ event.getNewX(), event.getNewY());
+
+ }
}
diff --git a/client/src/com/vaadin/client/ui/window/WindowMoveEvent.java b/client/src/com/vaadin/client/ui/window/WindowMoveEvent.java
new file mode 100644
index 0000000000..439a90e3a1
--- /dev/null
+++ b/client/src/com/vaadin/client/ui/window/WindowMoveEvent.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.client.ui.window;
+
+import com.google.gwt.event.shared.GwtEvent;
+
+/**
+ * Event for window position updates
+ *
+ * @since 7.1.9
+ * @author Vaadin Ltd
+ */
+public class WindowMoveEvent extends GwtEvent<WindowMoveHandler> {
+
+ private static final Type<WindowMoveHandler> TYPE = new Type<WindowMoveHandler>();
+
+ private final int newX;
+ private final int newY;
+
+ /**
+ * Creates a new event with the given parameters
+ *
+ * @param x
+ * The new x-position for the VWindow
+ * @param y
+ * The new y-position for the VWindow
+ */
+ public WindowMoveEvent(int x, int y) {
+ newX = x;
+ newY = y;
+ }
+
+ /**
+ * Gets the new x position of the window
+ *
+ * @return the new X position of the VWindow
+ */
+ public int getNewX() {
+ return newX;
+ }
+
+ /**
+ * Gets the new y position of the window
+ *
+ * @return the new Y position of the VWindow
+ */
+ public int getNewY() {
+ return newY;
+ }
+
+ /**
+ * Gets the type of the event
+ *
+ * @return the type of the event
+ */
+ public static Type<WindowMoveHandler> getType() {
+ return TYPE;
+ }
+
+ @Override
+ public Type<WindowMoveHandler> getAssociatedType() {
+ return TYPE;
+ }
+
+ @Override
+ protected void dispatch(WindowMoveHandler handler) {
+ handler.onWindowMove(this);
+ }
+}
diff --git a/client/src/com/vaadin/client/ui/window/WindowMoveHandler.java b/client/src/com/vaadin/client/ui/window/WindowMoveHandler.java
new file mode 100644
index 0000000000..e30e1853fe
--- /dev/null
+++ b/client/src/com/vaadin/client/ui/window/WindowMoveHandler.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.client.ui.window;
+
+import com.google.gwt.event.shared.EventHandler;
+
+/**
+ * Handler for {@link WindowMoveEvent}s
+ *
+ * @since 7.1.9
+ * @author Vaadin Ltd
+ */
+public interface WindowMoveHandler extends EventHandler {
+
+ /**
+ * Called when the VWindow was moved by the user.
+ *
+ * @param event
+ * Contains new coordinates for the VWindow
+ */
+ public void onWindowMove(WindowMoveEvent event);
+}
diff --git a/client/tests/src/com/vaadin/client/TestVBrowserDetailsUserAgentParser.java b/client/tests/src/com/vaadin/client/TestVBrowserDetailsUserAgentParser.java
index 7d5911f5a0..5b428574e2 100644
--- a/client/tests/src/com/vaadin/client/TestVBrowserDetailsUserAgentParser.java
+++ b/client/tests/src/com/vaadin/client/TestVBrowserDetailsUserAgentParser.java
@@ -27,6 +27,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
private static final String IE9_BETA_WINDOWS_7 = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
private static final String IE10_WINDOWS_8 = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
+ private static final String IE11_WINDOWS_7 = "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; rv:11.0) like Gecko";
// "Version/" was added in 10.00
private static final String OPERA964_WINDOWS = "Opera/9.64(Windows NT 5.1; U; en) Presto/2.1.1";
@@ -314,6 +315,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
public void testIE8() {
VBrowserDetails bd = new VBrowserDetails(IE8_WINDOWS);
+ assertTrident(bd);
assertEngineVersion(bd, 4);
assertIE(bd);
assertBrowserMajorVersion(bd, 8);
@@ -325,6 +327,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
VBrowserDetails bd = new VBrowserDetails(IE8_IN_IE7_MODE_WINDOWS);
bd.setIEMode(7);
+ assertTrident(bd);
assertEngineVersion(bd, 4);
assertIE(bd);
assertBrowserMajorVersion(bd, 7);
@@ -335,6 +338,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
public void testIE9() {
VBrowserDetails bd = new VBrowserDetails(IE9_BETA_WINDOWS_7);
+ assertTrident(bd);
assertEngineVersion(bd, 5);
assertIE(bd);
assertBrowserMajorVersion(bd, 9);
@@ -346,6 +350,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
VBrowserDetails bd = new VBrowserDetails(IE9_IN_IE7_MODE_WINDOWS_7);
// bd.setIE8InCompatibilityMode();
+ assertTrident(bd);
assertEngineVersion(bd, 5);
assertIE(bd);
assertBrowserMajorVersion(bd, 7);
@@ -362,6 +367,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
* Trident/4.0 in example user agent string based on beta even though it
* should be Trident/5.0 in real (non-beta) user agent strings
*/
+ assertTrident(bd);
assertEngineVersion(bd, 4);
assertIE(bd);
assertBrowserMajorVersion(bd, 8);
@@ -372,6 +378,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
public void testIE10() {
VBrowserDetails bd = new VBrowserDetails(IE10_WINDOWS_8);
+ assertTrident(bd);
assertEngineVersion(bd, 6);
assertIE(bd);
assertBrowserMajorVersion(bd, 10);
@@ -379,6 +386,16 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
assertWindows(bd);
}
+ public void testIE11() {
+ VBrowserDetails bd = new VBrowserDetails(IE11_WINDOWS_7);
+ assertTrident(bd);
+ assertEngineVersion(bd, 7);
+ assertIE(bd);
+ assertBrowserMajorVersion(bd, 11);
+ assertBrowserMinorVersion(bd, 0);
+ assertWindows(bd);
+ }
+
/*
* Helper methods below
*/
@@ -406,6 +423,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
assertTrue(browserDetails.isGecko());
assertFalse(browserDetails.isWebKit());
assertFalse(browserDetails.isPresto());
+ assertFalse(browserDetails.isTrident());
}
private void assertPresto(VBrowserDetails browserDetails) {
@@ -413,6 +431,15 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
assertFalse(browserDetails.isGecko());
assertFalse(browserDetails.isWebKit());
assertTrue(browserDetails.isPresto());
+ assertFalse(browserDetails.isTrident());
+ }
+
+ private void assertTrident(VBrowserDetails browserDetails) {
+ // Engine
+ assertFalse(browserDetails.isGecko());
+ assertFalse(browserDetails.isWebKit());
+ assertFalse(browserDetails.isPresto());
+ assertTrue(browserDetails.isTrident());
}
private void assertWebKit(VBrowserDetails browserDetails) {
@@ -420,6 +447,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
assertFalse(browserDetails.isGecko());
assertTrue(browserDetails.isWebKit());
assertFalse(browserDetails.isPresto());
+ assertFalse(browserDetails.isTrident());
}
private void assertFirefox(VBrowserDetails browserDetails) {
diff --git a/ivysettings.xml b/ivysettings.xml
index fa08f3d0bb..7112bbf217 100644
--- a/ivysettings.xml
+++ b/ivysettings.xml
@@ -11,6 +11,8 @@
<settings defaultResolver="public" />
<resolvers>
<ibiblio name="public" m2compatible="true" />
+ <ibiblio name="vaadin-addons" usepoms="true"
+ m2compatible="true" root="http://maven.vaadin.com/vaadin-addons" />
<filesystem name="local-maven" m2compatible="true">
<artifact
pattern="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]" />
@@ -23,6 +25,8 @@
</filesystem>
</resolvers>
<modules>
+ <module organisation="com.vaadin" name="vaadin-testbench"
+ resolver="vaadin-addons" />
<module organisation="com.vaadin" name="vaadin-buildhelpers"
resolver="build-temp" />
<module organisation="com.vaadin" name="vaadin-shared"
@@ -41,6 +45,8 @@
resolver="build-temp" />
<module organisation="com.vaadin" name="vaadin-push"
resolver="build-temp" />
+ <module organisation="com.vaadin" name="vaadin-liferay"
+ resolver="build-temp" />
</modules>
diff --git a/liferay/build.xml b/liferay/build.xml
new file mode 100644
index 0000000000..fc1d748e55
--- /dev/null
+++ b/liferay/build.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0"?>
+
+<project name="liferay" basedir="." default="publish-local" xmlns:ivy="antlib:org.apache.ivy.ant">
+ <description>
+ Builds the Liferay ZIP archive
+ </description>
+
+ <include file="../common.xml" as="common" />
+ <include file="../build.xml" as="vaadin" />
+
+ <property name="module.name" value="vaadin-liferay" />
+ <property name="result.dir" value="result" />
+ <property name="lib.dir" value="${result.dir}/lib" />
+ <property name="work.dir" value="${result.dir}/work" />
+ <property name="liferay.zip" location="${result.dir}/lib/${module.name}-${vaadin.version}.zip" />
+
+ <target name="publish-local" depends="build-zip" if="build.release">
+ <antcall target="common.publish-local">
+ <param name="conf" value="deps" />
+ </antcall>
+ </target>
+
+ <target name="fetch-jars">
+ <echo>Retriving prebuilt jars</echo>
+ <!-- Retrieve pre-build jars -->
+ <ivy:resolve />
+ <mkdir dir="${lib.dir}" />
+ <ivy:retrieve pattern="${lib.dir}/[artifact].[type]" conf="deps" />
+ </target>
+
+ <target name="unpack" depends="fetch-jars">
+ <echo>Unpacking jars into working directory</echo>
+ <mkdir dir="${work.dir}" />
+ <unjar src="${lib.dir}/vaadin-client-compiled.jar" dest="${work.dir}">
+ <patternset>
+ <include name="VAADIN/widgetsets/**/*" />
+ </patternset>
+ </unjar>
+ <unjar src="${lib.dir}/vaadin-themes.jar" dest="${work.dir}">
+ <patternset>
+ <include name="VAADIN/themes/base/**/*" />
+ <include name="VAADIN/themes/chameleon/**/*" />
+ <include name="VAADIN/themes/liferay/**/*" />
+ <include name="VAADIN/themes/runo/**/*" />
+ <include name="VAADIN/themes/reindeer/**/*" />
+ </patternset>
+ </unjar>
+ <unjar src="${lib.dir}/vaadin-push.jar" dest="${work.dir}">
+ <patternset>
+ <include name="VAADIN/vaadinPush.js" />
+ <include name="VAADIN/vaadinPush.debug.js" />
+ </patternset>
+ </unjar>
+ <unjar src="${lib.dir}/vaadin-server.jar" dest="${work.dir}">
+ <patternset>
+ <include name="VAADIN/vaadinBootstrap.js" />
+ </patternset>
+ </unjar>
+ </target>
+
+ <target name="build-zip" depends="unpack">
+ <echo>Building Liferay zip</echo>
+ <zip zipfile="${liferay.zip}">
+ <zipfileset dir="${work.dir}" />
+ </zip>
+ </target>
+
+ <target name="clean">
+ <antcall target="common.clean" />
+ </target>
+
+ <target name="checkstyle" />
+
+ <target name="test" depends="checkstyle" />
+
+</project>
diff --git a/liferay/ivy.xml b/liferay/ivy.xml
new file mode 100644
index 0000000000..fb6d152e15
--- /dev/null
+++ b/liferay/ivy.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ivy-module version="2.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
+ xmlns:m="http://ant.apache.org/ivy/maven">
+
+ <info organisation="com.vaadin" module="vaadin-liferay" revision="${vaadin.version}" />
+
+ <configurations>
+ <conf name="build" />
+ <conf name="build-provided" />
+ <conf name="deps" visibility="private" />
+ </configurations>
+
+ <publications>
+ <artifact type="zip" ext="zip" />
+ </publications>
+
+ <dependencies>
+ <dependency org="com.vaadin" name="vaadin-client-compiled"
+ rev="${vaadin.version}" conf="deps -> build" transitive="false"/>
+ <dependency org="com.vaadin" name="vaadin-themes"
+ rev="${vaadin.version}" conf="deps -> build" transitive="false"/>
+ <dependency org="com.vaadin" name="vaadin-push"
+ rev="${vaadin.version}" conf="deps -> build" transitive="false" />
+ <dependency org="com.vaadin" name="vaadin-server"
+ rev="${vaadin.version}" conf="deps -> build" transitive="false" />
+ </dependencies>
+
+</ivy-module>
diff --git a/publish.xml b/publish.xml
index 4007f2db00..d37087d8f9 100644
--- a/publish.xml
+++ b/publish.xml
@@ -11,11 +11,6 @@
<ivy:settings file="ivysettings-publish.xml" id="publish.settings" />
<property file="publish.properties" />
- <available property="ant-jsch.present" file="${ant.home}/lib/ant-jsch.jar" />
- <available property="jsch.present" file="${ant.home}/lib/jsch-0.1.48.jar" />
- <fail unless="ant-jsch.present" message="Please install ant-jsch.jar into ANT_HOME/lib" />
- <fail unless="jsch.present" message="Please install jsch.jar into ANT_HOME/lib" />
-
<target name="nightly.publish" depends="nightly.download.publish, nightly.maven.publish">
</target>
diff --git a/push/build.xml b/push/build.xml
index 1cbe23d75b..abeec2a8b0 100644
--- a/push/build.xml
+++ b/push/build.xml
@@ -10,12 +10,14 @@
<property name="module.name" value="vaadin-push" />
<property name="module.symbolic" value="com.vaadin.push" />
<property name="result.dir" location="result" />
+ <property name="temp.dir" location="${result.dir}/temp" />
+ <property name="jquery.unpack" location="${temp.dir}/jquery" />
<property name="vaadinPush.js" location="${result.dir}/js/VAADIN/vaadinPush.js" />
<property name="vaadinPush.debug.js" location="${result.dir}/js/VAADIN/vaadinPush.debug.js" />
- <!-- Keep the version number in sync with ivy.xml, server/src/com/vaadin/server/Constants.java and jquery.atmosphere.js -->
- <property name="atmosphere.version" value="1.0.14.vaadin4" />
- <property name="jquery.version" value="1.7.2" />
+ <!-- Keep the version number in sync with ivy.xml, server/src/com/vaadin/server/Constants.java -->
+ <property name="atmosphere.runtime.version" value="1.0.18.vaadin1" />
+ <property name="jquery.version" value="1.9.0" />
<path id="classpath.compile.custom" />
@@ -28,9 +30,25 @@
<target name="vaadinPush.js">
<mkdir dir="${result.dir}/js/VAADIN" />
+ <ivy:resolve log="download-only" file="ivy.xml" conf="push.js" />
+ <ivy:cachepath pathid="atmosphere.jquery.deps" conf="push.js" />
+
+ <delete dir="${temp.dir}" />
+ <copy flatten="true" tofile="${temp.dir}/jquery.war">
+ <path refid="atmosphere.jquery.deps" />
+ </copy>
+
+ <!-- Unzip to temp dir -->
+ <unzip src="${temp.dir}/jquery.war" dest="${jquery.unpack}">
+ <patternset>
+ <include name="**/jquery.atmosphere.js" />
+ <include name="**/jquery-${jquery.version}.js" />
+ </patternset>
+ <mapper type="flatten" />
+ </unzip>
+ <loadfile srcfile="${jquery.unpack}/jquery-${jquery.version}.js" property="jquery.js.contents" />
+ <loadfile srcfile="${jquery.unpack}/jquery.atmosphere.js" property="jquery.atmosphere.js.contents" />
- <loadfile srcfile="${vaadin.basedir}/WebContent/VAADIN/jquery-${jquery.version}.js" property="jquery.js.contents" />
- <loadfile srcfile="${vaadin.basedir}/WebContent/VAADIN/jquery.atmosphere.js" property="jquery.atmosphere.js.contents" />
<loadfile srcfile="${vaadin.basedir}/WebContent/VAADIN/vaadinPush.js.tpl" property="vaadinPush.js.contents">
<filterchain>
<replacetokens begintoken="@" endtoken="@">
@@ -55,7 +73,7 @@
<target name="jar" depends="vaadinPush.js">
<antcall target="common.jar">
- <param name="require-bundle" value="com.vaadin.external.atmosphere.atmosphere-runtime;bundle-version=&quot;${atmosphere.version}&quot;;visibility:=reexport" />
+ <param name="require-bundle" value="com.vaadin.external.atmosphere.atmosphere-runtime;bundle-version=&quot;${atmosphere.runtime.version}&quot;;visibility:=reexport" />
<reference torefid="extra.jar.includes" refid="jar.includes" />
</antcall>
</target>
diff --git a/push/ivy.xml b/push/ivy.xml
index 5a2a24fb1f..2be47512fe 100644
--- a/push/ivy.xml
+++ b/push/ivy.xml
@@ -1,4 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ivy-module [
+<!-- Keep the version number in sync with build.xml -->
+ <!ENTITY atmosphere.runtime.version "1.0.18.vaadin1">
+
+ <!ENTITY atmosphere.js.version "2.0.3.vaadin2">
+]>
<ivy-module version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
@@ -11,6 +17,8 @@
<conf name="build-provided" />
<conf name="ide" visibility="private" />
<conf name="test" visibility="private" />
+ <!-- Used for building push.js only -->
+ <conf name="push.js" visibility="private" />
</configurations>
<publications>
<artifact type="jar" ext="jar" />
@@ -26,10 +34,11 @@
rev="2.4" conf="build-provided,ide,test -> default" />
<!-- Atmosphere -->
- <!-- Keep the version number in sync with build.xml and other locations listed in that file -->
- <dependency org="com.vaadin.external.atmosphere" name="atmosphere-runtime"
- rev="1.0.14.vaadin4" conf="build,ide,test -> default">
- </dependency>
+ <dependency org="com.vaadin.external.atmosphere"
+ name="atmosphere-runtime" rev="&atmosphere.runtime.version;"
+ conf="build,ide,test -> default" />
+ <dependency org="com.vaadin.external.atmosphere.client"
+ name="jquery" rev="&atmosphere.js.version;" conf="push.js -> default" />
</dependencies>
</ivy-module>
diff --git a/scripts/automerge7.sh b/scripts/automerge7.sh
index 2b98530902..10e6ee0ffb 100755
--- a/scripts/automerge7.sh
+++ b/scripts/automerge7.sh
@@ -109,7 +109,7 @@ do
pendingCommit=
pendingCommitMessage=
echo
- echo "Stopping merge because $commit because of merge conflicts"
+ echo "Stopping merge at $commit because of merge conflicts"
echo "The following commit must be manually merged."
show $commit
exit 3
diff --git a/server/ivy.xml b/server/ivy.xml
index b78541c52f..ba859b08ee 100644
--- a/server/ivy.xml
+++ b/server/ivy.xml
@@ -58,7 +58,7 @@
<!-- TESTING DEPENDENCIES -->
<!-- Test frameworks & related -->
- <dependency org="junit" name="junit" rev="4.5"
+ <dependency org="junit" name="junit" rev="4.11"
conf="test,ide -> default" />
<dependency org="org.easymock" name="easymock" rev="3.0"
conf="test,ide-> default" transitive="true" />
diff --git a/server/src/com/vaadin/data/Container.java b/server/src/com/vaadin/data/Container.java
index e93db52a35..bf553f31d2 100644
--- a/server/src/com/vaadin/data/Container.java
+++ b/server/src/com/vaadin/data/Container.java
@@ -582,6 +582,60 @@ public interface Container extends Serializable {
public Item addItemAt(int index, Object newItemId)
throws UnsupportedOperationException;
+ /**
+ * An <code>Event</code> object specifying information about the added
+ * items.
+ */
+ public interface ItemAddEvent extends ItemSetChangeEvent {
+
+ /**
+ * Gets the item id of the first added item.
+ *
+ * @return item id of the first added item
+ */
+ public Object getFirstItemId();
+
+ /**
+ * Gets the index of the first added item.
+ *
+ * @return index of the first added item
+ */
+ public int getFirstIndex();
+
+ /**
+ * Gets the number of the added items.
+ *
+ * @return the number of added items.
+ */
+ public int getAddedItemsCount();
+ }
+
+ /**
+ * An <code>Event</code> object specifying information about the removed
+ * items.
+ */
+ public interface ItemRemoveEvent extends ItemSetChangeEvent {
+ /**
+ * Gets the item id of the first removed item.
+ *
+ * @return item id of the first removed item
+ */
+ public Object getFirstItemId();
+
+ /**
+ * Gets the index of the first removed item.
+ *
+ * @return index of the first removed item
+ */
+ public int getFirstIndex();
+
+ /**
+ * Gets the number of the removed items.
+ *
+ * @return the number of removed items
+ */
+ public int getRemovedItemsCount();
+ }
}
/**
diff --git a/server/src/com/vaadin/data/util/AbstractBeanContainer.java b/server/src/com/vaadin/data/util/AbstractBeanContainer.java
index cd5c0c809d..67239996a2 100644
--- a/server/src/com/vaadin/data/util/AbstractBeanContainer.java
+++ b/server/src/com/vaadin/data/util/AbstractBeanContainer.java
@@ -222,6 +222,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends
@Override
public boolean removeAllItems() {
int origSize = size();
+ IDTYPE firstItem = getFirstVisibleItem();
internalRemoveAllItems();
@@ -234,7 +235,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends
// fire event only if the visible view changed, regardless of whether
// filtered out items were removed or not
if (origSize != 0) {
- fireItemSetChange();
+ fireItemsRemoved(0, firstItem, origSize);
}
return true;
@@ -679,6 +680,8 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends
protected void addAll(Collection<? extends BEANTYPE> collection)
throws IllegalStateException, IllegalArgumentException {
boolean modified = false;
+ int origSize = size();
+
for (BEANTYPE bean : collection) {
// TODO skipping invalid beans - should not allow them in javadoc?
if (bean == null
@@ -699,13 +702,22 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends
if (modified) {
// Filter the contents when all items have been added
if (isFiltered()) {
- filterAll();
- } else {
- fireItemSetChange();
+ doFilterContainer(!getFilters().isEmpty());
+ }
+ if (visibleNewItemsWasAdded(origSize)) {
+ // fire event about added items
+ int firstPosition = origSize;
+ IDTYPE firstItemId = getVisibleItemIds().get(firstPosition);
+ int affectedItems = size() - origSize;
+ fireItemsAdded(firstPosition, firstItemId, affectedItems);
}
}
}
+ private boolean visibleNewItemsWasAdded(int origSize) {
+ return size() > origSize;
+ }
+
/**
* Use the bean resolver to get the identifier for a bean.
*
diff --git a/server/src/com/vaadin/data/util/AbstractInMemoryContainer.java b/server/src/com/vaadin/data/util/AbstractInMemoryContainer.java
index 84304431bc..9a7922b928 100644
--- a/server/src/com/vaadin/data/util/AbstractInMemoryContainer.java
+++ b/server/src/com/vaadin/data/util/AbstractInMemoryContainer.java
@@ -15,8 +15,10 @@
*/
package com.vaadin.data.util;
+import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
+import java.util.EventObject;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
@@ -146,6 +148,85 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE
}
}
+ private static abstract class BaseItemAddOrRemoveEvent extends
+ EventObject implements Serializable {
+ protected Object itemId;
+ protected int index;
+ protected int count;
+
+ public BaseItemAddOrRemoveEvent(Container source, Object itemId,
+ int index, int count) {
+ super(source);
+ this.itemId = itemId;
+ this.index = index;
+ this.count = count;
+ }
+
+ public Container getContainer() {
+ return (Container) getSource();
+ }
+
+ public Object getFirstItemId() {
+ return itemId;
+ }
+
+ public int getFirstIndex() {
+ return index;
+ }
+
+ public int getAffectedItemsCount() {
+ return count;
+ }
+ }
+
+ /**
+ * An <code>Event</code> object specifying information about the added
+ * items.
+ *
+ * <p>
+ * This class provides information about the first added item and the number
+ * of added items.
+ * </p>
+ */
+ protected static class BaseItemAddEvent extends
+ BaseItemAddOrRemoveEvent implements
+ Container.Indexed.ItemAddEvent {
+
+ public BaseItemAddEvent(Container source, Object itemId, int index,
+ int count) {
+ super(source, itemId, index, count);
+ }
+
+ @Override
+ public int getAddedItemsCount() {
+ return getAffectedItemsCount();
+ }
+ }
+
+ /**
+ * An <code>Event</code> object specifying information about the removed
+ * items.
+ *
+ * <p>
+ * This class provides information about the first removed item and the
+ * number of removed items.
+ * </p>
+ */
+ protected static class BaseItemRemoveEvent extends
+ BaseItemAddOrRemoveEvent implements
+ Container.Indexed.ItemRemoveEvent {
+
+ public BaseItemRemoveEvent(Container source, Object itemId,
+ int index, int count) {
+ super(source, itemId, index, count);
+ }
+
+ @Override
+ public int getRemovedItemsCount() {
+ return getAffectedItemsCount();
+ }
+ }
+
/**
* Get an item even if filtered out.
*
@@ -898,36 +979,69 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE
* Notify item set change listeners that an item has been added to the
* container.
*
- * Unless subclasses specify otherwise, the default notification indicates a
- * full refresh.
- *
* @param postion
- * position of the added item in the view (if visible)
+ * position of the added item in the view
* @param itemId
* id of the added item
* @param item
* the added item
*/
protected void fireItemAdded(int position, ITEMIDTYPE itemId, ITEMCLASS item) {
- fireItemSetChange();
+ fireItemsAdded(position, itemId, 1);
+ }
+
+ /**
+ * Notify item set change listeners that items has been added to the
+ * container.
+ *
+ * @param firstPosition
+ * position of the first visible added item in the view
+ * @param firstItemId
+ * id of the first visible added item
+ * @param numberOfItems
+ * the number of visible added items
+ */
+ protected void fireItemsAdded(int firstPosition, ITEMIDTYPE firstItemId,
+ int numberOfItems) {
+ BaseItemAddEvent addEvent = new BaseItemAddEvent(this,
+ firstItemId, firstPosition, numberOfItems);
+ fireItemSetChange(addEvent);
}
/**
* Notify item set change listeners that an item has been removed from the
* container.
*
- * Unless subclasses specify otherwise, the default notification indicates a
- * full refresh.
+ * @param position
+ * position of the removed item in the view prior to removal
*
- * @param postion
- * position of the removed item in the view prior to removal (if
- * was visible)
* @param itemId
* id of the removed item, of type {@link Object} to satisfy
* {@link Container#removeItem(Object)} API
*/
protected void fireItemRemoved(int position, Object itemId) {
- fireItemSetChange();
+ fireItemsRemoved(position, itemId, 1);
+ }
+
+ /**
+ * Notify item set change listeners that items has been removed from the
+ * container.
+ *
+ * @param firstPosition
+ * position of the first visible removed item in the view prior
+ * to removal
+ * @param firstItemId
+ * id of the first visible removed item, of type {@link Object}
+ * to satisfy {@link Container#removeItem(Object)} API
+ * @param numberOfItems
+ * the number of removed visible items
+ *
+ */
+ protected void fireItemsRemoved(int firstPosition, Object firstItemId,
+ int numberOfItems) {
+ BaseItemRemoveEvent removeEvent = new BaseItemRemoveEvent(this,
+ firstItemId, firstPosition, numberOfItems);
+ fireItemSetChange(removeEvent);
}
// visible and filtered item identifier lists
@@ -946,6 +1060,21 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE
}
/**
+ * Returns the item id of the first visible item after filtering. 'Null' is
+ * returned if there is no visible items.
+ *
+ * For internal use only.
+ *
+ * @return item id of the first visible item
+ */
+ protected ITEMIDTYPE getFirstVisibleItem() {
+ if (!getVisibleItemIds().isEmpty()) {
+ return getVisibleItemIds().get(0);
+ }
+ return null;
+ }
+
+ /**
* Returns true is the container has active filters.
*
* @return true if the container is currently filtered
diff --git a/server/src/com/vaadin/data/util/IndexedContainer.java b/server/src/com/vaadin/data/util/IndexedContainer.java
index d7bf70caf6..5d20919208 100644
--- a/server/src/com/vaadin/data/util/IndexedContainer.java
+++ b/server/src/com/vaadin/data/util/IndexedContainer.java
@@ -226,6 +226,7 @@ public class IndexedContainer extends
@Override
public boolean removeAllItems() {
int origSize = size();
+ Object firstItem = getFirstVisibleItem();
internalRemoveAllItems();
@@ -235,7 +236,7 @@ public class IndexedContainer extends
// filtered out items were removed or not
if (origSize != 0) {
// Sends a change event
- fireItemSetChange();
+ fireItemsRemoved(0, firstItem, origSize);
}
return true;
@@ -620,8 +621,7 @@ public class IndexedContainer extends
@Override
protected void fireItemAdded(int position, Object itemId, Item item) {
if (position >= 0) {
- fireItemSetChange(new IndexedContainer.ItemSetChangeEvent(this,
- position));
+ super.fireItemAdded(position, itemId, item);
}
}
@@ -1211,4 +1211,5 @@ public class IndexedContainer extends
public Collection<Filter> getContainerFilters() {
return super.getContainerFilters();
}
+
}
diff --git a/server/src/com/vaadin/event/ConnectorActionManager.java b/server/src/com/vaadin/event/ConnectorActionManager.java
new file mode 100644
index 0000000000..297f78f179
--- /dev/null
+++ b/server/src/com/vaadin/event/ConnectorActionManager.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.event;
+
+import java.util.logging.Logger;
+
+import com.vaadin.event.Action.Container;
+import com.vaadin.server.ClientConnector;
+import com.vaadin.server.VariableOwner;
+import com.vaadin.server.communication.ServerRpcHandler;
+import com.vaadin.ui.Component;
+
+/**
+ * An ActionManager connected to a connector. Takes care of verifying that the
+ * connector can receive events before triggering an action.
+ * <p>
+ * This is mostly a workaround until shortcut actions are re-implemented in a
+ * more sensible way.
+ *
+ * @since 7.1.8
+ * @author Vaadin Ltd
+ */
+public class ConnectorActionManager extends ActionManager {
+
+ private ClientConnector connector;
+
+ /**
+ * Initialize an action manager for the given connector.
+ *
+ * @param connector
+ * the owner of this action manager
+ */
+ public ConnectorActionManager(ClientConnector connector) {
+ super();
+ this.connector = connector;
+ }
+
+ /**
+ * Initialize an action manager for the given connector using the given
+ * viewer.
+ *
+ * @param connector
+ * the owner of this action manager
+ * @param viewer
+ * the viewer connected
+ */
+ public <T extends Component & Container & VariableOwner> ConnectorActionManager(
+ ClientConnector connector, T viewer) {
+ super(viewer);
+ this.connector = connector;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.event.ActionManager#handleAction(com.vaadin.event.Action,
+ * java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void handleAction(Action action, Object sender, Object target) {
+ if (!connector.isConnectorEnabled()) {
+ getLogger().warning(
+ ServerRpcHandler.getIgnoredDisabledError("action",
+ connector));
+ return;
+ }
+
+ super.handleAction(action, sender, target);
+ }
+
+ private static final Logger getLogger() {
+ return Logger.getLogger(ConnectorActionManager.class.getName());
+ }
+
+}
diff --git a/server/src/com/vaadin/event/UIEvents.java b/server/src/com/vaadin/event/UIEvents.java
new file mode 100644
index 0000000000..321bfc9251
--- /dev/null
+++ b/server/src/com/vaadin/event/UIEvents.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.event;
+
+import java.io.Serializable;
+import java.lang.reflect.Method;
+
+import com.vaadin.ui.Component;
+import com.vaadin.ui.UI;
+import com.vaadin.util.ReflectTools;
+
+/**
+ * A class that contains events, listeners and handlers specific to the
+ * {@link UI} class.
+ *
+ * @since 7.2
+ * @author Vaadin Ltd
+ */
+public interface UIEvents {
+
+ /**
+ * A {@link PollListener} receives and handles {@link PollEvent PollEvents}
+ * fired by {@link PollNotifier PollNotifiers}.
+ *
+ * @since 7.2
+ * @author Vaadin Ltd
+ */
+ public interface PollListener extends Serializable {
+ public static final Method POLL_METHOD = ReflectTools.findMethod(
+ PollListener.class, "poll", PollEvent.class);
+
+ /**
+ * A poll request has been received by the server.
+ *
+ * @param event
+ * poll event
+ */
+ public void poll(PollEvent event);
+ }
+
+ /**
+ * An event that is fired whenever a client polls the server for
+ * asynchronous UI updates.
+ *
+ * @since 7.2
+ * @author Vaadin Ltd
+ */
+ public static class PollEvent extends Component.Event {
+ public PollEvent(UI ui) {
+ super(ui);
+ }
+
+ /**
+ * Get the {@link UI} instance that received the poll request.
+ *
+ * @return the {@link UI} that received the poll request. Never
+ * <code>null</code>.
+ */
+ public UI getUI() {
+ /*
+ * This cast is safe to make, since this class' constructor
+ * constrains the source to be a UI instance.
+ */
+ return (UI) getComponent();
+ }
+ }
+
+ /**
+ * The interface for adding and removing {@link PollEvent} listeners.
+ * <p>
+ * By implementing this interface, a class publicly announces that it is
+ * able to send {@link PollEvent PollEvents} whenever the client sends a
+ * periodic poll message to the client, to check for asynchronous
+ * server-side modifications.
+ *
+ * @since 7.2
+ * @see UI#setPollInterval(int)
+ */
+ public interface PollNotifier extends Serializable {
+ /**
+ * Add a poll listener.
+ * <p>
+ * The listener is called whenever the client polls the server for
+ * asynchronous UI updates.
+ *
+ * @see UI#setPollInterval(int)
+ * @see #removePollListener(PollListener)
+ * @param listener
+ * the {@link PollListener} to add
+ */
+ public void addPollListener(PollListener listener);
+
+ /**
+ * Remove a poll listener.
+ *
+ * @see #addPollListener(PollListener)
+ * @param listener
+ * the listener to be removed
+ */
+ public void removePollListener(PollListener listener);
+ }
+
+}
diff --git a/server/src/com/vaadin/server/ClientMethodInvocation.java b/server/src/com/vaadin/server/ClientMethodInvocation.java
index 9c8318b064..3a6a87a53c 100644
--- a/server/src/com/vaadin/server/ClientMethodInvocation.java
+++ b/server/src/com/vaadin/server/ClientMethodInvocation.java
@@ -16,10 +16,16 @@
package com.vaadin.server;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
+import org.json.JSONArray;
+import org.json.JSONException;
+
/**
* Internal class for keeping track of pending server to client method
* invocations for a Connector.
@@ -80,4 +86,52 @@ public class ClientMethodInvocation implements Serializable,
}
return Long.signum(getSequenceNumber() - o.getSequenceNumber());
}
+
+ private void writeObject(ObjectOutputStream stream) throws IOException {
+ // Need to have custom serialization and deserialization because the
+ // constructor allows parameters of any type with Object[]. Thus, having
+ // parameters that are not Serializable will lead to
+ // NotSerializableException when trying to serialize this class.
+ // An example case of this is in #12532 (JavaScriptCallbackHelper ->
+ // JSONArray as parameter and not Serializable), for which this
+ // hac..workaround is implemented.
+
+ // Goes through the parameter types, and apply "custom serialization" to
+ // the ones that are not Serializable by changing them into something
+ // that is Serializable. On deserialization (readObject-method below)
+ // the process should be reversed.
+
+ // Easy way for implementing serialization & deserialization is by
+ // writing/parsing the object's content as string.
+ for (int i = 0; i < parameterTypes.length; i++) {
+ Type type = parameterTypes[i];
+ if (type instanceof Class<?>) {
+ Class<?> clazz = (Class<?>) type;
+ if (JSONArray.class.isAssignableFrom(clazz)) {
+ parameters[i] = ((JSONArray) parameters[i]).toString();
+ }
+ }
+ }
+ stream.defaultWriteObject();
+ }
+
+ private void readObject(ObjectInputStream stream) throws IOException,
+ ClassNotFoundException {
+ // Reverses the serialization done in writeObject. Basically just
+ // parsing the serialized type back to the non-serializable type.
+ stream.defaultReadObject();
+ for (int i = 0; i < parameterTypes.length; i++) {
+ Type type = parameterTypes[i];
+ if (type instanceof Class<?>) {
+ Class<?> clazz = (Class<?>) type;
+ if (JSONArray.class.isAssignableFrom(clazz)) {
+ try {
+ parameters[i] = new JSONArray(((String) parameters[i]));
+ } catch (JSONException e) {
+ throw new IOException(e);
+ }
+ }
+ }
+ }
+ }
} \ No newline at end of file
diff --git a/server/src/com/vaadin/server/Constants.java b/server/src/com/vaadin/server/Constants.java
index 8c379abe06..b0841da314 100644
--- a/server/src/com/vaadin/server/Constants.java
+++ b/server/src/com/vaadin/server/Constants.java
@@ -67,7 +67,7 @@ public interface Constants {
// Keep the version number in sync with push/build.xml and other locations
// listed in that file
- static final String REQUIRED_ATMOSPHERE_VERSION = "1.0.14.vaadin4";
+ static final String REQUIRED_ATMOSPHERE_RUNTIME_VERSION = "1.0.18.vaadin1";
static final String INVALID_ATMOSPHERE_VERSION_WARNING = "\n"
+ "=================================================================\n"
@@ -82,7 +82,7 @@ public interface Constants {
+ "If using a dependency management system, please add a dependency\n"
+ "to vaadin-push.\n"
+ "If managing dependencies manually, please make sure Atmosphere\n"
- + REQUIRED_ATMOSPHERE_VERSION
+ + REQUIRED_ATMOSPHERE_RUNTIME_VERSION
+ " is included on the classpath.\n"
+ "Will fall back to using "
+ PushMode.class.getSimpleName()
diff --git a/server/src/com/vaadin/server/ErrorHandlingRunnable.java b/server/src/com/vaadin/server/ErrorHandlingRunnable.java
new file mode 100644
index 0000000000..3970a14ee8
--- /dev/null
+++ b/server/src/com/vaadin/server/ErrorHandlingRunnable.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.server;
+
+import java.io.Serializable;
+
+/**
+ * Defines the interface to handle exceptions thrown during the execution of a
+ * FutureAccess.
+ *
+ * @since 7.1.8
+ * @author Vaadin Ltd
+ */
+public interface ErrorHandlingRunnable extends Runnable, Serializable {
+
+ /**
+ * Handles exceptions thrown during the execution of a FutureAccess.
+ *
+ * @since 7.1.8
+ * @param exception
+ * the thrown exception.
+ */
+ public void handleError(Exception exception);
+
+}
diff --git a/server/src/com/vaadin/server/VaadinPortlet.java b/server/src/com/vaadin/server/VaadinPortlet.java
index adef90c45f..a41f301219 100644
--- a/server/src/com/vaadin/server/VaadinPortlet.java
+++ b/server/src/com/vaadin/server/VaadinPortlet.java
@@ -422,16 +422,37 @@ public class VaadinPortlet extends GenericPortlet implements Constants,
* @return A wrapped version of the PorletRequest
*/
protected VaadinPortletRequest createVaadinRequest(PortletRequest request) {
- String portalInfo = request.getPortalContext().getPortalInfo()
- .toLowerCase();
- if (portalInfo.contains("liferay")) {
+ if (isLiferay(request)) {
return new VaadinLiferayRequest(request, getService());
- } else if (portalInfo.contains("gatein")) {
+ } else if (isGateIn(request)) {
return new VaadinGateinRequest(request, getService());
} else {
return new VaadinPortletRequest(request, getService());
}
+ }
+ /**
+ * Returns true if the portlet request is from Liferay.
+ *
+ * @param request
+ * @return True if Liferay, false otherwise
+ */
+ private static boolean isLiferay(PortletRequest request) {
+ String portalInfo = request.getPortalContext().getPortalInfo()
+ .toLowerCase();
+ return portalInfo.contains("liferay");
+ }
+
+ /**
+ * Returns true if the portlet request if from GateIn
+ *
+ * @param request
+ * @return True if GateIn, false otherwise
+ */
+ private static boolean isGateIn(PortletRequest request) {
+ String portalInfo = request.getPortalContext().getPortalInfo()
+ .toLowerCase();
+ return portalInfo.contains("gatein");
}
private VaadinPortletResponse createVaadinResponse(PortletResponse response) {
diff --git a/server/src/com/vaadin/server/VaadinService.java b/server/src/com/vaadin/server/VaadinService.java
index cf6c806ead..aff0124d16 100644
--- a/server/src/com/vaadin/server/VaadinService.java
+++ b/server/src/com/vaadin/server/VaadinService.java
@@ -1736,6 +1736,13 @@ public abstract class VaadinService implements Serializable {
.getCurrentInstances());
CurrentInstance.setCurrent(session);
pendingAccess.run();
+
+ try {
+ pendingAccess.get();
+
+ } catch (Exception exception) {
+ pendingAccess.handleError(exception);
+ }
}
}
} finally {
diff --git a/server/src/com/vaadin/server/VaadinServlet.java b/server/src/com/vaadin/server/VaadinServlet.java
index d34cd3bf0e..baf97d23d9 100644
--- a/server/src/com/vaadin/server/VaadinServlet.java
+++ b/server/src/com/vaadin/server/VaadinServlet.java
@@ -426,8 +426,6 @@ public class VaadinServlet extends HttpServlet implements Constants {
outWriter.print(output);
outWriter.flush();
outWriter.close();
- out.flush();
-
}
/**
diff --git a/server/src/com/vaadin/server/VaadinServletService.java b/server/src/com/vaadin/server/VaadinServletService.java
index 3b39f17849..818f2e87c6 100644
--- a/server/src/com/vaadin/server/VaadinServletService.java
+++ b/server/src/com/vaadin/server/VaadinServletService.java
@@ -66,11 +66,11 @@ public class VaadinServletService extends VaadinService {
private static boolean checkAtmosphereSupport() {
try {
String rawVersion = Version.getRawVersion();
- if (!Constants.REQUIRED_ATMOSPHERE_VERSION.equals(rawVersion)) {
+ if (!Constants.REQUIRED_ATMOSPHERE_RUNTIME_VERSION.equals(rawVersion)) {
getLogger().log(
Level.WARNING,
Constants.INVALID_ATMOSPHERE_VERSION_WARNING,
- new Object[] { Constants.REQUIRED_ATMOSPHERE_VERSION,
+ new Object[] { Constants.REQUIRED_ATMOSPHERE_RUNTIME_VERSION,
rawVersion });
}
return true;
diff --git a/server/src/com/vaadin/server/VaadinSession.java b/server/src/com/vaadin/server/VaadinSession.java
index 8f15dacc98..f34721944a 100644
--- a/server/src/com/vaadin/server/VaadinSession.java
+++ b/server/src/com/vaadin/server/VaadinSession.java
@@ -16,6 +16,8 @@
package com.vaadin.server;
+import java.io.IOException;
+import java.io.ObjectInputStream;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.Collection;
@@ -33,6 +35,7 @@ import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Level;
import java.util.logging.Logger;
import javax.portlet.PortletSession;
@@ -83,6 +86,7 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable {
private final Map<Class<?>, CurrentInstance> instances = CurrentInstance
.getInstances(true);
private final VaadinSession session;
+ private Runnable runnable;
/**
* Creates an instance for the given runnable
@@ -97,6 +101,7 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable {
public FutureAccess(VaadinSession session, Runnable runnable) {
super(runnable, null);
this.session = session;
+ this.runnable = runnable;
}
@Override
@@ -126,6 +131,36 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable {
public Map<Class<?>, CurrentInstance> getCurrentInstances() {
return instances;
}
+
+ /**
+ * Handles exceptions thrown during the execution of this task.
+ *
+ * @since 7.1.8
+ * @param exception
+ * the thrown exception.
+ */
+ public void handleError(Exception exception) {
+ try {
+ if (runnable instanceof ErrorHandlingRunnable) {
+ ErrorHandlingRunnable errorHandlingRunnable = (ErrorHandlingRunnable) runnable;
+
+ errorHandlingRunnable.handleError(exception);
+ } else {
+ ErrorEvent errorEvent = new ErrorEvent(exception);
+
+ ErrorHandler errorHandler = ErrorEvent
+ .findErrorHandler(session);
+
+ if (errorHandler == null) {
+ errorHandler = new DefaultErrorHandler();
+ }
+
+ errorHandler.error(errorEvent);
+ }
+ } catch (Exception e) {
+ getLogger().log(Level.SEVERE, e.getMessage(), e);
+ }
+ }
}
/**
@@ -202,10 +237,10 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable {
* session is serialized as long as it doesn't happen while some other
* thread has the lock.
*/
- private transient ConcurrentLinkedQueue<FutureAccess> pendingAccessQueue;
+ private transient ConcurrentLinkedQueue<FutureAccess> pendingAccessQueue = new ConcurrentLinkedQueue<FutureAccess>();
/**
- * Create a new service session tied to a Vaadin service
+ * Creates a new VaadinSession tied to a VaadinService.
*
* @param service
* the Vaadin service for the new session
@@ -1260,18 +1295,15 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable {
}
/**
- * Gets the queue of tasks submitted using {@link #access(Runnable)}.
+ * Gets the queue of tasks submitted using {@link #access(Runnable)}. It is
+ * safe to call this method and access the returned queue without holding
+ * the {@link #lock() session lock}.
*
* @since 7.1
*
- * @return the pending access queue
+ * @return the queue of pending access tasks
*/
public Queue<FutureAccess> getPendingAccessQueue() {
- if (pendingAccessQueue == null) {
- // pendingAccessQueue is transient, so will be null after
- // deserialization
- pendingAccessQueue = new ConcurrentLinkedQueue<FutureAccess>();
- }
return pendingAccessQueue;
}
@@ -1288,6 +1320,16 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable {
}
/**
+ * Override default deserialization logic to account for transient
+ * {@link #pendingAccessQueue}.
+ */
+ private void readObject(ObjectInputStream stream) throws IOException,
+ ClassNotFoundException {
+ stream.defaultReadObject();
+ pendingAccessQueue = new ConcurrentLinkedQueue<FutureAccess>();
+ }
+
+ /**
* Finds the UI with the corresponding embed id.
*
* @since 7.2
diff --git a/server/src/com/vaadin/server/communication/PortletBootstrapHandler.java b/server/src/com/vaadin/server/communication/PortletBootstrapHandler.java
index 2458951ada..dd6d3c9283 100644
--- a/server/src/com/vaadin/server/communication/PortletBootstrapHandler.java
+++ b/server/src/com/vaadin/server/communication/PortletBootstrapHandler.java
@@ -31,6 +31,7 @@ import org.json.JSONObject;
import com.vaadin.server.BootstrapHandler;
import com.vaadin.server.PaintException;
import com.vaadin.server.VaadinPortlet;
+import com.vaadin.server.VaadinPortlet.VaadinLiferayRequest;
import com.vaadin.server.VaadinPortletRequest;
import com.vaadin.server.VaadinPortletResponse;
import com.vaadin.server.VaadinRequest;
@@ -98,6 +99,8 @@ public class PortletBootstrapHandler extends BootstrapHandler {
JSONObject parameters = super.getApplicationParameters(context);
VaadinPortletResponse response = (VaadinPortletResponse) context
.getResponse();
+ VaadinPortletRequest request = (VaadinPortletRequest) context
+ .getRequest();
MimeResponse portletResponse = (MimeResponse) response
.getPortletResponse();
ResourceURL resourceURL = portletResponse.createResourceURL();
@@ -108,6 +111,14 @@ public class PortletBootstrapHandler extends BootstrapHandler {
parameters
.put(ApplicationConstants.SERVICE_URL_PATH_AS_PARAMETER, true);
+ // If we are running in Liferay then we need to prefix all parameters
+ // with the portlet namespace
+ if (request instanceof VaadinLiferayRequest) {
+ parameters.put(
+ ApplicationConstants.SERVICE_URL_PARAMETER_NAMESPACE,
+ response.getPortletResponse().getNamespace());
+ }
+
return parameters;
}
} \ No newline at end of file
diff --git a/server/src/com/vaadin/server/communication/PushHandler.java b/server/src/com/vaadin/server/communication/PushHandler.java
index 81dd00084d..09428e47a9 100644
--- a/server/src/com/vaadin/server/communication/PushHandler.java
+++ b/server/src/com/vaadin/server/communication/PushHandler.java
@@ -31,6 +31,8 @@ import org.atmosphere.cpr.AtmosphereResourceEvent;
import org.atmosphere.cpr.AtmosphereResourceEventListenerAdapter;
import org.json.JSONException;
+import com.vaadin.server.ErrorEvent;
+import com.vaadin.server.ErrorHandler;
import com.vaadin.server.LegacyCommunicationManager.InvalidUIDLSecurityKeyException;
import com.vaadin.server.ServiceException;
import com.vaadin.server.ServletPortletHelper;
@@ -262,11 +264,12 @@ public class PushHandler extends AtmosphereResourceEventListenerAdapter
return;
}
+ UI ui = null;
session.lock();
try {
VaadinSession.setCurrent(session);
// Sets UI.currentInstance
- final UI ui = service.findUI(vaadinRequest);
+ ui = service.findUI(vaadinRequest);
if (ui == null) {
sendNotificationAndDisconnect(resource,
UidlRequestHandler.getUINotFoundErrorJSON(service,
@@ -274,14 +277,63 @@ public class PushHandler extends AtmosphereResourceEventListenerAdapter
} else {
callback.run(resource, ui);
}
- } catch (IOException e) {
- getLogger().log(Level.WARNING, "Error writing a push response",
- e);
+ } catch (final IOException e) {
+ callErrorHandler(session, e);
+ } catch (final Exception e) {
+ SystemMessages msg = service.getSystemMessages(
+ ServletPortletHelper.findLocale(null, null,
+ vaadinRequest), vaadinRequest);
+
+ AtmosphereResource errorResource = resource;
+ if (ui != null && ui.getPushConnection() != null) {
+ // We MUST use the opened push connection if there is one.
+ // Otherwise we will write the response to the wrong request
+ // when using streaming (the client -> server request
+ // instead of the opened push channel)
+ errorResource = ((AtmospherePushConnection) ui
+ .getPushConnection()).getResource();
+ }
+
+ sendNotificationAndDisconnect(
+ errorResource,
+ VaadinService.createCriticalNotificationJSON(
+ msg.getInternalErrorCaption(),
+ msg.getInternalErrorMessage(), null,
+ msg.getInternalErrorURL()));
+ callErrorHandler(session, e);
} finally {
- session.unlock();
+ try {
+ session.unlock();
+ } catch (Exception e) {
+ getLogger().log(Level.WARNING,
+ "Error while unlocking session", e);
+ // can't call ErrorHandler, we (hopefully) don't have a lock
+ }
}
} finally {
- service.requestEnd(vaadinRequest, null, session);
+ try {
+ service.requestEnd(vaadinRequest, null, session);
+ } catch (Exception e) {
+ getLogger().log(Level.WARNING, "Error while ending request", e);
+
+ // can't call ErrorHandler, we don't have a lock
+ }
+ }
+ }
+
+ /**
+ * Call the session's {@link ErrorHandler}, if it has one, with the given
+ * exception wrapped in an {@link ErrorEvent}.
+ */
+ private void callErrorHandler(VaadinSession session, Exception e) {
+ try {
+ ErrorHandler errorHandler = ErrorEvent.findErrorHandler(session);
+ if (errorHandler != null) {
+ errorHandler.error(new ErrorEvent(e));
+ }
+ } catch (Exception ex) {
+ // Let's not allow error handling to cause trouble; log fails
+ getLogger().log(Level.WARNING, "ErrorHandler call failed", ex);
}
}
diff --git a/server/src/com/vaadin/server/communication/ServerRpcHandler.java b/server/src/com/vaadin/server/communication/ServerRpcHandler.java
index eff9ceebf4..432a9ea893 100644
--- a/server/src/com/vaadin/server/communication/ServerRpcHandler.java
+++ b/server/src/com/vaadin/server/communication/ServerRpcHandler.java
@@ -248,15 +248,8 @@ public class ServerRpcHandler implements Serializable {
}
// Connector is disabled, log a warning and move to the next
- String msg = "Ignoring RPC call for disabled connector "
- + connector.getClass().getName();
- if (connector instanceof Component) {
- String caption = ((Component) connector).getCaption();
- if (caption != null) {
- msg += ", caption=" + caption;
- }
- }
- getLogger().warning(msg);
+ getLogger().warning(
+ getIgnoredDisabledError("RPC call", connector));
continue;
}
// DragAndDropService has null UI
@@ -495,4 +488,26 @@ public class ServerRpcHandler implements Serializable {
private static final Logger getLogger() {
return Logger.getLogger(ServerRpcHandler.class.getName());
}
+
+ /**
+ * Generates an error message when the client is trying to to something
+ * ('what') with a connector which is disabled or invisible.
+ *
+ * @since 7.1.8
+ * @param connector
+ * the connector which is disabled (or invisible)
+ * @return an error message
+ */
+ public static String getIgnoredDisabledError(String what,
+ ClientConnector connector) {
+ String msg = "Ignoring " + what + " for disabled connector "
+ + connector.getClass().getName();
+ if (connector instanceof Component) {
+ String caption = ((Component) connector).getCaption();
+ if (caption != null) {
+ msg += ", caption=" + caption;
+ }
+ }
+ return msg;
+ }
}
diff --git a/server/src/com/vaadin/ui/AbstractComponent.java b/server/src/com/vaadin/ui/AbstractComponent.java
index 262d47af18..61bcf00ad8 100644
--- a/server/src/com/vaadin/ui/AbstractComponent.java
+++ b/server/src/com/vaadin/ui/AbstractComponent.java
@@ -27,6 +27,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.vaadin.event.ActionManager;
+import com.vaadin.event.ConnectorActionManager;
import com.vaadin.event.ShortcutListener;
import com.vaadin.server.AbstractClientConnector;
import com.vaadin.server.ComponentSizeValidator;
@@ -90,7 +91,7 @@ public abstract class AbstractComponent extends AbstractClientConnector
* Keeps track of the Actions added to this component; the actual
* handling/notifying is delegated, usually to the containing window.
*/
- private ActionManager actionManager;
+ private ConnectorActionManager actionManager;
private boolean visible = true;
@@ -929,7 +930,7 @@ public abstract class AbstractComponent extends AbstractClientConnector
*/
protected ActionManager getActionManager() {
if (actionManager == null) {
- actionManager = new ActionManager();
+ actionManager = new ConnectorActionManager(this);
setActionManagerViewer();
}
return actionManager;
diff --git a/server/src/com/vaadin/ui/Link.java b/server/src/com/vaadin/ui/Link.java
index cf8e1a9693..e1a47777bd 100644
--- a/server/src/com/vaadin/ui/Link.java
+++ b/server/src/com/vaadin/ui/Link.java
@@ -16,13 +16,10 @@
package com.vaadin.ui;
-import java.util.Map;
-
-import com.vaadin.server.PaintException;
-import com.vaadin.server.PaintTarget;
import com.vaadin.server.Resource;
import com.vaadin.shared.ui.BorderStyle;
import com.vaadin.shared.ui.link.LinkConstants;
+import com.vaadin.shared.ui.link.LinkState;
/**
* Link is used to create external or internal URL links.
@@ -31,7 +28,7 @@ import com.vaadin.shared.ui.link.LinkConstants;
* @since 3.0
*/
@SuppressWarnings("serial")
-public class Link extends AbstractComponent implements LegacyComponent {
+public class Link extends AbstractComponent {
/**
* @deprecated As of 7.0, use {@link BorderStyle#NONE} instead
@@ -51,14 +48,6 @@ public class Link extends AbstractComponent implements LegacyComponent {
@Deprecated
public static final BorderStyle TARGET_BORDER_DEFAULT = BorderStyle.DEFAULT;
- private String targetName;
-
- private BorderStyle targetBorder = BorderStyle.DEFAULT;
-
- private int targetWidth = -1;
-
- private int targetHeight = -1;
-
/**
* Creates a new link.
*/
@@ -105,43 +94,14 @@ public class Link extends AbstractComponent implements LegacyComponent {
setTargetBorder(border);
}
- /**
- * Paints the content of this component.
- *
- * @param target
- * the Paint Event.
- * @throws PaintException
- * if the paint operation failed.
- */
@Override
- public void paintContent(PaintTarget target) throws PaintException {
- if (getResource() == null) {
- return;
- }
-
- // Target window name
- final String name = getTargetName();
- if (name != null && name.length() > 0) {
- target.addAttribute("name", name);
- }
-
- // Target window size
- if (getTargetWidth() >= 0) {
- target.addAttribute("targetWidth", getTargetWidth());
- }
- if (getTargetHeight() >= 0) {
- target.addAttribute("targetHeight", getTargetHeight());
- }
-
- // Target window border
- switch (getTargetBorder()) {
- case MINIMAL:
- target.addAttribute("border", "minimal");
- break;
- case NONE:
- target.addAttribute("border", "none");
- break;
- }
+ protected LinkState getState() {
+ return (LinkState) super.getState();
+ }
+
+ @Override
+ protected LinkState getState(boolean markAsDirty) {
+ return (LinkState) super.getState(markAsDirty);
}
/**
@@ -150,7 +110,7 @@ public class Link extends AbstractComponent implements LegacyComponent {
* @return the target window border.
*/
public BorderStyle getTargetBorder() {
- return targetBorder;
+ return getState(false).targetBorder;
}
/**
@@ -159,7 +119,8 @@ public class Link extends AbstractComponent implements LegacyComponent {
* @return the target window height.
*/
public int getTargetHeight() {
- return targetHeight < 0 ? -1 : targetHeight;
+ return getState(false).targetHeight < 0 ? -1
+ : getState(false).targetHeight;
}
/**
@@ -169,7 +130,7 @@ public class Link extends AbstractComponent implements LegacyComponent {
* @return the target window name.
*/
public String getTargetName() {
- return targetName;
+ return getState(false).target;
}
/**
@@ -178,7 +139,8 @@ public class Link extends AbstractComponent implements LegacyComponent {
* @return the target window width.
*/
public int getTargetWidth() {
- return targetWidth < 0 ? -1 : targetWidth;
+ return getState(false).targetWidth < 0 ? -1
+ : getState(false).targetWidth;
}
/**
@@ -188,8 +150,7 @@ public class Link extends AbstractComponent implements LegacyComponent {
* the targetBorder to set.
*/
public void setTargetBorder(BorderStyle targetBorder) {
- this.targetBorder = targetBorder;
- markAsDirty();
+ getState().targetBorder = targetBorder;
}
/**
@@ -199,8 +160,7 @@ public class Link extends AbstractComponent implements LegacyComponent {
* the targetHeight to set.
*/
public void setTargetHeight(int targetHeight) {
- this.targetHeight = targetHeight;
- markAsDirty();
+ getState().targetHeight = targetHeight;
}
/**
@@ -210,8 +170,7 @@ public class Link extends AbstractComponent implements LegacyComponent {
* the targetName to set.
*/
public void setTargetName(String targetName) {
- this.targetName = targetName;
- markAsDirty();
+ getState().target = targetName;
}
/**
@@ -221,8 +180,7 @@ public class Link extends AbstractComponent implements LegacyComponent {
* the targetWidth to set.
*/
public void setTargetWidth(int targetWidth) {
- this.targetWidth = targetWidth;
- markAsDirty();
+ getState().targetWidth = targetWidth;
}
/**
@@ -244,8 +202,4 @@ public class Link extends AbstractComponent implements LegacyComponent {
setResource(LinkConstants.HREF_RESOURCE, resource);
}
- @Override
- public void changeVariables(Object source, Map<String, Object> variables) {
- // TODO Remove once LegacyComponent is no longer implemented
- }
}
diff --git a/server/src/com/vaadin/ui/Table.java b/server/src/com/vaadin/ui/Table.java
index bd2b7828de..32ed738697 100644
--- a/server/src/com/vaadin/ui/Table.java
+++ b/server/src/com/vaadin/ui/Table.java
@@ -427,6 +427,12 @@ public class Table extends AbstractSelect implements Action.Container,
private int currentPageFirstItemIndex = 0;
/**
+ * Index of the "first" item on the last page if a user has used
+ * setCurrentPageFirstItemIndex to scroll down. -1 if not set.
+ */
+ private int currentPageFirstItemIndexOnLastPage = -1;
+
+ /**
* Holds value of property selectable.
*/
private boolean selectable = false;
@@ -1477,12 +1483,14 @@ public class Table extends AbstractSelect implements Action.Container,
}
/*
- * FIXME #7607 Take somehow into account the case where we want to
- * scroll to the bottom so that the last row is completely visible even
- * if (table height) / (row height) is not an integer. Reverted the
- * original fix because of #8662 regression.
+ * If the new index is on the last page we set the index to be the first
+ * item on that last page and make a note of the real index for the
+ * client side to be able to move the scroll position to the correct
+ * position.
*/
+ int indexOnLastPage = -1;
if (newIndex > maxIndex) {
+ indexOnLastPage = newIndex;
newIndex = maxIndex;
}
@@ -1494,6 +1502,20 @@ public class Table extends AbstractSelect implements Action.Container,
currentPageFirstItemId = null;
}
currentPageFirstItemIndex = newIndex;
+
+ if (needsPageBufferReset) {
+ /*
+ * The flag currentPageFirstItemIndexOnLastPage denotes a user
+ * set scrolling position on the last page via
+ * setCurrentPageFirstItemIndex() and shouldn't be changed by
+ * the table component internally changing the firstvisible item
+ * on lazy row fetching. Doing so would make the scrolling
+ * position not be updated correctly when the lazy rows are
+ * finally rendered.
+ */
+ currentPageFirstItemIndexOnLastPage = indexOnLastPage;
+ }
+
} else {
// For containers not supporting indexes, we must iterate the
@@ -3447,6 +3469,8 @@ public class Table extends AbstractSelect implements Action.Container,
if (getCurrentPageFirstItemIndex() != 0 || getPageLength() > 0) {
target.addVariable(this, "firstvisible",
getCurrentPageFirstItemIndex());
+ target.addVariable(this, "firstvisibleonlastpage",
+ currentPageFirstItemIndexOnLastPage);
}
}
diff --git a/server/src/com/vaadin/ui/TreeTable.java b/server/src/com/vaadin/ui/TreeTable.java
index e150db9423..1c13eae8d9 100644
--- a/server/src/com/vaadin/ui/TreeTable.java
+++ b/server/src/com/vaadin/ui/TreeTable.java
@@ -590,11 +590,11 @@ public class TreeTable extends Table implements Hierarchical {
// does not change component hierarchy during paint
containerSupportsPartialUpdates = (newDataSource instanceof ItemSetChangeNotifier) && false;
- if (!(newDataSource instanceof Hierarchical)) {
+ if (newDataSource != null && !(newDataSource instanceof Hierarchical)) {
newDataSource = new ContainerHierarchicalWrapper(newDataSource);
}
- if (!(newDataSource instanceof Ordered)) {
+ if (newDataSource != null && !(newDataSource instanceof Ordered)) {
newDataSource = new HierarchicalContainerOrderedWrapper(
(Hierarchical) newDataSource);
}
diff --git a/server/src/com/vaadin/ui/UI.java b/server/src/com/vaadin/ui/UI.java
index 8beebb0f1e..a292e6b829 100644
--- a/server/src/com/vaadin/ui/UI.java
+++ b/server/src/com/vaadin/ui/UI.java
@@ -24,6 +24,7 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
+import java.util.logging.Level;
import java.util.logging.Logger;
import com.vaadin.event.Action;
@@ -31,10 +32,16 @@ import com.vaadin.event.Action.Handler;
import com.vaadin.event.ActionManager;
import com.vaadin.event.MouseEvents.ClickEvent;
import com.vaadin.event.MouseEvents.ClickListener;
+import com.vaadin.event.UIEvents.PollEvent;
+import com.vaadin.event.UIEvents.PollListener;
+import com.vaadin.event.UIEvents.PollNotifier;
import com.vaadin.navigator.Navigator;
import com.vaadin.server.ClientConnector;
import com.vaadin.server.ComponentSizeValidator;
import com.vaadin.server.ComponentSizeValidator.InvalidLayout;
+import com.vaadin.server.DefaultErrorHandler;
+import com.vaadin.server.ErrorHandler;
+import com.vaadin.server.ErrorHandlingRunnable;
import com.vaadin.server.LocaleService;
import com.vaadin.server.Page;
import com.vaadin.server.PaintException;
@@ -91,7 +98,8 @@ import com.vaadin.util.CurrentInstance;
* @since 7.0
*/
public abstract class UI extends AbstractSingleComponentContainer implements
- Action.Container, Action.Notifier, LegacyComponent, Focusable {
+ Action.Container, Action.Notifier, PollNotifier, LegacyComponent,
+ Focusable {
/**
* The application to which this UI belongs
@@ -163,10 +171,7 @@ public abstract class UI extends AbstractSingleComponentContainer implements
@Override
public void poll() {
- /*
- * No-op. This is only called to cause a server visit to check for
- * changes.
- */
+ fireEvent(new PollEvent(UI.this));
}
};
private DebugWindowServerRpc debugRpc = new DebugWindowServerRpc() {
@@ -405,9 +410,12 @@ public abstract class UI extends AbstractSingleComponentContainer implements
* @see #getSession()
*/
public void setSession(VaadinSession session) {
- if ((session == null) == (this.session == null)) {
+ if (session == null && this.session == null) {
+ throw new IllegalStateException(
+ "Session should never be set to null when UI.session is already null");
+ } else if (session != null && this.session != null) {
throw new IllegalStateException(
- "VaadinServiceSession has already been set. Old session: "
+ "Session has already been set. Old session: "
+ getSessionDetails(this.session)
+ ". New session: " + getSessionDetails(session)
+ ".");
@@ -1296,11 +1304,36 @@ public abstract class UI extends AbstractSingleComponentContainer implements
throw new UIDetachedException();
}
- return session.access(new Runnable() {
+ return session.access(new ErrorHandlingRunnable() {
@Override
public void run() {
accessSynchronously(runnable);
}
+
+ @Override
+ public void handleError(Exception exception) {
+ try {
+ if (runnable instanceof ErrorHandlingRunnable) {
+ ErrorHandlingRunnable errorHandlingRunnable = (ErrorHandlingRunnable) runnable;
+
+ errorHandlingRunnable.handleError(exception);
+ } else {
+ ConnectorErrorEvent errorEvent = new ConnectorErrorEvent(
+ UI.this, exception);
+
+ ErrorHandler errorHandler = com.vaadin.server.ErrorEvent
+ .findErrorHandler(UI.this);
+
+ if (errorHandler == null) {
+ errorHandler = new DefaultErrorHandler();
+ }
+
+ errorHandler.error(errorEvent);
+ }
+ } catch (Exception e) {
+ getLogger().log(Level.SEVERE, e.getMessage(), e);
+ }
+ }
});
}
@@ -1458,6 +1491,17 @@ public abstract class UI extends AbstractSingleComponentContainer implements
return getState(false).pollInterval;
}
+ @Override
+ public void addPollListener(PollListener listener) {
+ addListener(EventId.POLL, PollEvent.class, listener,
+ PollListener.POLL_METHOD);
+ }
+
+ @Override
+ public void removePollListener(PollListener listener) {
+ removeListener(EventId.POLL, PollEvent.class, listener);
+ }
+
/**
* Retrieves the object used for configuring the push channel.
*
diff --git a/server/src/com/vaadin/ui/Window.java b/server/src/com/vaadin/ui/Window.java
index 8e7c6dbc80..d3afdaacf1 100644
--- a/server/src/com/vaadin/ui/Window.java
+++ b/server/src/com/vaadin/ui/Window.java
@@ -82,6 +82,16 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
public void windowModeChanged(WindowMode newState) {
setWindowMode(newState);
}
+
+ @Override
+ public void windowMoved(int x, int y) {
+ if (x != getState(false).positionX) {
+ setPositionX(x);
+ }
+ if (y != getState(false).positionY) {
+ setPositionY(y);
+ }
+ }
};
/**
diff --git a/server/tests/src/com/vaadin/data/util/BeanItemContainerTest.java b/server/tests/src/com/vaadin/data/util/BeanItemContainerTest.java
index 3a2cb268b9..35f09fc8f3 100644
--- a/server/tests/src/com/vaadin/data/util/BeanItemContainerTest.java
+++ b/server/tests/src/com/vaadin/data/util/BeanItemContainerTest.java
@@ -10,8 +10,15 @@ import java.util.Map;
import junit.framework.Assert;
+import org.easymock.Capture;
+import org.easymock.EasyMock;
+
import com.vaadin.data.Container;
+import com.vaadin.data.Container.Indexed.ItemAddEvent;
+import com.vaadin.data.Container.Indexed.ItemRemoveEvent;
+import com.vaadin.data.Container.ItemSetChangeListener;
import com.vaadin.data.Item;
+import com.vaadin.data.util.filter.Compare;
/**
* Test basic functionality of BeanItemContainer.
@@ -737,4 +744,182 @@ public class BeanItemContainerTest extends AbstractBeanContainerTest {
// should throw exception
}
}
+
+ public void testItemAddedEvent() {
+ BeanItemContainer<Person> container = new BeanItemContainer<Person>(
+ Person.class);
+ Person bean = new Person("John");
+ ItemSetChangeListener addListener = createListenerMockFor(container);
+ addListener.containerItemSetChange(EasyMock.isA(ItemAddEvent.class));
+ EasyMock.replay(addListener);
+
+ container.addItem(bean);
+
+ EasyMock.verify(addListener);
+ }
+
+ public void testItemAddedEvent_AddedItem() {
+ BeanItemContainer<Person> container = new BeanItemContainer<Person>(
+ Person.class);
+ Person bean = new Person("John");
+ ItemSetChangeListener addListener = createListenerMockFor(container);
+ Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
+ EasyMock.replay(addListener);
+
+ container.addItem(bean);
+
+ assertEquals(bean, capturedEvent.getValue().getFirstItemId());
+ }
+
+ public void testItemAddedEvent_addItemAt_IndexOfAddedItem() {
+ BeanItemContainer<Person> container = new BeanItemContainer<Person>(
+ Person.class);
+ Person bean = new Person("John");
+ container.addItem(bean);
+ ItemSetChangeListener addListener = createListenerMockFor(container);
+ Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
+ EasyMock.replay(addListener);
+
+ container.addItemAt(1, new Person(""));
+
+ assertEquals(1, capturedEvent.getValue().getFirstIndex());
+ }
+
+ public void testItemAddedEvent_addItemAfter_IndexOfAddedItem() {
+ BeanItemContainer<Person> container = new BeanItemContainer<Person>(
+ Person.class);
+ Person bean = new Person("John");
+ container.addItem(bean);
+ ItemSetChangeListener addListener = createListenerMockFor(container);
+ Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
+ EasyMock.replay(addListener);
+
+ container.addItemAfter(bean, new Person(""));
+
+ assertEquals(1, capturedEvent.getValue().getFirstIndex());
+ }
+
+ public void testItemAddedEvent_amountOfAddedItems() {
+ BeanItemContainer<Person> container = new BeanItemContainer<Person>(
+ Person.class);
+ ItemSetChangeListener addListener = createListenerMockFor(container);
+ Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
+ EasyMock.replay(addListener);
+ List<Person> beans = Arrays.asList(new Person("Jack"), new Person(
+ "John"));
+
+ container.addAll(beans);
+
+ assertEquals(2, capturedEvent.getValue().getAddedItemsCount());
+ }
+
+ public void testItemAddedEvent_someItemsAreFiltered_amountOfAddedItemsIsReducedByAmountOfFilteredItems() {
+ BeanItemContainer<Person> container = new BeanItemContainer<Person>(
+ Person.class);
+ ItemSetChangeListener addListener = createListenerMockFor(container);
+ Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
+ EasyMock.replay(addListener);
+ List<Person> beans = Arrays.asList(new Person("Jack"), new Person(
+ "John"));
+ container.addFilter(new Compare.Equal("name", "John"));
+
+ container.addAll(beans);
+
+ assertEquals(1, capturedEvent.getValue().getAddedItemsCount());
+ }
+
+ public void testItemAddedEvent_someItemsAreFiltered_addedItemIsTheFirstVisibleItem() {
+ BeanItemContainer<Person> container = new BeanItemContainer<Person>(
+ Person.class);
+ Person bean = new Person("John");
+ ItemSetChangeListener addListener = createListenerMockFor(container);
+ Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
+ EasyMock.replay(addListener);
+ List<Person> beans = Arrays.asList(new Person("Jack"), bean);
+ container.addFilter(new Compare.Equal("name", "John"));
+
+ container.addAll(beans);
+
+ assertEquals(bean, capturedEvent.getValue().getFirstItemId());
+ }
+
+ public void testItemRemovedEvent() {
+ BeanItemContainer<Person> container = new BeanItemContainer<Person>(
+ Person.class);
+ Person bean = new Person("John");
+ container.addItem(bean);
+ ItemSetChangeListener removeListener = createListenerMockFor(container);
+ removeListener.containerItemSetChange(EasyMock
+ .isA(ItemRemoveEvent.class));
+ EasyMock.replay(removeListener);
+
+ container.removeItem(bean);
+
+ EasyMock.verify(removeListener);
+ }
+
+ public void testItemRemovedEvent_RemovedItem() {
+ BeanItemContainer<Person> container = new BeanItemContainer<Person>(
+ Person.class);
+ Person bean = new Person("John");
+ container.addItem(bean);
+ ItemSetChangeListener removeListener = createListenerMockFor(container);
+ Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
+ EasyMock.replay(removeListener);
+
+ container.removeItem(bean);
+
+ assertEquals(bean, capturedEvent.getValue().getFirstItemId());
+ }
+
+ public void testItemRemovedEvent_indexOfRemovedItem() {
+ BeanItemContainer<Person> container = new BeanItemContainer<Person>(
+ Person.class);
+ container.addItem(new Person("Jack"));
+ Person secondBean = new Person("John");
+ container.addItem(secondBean);
+ ItemSetChangeListener removeListener = createListenerMockFor(container);
+ Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
+ EasyMock.replay(removeListener);
+
+ container.removeItem(secondBean);
+
+ assertEquals(1, capturedEvent.getValue().getFirstIndex());
+ }
+
+ public void testItemRemovedEvent_amountOfRemovedItems() {
+ BeanItemContainer<Person> container = new BeanItemContainer<Person>(
+ Person.class);
+ container.addItem(new Person("Jack"));
+ container.addItem(new Person("John"));
+ ItemSetChangeListener removeListener = createListenerMockFor(container);
+ Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
+ EasyMock.replay(removeListener);
+
+ container.removeAllItems();
+
+ assertEquals(2, capturedEvent.getValue().getRemovedItemsCount());
+ }
+
+ private Capture<ItemAddEvent> captureAddEvent(
+ ItemSetChangeListener addListener) {
+ Capture<ItemAddEvent> capturedEvent = new Capture<ItemAddEvent>();
+ addListener.containerItemSetChange(EasyMock.capture(capturedEvent));
+ return capturedEvent;
+ }
+
+ private Capture<ItemRemoveEvent> captureRemoveEvent(
+ ItemSetChangeListener removeListener) {
+ Capture<ItemRemoveEvent> capturedEvent = new Capture<ItemRemoveEvent>();
+ removeListener.containerItemSetChange(EasyMock.capture(capturedEvent));
+ return capturedEvent;
+ }
+
+ private ItemSetChangeListener createListenerMockFor(
+ BeanItemContainer<Person> container) {
+ ItemSetChangeListener listener = EasyMock
+ .createNiceMock(ItemSetChangeListener.class);
+ container.addItemSetChangeListener(listener);
+ return listener;
+ }
}
diff --git a/server/tests/src/com/vaadin/data/util/TestIndexedContainer.java b/server/tests/src/com/vaadin/data/util/TestIndexedContainer.java
index 09e5a26c15..5c78965092 100644
--- a/server/tests/src/com/vaadin/data/util/TestIndexedContainer.java
+++ b/server/tests/src/com/vaadin/data/util/TestIndexedContainer.java
@@ -4,6 +4,12 @@ import java.util.List;
import junit.framework.Assert;
+import org.easymock.Capture;
+import org.easymock.EasyMock;
+
+import com.vaadin.data.Container.Indexed.ItemAddEvent;
+import com.vaadin.data.Container.Indexed.ItemRemoveEvent;
+import com.vaadin.data.Container.ItemSetChangeListener;
import com.vaadin.data.Item;
public class TestIndexedContainer extends AbstractInMemoryContainerTest {
@@ -271,6 +277,113 @@ public class TestIndexedContainer extends AbstractInMemoryContainerTest {
counter.assertNone();
}
+ public void testItemAddedEvent() {
+ IndexedContainer container = new IndexedContainer();
+ ItemSetChangeListener addListener = createListenerMockFor(container);
+ addListener.containerItemSetChange(EasyMock.isA(ItemAddEvent.class));
+ EasyMock.replay(addListener);
+
+ container.addItem();
+
+ EasyMock.verify(addListener);
+ }
+
+ public void testItemAddedEvent_AddedItem() {
+ IndexedContainer container = new IndexedContainer();
+ ItemSetChangeListener addListener = createListenerMockFor(container);
+ Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
+ EasyMock.replay(addListener);
+
+ Object itemId = container.addItem();
+
+ assertEquals(itemId, capturedEvent.getValue().getFirstItemId());
+ }
+
+ public void testItemAddedEvent_IndexOfAddedItem() {
+ IndexedContainer container = new IndexedContainer();
+ ItemSetChangeListener addListener = createListenerMockFor(container);
+ container.addItem();
+ Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
+ EasyMock.replay(addListener);
+
+ Object itemId = container.addItemAt(1);
+
+ assertEquals(1, capturedEvent.getValue().getFirstIndex());
+ }
+
+ public void testItemRemovedEvent() {
+ IndexedContainer container = new IndexedContainer();
+ Object itemId = container.addItem();
+ ItemSetChangeListener removeListener = createListenerMockFor(container);
+ removeListener.containerItemSetChange(EasyMock
+ .isA(ItemRemoveEvent.class));
+ EasyMock.replay(removeListener);
+
+ container.removeItem(itemId);
+
+ EasyMock.verify(removeListener);
+ }
+
+ public void testItemRemovedEvent_RemovedItem() {
+ IndexedContainer container = new IndexedContainer();
+ Object itemId = container.addItem();
+ ItemSetChangeListener removeListener = createListenerMockFor(container);
+ Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
+ EasyMock.replay(removeListener);
+
+ container.removeItem(itemId);
+
+ assertEquals(itemId, capturedEvent.getValue().getFirstItemId());
+ }
+
+ public void testItemRemovedEvent_indexOfRemovedItem() {
+ IndexedContainer container = new IndexedContainer();
+ container.addItem();
+ Object secondItemId = container.addItem();
+ ItemSetChangeListener removeListener = createListenerMockFor(container);
+ Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
+ EasyMock.replay(removeListener);
+
+ container.removeItem(secondItemId);
+
+ assertEquals(1, capturedEvent.getValue().getFirstIndex());
+ }
+
+ public void testItemRemovedEvent_amountOfRemovedItems() {
+ IndexedContainer container = new IndexedContainer();
+ container.addItem();
+ container.addItem();
+ ItemSetChangeListener removeListener = createListenerMockFor(container);
+ Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
+ EasyMock.replay(removeListener);
+
+ container.removeAllItems();
+
+ assertEquals(2, capturedEvent.getValue().getRemovedItemsCount());
+ }
+
+ private Capture<ItemAddEvent> captureAddEvent(
+ ItemSetChangeListener addListener) {
+ Capture<ItemAddEvent> capturedEvent = new Capture<ItemAddEvent>();
+ addListener.containerItemSetChange(EasyMock.capture(capturedEvent));
+ return capturedEvent;
+ }
+
+ private Capture<ItemRemoveEvent> captureRemoveEvent(
+ ItemSetChangeListener removeListener) {
+ Capture<ItemRemoveEvent> capturedEvent = new Capture<ItemRemoveEvent>();
+ removeListener.containerItemSetChange(EasyMock.capture(capturedEvent));
+ return capturedEvent;
+ }
+
+ private ItemSetChangeListener createListenerMockFor(
+ IndexedContainer container) {
+ ItemSetChangeListener listener = EasyMock
+ .createNiceMock(ItemSetChangeListener.class);
+ container.addItemSetChangeListener(listener);
+ return listener;
+ }
+
// Ticket 8028
public void testGetItemIdsRangeIndexOutOfBounds() {
IndexedContainer ic = new IndexedContainer();
diff --git a/server/tests/src/com/vaadin/tests/server/TestAtmosphereVersion.java b/server/tests/src/com/vaadin/tests/server/TestAtmosphereVersion.java
index 5c27ef0752..3d37022b81 100644
--- a/server/tests/src/com/vaadin/tests/server/TestAtmosphereVersion.java
+++ b/server/tests/src/com/vaadin/tests/server/TestAtmosphereVersion.java
@@ -12,7 +12,7 @@ public class TestAtmosphereVersion extends TestCase {
* classpath
*/
public void testAtmosphereVersion() {
- assertEquals(Constants.REQUIRED_ATMOSPHERE_VERSION,
+ assertEquals(Constants.REQUIRED_ATMOSPHERE_RUNTIME_VERSION,
Version.getRawVersion());
}
}
diff --git a/server/tests/src/com/vaadin/tests/server/TestClientMethodSerialization.java b/server/tests/src/com/vaadin/tests/server/TestClientMethodSerialization.java
new file mode 100644
index 0000000000..1e0210dc63
--- /dev/null
+++ b/server/tests/src/com/vaadin/tests/server/TestClientMethodSerialization.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.server;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+import junit.framework.TestCase;
+
+import org.json.JSONArray;
+
+import com.vaadin.server.ClientMethodInvocation;
+import com.vaadin.server.JavaScriptCallbackHelper;
+import com.vaadin.ui.JavaScript.JavaScriptCallbackRpc;
+import com.vaadin.util.ReflectTools;
+
+public class TestClientMethodSerialization extends TestCase {
+
+ private static final Method JAVASCRIPT_CALLBACK_METHOD = ReflectTools
+ .findMethod(JavaScriptCallbackRpc.class, "call", String.class,
+ JSONArray.class);
+
+ private static final Method BASIC_PARAMS_CALL_METHOD = ReflectTools
+ .findMethod(TestClientMethodSerialization.class,
+ "basicParamsMethodForTesting", String.class, Integer.class);
+
+ private static final Method NO_PARAMS_CALL_METHOD = ReflectTools
+ .findMethod(TestClientMethodSerialization.class,
+ "noParamsMethodForTesting");
+
+ public void basicParamsMethodForTesting(String stringParam,
+ Integer integerParam) {
+ }
+
+ public void noParamsMethodForTesting() {
+ }
+
+ /**
+ * Tests the {@link ClientMethodInvocation} serialization when using
+ * {@link JavaScriptCallbackHelper#invokeCallback(String, Object...)}.
+ * #12532
+ */
+ public void testClientMethodSerialization_WithJSONArray_ContentStaysSame()
+ throws Exception {
+ JSONArray originalArray = new JSONArray(Arrays.asList(
+ "callbackParameter1", "callBackParameter2", "12345"));
+ ClientMethodInvocation original = new ClientMethodInvocation(null,
+ "interfaceName", JAVASCRIPT_CALLBACK_METHOD, new Object[] {
+ "callBackMethodName", originalArray });
+
+ ClientMethodInvocation copy = (ClientMethodInvocation) serializeAndDeserialize(original);
+ JSONArray copyArray = (JSONArray) copy.getParameters()[1];
+ assertEquals(originalArray.toString(), copyArray.toString());
+ }
+
+ public void testClientMethodSerialization_WithBasicParams_NoChanges()
+ throws Exception {
+ String stringParam = "a string 123";
+ Integer integerParam = 1234567890;
+ ClientMethodInvocation original = new ClientMethodInvocation(null,
+ "interfaceName", BASIC_PARAMS_CALL_METHOD, new Serializable[] {
+ stringParam, integerParam });
+ ClientMethodInvocation copy = (ClientMethodInvocation) serializeAndDeserialize(original);
+ String copyString = (String) copy.getParameters()[0];
+ Integer copyInteger = (Integer) copy.getParameters()[1];
+ assertEquals(copyString, stringParam);
+ assertEquals(copyInteger, integerParam);
+ }
+
+ public void testClientMethodSerialization_NoParams_NoExceptions() {
+ ClientMethodInvocation original = new ClientMethodInvocation(null,
+ "interfaceName", NO_PARAMS_CALL_METHOD, null);
+ ClientMethodInvocation copy = (ClientMethodInvocation) serializeAndDeserialize(original);
+ }
+
+ private static Serializable serializeAndDeserialize(Serializable input) {
+ Serializable output = null;
+ try {
+ ByteArrayOutputStream bs = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream(bs);
+ out.writeObject(input);
+ byte[] data = bs.toByteArray();
+ ObjectInputStream in = new ObjectInputStream(
+ new ByteArrayInputStream(data));
+ output = (Serializable) in.readObject();
+ } catch (Exception e) {
+ fail("Exception during serialization/deserialization: "
+ + e.getMessage());
+ }
+ return output;
+ }
+
+}
diff --git a/server/tests/src/com/vaadin/tests/server/TestSerialization.java b/server/tests/src/com/vaadin/tests/server/TestSerialization.java
index 84ff5ad6fa..a52821a919 100644
--- a/server/tests/src/com/vaadin/tests/server/TestSerialization.java
+++ b/server/tests/src/com/vaadin/tests/server/TestSerialization.java
@@ -14,6 +14,7 @@ import com.vaadin.data.Property;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.data.util.MethodProperty;
import com.vaadin.data.validator.RegexpValidator;
+import com.vaadin.server.VaadinSession;
import com.vaadin.ui.Form;
public class TestSerialization extends TestCase {
@@ -21,7 +22,7 @@ public class TestSerialization extends TestCase {
public void testValidators() throws Exception {
RegexpValidator validator = new RegexpValidator(".*", "Error");
validator.validate("aaa");
- RegexpValidator validator2 = (RegexpValidator) serializeAndDeserialize(validator);
+ RegexpValidator validator2 = serializeAndDeserialize(validator);
validator2.validate("aaa");
}
@@ -67,7 +68,17 @@ public class TestSerialization extends TestCase {
serializeAndDeserialize(mp);
}
- private static Serializable serializeAndDeserialize(Serializable s)
+ public void testVaadinSession() throws Exception {
+ VaadinSession session = new VaadinSession(null);
+
+ session = serializeAndDeserialize(session);
+
+ assertNotNull(
+ "Pending access queue was not recreated after deserialization",
+ session.getPendingAccessQueue());
+ }
+
+ private static <S extends Serializable> S serializeAndDeserialize(S s)
throws IOException, ClassNotFoundException {
// Serialize and deserialize
@@ -77,10 +88,12 @@ public class TestSerialization extends TestCase {
byte[] data = bs.toByteArray();
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(
data));
- Serializable s2 = (Serializable) in.readObject();
+ @SuppressWarnings("unchecked")
+ S s2 = (S) in.readObject();
// using special toString(Object) method to avoid calling
// Property.toString(), which will be temporarily disabled
+ // TODO This is hilariously broken (#12723)
if (s.equals(s2)) {
System.out.println(toString(s) + " equals " + toString(s2));
} else {
diff --git a/server/tests/src/com/vaadin/tests/server/component/abstractfield/AbsFieldValueConversions.java b/server/tests/src/com/vaadin/tests/server/component/abstractfield/AbsFieldValueConversions.java
index dd46b11520..85116dd152 100644
--- a/server/tests/src/com/vaadin/tests/server/component/abstractfield/AbsFieldValueConversions.java
+++ b/server/tests/src/com/vaadin/tests/server/component/abstractfield/AbsFieldValueConversions.java
@@ -250,6 +250,7 @@ public class AbsFieldValueConversions extends TestCase {
@Test
public void testNullConverter() {
TextField tf = new TextField("foo");
+ tf.setConverter(new StringToIntegerConverter());
tf.setPropertyDataSource(new ObjectProperty<Integer>(12));
tf.setConverter((Converter) null);
try {
diff --git a/server/tests/src/com/vaadin/tests/server/component/treetable/TreeTableSetContainerNull.java b/server/tests/src/com/vaadin/tests/server/component/treetable/TreeTableSetContainerNull.java
new file mode 100644
index 0000000000..a3b79a14f0
--- /dev/null
+++ b/server/tests/src/com/vaadin/tests/server/component/treetable/TreeTableSetContainerNull.java
@@ -0,0 +1,15 @@
+package com.vaadin.tests.server.component.treetable;
+
+import junit.framework.TestCase;
+
+import com.vaadin.ui.TreeTable;
+
+public class TreeTableSetContainerNull extends TestCase {
+
+ public void testNullContainer() {
+ TreeTable treeTable = new TreeTable();
+
+ // should not cause an exception
+ treeTable.setContainerDataSource(null);
+ }
+}
diff --git a/shared/ivy.xml b/shared/ivy.xml
index 3b044e9ab4..fc54d680fa 100644
--- a/shared/ivy.xml
+++ b/shared/ivy.xml
@@ -21,7 +21,7 @@
</publications>
<dependencies>
<dependency org="com.vaadin" name="vaadin-shared-deps"
- rev="1.0.2" conf="build,ide,test->default" />
+ rev="1.0.3" conf="build,ide,test->default" />
</dependencies>
</ivy-module>
diff --git a/shared/src/com/vaadin/shared/ApplicationConstants.java b/shared/src/com/vaadin/shared/ApplicationConstants.java
index 8e66afbb32..a81f29b77c 100644
--- a/shared/src/com/vaadin/shared/ApplicationConstants.java
+++ b/shared/src/com/vaadin/shared/ApplicationConstants.java
@@ -49,6 +49,10 @@ public class ApplicationConstants implements Serializable {
public static final String SERVICE_URL_PATH_AS_PARAMETER = "usePathParameter";
+ // Denotes the namespace which parameters should be prefixed with when
+ // passed as GET parameters. Currently only used by Liferay.
+ public static final String SERVICE_URL_PARAMETER_NAMESPACE = "pathParameterNS";
+
// Javadocs in ApplicationConfiguration should be updated if this is changed
public static final String V_RESOURCE_PATH = "v-resourcePath";
diff --git a/shared/src/com/vaadin/shared/EventId.java b/shared/src/com/vaadin/shared/EventId.java
index dd30379d41..d669f8fa83 100644
--- a/shared/src/com/vaadin/shared/EventId.java
+++ b/shared/src/com/vaadin/shared/EventId.java
@@ -22,5 +22,5 @@ public interface EventId extends Serializable {
public static final String FOCUS = "focus";
public static final String CLICK_EVENT_IDENTIFIER = "click";
public static final String LAYOUT_CLICK_EVENT_IDENTIFIER = "lClick";
-
+ public static final String POLL = "poll";
}
diff --git a/shared/src/com/vaadin/shared/VBrowserDetails.java b/shared/src/com/vaadin/shared/VBrowserDetails.java
index f31f5f3c04..a745a212b0 100644
--- a/shared/src/com/vaadin/shared/VBrowserDetails.java
+++ b/shared/src/com/vaadin/shared/VBrowserDetails.java
@@ -31,6 +31,7 @@ public class VBrowserDetails implements Serializable {
private boolean isGecko = false;
private boolean isWebKit = false;
private boolean isPresto = false;
+ private boolean isTrident = false;
private boolean isChromeFrameCapable = false;
private boolean isChromeFrame = false;
@@ -65,9 +66,11 @@ public class VBrowserDetails implements Serializable {
// browser engine name
isGecko = userAgent.indexOf("gecko") != -1
- && userAgent.indexOf("webkit") == -1;
+ && userAgent.indexOf("webkit") == -1
+ && userAgent.indexOf("trident/") == -1;
isWebKit = userAgent.indexOf("applewebkit") != -1;
isPresto = userAgent.indexOf(" presto/") != -1;
+ isTrident = userAgent.indexOf("trident/") != -1;
// browser name
isChrome = userAgent.indexOf(" chrome/") != -1;
@@ -75,6 +78,9 @@ public class VBrowserDetails implements Serializable {
isOpera = userAgent.indexOf("opera") != -1;
isIE = userAgent.indexOf("msie") != -1 && !isOpera
&& (userAgent.indexOf("webtv") == -1);
+ // IE 11 no longer contains MSIE in the user agent
+ isIE = isIE || isTrident;
+
isFirefox = userAgent.indexOf(" firefox/") != -1;
// chromeframe
@@ -113,11 +119,21 @@ public class VBrowserDetails implements Serializable {
// Browser version
try {
if (isIE) {
- String ieVersionString = userAgent.substring(userAgent
- .indexOf("msie ") + 5);
- ieVersionString = safeSubstring(ieVersionString, 0,
- ieVersionString.indexOf(";"));
- parseVersionString(ieVersionString);
+ if (userAgent.indexOf("msie") == -1) {
+ // IE 11+
+ int rvPos = userAgent.indexOf("rv:");
+ if (rvPos >= 0) {
+ String tmp = userAgent.substring(rvPos + 3);
+ tmp = tmp.replaceFirst("(\\.[0-9]+).+", "$1");
+ parseVersionString(tmp);
+ }
+ } else {
+ String ieVersionString = userAgent.substring(userAgent
+ .indexOf("msie ") + 5);
+ ieVersionString = safeSubstring(ieVersionString, 0,
+ ieVersionString.indexOf(";"));
+ parseVersionString(ieVersionString);
+ }
} else if (isFirefox) {
int i = userAgent.indexOf(" firefox/") + 9;
parseVersionString(safeSubstring(userAgent, i, i + 5));
@@ -288,6 +304,16 @@ public class VBrowserDetails implements Serializable {
}
/**
+ * Tests if the browser is using the Trident engine
+ *
+ * @since 7.1.7
+ * @return true if it is Trident, false otherwise
+ */
+ public boolean isTrident() {
+ return isTrident;
+ }
+
+ /**
* Tests if the browser is Safari.
*
* @return true if it is Safari, false otherwise
diff --git a/shared/src/com/vaadin/shared/ui/link/LinkState.java b/shared/src/com/vaadin/shared/ui/link/LinkState.java
index 269496767d..33ede86378 100644
--- a/shared/src/com/vaadin/shared/ui/link/LinkState.java
+++ b/shared/src/com/vaadin/shared/ui/link/LinkState.java
@@ -16,9 +16,15 @@
package com.vaadin.shared.ui.link;
import com.vaadin.shared.AbstractComponentState;
+import com.vaadin.shared.ui.BorderStyle;
public class LinkState extends AbstractComponentState {
{
primaryStyleName = "v-link";
}
+ public String name = "";
+ public String target = null;
+ public BorderStyle targetBorder = BorderStyle.DEFAULT;
+ public int targetWidth = -1;
+ public int targetHeight = -1;
}
diff --git a/shared/src/com/vaadin/shared/ui/window/WindowServerRpc.java b/shared/src/com/vaadin/shared/ui/window/WindowServerRpc.java
index b43765274e..1307b1e765 100644
--- a/shared/src/com/vaadin/shared/ui/window/WindowServerRpc.java
+++ b/shared/src/com/vaadin/shared/ui/window/WindowServerRpc.java
@@ -22,4 +22,6 @@ public interface WindowServerRpc extends ClickRpc, ServerRpc {
public void windowModeChanged(WindowMode newState);
+ public void windowMoved(int x, int y);
+
} \ No newline at end of file
diff --git a/theme-compiler/ivy.xml b/theme-compiler/ivy.xml
index 5bcdbb54cb..0f84966508 100644
--- a/theme-compiler/ivy.xml
+++ b/theme-compiler/ivy.xml
@@ -40,7 +40,9 @@
rev="2.4" conf="build-provided->default" />
<!-- Testing libs -->
- <dependency org="junit" name="junit" rev="4.5"
+ <dependency org="junit" name="junit" rev="4.11"
+ conf="ide,test -> default" />
+ <dependency org="org.jsoup" name="jsoup" rev="1.6.3"
conf="ide,test -> default" />
<!-- Internally used, for now -->
diff --git a/theme-compiler/src/com/vaadin/sass/internal/ScssStylesheet.java b/theme-compiler/src/com/vaadin/sass/internal/ScssStylesheet.java
index 704425e300..ed6b98f5ac 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/ScssStylesheet.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/ScssStylesheet.java
@@ -19,10 +19,10 @@ package com.vaadin.sass.internal;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
@@ -35,8 +35,9 @@ import com.vaadin.sass.internal.handler.SCSSErrorHandler;
import com.vaadin.sass.internal.parser.ParseException;
import com.vaadin.sass.internal.parser.Parser;
import com.vaadin.sass.internal.parser.SCSSParseException;
+import com.vaadin.sass.internal.resolver.ClassloaderResolver;
+import com.vaadin.sass.internal.resolver.FilesystemResolver;
import com.vaadin.sass.internal.resolver.ScssStylesheetResolver;
-import com.vaadin.sass.internal.resolver.VaadinResolver;
import com.vaadin.sass.internal.tree.BlockNode;
import com.vaadin.sass.internal.tree.MixinDefNode;
import com.vaadin.sass.internal.tree.Node;
@@ -63,6 +64,8 @@ public class ScssStylesheet extends Node {
private String charset;
+ private List<ScssStylesheetResolver> resolvers = new ArrayList<ScssStylesheetResolver>();
+
/**
* Read in a file SCSS and parse it into a ScssStylesheet
*
@@ -90,18 +93,48 @@ public class ScssStylesheet extends Node {
}
/**
- * Main entry point for the SASS compiler. Takes in a file and encoding then
- * builds up a ScssStylesheet tree out of it. Calling compile() on it will
- * transform SASS into CSS. Calling toString() will print out the SCSS/CSS.
+ * Main entry point for the SASS compiler. Takes in a file and an optional
+ * parent style sheet, then builds up a ScssStylesheet tree out of it.
+ * Calling compile() on it will transform SASS into CSS. Calling toString()
+ * will print out the SCSS/CSS.
+ *
+ * @param identifier
+ * The file path. If null then null is returned.
+ * @param parentStylesheet
+ * Style sheet from which to inherit resolvers and encoding. May
+ * be null.
+ * @return
+ * @throws CSSException
+ * @throws IOException
+ */
+ public static ScssStylesheet get(String identifier,
+ ScssStylesheet parentStylesheet) throws CSSException, IOException {
+ return get(identifier, parentStylesheet, new SCSSDocumentHandlerImpl(),
+ new SCSSErrorHandler());
+ }
+
+ /**
+ * Main entry point for the SASS compiler. Takes in a file, an optional
+ * parent stylesheet, and document and error handlers. Then builds up a
+ * ScssStylesheet tree out of it. Calling compile() on it will transform
+ * SASS into CSS. Calling toString() will print out the SCSS/CSS.
*
* @param identifier
* The file path. If null then null is returned.
- * @param encoding
+ * @param parentStylesheet
+ * Style sheet from which to inherit resolvers and encoding. May
+ * be null.
+ * @param documentHandler
+ * Instance of document handler. May not be null.
+ * @param errorHandler
+ * Instance of error handler. May not be null.
* @return
* @throws CSSException
* @throws IOException
*/
- public static ScssStylesheet get(String identifier, String encoding)
+ public static ScssStylesheet get(String identifier,
+ ScssStylesheet parentStylesheet,
+ SCSSDocumentHandler documentHandler, SCSSErrorHandler errorHandler)
throws CSSException, IOException {
/*
* The encoding to be used is passed through "encoding" parameter. the
@@ -120,18 +153,27 @@ public class ScssStylesheet extends Node {
File file = new File(identifier);
file = file.getCanonicalFile();
- SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
- ScssStylesheet stylesheet = handler.getStyleSheet();
-
- InputSource source = stylesheet.resolveStylesheet(identifier);
+ ScssStylesheet stylesheet = documentHandler.getStyleSheet();
+ if (parentStylesheet == null) {
+ // Use default resolvers
+ stylesheet.addResolver(new FilesystemResolver());
+ stylesheet.addResolver(new ClassloaderResolver());
+ } else {
+ // Use parent resolvers
+ stylesheet.setResolvers(parentStylesheet.getResolvers());
+ }
+ InputSource source = stylesheet.resolveStylesheet(identifier,
+ parentStylesheet);
if (source == null) {
return null;
}
- source.setEncoding(encoding);
+ if (parentStylesheet != null) {
+ source.setEncoding(parentStylesheet.getCharset());
+ }
Parser parser = new Parser();
- parser.setErrorHandler(new SCSSErrorHandler());
- parser.setDocumentHandler(handler);
+ parser.setErrorHandler(errorHandler);
+ parser.setDocumentHandler(documentHandler);
try {
parser.parseStyleSheet(source);
@@ -145,21 +187,10 @@ public class ScssStylesheet extends Node {
return stylesheet;
}
- private static ScssStylesheetResolver[] resolvers = null;
-
- public static void setStylesheetResolvers(
- ScssStylesheetResolver... styleSheetResolvers) {
- resolvers = Arrays.copyOf(styleSheetResolvers,
- styleSheetResolvers.length);
- }
-
- public InputSource resolveStylesheet(String identifier) {
- if (resolvers == null) {
- setStylesheetResolvers(new VaadinResolver());
- }
-
- for (ScssStylesheetResolver resolver : resolvers) {
- InputSource source = resolver.resolve(identifier);
+ public InputSource resolveStylesheet(String identifier,
+ ScssStylesheet parentStylesheet) {
+ for (ScssStylesheetResolver resolver : getResolvers()) {
+ InputSource source = resolver.resolve(parentStylesheet, identifier);
if (source != null) {
File f = new File(source.getURI());
setFile(f);
@@ -171,6 +202,38 @@ public class ScssStylesheet extends Node {
}
/**
+ * Retrieves a list of resolvers to use when resolving imports
+ *
+ * @since 7.2
+ * @return the resolvers used to resolving imports
+ */
+ public List<ScssStylesheetResolver> getResolvers() {
+ return Collections.unmodifiableList(resolvers);
+ }
+
+ /**
+ * Sets the list of resolvers to use when resolving imports
+ *
+ * @since 7.2
+ * @param resolvers
+ * the resolvers to set
+ */
+ public void setResolvers(List<ScssStylesheetResolver> resolvers) {
+ this.resolvers = new ArrayList<ScssStylesheetResolver>(resolvers);
+ }
+
+ /**
+ * Adds the given resolver to the resolver list
+ *
+ * @since 7.2
+ * @param resolver
+ * The resolver to add
+ */
+ public void addResolver(ScssStylesheetResolver resolver) {
+ resolvers.add(resolver);
+ }
+
+ /**
* Applies all the visitors and compiles SCSS into Css.
*
* @throws Exception
diff --git a/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSDocumentHandler.java b/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSDocumentHandler.java
index b9672b6c78..e6916e5070 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSDocumentHandler.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSDocumentHandler.java
@@ -18,6 +18,7 @@ package com.vaadin.sass.internal.handler;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
import org.w3c.css.sac.CSSException;
import org.w3c.css.sac.DocumentHandler;
@@ -50,7 +51,7 @@ public interface SCSSDocumentHandler extends DocumentHandler {
void endNestedProperties(String name);
- void includeDirective(String name, Collection<LexicalUnitImpl> args);
+ void includeDirective(String name, List<LexicalUnitImpl> args);
void importStyle(String uri, SACMediaList media, boolean isURL);
@@ -98,7 +99,7 @@ public interface SCSSDocumentHandler extends DocumentHandler {
void contentDirective();
- void startIncludeContentBlock(String name);
+ void startIncludeContentBlock(String name, List<LexicalUnitImpl> args);
void endIncludeContentBlock();
diff --git a/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSDocumentHandlerImpl.java b/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSDocumentHandlerImpl.java
index d77a404ae8..99f00e3889 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSDocumentHandlerImpl.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSDocumentHandlerImpl.java
@@ -18,6 +18,7 @@ package com.vaadin.sass.internal.handler;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
import java.util.Stack;
import org.w3c.css.sac.CSSException;
@@ -244,7 +245,7 @@ public class SCSSDocumentHandlerImpl implements SCSSDocumentHandler {
}
@Override
- public void includeDirective(String name, Collection<LexicalUnitImpl> args) {
+ public void includeDirective(String name, List<LexicalUnitImpl> args) {
MixinNode node = new MixinNode(name, args);
nodeStack.peek().appendChild(node);
}
@@ -374,8 +375,8 @@ public class SCSSDocumentHandlerImpl implements SCSSDocumentHandler {
}
@Override
- public void startIncludeContentBlock(String name) {
- MixinNode node = new MixinNode(name);
+ public void startIncludeContentBlock(String name, List<LexicalUnitImpl> args) {
+ MixinNode node = new MixinNode(name, args);
nodeStack.peek().appendChild(node);
nodeStack.push(node);
diff --git a/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSErrorHandler.java b/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSErrorHandler.java
index 2e51c686d4..0d48da34e4 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSErrorHandler.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/handler/SCSSErrorHandler.java
@@ -15,34 +15,46 @@
*/
package com.vaadin.sass.internal.handler;
+import java.io.PrintStream;
+
import org.w3c.css.sac.CSSException;
import org.w3c.css.sac.CSSParseException;
import org.w3c.css.sac.ErrorHandler;
public class SCSSErrorHandler implements ErrorHandler {
+ private PrintStream errorStream;
+
+ public SCSSErrorHandler(PrintStream errorStream) {
+ this.errorStream = errorStream;
+ }
+
+ public SCSSErrorHandler() {
+ this(System.out);
+ }
+
@Override
public void error(CSSParseException arg0) throws CSSException {
- System.out.println("Error when parsing file \n" + arg0.getURI()
+ errorStream.println("Error when parsing file \n" + arg0.getURI()
+ " on line " + arg0.getLineNumber() + ", column "
+ arg0.getColumnNumber());
- System.out.println(arg0.getMessage() + "\n");
+ errorStream.println(arg0.getMessage() + "\n");
}
@Override
public void fatalError(CSSParseException arg0) throws CSSException {
- System.out.println("FATAL Error when parsing file \n" + arg0.getURI()
+ errorStream.println("FATAL Error when parsing file \n" + arg0.getURI()
+ " on line " + arg0.getLineNumber() + ", column "
+ arg0.getColumnNumber());
- System.out.println(arg0.getMessage() + "\n");
+ errorStream.println(arg0.getMessage() + "\n");
}
@Override
public void warning(CSSParseException arg0) throws CSSException {
- System.out.println("Warning when parsing file \n" + arg0.getURI()
+ errorStream.println("Warning when parsing file \n" + arg0.getURI()
+ " on line " + arg0.getLineNumber() + ", column "
+ arg0.getColumnNumber());
- System.out.println(arg0.getMessage() + "\n");
+ errorStream.println(arg0.getMessage() + "\n");
}
}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/LexicalUnitImpl.java b/theme-compiler/src/com/vaadin/sass/internal/parser/LexicalUnitImpl.java
index 498e1a941b..cfd428e094 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/parser/LexicalUnitImpl.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/parser/LexicalUnitImpl.java
@@ -148,6 +148,22 @@ public class LexicalUnitImpl implements LexicalUnit, SCSSLexicalUnit,
return f;
}
+ /**
+ * Returns the float value as a string unless the value is an integer. In
+ * that case returns the integer value as a string.
+ *
+ * @return a string representing the value, either with or without decimals
+ */
+ public String getFloatOrInteger() {
+ float f = getFloatValue();
+ int i = (int) f;
+ if ((i) == f) {
+ return i + "";
+ } else {
+ return f + "";
+ }
+ }
+
public void setFloatValue(float f) {
this.f = f;
i = (int) f;
@@ -274,7 +290,7 @@ public class LexicalUnitImpl implements LexicalUnit, SCSSLexicalUnit,
text = Integer.toString(getIntegerValue(), 10);
break;
case LexicalUnit.SAC_REAL:
- text = getFloatValue() + "";
+ text = getFloatOrInteger();
break;
case LexicalUnit.SAC_EM:
case SCSSLexicalUnit.SAC_LEM:
@@ -295,13 +311,7 @@ public class LexicalUnitImpl implements LexicalUnit, SCSSLexicalUnit,
case LexicalUnit.SAC_HERTZ:
case LexicalUnit.SAC_KILOHERTZ:
case LexicalUnit.SAC_DIMENSION:
- float f = getFloatValue();
- int i = (int) f;
- if ((i) == f) {
- text = i + getDimensionUnitText();
- } else {
- text = f + getDimensionUnitText();
- }
+ text = getFloatOrInteger() + getDimensionUnitText();
break;
case LexicalUnit.SAC_URI:
text = "url(" + getStringValue() + ")";
@@ -367,6 +377,19 @@ public class LexicalUnitImpl implements LexicalUnit, SCSSLexicalUnit,
}
}
+ // A helper method for sass interpolation
+ public String unquotedString() {
+ String result = toString();
+ if (result.length() >= 2
+ && ((result.charAt(0) == '"' && result
+ .charAt(result.length() - 1) == '"') || (result
+ .charAt(0) == '\'' && result
+ .charAt(result.length() - 1) == '\''))) {
+ result = result.substring(1, result.length() - 1);
+ }
+ return result;
+ }
+
@Override
public LexicalUnitImpl divide(LexicalUnitImpl denominator) {
if (denominator.getLexicalUnitType() != SAC_INTEGER
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java
index 170d8f3e54..53d1ee78ca 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java
@@ -159,7 +159,6 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
/**
* This method parses only one rule (style rule or at-rule, except
- *
* @charset).
*
* @param source
@@ -874,6 +873,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case TO:
case FROM:
+ case CONTENT_SYM:
case PERCENTAGE:
;
break;
@@ -881,7 +881,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
jj_la1[22] = jj_gen;
break label_17;
}
- keyframeSelector();
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case TO:
+ case FROM:
+ case PERCENTAGE:
+ keyframeSelector();
+ break;
+ case CONTENT_SYM:
+ contentDirective();
+ break;
+ default:
+ jj_la1[23] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
}
jj_consume_token(RBRACE);
label_18: while (true) {
@@ -890,7 +903,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[23] = jj_gen;
+ jj_la1[24] = jj_gen;
break label_18;
}
jj_consume_token(S);
@@ -907,6 +920,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
final public void keyframeSelector() throws ParseException {
Token n;
+ String selector = "";
boolean start = false;
try {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
@@ -920,36 +934,86 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
n = jj_consume_token(PERCENTAGE);
break;
default:
- jj_la1[24] = jj_gen;
+ jj_la1[25] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
+ selector += n.image;
label_19: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[25] = jj_gen;
+ jj_la1[26] = jj_gen;
break label_19;
}
jj_consume_token(S);
}
- jj_consume_token(LBRACE);
label_20: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
- case S:
+ case COMMA:
;
break;
default:
- jj_la1[26] = jj_gen;
+ jj_la1[27] = jj_gen;
break label_20;
}
+ jj_consume_token(COMMA);
+ label_21: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[28] = jj_gen;
+ break label_21;
+ }
+ jj_consume_token(S);
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case FROM:
+ n = jj_consume_token(FROM);
+ break;
+ case TO:
+ n = jj_consume_token(TO);
+ break;
+ case PERCENTAGE:
+ n = jj_consume_token(PERCENTAGE);
+ break;
+ default:
+ jj_la1[29] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ selector += (", " + n.image);
+ label_22: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[30] = jj_gen;
+ break label_22;
+ }
+ jj_consume_token(S);
+ }
+ }
+ jj_consume_token(LBRACE);
+ label_23: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[31] = jj_gen;
+ break label_23;
+ }
jj_consume_token(S);
}
start = true;
- documentHandler.startKeyframeSelector(n.image);
- label_21: while (true) {
+ documentHandler.startKeyframeSelector(selector);
+ label_24: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case PLUS:
case PRECEDES:
@@ -973,11 +1037,12 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case HASH:
case MEDIA_SYM:
case KEY_FRAME_SYM:
+ case ATKEYWORD:
;
break;
default:
- jj_la1[27] = jj_gen;
- break label_21;
+ jj_la1[32] = jj_gen;
+ break label_24;
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case PLUS:
@@ -1001,26 +1066,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case HASH:
case MEDIA_SYM:
case KEY_FRAME_SYM:
+ case ATKEYWORD:
ifContentStatement();
break;
case MICROSOFT_RULE:
microsoftExtension();
break;
default:
- jj_la1[28] = jj_gen;
+ jj_la1[33] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
}
jj_consume_token(RBRACE);
- label_22: while (true) {
+ label_25: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[29] = jj_gen;
- break label_22;
+ jj_la1[34] = jj_gen;
+ break label_25;
}
jj_consume_token(S);
}
@@ -1056,14 +1122,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
MediaListImpl ml = new MediaListImpl();
try {
jj_consume_token(MEDIA_SYM);
- label_23: while (true) {
+ label_26: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[30] = jj_gen;
- break label_23;
+ jj_la1[35] = jj_gen;
+ break label_26;
}
jj_consume_token(S);
}
@@ -1071,18 +1137,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
start = true;
documentHandler.startMedia(ml);
jj_consume_token(LBRACE);
- label_24: while (true) {
+ label_27: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[31] = jj_gen;
- break label_24;
+ jj_la1[36] = jj_gen;
+ break label_27;
}
jj_consume_token(S);
}
- label_25: while (true) {
+ label_28: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case CDO:
case LBRACE:
@@ -1122,8 +1188,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[32] = jj_gen;
- break label_25;
+ jj_la1[37] = jj_gen;
+ break label_28;
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case DEBUG_SYM:
@@ -1168,20 +1234,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
skipUnknownRule();
break;
default:
- jj_la1[33] = jj_gen;
+ jj_la1[38] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
}
jj_consume_token(RBRACE);
- label_26: while (true) {
+ label_29: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[34] = jj_gen;
- break label_26;
+ jj_la1[39] = jj_gen;
+ break label_29;
}
jj_consume_token(S);
}
@@ -1250,34 +1316,34 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
String pseudo = null;
try {
jj_consume_token(PAGE_SYM);
- label_27: while (true) {
+ label_30: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[35] = jj_gen;
- break label_27;
+ jj_la1[40] = jj_gen;
+ break label_30;
}
jj_consume_token(S);
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case IDENT:
n = jj_consume_token(IDENT);
- label_28: while (true) {
+ label_31: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[36] = jj_gen;
- break label_28;
+ jj_la1[41] = jj_gen;
+ break label_31;
}
jj_consume_token(S);
}
break;
default:
- jj_la1[37] = jj_gen;
+ jj_la1[42] = jj_gen;
;
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
@@ -1285,21 +1351,21 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
pseudo = pseudo_page();
break;
default:
- jj_la1[38] = jj_gen;
+ jj_la1[43] = jj_gen;
;
}
if (n != null) {
page = convertIdent(n.image);
}
jj_consume_token(LBRACE);
- label_29: while (true) {
+ label_32: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[39] = jj_gen;
- break label_29;
+ jj_la1[44] = jj_gen;
+ break label_32;
}
jj_consume_token(S);
}
@@ -1311,27 +1377,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
declaration();
break;
default:
- jj_la1[40] = jj_gen;
+ jj_la1[45] = jj_gen;
;
}
- label_30: while (true) {
+ label_33: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case SEMICOLON:
;
break;
default:
- jj_la1[41] = jj_gen;
- break label_30;
+ jj_la1[46] = jj_gen;
+ break label_33;
}
jj_consume_token(SEMICOLON);
- label_31: while (true) {
+ label_34: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[42] = jj_gen;
- break label_31;
+ jj_la1[47] = jj_gen;
+ break label_34;
}
jj_consume_token(S);
}
@@ -1341,19 +1407,19 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
declaration();
break;
default:
- jj_la1[43] = jj_gen;
+ jj_la1[48] = jj_gen;
;
}
}
jj_consume_token(RBRACE);
- label_32: while (true) {
+ label_35: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[44] = jj_gen;
- break label_32;
+ jj_la1[49] = jj_gen;
+ break label_35;
}
jj_consume_token(S);
}
@@ -1379,14 +1445,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
Token n;
jj_consume_token(COLON);
n = jj_consume_token(IDENT);
- label_33: while (true) {
+ label_36: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[45] = jj_gen;
- break label_33;
+ jj_la1[50] = jj_gen;
+ break label_36;
}
jj_consume_token(S);
}
@@ -1402,26 +1468,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
boolean start = false;
try {
jj_consume_token(FONT_FACE_SYM);
- label_34: while (true) {
+ label_37: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[46] = jj_gen;
- break label_34;
+ jj_la1[51] = jj_gen;
+ break label_37;
}
jj_consume_token(S);
}
jj_consume_token(LBRACE);
- label_35: while (true) {
+ label_38: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[47] = jj_gen;
- break label_35;
+ jj_la1[52] = jj_gen;
+ break label_38;
}
jj_consume_token(S);
}
@@ -1433,27 +1499,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
declaration();
break;
default:
- jj_la1[48] = jj_gen;
+ jj_la1[53] = jj_gen;
;
}
- label_36: while (true) {
+ label_39: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case SEMICOLON:
;
break;
default:
- jj_la1[49] = jj_gen;
- break label_36;
+ jj_la1[54] = jj_gen;
+ break label_39;
}
jj_consume_token(SEMICOLON);
- label_37: while (true) {
+ label_40: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[50] = jj_gen;
- break label_37;
+ jj_la1[55] = jj_gen;
+ break label_40;
}
jj_consume_token(S);
}
@@ -1463,19 +1529,19 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
declaration();
break;
default:
- jj_la1[51] = jj_gen;
+ jj_la1[56] = jj_gen;
;
}
}
jj_consume_token(RBRACE);
- label_38: while (true) {
+ label_41: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[52] = jj_gen;
- break label_38;
+ jj_la1[57] = jj_gen;
+ break label_41;
}
jj_consume_token(S);
}
@@ -1577,7 +1643,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
n = jj_consume_token(UNKNOWN);
break;
default:
- jj_la1[53] = jj_gen;
+ jj_la1[58] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1612,12 +1678,12 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
connector = combinatorChar();
break;
default:
- jj_la1[54] = jj_gen;
+ jj_la1[59] = jj_gen;
;
}
break;
default:
- jj_la1[55] = jj_gen;
+ jj_la1[60] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1643,18 +1709,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
t = jj_consume_token(SIBLING);
break;
default:
- jj_la1[56] = jj_gen;
+ jj_la1[61] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
- label_39: while (true) {
+ label_42: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[57] = jj_gen;
- break label_39;
+ jj_la1[62] = jj_gen;
+ break label_42;
}
jj_consume_token(S);
}
@@ -1672,20 +1738,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
String value = "";
// This is not really taking the syntax of filter rules into account
n = jj_consume_token(MICROSOFT_RULE);
- label_40: while (true) {
+ label_43: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[58] = jj_gen;
- break label_40;
+ jj_la1[63] = jj_gen;
+ break label_43;
}
jj_consume_token(S);
}
name = n.image;
jj_consume_token(COLON);
- label_41: while (true) {
+ label_44: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case IDENT:
n = jj_consume_token(IDENT);
@@ -1734,7 +1800,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
break;
default:
- jj_la1[59] = jj_gen;
+ jj_la1[64] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1753,19 +1819,19 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[60] = jj_gen;
- break label_41;
+ jj_la1[65] = jj_gen;
+ break label_44;
}
}
jj_consume_token(SEMICOLON);
- label_42: while (true) {
+ label_45: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[61] = jj_gen;
- break label_42;
+ jj_la1[66] = jj_gen;
+ break label_45;
}
jj_consume_token(S);
}
@@ -1779,7 +1845,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
final public String property() throws ParseException {
Token t;
String s = "";
- label_43: while (true) {
+ label_46: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case IDENT:
t = jj_consume_token(IDENT);
@@ -1790,7 +1856,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
s += t.image;
break;
default:
- jj_la1[62] = jj_gen;
+ jj_la1[67] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1800,18 +1866,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[63] = jj_gen;
- break label_43;
+ jj_la1[68] = jj_gen;
+ break label_46;
}
}
- label_44: while (true) {
+ label_47: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[64] = jj_gen;
- break label_44;
+ jj_la1[69] = jj_gen;
+ break label_47;
}
jj_consume_token(S);
}
@@ -1826,14 +1892,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
final public String variableName() throws ParseException {
Token n;
n = jj_consume_token(VARIABLE);
- label_45: while (true) {
+ label_48: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[65] = jj_gen;
- break label_45;
+ jj_la1[70] = jj_gen;
+ break label_48;
}
jj_consume_token(S);
}
@@ -1848,14 +1914,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
final public String functionName() throws ParseException {
Token n;
n = jj_consume_token(FUNCTION);
- label_46: while (true) {
+ label_49: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[66] = jj_gen;
- break label_46;
+ jj_la1[71] = jj_gen;
+ break label_49;
}
jj_consume_token(S);
}
@@ -1880,20 +1946,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
l = selectorList();
save = token;
jj_consume_token(LBRACE);
- label_47: while (true) {
+ label_50: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[67] = jj_gen;
- break label_47;
+ jj_la1[72] = jj_gen;
+ break label_50;
}
jj_consume_token(S);
}
start = true;
documentHandler.startSelector(l);
- label_48: while (true) {
+ label_51: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case PLUS:
case PRECEDES:
@@ -1918,11 +1984,12 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case IMPORT_SYM:
case MEDIA_SYM:
case KEY_FRAME_SYM:
+ case ATKEYWORD:
;
break;
default:
- jj_la1[68] = jj_gen;
- break label_48;
+ jj_la1[73] = jj_gen;
+ break label_51;
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case PLUS:
@@ -1946,6 +2013,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case HASH:
case MEDIA_SYM:
case KEY_FRAME_SYM:
+ case ATKEYWORD:
ifContentStatement();
break;
case MICROSOFT_RULE:
@@ -1955,20 +2023,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
importDeclaration();
break;
default:
- jj_la1[69] = jj_gen;
+ jj_la1[74] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
}
jj_consume_token(RBRACE);
- label_49: while (true) {
+ label_52: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[70] = jj_gen;
- break label_49;
+ jj_la1[75] = jj_gen;
+ break label_52;
}
jj_consume_token(S);
}
@@ -1997,24 +2065,24 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
ArrayList<String> selectors = new ArrayList<String>();
String selector;
selector = selector();
- label_50: while (true) {
+ label_53: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case COMMA:
;
break;
default:
- jj_la1[71] = jj_gen;
- break label_50;
+ jj_la1[76] = jj_gen;
+ break label_53;
}
jj_consume_token(COMMA);
- label_51: while (true) {
+ label_54: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[72] = jj_gen;
- break label_51;
+ jj_la1[77] = jj_gen;
+ break label_54;
}
jj_consume_token(S);
}
@@ -2056,27 +2124,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
selector = simple_selector(selector, comb);
break;
default:
- jj_la1[73] = jj_gen;
+ jj_la1[78] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
- label_52: while (true) {
+ label_55: while (true) {
if (jj_2_2(2)) {
;
} else {
- break label_52;
+ break label_55;
}
comb = combinator();
selector = simple_selector(selector, comb);
}
- label_53: while (true) {
+ label_56: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[74] = jj_gen;
- break label_53;
+ jj_la1[79] = jj_gen;
+ break label_56;
}
jj_consume_token(S);
}
@@ -2125,7 +2193,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case INTERPOLATION:
case IDENT:
simple_current = element_name();
- label_54: while (true) {
+ label_57: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case LBRACKET:
case DOT:
@@ -2134,8 +2202,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[75] = jj_gen;
- break label_54;
+ jj_la1[80] = jj_gen;
+ break label_57;
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case HASH:
@@ -2151,90 +2219,17 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
cond = pseudo(cond);
break;
default:
- jj_la1[76] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- break;
- case HASH:
- cond = hash(cond);
- label_55: while (true) {
- switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
- case LBRACKET:
- case DOT:
- case COLON:
- ;
- break;
- default:
- jj_la1[77] = jj_gen;
- break label_55;
- }
- switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
- case DOT:
- cond = _class(cond);
- break;
- case LBRACKET:
- cond = attrib(cond);
- break;
- case COLON:
- cond = pseudo(cond);
- break;
- default:
- jj_la1[78] = jj_gen;
+ jj_la1[81] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
}
break;
+ case LBRACKET:
case DOT:
- cond = _class(cond);
- label_56: while (true) {
- switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
- case LBRACKET:
- case DOT:
- case COLON:
- case HASH:
- ;
- break;
- default:
- jj_la1[79] = jj_gen;
- break label_56;
- }
- switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
- case HASH:
- cond = hash(cond);
- break;
- case DOT:
- cond = _class(cond);
- break;
- case LBRACKET:
- cond = attrib(cond);
- break;
- case COLON:
- cond = pseudo(cond);
- break;
- default:
- jj_la1[80] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- break;
case COLON:
- cond = pseudo(cond);
- label_57: while (true) {
- switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
- case LBRACKET:
- case DOT:
- case COLON:
- case HASH:
- ;
- break;
- default:
- jj_la1[81] = jj_gen;
- break label_57;
- }
+ case HASH:
+ label_58: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case HASH:
cond = hash(cond);
@@ -2253,11 +2248,6 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
jj_consume_token(-1);
throw new ParseException();
}
- }
- break;
- case LBRACKET:
- cond = attrib(cond);
- label_58: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case LBRACKET:
case DOT:
@@ -2269,28 +2259,10 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
jj_la1[83] = jj_gen;
break label_58;
}
- switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
- case HASH:
- cond = hash(cond);
- break;
- case DOT:
- cond = _class(cond);
- break;
- case LBRACKET:
- cond = attrib(cond);
- break;
- case COLON:
- cond = pseudo(cond);
- break;
- default:
- jj_la1[84] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
}
break;
default:
- jj_la1[85] = jj_gen;
+ jj_la1[84] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -2354,7 +2326,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
s += t.image;
break;
default:
- jj_la1[86] = jj_gen;
+ jj_la1[85] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -2364,7 +2336,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[87] = jj_gen;
+ jj_la1[86] = jj_gen;
break label_59;
}
}
@@ -2405,7 +2377,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
s += t.image;
break;
default:
- jj_la1[88] = jj_gen;
+ jj_la1[87] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -2415,7 +2387,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[89] = jj_gen;
+ jj_la1[88] = jj_gen;
break label_60;
}
}
@@ -2442,7 +2414,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
break;
default:
- jj_la1[90] = jj_gen;
+ jj_la1[89] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -2465,7 +2437,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[91] = jj_gen;
+ jj_la1[90] = jj_gen;
break label_61;
}
jj_consume_token(S);
@@ -2477,7 +2449,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[92] = jj_gen;
+ jj_la1[91] = jj_gen;
break label_62;
}
jj_consume_token(S);
@@ -2515,7 +2487,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
cases = 6;
break;
default:
- jj_la1[93] = jj_gen;
+ jj_la1[92] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -2525,7 +2497,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[94] = jj_gen;
+ jj_la1[93] = jj_gen;
break label_63;
}
jj_consume_token(S);
@@ -2540,7 +2512,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
attValue = val.image;
break;
default:
- jj_la1[95] = jj_gen;
+ jj_la1[94] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -2550,14 +2522,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[96] = jj_gen;
+ jj_la1[95] = jj_gen;
break label_64;
}
jj_consume_token(S);
}
break;
default:
- jj_la1[97] = jj_gen;
+ jj_la1[96] = jj_gen;
;
}
jj_consume_token(RBRACKET);
@@ -2622,7 +2594,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
isPseudoElement = true;
break;
default:
- jj_la1[98] = jj_gen;
+ jj_la1[97] = jj_gen;
;
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
@@ -2671,12 +2643,12 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[99] = jj_gen;
+ jj_la1[98] = jj_gen;
break label_65;
}
jj_consume_token(S);
}
- d = skipStatementUntilRightParan();
+ d = skipStatementUntilMatchingRightParan();
jj_consume_token(RPARAN);
// accept anything between function and a right parenthesis
String f = convertIdent(n.image);
@@ -2697,7 +2669,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
break;
default:
- jj_la1[100] = jj_gen;
+ jj_la1[99] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -2742,7 +2714,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[101] = jj_gen;
+ jj_la1[100] = jj_gen;
break label_66;
}
jj_consume_token(S);
@@ -2753,7 +2725,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
guarded = guarded();
break;
default:
- jj_la1[102] = jj_gen;
+ jj_la1[101] = jj_gen;
;
}
label_67: while (true) {
@@ -2764,7 +2736,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[103] = jj_gen;
+ jj_la1[102] = jj_gen;
break label_68;
}
jj_consume_token(S);
@@ -2774,7 +2746,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[104] = jj_gen;
+ jj_la1[103] = jj_gen;
break label_67;
}
}
@@ -2813,7 +2785,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
eachDirective();
break;
default:
- jj_la1[105] = jj_gen;
+ jj_la1[104] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -2852,7 +2824,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
keyframes();
break;
default:
- jj_la1[106] = jj_gen;
+ jj_la1[105] = jj_gen;
if (jj_2_3(2147483647)) {
variable();
} else {
@@ -2864,8 +2836,11 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case IF_SYM:
controlDirective();
break;
+ case ATKEYWORD:
+ atRuleDeclaration();
+ break;
default:
- jj_la1[107] = jj_gen;
+ jj_la1[106] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -2903,7 +2878,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[108] = jj_gen;
+ jj_la1[107] = jj_gen;
break label_69;
}
}
@@ -2914,7 +2889,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[109] = jj_gen;
+ jj_la1[108] = jj_gen;
break label_70;
}
jj_consume_token(S);
@@ -2943,14 +2918,48 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case VARIABLE:
case HASH:
case MEDIA_SYM:
+ case FONT_FACE_SYM:
case KEY_FRAME_SYM:
+ case ATKEYWORD:
;
break;
default:
- jj_la1[110] = jj_gen;
+ jj_la1[109] = jj_gen;
break label_71;
}
- ifContentStatement();
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ifContentStatement();
+ break;
+ case FONT_FACE_SYM:
+ fontFace();
+ break;
+ default:
+ jj_la1[110] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
}
jj_consume_token(RBRACE);
label_72: while (true) {
@@ -3070,14 +3079,48 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case VARIABLE:
case HASH:
case MEDIA_SYM:
+ case FONT_FACE_SYM:
case KEY_FRAME_SYM:
+ case ATKEYWORD:
;
break;
default:
jj_la1[117] = jj_gen;
break label_77;
}
- ifContentStatement();
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case INCLUDE_SYM:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case EACH_SYM:
+ case IF_SYM:
+ case EXTEND_SYM:
+ case CONTENT_SYM:
+ case IDENT:
+ case VARIABLE:
+ case HASH:
+ case MEDIA_SYM:
+ case KEY_FRAME_SYM:
+ case ATKEYWORD:
+ ifContentStatement();
+ break;
+ case FONT_FACE_SYM:
+ fontFace();
+ break;
+ default:
+ jj_la1[118] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
}
jj_consume_token(RBRACE);
label_78: while (true) {
@@ -3086,7 +3129,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[118] = jj_gen;
+ jj_la1[119] = jj_gen;
break label_78;
}
jj_consume_token(S);
@@ -3152,7 +3195,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
n = jj_consume_token(NOT_EQ);
break;
default:
- jj_la1[119] = jj_gen;
+ jj_la1[120] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -3184,7 +3227,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[120] = jj_gen;
+ jj_la1[121] = jj_gen;
break label_79;
}
jj_consume_token(S);
@@ -3196,7 +3239,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[121] = jj_gen;
+ jj_la1[122] = jj_gen;
break label_80;
}
jj_consume_token(S);
@@ -3208,7 +3251,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[122] = jj_gen;
+ jj_la1[123] = jj_gen;
break label_81;
}
jj_consume_token(S);
@@ -3223,7 +3266,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
documentHandler.startEachDirective(var.image, listVariable);
break;
default:
- jj_la1[123] = jj_gen;
+ jj_la1[124] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -3234,7 +3277,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[124] = jj_gen;
+ jj_la1[125] = jj_gen;
break label_82;
}
jj_consume_token(S);
@@ -3262,10 +3305,11 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case HASH:
case MEDIA_SYM:
case KEY_FRAME_SYM:
+ case ATKEYWORD:
;
break;
default:
- jj_la1[125] = jj_gen;
+ jj_la1[126] = jj_gen;
break label_83;
}
ifContentStatement();
@@ -3277,7 +3321,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[126] = jj_gen;
+ jj_la1[127] = jj_gen;
break label_84;
}
jj_consume_token(S);
@@ -3295,7 +3339,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[127] = jj_gen;
+ jj_la1[128] = jj_gen;
break label_85;
}
jj_consume_token(S);
@@ -3307,7 +3351,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[128] = jj_gen;
+ jj_la1[129] = jj_gen;
break label_86;
}
jj_consume_token(COMMA);
@@ -3317,7 +3361,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[129] = jj_gen;
+ jj_la1[130] = jj_gen;
break label_87;
}
jj_consume_token(S);
@@ -3330,7 +3374,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[130] = jj_gen;
+ jj_la1[131] = jj_gen;
break label_88;
}
jj_consume_token(S);
@@ -3355,7 +3399,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[131] = jj_gen;
+ jj_la1[132] = jj_gen;
break label_89;
}
jj_consume_token(S);
@@ -3375,14 +3419,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[132] = jj_gen;
+ jj_la1[133] = jj_gen;
break label_90;
}
jj_consume_token(S);
}
break;
default:
- jj_la1[133] = jj_gen;
+ jj_la1[134] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -3393,7 +3437,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[134] = jj_gen;
+ jj_la1[135] = jj_gen;
break label_91;
}
jj_consume_token(S);
@@ -3424,10 +3468,11 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case PAGE_SYM:
case FONT_FACE_SYM:
case KEY_FRAME_SYM:
+ case ATKEYWORD:
;
break;
default:
- jj_la1[135] = jj_gen;
+ jj_la1[136] = jj_gen;
break label_92;
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
@@ -3452,6 +3497,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case HASH:
case MEDIA_SYM:
case KEY_FRAME_SYM:
+ case ATKEYWORD:
ifContentStatement();
break;
case FONT_FACE_SYM:
@@ -3461,7 +3507,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
page();
break;
default:
- jj_la1[136] = jj_gen;
+ jj_la1[137] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -3473,7 +3519,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[137] = jj_gen;
+ jj_la1[138] = jj_gen;
break label_93;
}
jj_consume_token(S);
@@ -3492,7 +3538,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[138] = jj_gen;
+ jj_la1[139] = jj_gen;
break label_94;
}
jj_consume_token(COMMA);
@@ -3502,7 +3548,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[139] = jj_gen;
+ jj_la1[140] = jj_gen;
break label_95;
}
jj_consume_token(S);
@@ -3560,7 +3606,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[140] = jj_gen;
+ jj_la1[141] = jj_gen;
break label_96;
}
jj_consume_token(S);
@@ -3582,14 +3628,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[141] = jj_gen;
+ jj_la1[142] = jj_gen;
break label_98;
}
jj_consume_token(S);
}
break;
default:
- jj_la1[142] = jj_gen;
+ jj_la1[143] = jj_gen;
;
}
prev = nonVariableTerm(prev);
@@ -3601,13 +3647,13 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
token.beginColumn, prev, variable.image);
break;
default:
- jj_la1[143] = jj_gen;
+ jj_la1[144] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
break;
default:
- jj_la1[144] = jj_gen;
+ jj_la1[145] = jj_gen;
;
}
VariableNode arg = new VariableNode(name, first, false);
@@ -3667,7 +3713,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[145] = jj_gen;
+ jj_la1[146] = jj_gen;
break label_99;
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
@@ -3679,14 +3725,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[146] = jj_gen;
+ jj_la1[147] = jj_gen;
break label_100;
}
jj_consume_token(S);
}
break;
default:
- jj_la1[147] = jj_gen;
+ jj_la1[148] = jj_gen;
;
}
next = term(prev);
@@ -3699,7 +3745,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[148] = jj_gen;
+ jj_la1[149] = jj_gen;
break label_101;
}
jj_consume_token(COMMA);
@@ -3709,7 +3755,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[149] = jj_gen;
+ jj_la1[150] = jj_gen;
break label_102;
}
jj_consume_token(S);
@@ -3756,7 +3802,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[150] = jj_gen;
+ jj_la1[151] = jj_gen;
break label_103;
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
@@ -3768,14 +3814,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[151] = jj_gen;
+ jj_la1[152] = jj_gen;
break label_104;
}
jj_consume_token(S);
}
break;
default:
- jj_la1[152] = jj_gen;
+ jj_la1[153] = jj_gen;
;
}
next = term(prev);
@@ -3801,7 +3847,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[153] = jj_gen;
+ jj_la1[154] = jj_gen;
break label_105;
}
jj_consume_token(S);
@@ -3819,24 +3865,35 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
name = functionName();
args = argValuelist();
jj_consume_token(RPARAN);
+ label_106: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case S:
+ ;
+ break;
+ default:
+ jj_la1[155] = jj_gen;
+ break label_106;
+ }
+ jj_consume_token(S);
+ }
break;
default:
- jj_la1[154] = jj_gen;
+ jj_la1[156] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case SEMICOLON:
- label_106: while (true) {
+ label_107: while (true) {
jj_consume_token(SEMICOLON);
- label_107: while (true) {
+ label_108: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[155] = jj_gen;
- break label_107;
+ jj_la1[157] = jj_gen;
+ break label_108;
}
jj_consume_token(S);
}
@@ -3845,27 +3902,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[156] = jj_gen;
- break label_106;
+ jj_la1[158] = jj_gen;
+ break label_107;
}
}
documentHandler.includeDirective(name, args);
break;
case LBRACE:
jj_consume_token(LBRACE);
- label_108: while (true) {
+ label_109: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[157] = jj_gen;
- break label_108;
+ jj_la1[159] = jj_gen;
+ break label_109;
}
jj_consume_token(S);
}
- documentHandler.startIncludeContentBlock(name);
- label_109: while (true) {
+ documentHandler.startIncludeContentBlock(name, args);
+ label_110: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case PLUS:
case PRECEDES:
@@ -3876,34 +3933,62 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case DOT:
case COLON:
case INTERPOLATION:
+ case TO:
+ case FROM:
case DEBUG_SYM:
case WARN_SYM:
case IDENT:
+ case PERCENTAGE:
case HASH:
;
break;
default:
- jj_la1[158] = jj_gen;
- break label_109;
+ jj_la1[160] = jj_gen;
+ break label_110;
+ }
+ switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+ case PLUS:
+ case PRECEDES:
+ case SIBLING:
+ case LBRACKET:
+ case ANY:
+ case PARENT:
+ case DOT:
+ case COLON:
+ case INTERPOLATION:
+ case DEBUG_SYM:
+ case WARN_SYM:
+ case IDENT:
+ case HASH:
+ styleRuleOrDeclarationOrNestedProperties();
+ break;
+ case TO:
+ case FROM:
+ case PERCENTAGE:
+ keyframeSelector();
+ break;
+ default:
+ jj_la1[161] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
}
- styleRuleOrDeclarationOrNestedProperties();
}
jj_consume_token(RBRACE);
- label_110: while (true) {
+ label_111: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[159] = jj_gen;
- break label_110;
+ jj_la1[162] = jj_gen;
+ break label_111;
}
jj_consume_token(S);
}
documentHandler.endIncludeContentBlock();
break;
default:
- jj_la1[160] = jj_gen;
+ jj_la1[163] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -3930,26 +4015,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
// refactor, remove those 3 LOOKAHEAD(5).
n = jj_consume_token(VARIABLE);
variable = n.image;
- label_111: while (true) {
+ label_112: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[161] = jj_gen;
- break label_111;
+ jj_la1[164] = jj_gen;
+ break label_112;
}
jj_consume_token(S);
}
jj_consume_token(COLON);
- label_112: while (true) {
+ label_113: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[162] = jj_gen;
- break label_112;
+ jj_la1[165] = jj_gen;
+ break label_113;
}
jj_consume_token(S);
}
@@ -3964,18 +4049,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
type = jj_consume_token(CONTAINS);
break;
default:
- jj_la1[163] = jj_gen;
+ jj_la1[166] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
- label_113: while (true) {
+ label_114: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[164] = jj_gen;
- break label_113;
+ jj_la1[167] = jj_gen;
+ break label_114;
}
jj_consume_token(S);
}
@@ -3985,18 +4070,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
jj_consume_token(RPARAN);
break;
default:
- jj_la1[165] = jj_gen;
+ jj_la1[168] = jj_gen;
;
}
jj_consume_token(COMMA);
- label_114: while (true) {
+ label_115: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[166] = jj_gen;
- break label_114;
+ jj_la1[169] = jj_gen;
+ break label_115;
}
jj_consume_token(S);
}
@@ -4004,33 +4089,33 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case COMMA:
jj_consume_token(COMMA);
- label_115: while (true) {
+ label_116: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[167] = jj_gen;
- break label_115;
+ jj_la1[170] = jj_gen;
+ break label_116;
}
jj_consume_token(S);
}
n = jj_consume_token(IDENT);
separator = n.image;
- label_116: while (true) {
+ label_117: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[168] = jj_gen;
- break label_116;
+ jj_la1[171] = jj_gen;
+ break label_117;
}
jj_consume_token(S);
}
break;
default:
- jj_la1[169] = jj_gen;
+ jj_la1[172] = jj_gen;
;
}
jj_consume_token(RPARAN);
@@ -4051,26 +4136,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
default:
break;
}
- label_117: while (true) {
+ label_118: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[170] = jj_gen;
- break label_117;
+ jj_la1[173] = jj_gen;
+ break label_118;
}
jj_consume_token(S);
}
jj_consume_token(SEMICOLON);
- label_118: while (true) {
+ label_119: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[171] = jj_gen;
- break label_118;
+ jj_la1[174] = jj_gen;
+ break label_119;
}
jj_consume_token(S);
}
@@ -4088,38 +4173,38 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
Token n = null;
n = jj_consume_token(VARIABLE);
variable = n.image;
- label_119: while (true) {
+ label_120: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[172] = jj_gen;
- break label_119;
+ jj_la1[175] = jj_gen;
+ break label_120;
}
jj_consume_token(S);
}
jj_consume_token(COLON);
- label_120: while (true) {
+ label_121: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[173] = jj_gen;
- break label_120;
+ jj_la1[176] = jj_gen;
+ break label_121;
}
jj_consume_token(S);
}
jj_consume_token(APPEND);
- label_121: while (true) {
+ label_122: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[174] = jj_gen;
- break label_121;
+ jj_la1[177] = jj_gen;
+ break label_122;
}
jj_consume_token(S);
}
@@ -4129,18 +4214,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
jj_consume_token(RPARAN);
break;
default:
- jj_la1[175] = jj_gen;
+ jj_la1[178] = jj_gen;
;
}
jj_consume_token(COMMA);
- label_122: while (true) {
+ label_123: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[176] = jj_gen;
- break label_122;
+ jj_la1[179] = jj_gen;
+ break label_123;
}
jj_consume_token(S);
}
@@ -4148,33 +4233,33 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case COMMA:
jj_consume_token(COMMA);
- label_123: while (true) {
+ label_124: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[177] = jj_gen;
- break label_123;
+ jj_la1[180] = jj_gen;
+ break label_124;
}
jj_consume_token(S);
}
n = jj_consume_token(IDENT);
separator = n.image;
- label_124: while (true) {
+ label_125: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[178] = jj_gen;
- break label_124;
+ jj_la1[181] = jj_gen;
+ break label_125;
}
jj_consume_token(S);
}
break;
default:
- jj_la1[179] = jj_gen;
+ jj_la1[182] = jj_gen;
;
}
jj_consume_token(RPARAN);
@@ -4193,38 +4278,38 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
Token n = null;
n = jj_consume_token(VARIABLE);
variable = n.image;
- label_125: while (true) {
+ label_126: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[180] = jj_gen;
- break label_125;
+ jj_la1[183] = jj_gen;
+ break label_126;
}
jj_consume_token(S);
}
jj_consume_token(COLON);
- label_126: while (true) {
+ label_127: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[181] = jj_gen;
- break label_126;
+ jj_la1[184] = jj_gen;
+ break label_127;
}
jj_consume_token(S);
}
jj_consume_token(REMOVE);
- label_127: while (true) {
+ label_128: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[182] = jj_gen;
- break label_127;
+ jj_la1[185] = jj_gen;
+ break label_128;
}
jj_consume_token(S);
}
@@ -4234,18 +4319,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
jj_consume_token(RPARAN);
break;
default:
- jj_la1[183] = jj_gen;
+ jj_la1[186] = jj_gen;
;
}
jj_consume_token(COMMA);
- label_128: while (true) {
+ label_129: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[184] = jj_gen;
- break label_128;
+ jj_la1[187] = jj_gen;
+ break label_129;
}
jj_consume_token(S);
}
@@ -4253,33 +4338,33 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case COMMA:
jj_consume_token(COMMA);
- label_129: while (true) {
+ label_130: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[185] = jj_gen;
- break label_129;
+ jj_la1[188] = jj_gen;
+ break label_130;
}
jj_consume_token(S);
}
n = jj_consume_token(IDENT);
separator = n.image;
- label_130: while (true) {
+ label_131: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[186] = jj_gen;
- break label_130;
+ jj_la1[189] = jj_gen;
+ break label_131;
}
jj_consume_token(S);
}
break;
default:
- jj_la1[187] = jj_gen;
+ jj_la1[190] = jj_gen;
;
}
jj_consume_token(RPARAN);
@@ -4300,43 +4385,43 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
case VARIABLE:
n = jj_consume_token(VARIABLE);
variable = n.image;
- label_131: while (true) {
+ label_132: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[188] = jj_gen;
- break label_131;
+ jj_la1[191] = jj_gen;
+ break label_132;
}
jj_consume_token(S);
}
jj_consume_token(COLON);
- label_132: while (true) {
+ label_133: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[189] = jj_gen;
- break label_132;
+ jj_la1[192] = jj_gen;
+ break label_133;
}
jj_consume_token(S);
}
break;
default:
- jj_la1[190] = jj_gen;
+ jj_la1[193] = jj_gen;
;
}
jj_consume_token(CONTAINS);
- label_133: while (true) {
+ label_134: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[191] = jj_gen;
- break label_133;
+ jj_la1[194] = jj_gen;
+ break label_134;
}
jj_consume_token(S);
}
@@ -4346,18 +4431,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
jj_consume_token(RPARAN);
break;
default:
- jj_la1[192] = jj_gen;
+ jj_la1[195] = jj_gen;
;
}
jj_consume_token(COMMA);
- label_134: while (true) {
+ label_135: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[193] = jj_gen;
- break label_134;
+ jj_la1[196] = jj_gen;
+ break label_135;
}
jj_consume_token(S);
}
@@ -4365,33 +4450,33 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case COMMA:
jj_consume_token(COMMA);
- label_135: while (true) {
+ label_136: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[194] = jj_gen;
- break label_135;
+ jj_la1[197] = jj_gen;
+ break label_136;
}
jj_consume_token(S);
}
n = jj_consume_token(IDENT);
separator = n.image;
- label_136: while (true) {
+ label_137: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[195] = jj_gen;
- break label_136;
+ jj_la1[198] = jj_gen;
+ break label_137;
}
jj_consume_token(S);
}
break;
default:
- jj_la1[196] = jj_gen;
+ jj_la1[199] = jj_gen;
;
}
jj_consume_token(RPARAN);
@@ -4493,7 +4578,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
warnDirective();
break;
default:
- jj_la1[197] = jj_gen;
+ jj_la1[200] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -4505,14 +4590,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
// TODO should evaluate the content expression, call
// documentHandler.debugDirective() etc.
System.out.println(content);
- label_137: while (true) {
+ label_138: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[198] = jj_gen;
- break label_137;
+ jj_la1[201] = jj_gen;
+ break label_138;
}
jj_consume_token(S);
}
@@ -4524,14 +4609,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
// TODO should evaluate the content expression, call
// documentHandler.warnDirective() etc.
System.err.println(content);
- label_138: while (true) {
+ label_139: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[199] = jj_gen;
- break label_138;
+ jj_la1[202] = jj_gen;
+ break label_139;
}
jj_consume_token(S);
}
@@ -4557,19 +4642,19 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
exclusive = false;
break;
default:
- jj_la1[200] = jj_gen;
+ jj_la1[203] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
to = skipStatementUntilLeftBrace();
- label_139: while (true) {
+ label_140: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[201] = jj_gen;
- break label_139;
+ jj_la1[204] = jj_gen;
+ break label_140;
}
jj_consume_token(S);
}
@@ -4599,28 +4684,28 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
final public void extendDirective() throws ParseException {
ArrayList<String> list;
jj_consume_token(EXTEND_SYM);
- label_140: while (true) {
+ label_141: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[202] = jj_gen;
- break label_140;
+ jj_la1[205] = jj_gen;
+ break label_141;
}
jj_consume_token(S);
}
list = selectorList();
- label_141: while (true) {
+ label_142: while (true) {
jj_consume_token(SEMICOLON);
- label_142: while (true) {
+ label_143: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[203] = jj_gen;
- break label_142;
+ jj_la1[206] = jj_gen;
+ break label_143;
}
jj_consume_token(S);
}
@@ -4629,8 +4714,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[204] = jj_gen;
- break label_141;
+ jj_la1[207] = jj_gen;
+ break label_142;
}
}
documentHandler.extendDirective(list);
@@ -4638,27 +4723,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
final public void contentDirective() throws ParseException {
jj_consume_token(CONTENT_SYM);
- label_143: while (true) {
+ label_144: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[205] = jj_gen;
- break label_143;
+ jj_la1[208] = jj_gen;
+ break label_144;
}
jj_consume_token(S);
}
- label_144: while (true) {
+ label_145: while (true) {
jj_consume_token(SEMICOLON);
- label_145: while (true) {
+ label_146: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[206] = jj_gen;
- break label_145;
+ jj_la1[209] = jj_gen;
+ break label_146;
}
jj_consume_token(S);
}
@@ -4667,8 +4752,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
;
break;
default:
- jj_la1[207] = jj_gen;
- break label_144;
+ jj_la1[210] = jj_gen;
+ break label_145;
}
}
documentHandler.contentDirective();
@@ -4695,26 +4780,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
LexicalUnit exp;
name = property();
jj_consume_token(COLON);
- label_146: while (true) {
+ label_147: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[208] = jj_gen;
- break label_146;
+ jj_la1[211] = jj_gen;
+ break label_147;
}
jj_consume_token(S);
}
jj_consume_token(LBRACE);
- label_147: while (true) {
+ label_148: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[209] = jj_gen;
- break label_147;
+ jj_la1[212] = jj_gen;
+ break label_148;
}
jj_consume_token(S);
}
@@ -4725,27 +4810,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
declaration();
break;
default:
- jj_la1[210] = jj_gen;
+ jj_la1[213] = jj_gen;
;
}
- label_148: while (true) {
+ label_149: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case SEMICOLON:
;
break;
default:
- jj_la1[211] = jj_gen;
- break label_148;
+ jj_la1[214] = jj_gen;
+ break label_149;
}
jj_consume_token(SEMICOLON);
- label_149: while (true) {
+ label_150: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[212] = jj_gen;
- break label_149;
+ jj_la1[215] = jj_gen;
+ break label_150;
}
jj_consume_token(S);
}
@@ -4755,20 +4840,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
declaration();
break;
default:
- jj_la1[213] = jj_gen;
+ jj_la1[216] = jj_gen;
;
}
}
jj_consume_token(RBRACE);
documentHandler.endNestedProperties(name);
- label_150: while (true) {
+ label_151: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[214] = jj_gen;
- break label_150;
+ jj_la1[217] = jj_gen;
+ break label_151;
}
jj_consume_token(S);
}
@@ -4787,7 +4872,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
debuggingDirective();
break;
default:
- jj_la1[215] = jj_gen;
+ jj_la1[218] = jj_gen;
if (jj_2_6(2147483647)) {
styleRule();
} else if (jj_2_7(3)) {
@@ -4808,7 +4893,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
styleRule();
break;
default:
- jj_la1[216] = jj_gen;
+ jj_la1[219] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -4853,14 +4938,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
name = property();
save = token;
jj_consume_token(COLON);
- label_151: while (true) {
+ label_152: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[217] = jj_gen;
- break label_151;
+ jj_la1[220] = jj_gen;
+ break label_152;
}
jj_consume_token(S);
}
@@ -4904,7 +4989,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
important = prio();
break;
default:
- jj_la1[218] = jj_gen;
+ jj_la1[221] = jj_gen;
;
}
Token next = getToken(1);
@@ -4926,14 +5011,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
break;
case LBRACE:
jj_consume_token(LBRACE);
- label_152: while (true) {
+ label_153: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[219] = jj_gen;
- break label_152;
+ jj_la1[222] = jj_gen;
+ break label_153;
}
jj_consume_token(S);
}
@@ -4944,27 +5029,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
declaration();
break;
default:
- jj_la1[220] = jj_gen;
+ jj_la1[223] = jj_gen;
;
}
- label_153: while (true) {
+ label_154: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case SEMICOLON:
;
break;
default:
- jj_la1[221] = jj_gen;
- break label_153;
+ jj_la1[224] = jj_gen;
+ break label_154;
}
jj_consume_token(SEMICOLON);
- label_154: while (true) {
+ label_155: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[222] = jj_gen;
- break label_154;
+ jj_la1[225] = jj_gen;
+ break label_155;
}
jj_consume_token(S);
}
@@ -4974,26 +5059,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
declaration();
break;
default:
- jj_la1[223] = jj_gen;
+ jj_la1[226] = jj_gen;
;
}
}
jj_consume_token(RBRACE);
- label_155: while (true) {
+ label_156: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[224] = jj_gen;
- break label_155;
+ jj_la1[227] = jj_gen;
+ break label_156;
}
jj_consume_token(S);
}
documentHandler.endNestedProperties(name);
break;
default:
- jj_la1[225] = jj_gen;
+ jj_la1[228] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -5041,14 +5126,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
name = property();
save = token;
jj_consume_token(COLON);
- label_156: while (true) {
+ label_157: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[226] = jj_gen;
- break label_156;
+ jj_la1[229] = jj_gen;
+ break label_157;
}
jj_consume_token(S);
}
@@ -5058,7 +5143,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
important = prio();
break;
default:
- jj_la1[227] = jj_gen;
+ jj_la1[230] = jj_gen;
;
}
documentHandler.property(name, exp, important);
@@ -5099,14 +5184,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
*/
final public boolean prio() throws ParseException {
jj_consume_token(IMPORTANT_SYM);
- label_157: while (true) {
+ label_158: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[228] = jj_gen;
- break label_157;
+ jj_la1[231] = jj_gen;
+ break label_158;
}
jj_consume_token(S);
}
@@ -5120,14 +5205,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
final public boolean guarded() throws ParseException {
jj_consume_token(GUARDED_SYM);
- label_158: while (true) {
+ label_159: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[229] = jj_gen;
- break label_158;
+ jj_la1[232] = jj_gen;
+ break label_159;
}
jj_consume_token(S);
}
@@ -5159,14 +5244,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
* parenthesis is not supported now.
*/
n = jj_consume_token(COMMA);
- label_159: while (true) {
+ label_160: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[230] = jj_gen;
- break label_159;
+ jj_la1[233] = jj_gen;
+ break label_160;
}
jj_consume_token(S);
}
@@ -5179,14 +5264,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
break;
case DIV:
n = jj_consume_token(DIV);
- label_160: while (true) {
+ label_161: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[231] = jj_gen;
- break label_160;
+ jj_la1[234] = jj_gen;
+ break label_161;
}
jj_consume_token(S);
}
@@ -5199,14 +5284,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
break;
case ANY:
n = jj_consume_token(ANY);
- label_161: while (true) {
+ label_162: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[232] = jj_gen;
- break label_161;
+ jj_la1[235] = jj_gen;
+ break label_162;
}
jj_consume_token(S);
}
@@ -5219,14 +5304,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
break;
case MOD:
n = jj_consume_token(MOD);
- label_162: while (true) {
+ label_163: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[233] = jj_gen;
- break label_162;
+ jj_la1[236] = jj_gen;
+ break label_163;
}
jj_consume_token(S);
}
@@ -5239,15 +5324,15 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
break;
case PLUS:
n = jj_consume_token(PLUS);
- label_163: while (true) {
+ label_164: while (true) {
jj_consume_token(S);
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[234] = jj_gen;
- break label_163;
+ jj_la1[237] = jj_gen;
+ break label_164;
}
}
{
@@ -5259,15 +5344,15 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
break;
case MINUS:
n = jj_consume_token(MINUS);
- label_164: while (true) {
+ label_165: while (true) {
jj_consume_token(S);
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[235] = jj_gen;
- break label_164;
+ jj_la1[238] = jj_gen;
+ break label_165;
}
}
{
@@ -5278,7 +5363,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
break;
default:
- jj_la1[236] = jj_gen;
+ jj_la1[239] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -5294,11 +5379,11 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
char op;
first = term(null);
res = first;
- label_165: while (true) {
+ label_166: while (true) {
if (jj_2_8(2)) {
;
} else {
- break label_165;
+ break label_166;
}
if (jj_2_9(2)) {
res = operator(res);
@@ -5338,7 +5423,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
break;
default:
- jj_la1[237] = jj_gen;
+ jj_la1[240] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -5393,7 +5478,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
result = variableTerm(prev);
break;
default:
- jj_la1[238] = jj_gen;
+ jj_la1[241] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -5457,7 +5542,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
op = unaryOperator();
break;
default:
- jj_la1[239] = jj_gen;
+ jj_la1[242] = jj_gen;
;
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
@@ -5564,15 +5649,16 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
&& (Character.isDigit(s.charAt(i)) || (s.charAt(i) == '.'))) {
i++;
}
+
result = LexicalUnitImpl.createDimen(n.beginLine,
- n.beginColumn, prev, Float.valueOf(s.substring(0, i))
- .floatValue(), s.substring(i));
+ n.beginColumn, prev, number(op, n, s.length() - i),
+ s.substring(i));
break;
case FUNCTION:
result = function(op, prev);
break;
default:
- jj_la1[240] = jj_gen;
+ jj_la1[243] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -5604,7 +5690,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
s += ".";
break;
default:
- jj_la1[241] = jj_gen;
+ jj_la1[244] = jj_gen;
;
}
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
@@ -5621,7 +5707,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
n = jj_consume_token(FROM);
break;
default:
- jj_la1[242] = jj_gen;
+ jj_la1[245] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -5659,24 +5745,24 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
result = unicode(prev);
break;
default:
- jj_la1[243] = jj_gen;
+ jj_la1[246] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
break;
default:
- jj_la1[244] = jj_gen;
+ jj_la1[247] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
- label_166: while (true) {
+ label_167: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[245] = jj_gen;
- break label_166;
+ jj_la1[248] = jj_gen;
+ break label_167;
}
jj_consume_token(S);
}
@@ -5699,14 +5785,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
Token n;
LexicalUnit params = null;
n = jj_consume_token(FUNCTION);
- label_167: while (true) {
+ label_168: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[246] = jj_gen;
- break label_167;
+ jj_la1[249] = jj_gen;
+ break label_168;
}
jj_consume_token(S);
}
@@ -5765,7 +5851,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
params = expr();
break;
default:
- jj_la1[247] = jj_gen;
+ jj_la1[250] = jj_gen;
;
}
jj_consume_token(RPARAN);
@@ -6095,9 +6181,35 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return skipStatementUntil(lBrace);
}
- String skipStatementUntilRightParan() throws ParseException {
- int[] rParan = { RPARAN };
- return skipStatementUntil(rParan);
+ String skipStatementUntilMatchingRightParan() throws ParseException {
+ int[] leftTokens = { LPARAN, FUNCTION }; // a FUNCTION also contains "("
+ int[] rightTokens = { RPARAN };
+ StringBuffer s = new StringBuffer();
+ int difference = 1;
+ Token tok;
+ while (difference != 0) {
+ tok = getToken(1);
+ if (tok.kind == EOF) {
+ return null;
+ }
+ for (int sym : leftTokens) {
+ if (tok.kind == sym) {
+ difference++;
+ }
+ }
+ for (int sym : rightTokens) {
+ if (tok.kind == sym) {
+ difference--;
+ }
+ }
+ if (difference != 0) {
+ if (tok.image != null) {
+ s.append(tok.image);
+ }
+ getNextToken();
+ }
+ }
+ return s.toString().trim();
}
String skipStatementUntil(int[] symbols) throws ParseException {
@@ -6308,14 +6420,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
// TODO required by original parser but not used by Vaadin?
final public void _parseRule() throws ParseException {
String ret = null;
- label_168: while (true) {
+ label_169: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[248] = jj_gen;
- break label_168;
+ jj_la1[251] = jj_gen;
+ break label_169;
}
jj_consume_token(S);
}
@@ -6350,7 +6462,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
fontFace();
break;
default:
- jj_la1[249] = jj_gen;
+ jj_la1[252] = jj_gen;
ret = skipStatement();
if ((ret == null) || (ret.length() == 0)) {
{
@@ -6373,14 +6485,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
final public void _parseImportRule() throws ParseException {
- label_169: while (true) {
+ label_170: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[250] = jj_gen;
- break label_169;
+ jj_la1[253] = jj_gen;
+ break label_170;
}
jj_consume_token(S);
}
@@ -6388,14 +6500,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
final public void _parseMediaRule() throws ParseException {
- label_170: while (true) {
+ label_171: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[251] = jj_gen;
- break label_170;
+ jj_la1[254] = jj_gen;
+ break label_171;
}
jj_consume_token(S);
}
@@ -6403,14 +6515,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
final public void _parseDeclarationBlock() throws ParseException {
- label_171: while (true) {
+ label_172: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[252] = jj_gen;
- break label_171;
+ jj_la1[255] = jj_gen;
+ break label_172;
}
jj_consume_token(S);
}
@@ -6420,27 +6532,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
declaration();
break;
default:
- jj_la1[253] = jj_gen;
+ jj_la1[256] = jj_gen;
;
}
- label_172: while (true) {
+ label_173: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case SEMICOLON:
;
break;
default:
- jj_la1[254] = jj_gen;
- break label_172;
+ jj_la1[257] = jj_gen;
+ break label_173;
}
jj_consume_token(SEMICOLON);
- label_173: while (true) {
+ label_174: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[255] = jj_gen;
- break label_173;
+ jj_la1[258] = jj_gen;
+ break label_174;
}
jj_consume_token(S);
}
@@ -6450,7 +6562,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
declaration();
break;
default:
- jj_la1[256] = jj_gen;
+ jj_la1[259] = jj_gen;
;
}
}
@@ -6459,14 +6571,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
final public ArrayList<String> _parseSelectors() throws ParseException {
ArrayList<String> p = null;
try {
- label_174: while (true) {
+ label_175: while (true) {
switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
case S:
;
break;
default:
- jj_la1[257] = jj_gen;
- break label_174;
+ jj_la1[260] = jj_gen;
+ break label_175;
}
jj_consume_token(S);
}
@@ -6594,14 +6706,32 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
}
- private boolean jj_3R_187() {
- if (jj_3R_212()) {
+ private boolean jj_3R_209() {
+ if (jj_scan_token(MINUS)) {
return true;
}
+ Token xsp;
+ if (jj_scan_token(1)) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_scan_token(1)) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
return false;
}
- private boolean jj_3R_210() {
+ private boolean jj_3R_188() {
+ if (jj_3R_210()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_208() {
if (jj_scan_token(PLUS)) {
return true;
}
@@ -6619,7 +6749,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_209() {
+ private boolean jj_3R_207() {
if (jj_scan_token(MOD)) {
return true;
}
@@ -6634,7 +6764,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_208() {
+ private boolean jj_3R_206() {
if (jj_scan_token(ANY)) {
return true;
}
@@ -6649,7 +6779,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_207() {
+ private boolean jj_3R_205() {
if (jj_scan_token(DIV)) {
return true;
}
@@ -6664,7 +6794,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_206() {
+ private boolean jj_3R_204() {
if (jj_scan_token(COMMA)) {
return true;
}
@@ -6679,20 +6809,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_184() {
+ private boolean jj_3R_185() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_206()) {
+ if (jj_3R_204()) {
jj_scanpos = xsp;
- if (jj_3R_207()) {
+ if (jj_3R_205()) {
jj_scanpos = xsp;
- if (jj_3R_208()) {
+ if (jj_3R_206()) {
jj_scanpos = xsp;
- if (jj_3R_209()) {
+ if (jj_3R_207()) {
jj_scanpos = xsp;
- if (jj_3R_210()) {
+ if (jj_3R_208()) {
jj_scanpos = xsp;
- if (jj_3R_211()) {
+ if (jj_3R_209()) {
return true;
}
}
@@ -6703,18 +6833,25 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_214() {
- if (jj_3R_213()) {
+ private boolean jj_3R_212() {
+ if (jj_3R_211()) {
return true;
}
return false;
}
- private boolean jj_3R_212() {
- if (jj_scan_token(GUARDED_SYM)) {
- return true;
- }
+ private boolean jj_3R_211() {
Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(18)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(22)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(23)) {
+ return true;
+ }
+ }
+ }
while (true) {
xsp = jj_scanpos;
if (jj_scan_token(1)) {
@@ -6725,18 +6862,23 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_213() {
+ private boolean jj_3R_191() {
+ if (jj_scan_token(S)) {
+ return true;
+ }
Token xsp;
xsp = jj_scanpos;
- if (jj_scan_token(18)) {
+ if (jj_3R_212()) {
jj_scanpos = xsp;
- if (jj_scan_token(22)) {
- jj_scanpos = xsp;
- if (jj_scan_token(23)) {
- return true;
- }
- }
}
+ return false;
+ }
+
+ private boolean jj_3R_210() {
+ if (jj_scan_token(GUARDED_SYM)) {
+ return true;
+ }
+ Token xsp;
while (true) {
xsp = jj_scanpos;
if (jj_scan_token(1)) {
@@ -6747,8 +6889,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_175() {
- if (jj_3R_185()) {
+ private boolean jj_3R_176() {
+ if (jj_3R_186()) {
return true;
}
if (jj_scan_token(COLON)) {
@@ -6762,19 +6904,19 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
break;
}
}
- if (jj_3R_186()) {
+ if (jj_3R_187()) {
return true;
}
xsp = jj_scanpos;
- if (jj_3R_187()) {
+ if (jj_3R_188()) {
jj_scanpos = xsp;
}
- if (jj_3R_188()) {
+ if (jj_3R_189()) {
return true;
}
while (true) {
xsp = jj_scanpos;
- if (jj_3R_188()) {
+ if (jj_3R_189()) {
jj_scanpos = xsp;
break;
}
@@ -6783,37 +6925,25 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
private boolean jj_3R_190() {
- if (jj_scan_token(S)) {
+ if (jj_3R_211()) {
return true;
}
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_214()) {
- jj_scanpos = xsp;
- }
return false;
}
- private boolean jj_3R_189() {
- if (jj_3R_213()) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_176() {
+ private boolean jj_3R_177() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_189()) {
+ if (jj_3R_190()) {
jj_scanpos = xsp;
- if (jj_3R_190()) {
+ if (jj_3R_191()) {
return true;
}
}
return false;
}
- private boolean jj_3R_196() {
+ private boolean jj_3R_194() {
if (jj_scan_token(VARIABLE)) {
return true;
}
@@ -6838,10 +6968,10 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_178() {
+ private boolean jj_3R_179() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_196()) {
+ if (jj_3R_194()) {
jj_scanpos = xsp;
}
if (jj_scan_token(CONTAINS)) {
@@ -6862,21 +6992,21 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_216() {
+ private boolean jj_3R_262() {
if (jj_scan_token(HASH)) {
return true;
}
return false;
}
- private boolean jj_3R_286() {
+ private boolean jj_3R_279() {
if (jj_scan_token(IDENT)) {
return true;
}
return false;
}
- private boolean jj_3R_287() {
+ private boolean jj_3R_280() {
if (jj_scan_token(FUNCTION)) {
return true;
}
@@ -6896,26 +7026,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_285() {
+ private boolean jj_3R_278() {
if (jj_scan_token(COLON)) {
return true;
}
return false;
}
- private boolean jj_3R_218() {
+ private boolean jj_3R_265() {
if (jj_scan_token(COLON)) {
return true;
}
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_285()) {
+ if (jj_3R_278()) {
jj_scanpos = xsp;
}
xsp = jj_scanpos;
- if (jj_3R_286()) {
+ if (jj_3R_279()) {
jj_scanpos = xsp;
- if (jj_3R_287()) {
+ if (jj_3R_280()) {
return true;
}
}
@@ -6923,103 +7053,103 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
private boolean jj_3_7() {
- if (jj_3R_182()) {
+ if (jj_3R_183()) {
return true;
}
return false;
}
- private boolean jj_3R_203() {
+ private boolean jj_3R_201() {
if (jj_scan_token(LBRACE)) {
return true;
}
return false;
}
- private boolean jj_3R_306() {
+ private boolean jj_3R_290() {
if (jj_scan_token(STRING)) {
return true;
}
return false;
}
- private boolean jj_3R_304() {
+ private boolean jj_3R_288() {
if (jj_scan_token(STARMATCH)) {
return true;
}
return false;
}
- private boolean jj_3R_305() {
- if (jj_scan_token(IDENT)) {
+ private boolean jj_3R_287() {
+ if (jj_scan_token(DOLLARMATCH)) {
return true;
}
return false;
}
- private boolean jj_3R_303() {
- if (jj_scan_token(DOLLARMATCH)) {
+ private boolean jj_3R_289() {
+ if (jj_scan_token(IDENT)) {
return true;
}
return false;
}
- private boolean jj_3R_302() {
+ private boolean jj_3R_286() {
if (jj_scan_token(CARETMATCH)) {
return true;
}
return false;
}
- private boolean jj_3R_301() {
+ private boolean jj_3R_285() {
if (jj_scan_token(DASHMATCH)) {
return true;
}
return false;
}
- private boolean jj_3R_300() {
+ private boolean jj_3R_284() {
if (jj_scan_token(INCLUDES)) {
return true;
}
return false;
}
- private boolean jj_3R_267() {
+ private boolean jj_3R_270() {
if (jj_scan_token(INTERPOLATION)) {
return true;
}
return false;
}
- private boolean jj_3R_299() {
+ private boolean jj_3R_283() {
if (jj_scan_token(EQ)) {
return true;
}
return false;
}
- private boolean jj_3R_202() {
- if (jj_3R_186()) {
+ private boolean jj_3R_200() {
+ if (jj_3R_187()) {
return true;
}
return false;
}
- private boolean jj_3R_292() {
+ private boolean jj_3R_277() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_299()) {
+ if (jj_3R_283()) {
jj_scanpos = xsp;
- if (jj_3R_300()) {
+ if (jj_3R_284()) {
jj_scanpos = xsp;
- if (jj_3R_301()) {
+ if (jj_3R_285()) {
jj_scanpos = xsp;
- if (jj_3R_302()) {
+ if (jj_3R_286()) {
jj_scanpos = xsp;
- if (jj_3R_303()) {
+ if (jj_3R_287()) {
jj_scanpos = xsp;
- if (jj_3R_304()) {
+ if (jj_3R_288()) {
return true;
}
}
@@ -7035,9 +7165,9 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
}
xsp = jj_scanpos;
- if (jj_3R_305()) {
+ if (jj_3R_289()) {
jj_scanpos = xsp;
- if (jj_3R_306()) {
+ if (jj_3R_290()) {
return true;
}
}
@@ -7052,7 +7182,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
private boolean jj_3_6() {
- if (jj_3R_181()) {
+ if (jj_3R_182()) {
return true;
}
if (jj_scan_token(LBRACE)) {
@@ -7061,7 +7191,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_219() {
+ private boolean jj_3R_264() {
if (jj_scan_token(LBRACKET)) {
return true;
}
@@ -7084,7 +7214,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
}
xsp = jj_scanpos;
- if (jj_3R_292()) {
+ if (jj_3R_277()) {
jj_scanpos = xsp;
}
if (jj_scan_token(RBRACKET)) {
@@ -7093,8 +7223,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_182() {
- if (jj_3R_201()) {
+ private boolean jj_3R_183() {
+ if (jj_3R_199()) {
return true;
}
if (jj_scan_token(COLON)) {
@@ -7109,70 +7239,70 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
}
xsp = jj_scanpos;
- if (jj_3R_202()) {
+ if (jj_3R_200()) {
jj_scanpos = xsp;
- if (jj_3R_203()) {
+ if (jj_3R_201()) {
return true;
}
}
return false;
}
- private boolean jj_3R_298() {
+ private boolean jj_3R_282() {
if (jj_scan_token(INTERPOLATION)) {
return true;
}
return false;
}
- private boolean jj_3R_265() {
- if (jj_3R_186()) {
+ private boolean jj_3R_268() {
+ if (jj_3R_187()) {
return true;
}
return false;
}
- private boolean jj_3R_253() {
+ private boolean jj_3R_248() {
if (jj_scan_token(PARENT)) {
return true;
}
return false;
}
- private boolean jj_3R_252() {
+ private boolean jj_3R_247() {
if (jj_scan_token(ANY)) {
return true;
}
return false;
}
- private boolean jj_3R_262() {
+ private boolean jj_3R_261() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_266()) {
+ if (jj_3R_269()) {
jj_scanpos = xsp;
- if (jj_3R_267()) {
+ if (jj_3R_270()) {
return true;
}
}
return false;
}
- private boolean jj_3R_266() {
+ private boolean jj_3R_269() {
if (jj_scan_token(IDENT)) {
return true;
}
return false;
}
- private boolean jj_3R_215() {
+ private boolean jj_3R_213() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_251()) {
+ if (jj_3R_246()) {
jj_scanpos = xsp;
- if (jj_3R_252()) {
+ if (jj_3R_247()) {
jj_scanpos = xsp;
- if (jj_3R_253()) {
+ if (jj_3R_248()) {
return true;
}
}
@@ -7180,14 +7310,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_251() {
+ private boolean jj_3R_246() {
Token xsp;
- if (jj_3R_262()) {
+ if (jj_3R_261()) {
return true;
}
while (true) {
xsp = jj_scanpos;
- if (jj_3R_262()) {
+ if (jj_3R_261()) {
jj_scanpos = xsp;
break;
}
@@ -7195,7 +7325,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_255() {
+ private boolean jj_3R_254() {
if (jj_scan_token(FUNCTION)) {
return true;
}
@@ -7208,7 +7338,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
}
xsp = jj_scanpos;
- if (jj_3R_265()) {
+ if (jj_3R_268()) {
jj_scanpos = xsp;
}
if (jj_scan_token(RPARAN)) {
@@ -7217,7 +7347,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_179() {
+ private boolean jj_3R_180() {
if (jj_scan_token(COMMA)) {
return true;
}
@@ -7232,48 +7362,41 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_297() {
- if (jj_scan_token(IDENT)) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_246() {
- if (jj_3R_259()) {
+ private boolean jj_3R_241() {
+ if (jj_3R_258()) {
return true;
}
return false;
}
- private boolean jj_3R_280() {
+ private boolean jj_3R_276() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_297()) {
+ if (jj_3R_281()) {
jj_scanpos = xsp;
- if (jj_3R_298()) {
+ if (jj_3R_282()) {
return true;
}
}
return false;
}
- private boolean jj_3R_245() {
- if (jj_3R_258()) {
+ private boolean jj_3R_281() {
+ if (jj_scan_token(IDENT)) {
return true;
}
return false;
}
- private boolean jj_3R_296() {
- if (jj_3R_218()) {
+ private boolean jj_3R_240() {
+ if (jj_3R_257()) {
return true;
}
return false;
}
- private boolean jj_3R_244() {
- if (jj_3R_257()) {
+ private boolean jj_3R_239() {
+ if (jj_3R_256()) {
return true;
}
return false;
@@ -7282,26 +7405,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
private boolean jj_3_5() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_179()) {
+ if (jj_3R_180()) {
jj_scanpos = xsp;
}
- if (jj_3R_180()) {
+ if (jj_3R_181()) {
return true;
}
return false;
}
- private boolean jj_3R_217() {
+ private boolean jj_3R_263() {
if (jj_scan_token(DOT)) {
return true;
}
Token xsp;
- if (jj_3R_280()) {
+ if (jj_3R_276()) {
return true;
}
while (true) {
xsp = jj_scanpos;
- if (jj_3R_280()) {
+ if (jj_3R_276()) {
jj_scanpos = xsp;
break;
}
@@ -7309,65 +7432,65 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_294() {
- if (jj_3R_217()) {
+ private boolean jj_3R_252() {
+ if (jj_3R_265()) {
return true;
}
return false;
}
- private boolean jj_3R_289() {
- if (jj_3R_217()) {
+ private boolean jj_3R_275() {
+ if (jj_3R_265()) {
return true;
}
return false;
}
- private boolean jj_3R_291() {
- if (jj_3R_218()) {
+ private boolean jj_3R_273() {
+ if (jj_3R_263()) {
return true;
}
return false;
}
- private boolean jj_3R_279() {
- if (jj_3R_218()) {
+ private boolean jj_3R_250() {
+ if (jj_3R_263()) {
return true;
}
return false;
}
- private boolean jj_3R_282() {
- if (jj_3R_217()) {
+ private boolean jj_3R_251() {
+ if (jj_3R_264()) {
return true;
}
return false;
}
- private boolean jj_3R_284() {
- if (jj_3R_218()) {
+ private boolean jj_3R_274() {
+ if (jj_3R_264()) {
return true;
}
return false;
}
- private boolean jj_3R_295() {
- if (jj_3R_219()) {
+ private boolean jj_3R_255() {
+ if (jj_scan_token(DOT)) {
return true;
}
return false;
}
- private boolean jj_3R_272() {
+ private boolean jj_3R_271() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_293()) {
+ if (jj_3R_272()) {
jj_scanpos = xsp;
- if (jj_3R_294()) {
+ if (jj_3R_273()) {
jj_scanpos = xsp;
- if (jj_3R_295()) {
+ if (jj_3R_274()) {
jj_scanpos = xsp;
- if (jj_3R_296()) {
+ if (jj_3R_275()) {
return true;
}
}
@@ -7376,55 +7499,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_293() {
- if (jj_3R_216()) {
+ private boolean jj_3R_272() {
+ if (jj_3R_262()) {
return true;
}
return false;
}
- private boolean jj_3R_271() {
+ private boolean jj_3R_238() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_288()) {
+ if (jj_3R_255()) {
jj_scanpos = xsp;
- if (jj_3R_289()) {
- jj_scanpos = xsp;
- if (jj_3R_290()) {
- jj_scanpos = xsp;
- if (jj_3R_291()) {
- return true;
- }
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_288() {
- if (jj_3R_216()) {
- return true;
}
- return false;
- }
-
- private boolean jj_3R_276() {
- if (jj_3R_218()) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_270() {
- Token xsp;
xsp = jj_scanpos;
- if (jj_3R_281()) {
+ if (jj_scan_token(72)) {
jj_scanpos = xsp;
- if (jj_3R_282()) {
+ if (jj_scan_token(49)) {
jj_scanpos = xsp;
- if (jj_3R_283()) {
+ if (jj_scan_token(50)) {
jj_scanpos = xsp;
- if (jj_3R_284()) {
+ if (jj_scan_token(52)) {
return true;
}
}
@@ -7433,84 +7528,23 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_281() {
- if (jj_3R_216()) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_290() {
- if (jj_3R_219()) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_278() {
- if (jj_3R_219()) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_283() {
- if (jj_3R_219()) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_269() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_277()) {
- jj_scanpos = xsp;
- if (jj_3R_278()) {
- jj_scanpos = xsp;
- if (jj_3R_279()) {
- return true;
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_274() {
- if (jj_3R_217()) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_277() {
- if (jj_3R_217()) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_256() {
- if (jj_scan_token(DOT)) {
+ private boolean jj_3R_237() {
+ if (jj_scan_token(STRING)) {
return true;
}
return false;
}
- private boolean jj_3R_243() {
+ private boolean jj_3R_214() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_256()) {
- jj_scanpos = xsp;
- }
- xsp = jj_scanpos;
- if (jj_scan_token(72)) {
+ if (jj_3R_249()) {
jj_scanpos = xsp;
- if (jj_scan_token(49)) {
+ if (jj_3R_250()) {
jj_scanpos = xsp;
- if (jj_scan_token(50)) {
+ if (jj_3R_251()) {
jj_scanpos = xsp;
- if (jj_scan_token(52)) {
+ if (jj_3R_252()) {
return true;
}
}
@@ -7519,47 +7553,32 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_242() {
- if (jj_scan_token(STRING)) {
+ private boolean jj_3R_249() {
+ if (jj_3R_262()) {
return true;
}
return false;
}
- private boolean jj_3R_195() {
- if (jj_3R_219()) {
- return true;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_272()) {
- jj_scanpos = xsp;
- break;
- }
- }
- return false;
- }
-
- private boolean jj_3R_241() {
- if (jj_3R_255()) {
+ private boolean jj_3R_236() {
+ if (jj_3R_254()) {
return true;
}
return false;
}
- private boolean jj_3R_198() {
+ private boolean jj_3R_196() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_242()) {
+ if (jj_3R_237()) {
jj_scanpos = xsp;
- if (jj_3R_243()) {
+ if (jj_3R_238()) {
jj_scanpos = xsp;
- if (jj_3R_244()) {
+ if (jj_3R_239()) {
jj_scanpos = xsp;
- if (jj_3R_245()) {
+ if (jj_3R_240()) {
jj_scanpos = xsp;
- if (jj_3R_246()) {
+ if (jj_3R_241()) {
return true;
}
}
@@ -7569,36 +7588,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_194() {
- if (jj_3R_218()) {
- return true;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_271()) {
- jj_scanpos = xsp;
- break;
- }
- }
- return false;
- }
-
- private boolean jj_3R_275() {
- if (jj_3R_219()) {
- return true;
- }
- return false;
- }
-
private boolean jj_3R_193() {
- if (jj_3R_217()) {
+ Token xsp;
+ if (jj_3R_214()) {
return true;
}
- Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_270()) {
+ if (jj_3R_214()) {
jj_scanpos = xsp;
break;
}
@@ -7607,13 +7604,13 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
private boolean jj_3R_192() {
- if (jj_3R_216()) {
+ if (jj_3R_213()) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_269()) {
+ if (jj_3R_271()) {
jj_scanpos = xsp;
break;
}
@@ -7621,186 +7618,123 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_268() {
+ private boolean jj_3R_178() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_273()) {
+ if (jj_3R_192()) {
jj_scanpos = xsp;
- if (jj_3R_274()) {
- jj_scanpos = xsp;
- if (jj_3R_275()) {
- jj_scanpos = xsp;
- if (jj_3R_276()) {
- return true;
- }
- }
+ if (jj_3R_193()) {
+ return true;
}
}
return false;
}
- private boolean jj_3R_273() {
- if (jj_3R_216()) {
+ private boolean jj_3R_243() {
+ if (jj_3R_211()) {
return true;
}
- return false;
- }
-
- private boolean jj_3R_191() {
- if (jj_3R_215()) {
+ if (jj_3R_178()) {
return true;
}
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_268()) {
- jj_scanpos = xsp;
- break;
- }
- }
return false;
}
- private boolean jj_3R_240() {
+ private boolean jj_3R_235() {
if (jj_scan_token(DIMEN)) {
return true;
}
return false;
}
- private boolean jj_3R_177() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_191()) {
- jj_scanpos = xsp;
- if (jj_3R_192()) {
- jj_scanpos = xsp;
- if (jj_3R_193()) {
- jj_scanpos = xsp;
- if (jj_3R_194()) {
- jj_scanpos = xsp;
- if (jj_3R_195()) {
- return true;
- }
- }
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_239() {
+ private boolean jj_3R_234() {
if (jj_scan_token(KHZ)) {
return true;
}
return false;
}
- private boolean jj_3R_248() {
- if (jj_3R_213()) {
- return true;
- }
- if (jj_3R_177()) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_238() {
+ private boolean jj_3R_233() {
if (jj_scan_token(HZ)) {
return true;
}
return false;
}
- private boolean jj_3R_237() {
+ private boolean jj_3R_232() {
if (jj_scan_token(MS)) {
return true;
}
return false;
}
- private boolean jj_3R_236() {
+ private boolean jj_3R_231() {
if (jj_scan_token(SECOND)) {
return true;
}
return false;
}
- private boolean jj_3R_235() {
+ private boolean jj_3R_230() {
if (jj_scan_token(GRAD)) {
return true;
}
return false;
}
- private boolean jj_3R_234() {
+ private boolean jj_3R_229() {
if (jj_scan_token(RAD)) {
return true;
}
return false;
}
- private boolean jj_3R_233() {
+ private boolean jj_3R_228() {
if (jj_scan_token(DEG)) {
return true;
}
return false;
}
- private boolean jj_3R_232() {
+ private boolean jj_3R_227() {
if (jj_scan_token(EXS)) {
return true;
}
return false;
}
- private boolean jj_3R_231() {
+ private boolean jj_3R_226() {
if (jj_scan_token(REM)) {
return true;
}
return false;
}
- private boolean jj_3R_230() {
- if (jj_scan_token(LEM)) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_229() {
- if (jj_scan_token(EMS)) {
- return true;
- }
- return false;
- }
-
private boolean jj_3_2() {
- if (jj_3R_176()) {
+ if (jj_3R_177()) {
return true;
}
- if (jj_3R_177()) {
+ if (jj_3R_178()) {
return true;
}
return false;
}
- private boolean jj_3R_228() {
- if (jj_scan_token(PX)) {
+ private boolean jj_3R_225() {
+ if (jj_scan_token(LEM)) {
return true;
}
return false;
}
- private boolean jj_3R_227() {
- if (jj_scan_token(IN)) {
+ private boolean jj_3R_224() {
+ if (jj_scan_token(EMS)) {
return true;
}
return false;
}
- private boolean jj_3R_200() {
+ private boolean jj_3R_198() {
if (jj_scan_token(COMMA)) {
return true;
}
@@ -7812,39 +7746,39 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
break;
}
}
- if (jj_3R_199()) {
+ if (jj_3R_197()) {
return true;
}
return false;
}
- private boolean jj_3R_247() {
- if (jj_3R_177()) {
+ private boolean jj_3R_242() {
+ if (jj_3R_178()) {
return true;
}
return false;
}
- private boolean jj_3R_226() {
- if (jj_scan_token(PC)) {
+ private boolean jj_3R_223() {
+ if (jj_scan_token(PX)) {
return true;
}
return false;
}
- private boolean jj_3R_225() {
- if (jj_scan_token(MM)) {
+ private boolean jj_3R_222() {
+ if (jj_scan_token(IN)) {
return true;
}
return false;
}
- private boolean jj_3R_199() {
+ private boolean jj_3R_197() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_247()) {
+ if (jj_3R_242()) {
jj_scanpos = xsp;
- if (jj_3R_248()) {
+ if (jj_3R_243()) {
return true;
}
}
@@ -7865,103 +7799,132 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_224() {
+ private boolean jj_3R_221() {
+ if (jj_scan_token(PC)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_220() {
+ if (jj_scan_token(MM)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_219() {
if (jj_scan_token(CM)) {
return true;
}
return false;
}
- private boolean jj_3R_223() {
+ private boolean jj_3R_218() {
if (jj_scan_token(PT)) {
return true;
}
return false;
}
- private boolean jj_3R_222() {
+ private boolean jj_3R_217() {
if (jj_scan_token(PERCENTAGE)) {
return true;
}
return false;
}
- private boolean jj_3R_205() {
- if (jj_3R_250()) {
+ private boolean jj_3R_203() {
+ if (jj_3R_245()) {
return true;
}
return false;
}
- private boolean jj_3R_221() {
- if (jj_scan_token(NUMBER)) {
+ private boolean jj_3_1() {
+ if (jj_3R_176()) {
return true;
}
return false;
}
- private boolean jj_3R_220() {
- if (jj_3R_254()) {
+ private boolean jj_3R_182() {
+ if (jj_3R_197()) {
return true;
}
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_198()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
return false;
}
- private boolean jj_3_1() {
- if (jj_3R_175()) {
+ private boolean jj_3R_216() {
+ if (jj_scan_token(NUMBER)) {
return true;
}
return false;
}
- private boolean jj_3R_197() {
+ private boolean jj_3R_215() {
+ if (jj_3R_253()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_195() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_220()) {
+ if (jj_3R_215()) {
jj_scanpos = xsp;
}
xsp = jj_scanpos;
- if (jj_3R_221()) {
+ if (jj_3R_216()) {
jj_scanpos = xsp;
- if (jj_3R_222()) {
+ if (jj_3R_217()) {
jj_scanpos = xsp;
- if (jj_3R_223()) {
+ if (jj_3R_218()) {
jj_scanpos = xsp;
- if (jj_3R_224()) {
+ if (jj_3R_219()) {
jj_scanpos = xsp;
- if (jj_3R_225()) {
+ if (jj_3R_220()) {
jj_scanpos = xsp;
- if (jj_3R_226()) {
+ if (jj_3R_221()) {
jj_scanpos = xsp;
- if (jj_3R_227()) {
+ if (jj_3R_222()) {
jj_scanpos = xsp;
- if (jj_3R_228()) {
+ if (jj_3R_223()) {
jj_scanpos = xsp;
- if (jj_3R_229()) {
+ if (jj_3R_224()) {
jj_scanpos = xsp;
- if (jj_3R_230()) {
+ if (jj_3R_225()) {
jj_scanpos = xsp;
- if (jj_3R_231()) {
+ if (jj_3R_226()) {
jj_scanpos = xsp;
- if (jj_3R_232()) {
+ if (jj_3R_227()) {
jj_scanpos = xsp;
- if (jj_3R_233()) {
+ if (jj_3R_228()) {
jj_scanpos = xsp;
- if (jj_3R_234()) {
+ if (jj_3R_229()) {
jj_scanpos = xsp;
- if (jj_3R_235()) {
+ if (jj_3R_230()) {
jj_scanpos = xsp;
- if (jj_3R_236()) {
+ if (jj_3R_231()) {
jj_scanpos = xsp;
- if (jj_3R_237()) {
+ if (jj_3R_232()) {
jj_scanpos = xsp;
- if (jj_3R_238()) {
+ if (jj_3R_233()) {
jj_scanpos = xsp;
- if (jj_3R_239()) {
+ if (jj_3R_234()) {
jj_scanpos = xsp;
- if (jj_3R_240()) {
+ if (jj_3R_235()) {
jj_scanpos = xsp;
- if (jj_3R_241()) {
+ if (jj_3R_236()) {
return true;
}
}
@@ -7988,26 +7951,11 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
private boolean jj_3R_181() {
- if (jj_3R_199()) {
- return true;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_200()) {
- jj_scanpos = xsp;
- break;
- }
- }
- return false;
- }
-
- private boolean jj_3R_180() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_197()) {
+ if (jj_3R_195()) {
jj_scanpos = xsp;
- if (jj_3R_198()) {
+ if (jj_3R_196()) {
return true;
}
}
@@ -8021,7 +7969,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_257() {
+ private boolean jj_3R_256() {
if (jj_scan_token(HASH)) {
return true;
}
@@ -8029,39 +7977,46 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
private boolean jj_3_4() {
- if (jj_3R_178()) {
+ if (jj_3R_179()) {
return true;
}
return false;
}
- private boolean jj_3R_250() {
- if (jj_3R_185()) {
+ private boolean jj_3R_245() {
+ if (jj_3R_186()) {
return true;
}
return false;
}
- private boolean jj_3R_258() {
+ private boolean jj_3R_257() {
if (jj_scan_token(URL)) {
return true;
}
return false;
}
- private boolean jj_3R_204() {
- if (jj_3R_180()) {
+ private boolean jj_3R_202() {
+ if (jj_3R_181()) {
return true;
}
return false;
}
- private boolean jj_3R_183() {
+ private boolean jj_3R_260() {
+ if (jj_scan_token(INTERPOLATION)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_184() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_204()) {
+ if (jj_3R_202()) {
jj_scanpos = xsp;
- if (jj_3R_205()) {
+ if (jj_3R_203()) {
return true;
}
}
@@ -8069,53 +8024,46 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
}
private boolean jj_3_9() {
- if (jj_3R_184()) {
- return true;
- }
- return false;
- }
-
- private boolean jj_3R_261() {
- if (jj_scan_token(INTERPOLATION)) {
+ if (jj_3R_185()) {
return true;
}
return false;
}
private boolean jj_3_3() {
- if (jj_3R_175()) {
+ if (jj_3R_176()) {
return true;
}
return false;
}
- private boolean jj_3R_264() {
+ private boolean jj_3R_267() {
if (jj_scan_token(PLUS)) {
return true;
}
return false;
}
- private boolean jj_3R_254() {
+ private boolean jj_3R_253() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_263()) {
+ if (jj_3R_266()) {
jj_scanpos = xsp;
- if (jj_3R_264()) {
+ if (jj_3R_267()) {
return true;
}
}
return false;
}
- private boolean jj_3R_263() {
+ private boolean jj_3R_266() {
if (jj_scan_token(MINUS)) {
return true;
}
return false;
}
- private boolean jj_3R_259() {
+ private boolean jj_3R_258() {
if (jj_scan_token(UNICODERANGE)) {
return true;
}
@@ -8128,14 +8076,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
if (jj_3_9()) {
jj_scanpos = xsp;
}
- if (jj_3R_183()) {
+ if (jj_3R_184()) {
return true;
}
return false;
}
- private boolean jj_3R_188() {
- if (jj_scan_token(SEMICOLON)) {
+ private boolean jj_3R_186() {
+ if (jj_scan_token(VARIABLE)) {
return true;
}
Token xsp;
@@ -8149,14 +8097,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_186() {
- if (jj_3R_183()) {
+ private boolean jj_3R_189() {
+ if (jj_scan_token(SEMICOLON)) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3_8()) {
+ if (jj_scan_token(1)) {
jj_scanpos = xsp;
break;
}
@@ -8164,14 +8112,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_185() {
- if (jj_scan_token(VARIABLE)) {
+ private boolean jj_3R_187() {
+ if (jj_3R_184()) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_scan_token(1)) {
+ if (jj_3_8()) {
jj_scanpos = xsp;
break;
}
@@ -8179,33 +8127,33 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_249() {
+ private boolean jj_3R_244() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_260()) {
+ if (jj_3R_259()) {
jj_scanpos = xsp;
- if (jj_3R_261()) {
+ if (jj_3R_260()) {
return true;
}
}
return false;
}
- private boolean jj_3R_260() {
+ private boolean jj_3R_259() {
if (jj_scan_token(IDENT)) {
return true;
}
return false;
}
- private boolean jj_3R_201() {
+ private boolean jj_3R_199() {
Token xsp;
- if (jj_3R_249()) {
+ if (jj_3R_244()) {
return true;
}
while (true) {
xsp = jj_scanpos;
- if (jj_3R_249()) {
+ if (jj_3R_244()) {
jj_scanpos = xsp;
break;
}
@@ -8220,24 +8168,6 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
return false;
}
- private boolean jj_3R_211() {
- if (jj_scan_token(MINUS)) {
- return true;
- }
- Token xsp;
- if (jj_scan_token(1)) {
- return true;
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_scan_token(1)) {
- jj_scanpos = xsp;
- break;
- }
- }
- return false;
- }
-
/** Generated Token Manager. */
public ParserTokenManager token_source;
/** Current token. */
@@ -8248,7 +8178,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
private Token jj_scanpos, jj_lastpos;
private int jj_la;
private int jj_gen;
- final private int[] jj_la1 = new int[258];
+ final private int[] jj_la1 = new int[261];
static private int[] jj_la1_0;
static private int[] jj_la1_1;
static private int[] jj_la1_2;
@@ -8263,117 +8193,117 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
private static void jj_la1_init_0() {
jj_la1_0 = new int[] { 0x0, 0x302, 0x302, 0x0, 0x300, 0x2, 0x2, 0x2,
0xd4c40000, 0x0, 0x300, 0x2, 0x300, 0x2, 0x0, 0x2, 0x2, 0x2,
- 0x0, 0x0, 0x2, 0x2, 0x0, 0x2, 0x0, 0x2, 0x2, 0xd4c40000,
- 0xd4c40000, 0x2, 0x2, 0x2, 0xd4fd1500, 0xd4fd1500, 0x2, 0x2,
- 0x2, 0x0, 0x0, 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2, 0x2, 0x2,
- 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2, 0x391500, 0xc40000,
- 0xc40002, 0xc40000, 0x2, 0x2, 0x80120002, 0x80120002, 0x2, 0x0,
- 0x0, 0x2, 0x2, 0x2, 0x2, 0xd4c40000, 0xd4c40000, 0x2, 0x100000,
- 0x2, 0xd4c40000, 0x2, 0x84000000, 0x84000000, 0x84000000,
- 0x84000000, 0x84000000, 0x84000000, 0x84000000, 0x84000000,
- 0x84000000, 0x84000000, 0xd4000000, 0x0, 0x0, 0x0, 0x0,
- 0x50000000, 0x2, 0x2, 0x3f000, 0x2, 0x0, 0x2, 0x3f000, 0x0,
- 0x2, 0x0, 0x2, 0x0, 0x2, 0x200000, 0x0, 0xd4c40000, 0x0,
- 0x134e0002, 0x2, 0xd4c40000, 0x2, 0x0, 0x2, 0x134e0002, 0x0,
- 0x2, 0xd4c40000, 0x2, 0x134e0002, 0x2, 0x2, 0x2, 0x0, 0x2,
- 0xd4c40000, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x2, 0x2, 0x0, 0x2,
- 0xd4c40000, 0xd4c40000, 0x2, 0x100000, 0x2, 0x2, 0x2, 0x100000,
- 0x0, 0x0, 0x800c0000, 0x2, 0x0, 0x100000, 0x2, 0x800c0000, 0x2,
- 0x0, 0x2, 0x0, 0x2, 0x200000, 0x2, 0xd4c40000, 0x2, 0x200400,
- 0x2, 0x2, 0x0, 0x2, 0x0, 0x2, 0x2, 0x2, 0x100000, 0x2, 0x2,
- 0x2, 0x2, 0x2, 0x0, 0x2, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x2,
- 0x0, 0x2, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x0, 0x2, 0x0, 0x2,
- 0x2, 0x2, 0x100000, 0x0, 0x2, 0x2, 0x0, 0x2, 0x2, 0x2,
- 0x200000, 0x2, 0x2, 0x200000, 0x2, 0x2, 0x0, 0x200000, 0x2,
- 0x0, 0x2, 0x0, 0xd4c40000, 0x2, 0x0, 0x2, 0x0, 0x200000, 0x2,
- 0x0, 0x2, 0x800c0400, 0x2, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2,
- 0x2, 0x2, 0x321c0000, 0xc0000, 0x800c0000, 0xc0000, 0x0,
- 0x80000000, 0x0, 0x80000000, 0x800c0000, 0x2, 0x2, 0x800c0000,
- 0x2, 0xd4c40000, 0x2, 0x2, 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2, };
+ 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x2, 0x0, 0x2, 0x100000, 0x2,
+ 0x0, 0x2, 0x2, 0xd4c40000, 0xd4c40000, 0x2, 0x2, 0x2,
+ 0xd4fd1500, 0xd4fd1500, 0x2, 0x2, 0x2, 0x0, 0x0, 0x2, 0x0,
+ 0x200000, 0x2, 0x0, 0x2, 0x2, 0x2, 0x2, 0x0, 0x200000, 0x2,
+ 0x0, 0x2, 0x391500, 0xc40000, 0xc40002, 0xc40000, 0x2, 0x2,
+ 0x80120002, 0x80120002, 0x2, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2,
+ 0xd4c40000, 0xd4c40000, 0x2, 0x100000, 0x2, 0xd4c40000, 0x2,
+ 0x84000000, 0x84000000, 0x84000000, 0x84000000, 0xd4000000,
+ 0x0, 0x0, 0x0, 0x0, 0x50000000, 0x2, 0x2, 0x3f000, 0x2, 0x0,
+ 0x2, 0x3f000, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x200000, 0x0,
+ 0xd4c40000, 0x0, 0x134e0002, 0x2, 0xd4c40000, 0xd4c40000, 0x2,
+ 0x0, 0x2, 0x134e0002, 0x0, 0x2, 0xd4c40000, 0xd4c40000, 0x2,
+ 0x134e0002, 0x2, 0x2, 0x2, 0x0, 0x2, 0xd4c40000, 0x2, 0x2,
+ 0x100000, 0x2, 0x2, 0x2, 0x2, 0x0, 0x2, 0xd4c40000, 0xd4c40000,
+ 0x2, 0x100000, 0x2, 0x2, 0x2, 0x100000, 0x0, 0x0, 0x800c0000,
+ 0x2, 0x0, 0x100000, 0x2, 0x800c0000, 0x2, 0x0, 0x2, 0x2, 0x0,
+ 0x2, 0x200000, 0x2, 0xd4c40000, 0xd4c40000, 0x2, 0x200400, 0x2,
+ 0x2, 0x0, 0x2, 0x0, 0x2, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x2,
+ 0x2, 0x2, 0x0, 0x2, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x2, 0x0,
+ 0x2, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x0, 0x2, 0x0, 0x2, 0x2,
+ 0x2, 0x100000, 0x0, 0x2, 0x2, 0x0, 0x2, 0x2, 0x2, 0x200000,
+ 0x2, 0x2, 0x200000, 0x2, 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2,
+ 0x0, 0xd4c40000, 0x2, 0x0, 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2,
+ 0x800c0400, 0x2, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2,
+ 0x321c0000, 0xc0000, 0x800c0000, 0xc0000, 0x0, 0x80000000, 0x0,
+ 0x80000000, 0x800c0000, 0x2, 0x2, 0x800c0000, 0x2, 0xd4c40000,
+ 0x2, 0x2, 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2, };
}
private static void jj_la1_init_1() {
jj_la1_1 = new int[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x566000c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80,
- 0x80, 0x0, 0x0, 0x120000, 0x0, 0x120000, 0x0, 0x0, 0x564000c0,
- 0x564000c0, 0x0, 0x0, 0x0, 0x60001c0, 0x60001c0, 0x0, 0x0, 0x0,
- 0x0, 0x40, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x80,
- 0x0, 0x0, 0x80, 0x0, 0x100, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc2,
- 0xc2, 0x0, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x564000c0,
- 0x564000c0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x40, 0x40, 0x40, 0x40,
- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80, 0x80, 0x80,
+ 0x80, 0x0, 0x0, 0x120000, 0x120000, 0x0, 0x120000, 0x0, 0x0,
+ 0x0, 0x120000, 0x0, 0x0, 0x564000c0, 0x564000c0, 0x0, 0x0, 0x0,
+ 0x60001c0, 0x60001c0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x80, 0x0,
+ 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0,
+ 0x100, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc2, 0xc2, 0x0, 0x80, 0x80,
+ 0x0, 0x0, 0x0, 0x0, 0x564000c0, 0x564000c0, 0x0, 0x0, 0x0,
+ 0xc0, 0x0, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80, 0x80, 0x80,
0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x50000000, 0x64000c0, 0x50000000, 0x3f,
- 0x0, 0x564000c0, 0x0, 0x80000000, 0x0, 0x3f, 0x0, 0x0,
- 0x564000c0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x564000c0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x564000c0,
- 0x564000c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x40, 0x160040,
- 0x0, 0x40, 0x0, 0x0, 0x160040, 0x0, 0x40, 0x0, 0x80, 0x0, 0x0,
- 0x0, 0x60000c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x564000c0, 0x564000c0, 0x0, 0x80000000, 0x0, 0x3f, 0x0,
+ 0x0, 0x564000c0, 0x564000c0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x564000c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0,
+ 0x564000c0, 0x564000c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40,
+ 0x40, 0x160040, 0x0, 0x40, 0x0, 0x0, 0x160040, 0x0, 0x40, 0x0,
+ 0x0, 0x80, 0x0, 0x0, 0x0, 0x61200c0, 0x61200c0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x2, 0x0, 0x0, 0x0, 0x0, 0x6000000, 0x0, 0x0, 0x60000, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x80,
- 0x0, 0x6000000, 0xc0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0,
- 0x160000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x160000, 0x0, 0x0, 0x0, 0x160000, 0x160000,
- 0x160000, 0x0, 0x0, 0x160000, 0x0, 0x60000c0, 0x0, 0x0, 0x0,
- 0x80, 0x0, 0x0, 0x80, 0x0, };
+ 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0,
+ 0x6000000, 0x0, 0x0, 0x60000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0, 0x6000000, 0xc0, 0x0,
+ 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0, 0x160000, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x160000, 0x0,
+ 0x0, 0x0, 0x160000, 0x160000, 0x160000, 0x0, 0x0, 0x160000,
+ 0x0, 0x60000c0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0, };
}
private static void jj_la1_init_2() {
jj_la1_2 = new int[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100,
0x1000, 0x0, 0x0, 0x0, 0x0, 0x880, 0x0, 0x0, 0x0, 0x100, 0x100,
- 0x0, 0x0, 0x2000, 0x0, 0x2000, 0x0, 0x0, 0x1119, 0x1119, 0x0,
- 0x0, 0x0, 0x2b80, 0x2b80, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0,
- 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0,
- 0x100, 0x0, 0x2a80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x380, 0x380, 0x0,
- 0x100, 0x100, 0x0, 0x0, 0x0, 0x0, 0x1119, 0x1119, 0x0, 0x0,
- 0x0, 0x100, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x0, 0x0, 0x0,
- 0x0, 0x180, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x40, 0x0, 0x0,
- 0x0, 0x109, 0x1000, 0x1300, 0x0, 0x1109, 0x0, 0x0, 0x0, 0x1300,
- 0x20, 0x0, 0x1109, 0x0, 0x1300, 0x0, 0x0, 0x0, 0x1100, 0x0,
- 0x1109, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x1109,
- 0x1109, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1000, 0x1000,
- 0xfffffb80, 0x0, 0x0, 0x0, 0x0, 0xfffffb80, 0x0, 0x0, 0x0,
- 0x1100, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x2008, 0x2008, 0x0, 0x2000, 0x0, 0x0, 0x0, 0x2000,
+ 0x0, 0x0, 0x1119, 0x1119, 0x0, 0x0, 0x0, 0x2b80, 0x2b80, 0x0,
+ 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0,
+ 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x2a80, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x380, 0x380, 0x0, 0x100, 0x100, 0x0, 0x0, 0x0, 0x0,
+ 0x1119, 0x1119, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x0, 0x0, 0x0, 0x0,
+ 0x180, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x40, 0x0, 0x0, 0x0,
+ 0x109, 0x1000, 0x1300, 0x0, 0x1109, 0x1109, 0x0, 0x0, 0x0,
+ 0x1300, 0x20, 0x0, 0x1109, 0x1109, 0x0, 0x1300, 0x0, 0x0, 0x0,
+ 0x1100, 0x0, 0x1109, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100,
+ 0x0, 0x1109, 0x1109, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1000,
+ 0x1000, 0xfffffb80, 0x0, 0x0, 0x0, 0x0, 0xfffffb80, 0x0, 0x0,
+ 0x0, 0x0, 0x1100, 0x0, 0x0, 0x0, 0x2100, 0x2100, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0,
- 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100,
- 0x0, 0xfffffb80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0xfffffb80, 0x0, 0xffffe200, 0x0, 0x100, 0x980,
- 0xffffeb80, 0x0, 0x0, 0xfffffb80, 0x0, 0x100, 0x0, 0x0, 0x0,
- 0x100, 0x0, 0x0, 0x100, 0x0, };
+ 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x100,
+ 0x0, 0x0, 0x100, 0x0, 0xfffffb80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfffffb80, 0x0, 0xffffe200, 0x0,
+ 0x100, 0x980, 0xffffeb80, 0x0, 0x0, 0xfffffb80, 0x0, 0x100,
+ 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, };
}
private static void jj_la1_init_3() {
jj_la1_3 = new int[] { 0x8, 0x80, 0x80, 0x2, 0x80, 0x0, 0x0, 0x0, 0x75,
0x0, 0x80, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x45, 0x0, 0x0, 0x0,
- 0xc401bf, 0xc401bf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0xc401be, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400000, 0x400000, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0x47, 0x0, 0x0, 0x0, 0x1,
- 0x0, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5,
+ 0xc5, 0x0, 0x0, 0x0, 0xc401bf, 0xc401bf, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x400000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0,
- 0x200000, 0x0, 0x45, 0x0, 0x0, 0x0, 0x200000, 0x0, 0x0, 0x45,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x400000, 0x0, 0x75, 0x75, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0, 0x0, 0x0, 0x0, 0x440001,
- 0x0, 0x0, 0x0, 0x400000, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
- 0x0, 0x380000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0xc401be, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400000,
+ 0x400000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, 0xc7, 0x0,
+ 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x400000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x80, 0x200000, 0x0,
+ 0xe5, 0xe5, 0x0, 0x0, 0x0, 0x200000, 0x0, 0x0, 0xe5, 0xe5, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x400000, 0x0, 0xf5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x440001, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0,
+ 0x0, 0x0, 0x0, 0x400000, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0,
+ 0x0, 0x0, 0x380000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x100, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0, 0x100, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0, 0x400000, 0x0,
- 0x0, 0x40001, 0x440001, 0x0, 0x0, 0x440001, 0x0, 0x37, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x100, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0, 0x100, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0, 0x400000,
+ 0x0, 0x0, 0x40001, 0x440001, 0x0, 0x0, 0x440001, 0x0, 0x37,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
}
final private JJCalls[] jj_2_rtns = new JJCalls[9];
@@ -8386,7 +8316,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 258; i++) {
+ for (int i = 0; i < 261; i++) {
jj_la1[i] = -1;
}
for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -8400,7 +8330,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 258; i++) {
+ for (int i = 0; i < 261; i++) {
jj_la1[i] = -1;
}
for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -8414,7 +8344,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 258; i++) {
+ for (int i = 0; i < 261; i++) {
jj_la1[i] = -1;
}
for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -8428,7 +8358,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 258; i++) {
+ for (int i = 0; i < 261; i++) {
jj_la1[i] = -1;
}
for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -8579,7 +8509,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
la1tokens[jj_kind] = true;
jj_kind = -1;
}
- for (int i = 0; i < 258; i++) {
+ for (int i = 0; i < 261; i++) {
if (jj_la1[i] == jj_gen) {
for (int j = 0; j < 32; j++) {
if ((jj_la1_0[i] & (1 << j)) != 0) {
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj
index 28ad653ef4..5fb7f2315f 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj
+++ b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj
@@ -559,7 +559,7 @@ TOKEN : /* basic tokens */
( <H> )? ( <H> )?
( [ " ", "\t" , "\n" , "\r", "\f" ] )? >
| < #ESCAPE : <UNICODE> | ( "\\" [ " "-"~","\200"-"\377" ] ) >
- | < #NMSTART : ("-")?[ "a"-"z"] | <NONASCII> | <ESCAPE> >
+ | < #NMSTART : ("-")?[ "a"-"z","_"] | <NONASCII> | <ESCAPE> >
| < #NMCHAR : ["a"-"z", "0"-"9", "-", "_"] | <NONASCII> | <ESCAPE> >
| < #STRINGCHAR : [ "\t"," ","!","#","$","%","&","("-"~" ]
| "\\\n" | "\\\r\n" | "\\\r" | "\\\f"
@@ -848,7 +848,7 @@ void keyframes() :
n=<KEY_FRAME_SYM> ( <S> )* {keyframeName = n.image;}
(n = <IDENT>{animationname += n.image; }|n = < INTERPOLATION >{ animationname += n.image; })+(<S>)*
{start = true; documentHandler.startKeyFrames(keyframeName, animationname); }
- <LBRACE> ( <S> )* ( keyframeSelector() )* <RBRACE> ( <S> )*
+ <LBRACE> ( <S> )* ( keyframeSelector() | contentDirective() )* <RBRACE> ( <S> )*
} catch (ParseException e) {
reportError(getLocator(), e);
skipStatement();
@@ -862,14 +862,17 @@ void keyframes() :
void keyframeSelector():
{
Token n;
+ String selector = "";
boolean start = false;
}
{
try{
- (n = <FROM> | n = <TO> | n = <PERCENTAGE>) (<S>)* <LBRACE> (<S>)*
+ (n = <FROM> | n = <TO> | n = <PERCENTAGE>){selector += n.image;} (<S>)*
+ (<COMMA> (<S>)* (n = <FROM> | n = <TO> | n = <PERCENTAGE>) {selector += (", " + n.image);} (<S>)* )*
+ <LBRACE> (<S>)*
{
start = true;
- documentHandler.startKeyframeSelector(n.image);
+ documentHandler.startKeyframeSelector(selector);
}
(ifContentStatement() | microsoftExtension() )*
<RBRACE> (<S>)*
@@ -1269,18 +1272,12 @@ String simple_selector(String selector, char comb) :
pseudoElt = null;
}
{
- ( simple_current=element_name()
- ( cond=hash(cond) | cond=_class(cond)
- | cond=attrib(cond) | cond=pseudo(cond) )*
- | cond=hash(cond) ( cond=_class(cond)
- | cond=attrib(cond) | cond=pseudo(cond) )*
- | cond=_class(cond) ( cond=hash(cond) | cond=_class(cond)
- | cond=attrib(cond) | cond=pseudo(cond) )*
- | cond=pseudo(cond) ( cond=hash(cond) | cond=_class(cond)
- | cond=attrib(cond) | cond=pseudo(cond) )*
- | cond=attrib(cond) ( cond=hash(cond) | cond=_class(cond)
- | cond=attrib(cond) | cond=pseudo(cond) )*
- )
+ ( (simple_current=element_name()
+ ( cond=hash(cond) | cond=_class(cond)
+ | cond=attrib(cond) | cond=pseudo(cond) )* )
+ | ( cond = hash(cond) | cond=_class(cond)
+ | cond=attrib(cond) | cond=pseudo(cond) )+
+ )
{
if (simple_current == null) {
simple_current = "";
@@ -1442,7 +1439,7 @@ boolean isPseudoElement = false;
}
}
}
- | ( n=<FUNCTION> ( <S> )* d=skipStatementUntilRightParan() <RPARAN>
+ | ( n=<FUNCTION> ( <S> )* d=skipStatementUntilMatchingRightParan() <RPARAN>
{
// accept anything between function and a right parenthesis
String f = convertIdent(n.image);
@@ -1526,8 +1523,8 @@ void controlDirective() :
void ifContentStatement() :
{}
{
- contentDirective() | includeDirective() | media() | extendDirective() | styleRuleOrDeclarationOrNestedProperties()
- | keyframes() | LOOKAHEAD(variable()) variable() | listModifyDirective() | controlDirective()
+ contentDirective() | includeDirective() | media() | extendDirective() | styleRuleOrDeclarationOrNestedProperties()
+ | keyframes() | LOOKAHEAD(variable()) variable() | listModifyDirective() | controlDirective() | atRuleDeclaration()
}
void ifDirective() :
@@ -1543,7 +1540,7 @@ void ifDirective() :
{ documentHandler.startIfElseDirective();
documentHandler.ifDirective(evaluator);
}
- ( ifContentStatement() )*
+ ( ifContentStatement() | fontFace() )*
< RBRACE >(< S >)*
(elseDirective())*
{ documentHandler.endIfElseDirective(); }
@@ -1562,7 +1559,7 @@ void elseDirective() :
{ if(!evaluator.trim().equals("")){ documentHandler.ifDirective(evaluator); }
else{ documentHandler.elseDirective(); }
}
- ( ifContentStatement() )*
+ ( ifContentStatement() | fontFace() )*
< RBRACE >(< S >)*
}
@@ -1726,11 +1723,11 @@ void includeDirective() :
(<S>)*
(name = property()|name = variableName(){ name = "$"+name;}
|(name = functionName()
- args = argValuelist()) <RPARAN>)
+ args = argValuelist()) <RPARAN>(<S>)*)
((";"(<S>)*)+
{documentHandler.includeDirective(name, args);}
- | <LBRACE> (<S>)* {documentHandler.startIncludeContentBlock(name);}
- (styleRuleOrDeclarationOrNestedProperties())*
+ | <LBRACE> (<S>)* {documentHandler.startIncludeContentBlock(name, args);}
+ (styleRuleOrDeclarationOrNestedProperties() | keyframeSelector())*
<RBRACE> (<S>)* {documentHandler.endIncludeContentBlock();}
)
}
@@ -2381,8 +2378,9 @@ LexicalUnitImpl nonVariableTerm(LexicalUnitImpl prev) : { LexicalUnitImpl result
&& (Character.isDigit(s.charAt(i)) || (s.charAt(i) == '.'))) {
i++;
}
+
result = LexicalUnitImpl.createDimen(n.beginLine, n.beginColumn, prev,
- Float.valueOf(s.substring(0, i)).floatValue(),
+ number(op,n,s.length()-i),
s.substring(i));
}
| result=function(op, prev) ) )
@@ -2734,9 +2732,35 @@ String skipStatementUntilLeftBrace(){
}
JAVACODE
-String skipStatementUntilRightParan(){
- int[] rParan = {RPARAN};
- return skipStatementUntil(rParan);
+String skipStatementUntilMatchingRightParan(){
+ int[] leftTokens = {LPARAN, FUNCTION}; // a FUNCTION also contains "("
+ int[] rightTokens = {RPARAN};
+ StringBuffer s = new StringBuffer();
+ int difference = 1;
+ Token tok;
+ while(difference != 0){
+ tok = getToken(1);
+ if(tok.kind == EOF) {
+ return null;
+ }
+ for(int sym : leftTokens){
+ if(tok.kind == sym){
+ difference++;
+ }
+ }
+ for(int sym : rightTokens){
+ if(tok.kind == sym){
+ difference--;
+ }
+ }
+ if(difference != 0){
+ if (tok.image != null) {
+ s.append(tok.image);
+ }
+ getNextToken();
+ }
+ }
+ return s.toString().trim();
}
JAVACODE
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/ParserConstants.java b/theme-compiler/src/com/vaadin/sass/internal/parser/ParserConstants.java
index b5e3b296bd..a3ab622ee9 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/parser/ParserConstants.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/parser/ParserConstants.java
@@ -16,278 +16,377 @@
/* Generated By:JavaCC: Do not edit this line. ParserConstants.java */
package com.vaadin.sass.internal.parser;
+
/**
- * Token literal values and constants. Generated by
- * org.javacc.parser.OtherFilesGen#start()
+ * Token literal values and constants.
+ * Generated by org.javacc.parser.OtherFilesGen#start()
*/
public interface ParserConstants {
- /** End of File. */
- int EOF = 0;
- /** RegularExpression Id. */
- int S = 1;
- /** RegularExpression Id. */
- int SINGLE_LINE_COMMENT = 2;
- /** RegularExpression Id. */
- int FORMAL_COMMENT = 5;
- /** RegularExpression Id. */
- int MULTI_LINE_COMMENT = 6;
- /** RegularExpression Id. */
- int CDO = 8;
- /** RegularExpression Id. */
- int CDC = 9;
- /** RegularExpression Id. */
- int LBRACE = 10;
- /** RegularExpression Id. */
- int RBRACE = 11;
- /** RegularExpression Id. */
- int DASHMATCH = 12;
- /** RegularExpression Id. */
- int CARETMATCH = 13;
- /** RegularExpression Id. */
- int DOLLARMATCH = 14;
- /** RegularExpression Id. */
- int STARMATCH = 15;
- /** RegularExpression Id. */
- int INCLUDES = 16;
- /** RegularExpression Id. */
- int EQ = 17;
- /** RegularExpression Id. */
- int PLUS = 18;
- /** RegularExpression Id. */
- int MINUS = 19;
- /** RegularExpression Id. */
- int COMMA = 20;
- /** RegularExpression Id. */
- int SEMICOLON = 21;
- /** RegularExpression Id. */
- int PRECEDES = 22;
- /** RegularExpression Id. */
- int SIBLING = 23;
- /** RegularExpression Id. */
- int SUCCEEDS = 24;
- /** RegularExpression Id. */
- int DIV = 25;
- /** RegularExpression Id. */
- int LBRACKET = 26;
- /** RegularExpression Id. */
- int RBRACKET = 27;
- /** RegularExpression Id. */
- int ANY = 28;
- /** RegularExpression Id. */
- int MOD = 29;
- /** RegularExpression Id. */
- int PARENT = 30;
- /** RegularExpression Id. */
- int DOT = 31;
- /** RegularExpression Id. */
- int LPARAN = 32;
- /** RegularExpression Id. */
- int RPARAN = 33;
- /** RegularExpression Id. */
- int COMPARE = 34;
- /** RegularExpression Id. */
- int OR = 35;
- /** RegularExpression Id. */
- int AND = 36;
- /** RegularExpression Id. */
- int NOT_EQ = 37;
- /** RegularExpression Id. */
- int COLON = 38;
- /** RegularExpression Id. */
- int INTERPOLATION = 39;
- /** RegularExpression Id. */
- int NONASCII = 40;
- /** RegularExpression Id. */
- int H = 41;
- /** RegularExpression Id. */
- int UNICODE = 42;
- /** RegularExpression Id. */
- int ESCAPE = 43;
- /** RegularExpression Id. */
- int NMSTART = 44;
- /** RegularExpression Id. */
- int NMCHAR = 45;
- /** RegularExpression Id. */
- int STRINGCHAR = 46;
- /** RegularExpression Id. */
- int D = 47;
- /** RegularExpression Id. */
- int NAME = 48;
- /** RegularExpression Id. */
- int TO = 49;
- /** RegularExpression Id. */
- int THROUGH = 50;
- /** RegularExpression Id. */
- int EACH_IN = 51;
- /** RegularExpression Id. */
- int FROM = 52;
- /** RegularExpression Id. */
- int MIXIN_SYM = 53;
- /** RegularExpression Id. */
- int INCLUDE_SYM = 54;
- /** RegularExpression Id. */
- int FUNCTION_SYM = 55;
- /** RegularExpression Id. */
- int RETURN_SYM = 56;
- /** RegularExpression Id. */
- int DEBUG_SYM = 57;
- /** RegularExpression Id. */
- int WARN_SYM = 58;
- /** RegularExpression Id. */
- int FOR_SYM = 59;
- /** RegularExpression Id. */
- int EACH_SYM = 60;
- /** RegularExpression Id. */
- int WHILE_SYM = 61;
- /** RegularExpression Id. */
- int IF_SYM = 62;
- /** RegularExpression Id. */
- int ELSE_SYM = 63;
- /** RegularExpression Id. */
- int EXTEND_SYM = 64;
- /** RegularExpression Id. */
- int MOZ_DOCUMENT_SYM = 65;
- /** RegularExpression Id. */
- int SUPPORTS_SYM = 66;
- /** RegularExpression Id. */
- int CONTENT_SYM = 67;
- /** RegularExpression Id. */
- int MICROSOFT_RULE = 68;
- /** RegularExpression Id. */
- int IF = 69;
- /** RegularExpression Id. */
- int GUARDED_SYM = 70;
- /** RegularExpression Id. */
- int STRING = 71;
- /** RegularExpression Id. */
- int IDENT = 72;
- /** RegularExpression Id. */
- int NUMBER = 73;
- /** RegularExpression Id. */
- int _URL = 74;
- /** RegularExpression Id. */
- int URL = 75;
- /** RegularExpression Id. */
- int VARIABLE = 76;
- /** RegularExpression Id. */
- int PERCENTAGE = 77;
- /** RegularExpression Id. */
- int PT = 78;
- /** RegularExpression Id. */
- int MM = 79;
- /** RegularExpression Id. */
- int CM = 80;
- /** RegularExpression Id. */
- int PC = 81;
- /** RegularExpression Id. */
- int IN = 82;
- /** RegularExpression Id. */
- int PX = 83;
- /** RegularExpression Id. */
- int EMS = 84;
- /** RegularExpression Id. */
- int LEM = 85;
- /** RegularExpression Id. */
- int REM = 86;
- /** RegularExpression Id. */
- int EXS = 87;
- /** RegularExpression Id. */
- int DEG = 88;
- /** RegularExpression Id. */
- int RAD = 89;
- /** RegularExpression Id. */
- int GRAD = 90;
- /** RegularExpression Id. */
- int MS = 91;
- /** RegularExpression Id. */
- int SECOND = 92;
- /** RegularExpression Id. */
- int HZ = 93;
- /** RegularExpression Id. */
- int KHZ = 94;
- /** RegularExpression Id. */
- int DIMEN = 95;
- /** RegularExpression Id. */
- int HASH = 96;
- /** RegularExpression Id. */
- int IMPORT_SYM = 97;
- /** RegularExpression Id. */
- int MEDIA_SYM = 98;
- /** RegularExpression Id. */
- int CHARSET_SYM = 99;
- /** RegularExpression Id. */
- int PAGE_SYM = 100;
- /** RegularExpression Id. */
- int FONT_FACE_SYM = 101;
- /** RegularExpression Id. */
- int KEY_FRAME_SYM = 102;
- /** RegularExpression Id. */
- int ATKEYWORD = 103;
- /** RegularExpression Id. */
- int IMPORTANT_SYM = 104;
- /** RegularExpression Id. */
- int RANGE0 = 105;
- /** RegularExpression Id. */
- int RANGE1 = 106;
- /** RegularExpression Id. */
- int RANGE2 = 107;
- /** RegularExpression Id. */
- int RANGE3 = 108;
- /** RegularExpression Id. */
- int RANGE4 = 109;
- /** RegularExpression Id. */
- int RANGE5 = 110;
- /** RegularExpression Id. */
- int RANGE6 = 111;
- /** RegularExpression Id. */
- int RANGE = 112;
- /** RegularExpression Id. */
- int UNI = 113;
- /** RegularExpression Id. */
- int UNICODERANGE = 114;
- /** RegularExpression Id. */
- int REMOVE = 115;
- /** RegularExpression Id. */
- int APPEND = 116;
- /** RegularExpression Id. */
- int CONTAINS = 117;
- /** RegularExpression Id. */
- int FUNCTION = 118;
- /** RegularExpression Id. */
- int UNKNOWN = 119;
+ /** End of File. */
+ int EOF = 0;
+ /** RegularExpression Id. */
+ int S = 1;
+ /** RegularExpression Id. */
+ int SINGLE_LINE_COMMENT = 2;
+ /** RegularExpression Id. */
+ int FORMAL_COMMENT = 5;
+ /** RegularExpression Id. */
+ int MULTI_LINE_COMMENT = 6;
+ /** RegularExpression Id. */
+ int CDO = 8;
+ /** RegularExpression Id. */
+ int CDC = 9;
+ /** RegularExpression Id. */
+ int LBRACE = 10;
+ /** RegularExpression Id. */
+ int RBRACE = 11;
+ /** RegularExpression Id. */
+ int DASHMATCH = 12;
+ /** RegularExpression Id. */
+ int CARETMATCH = 13;
+ /** RegularExpression Id. */
+ int DOLLARMATCH = 14;
+ /** RegularExpression Id. */
+ int STARMATCH = 15;
+ /** RegularExpression Id. */
+ int INCLUDES = 16;
+ /** RegularExpression Id. */
+ int EQ = 17;
+ /** RegularExpression Id. */
+ int PLUS = 18;
+ /** RegularExpression Id. */
+ int MINUS = 19;
+ /** RegularExpression Id. */
+ int COMMA = 20;
+ /** RegularExpression Id. */
+ int SEMICOLON = 21;
+ /** RegularExpression Id. */
+ int PRECEDES = 22;
+ /** RegularExpression Id. */
+ int SIBLING = 23;
+ /** RegularExpression Id. */
+ int SUCCEEDS = 24;
+ /** RegularExpression Id. */
+ int DIV = 25;
+ /** RegularExpression Id. */
+ int LBRACKET = 26;
+ /** RegularExpression Id. */
+ int RBRACKET = 27;
+ /** RegularExpression Id. */
+ int ANY = 28;
+ /** RegularExpression Id. */
+ int MOD = 29;
+ /** RegularExpression Id. */
+ int PARENT = 30;
+ /** RegularExpression Id. */
+ int DOT = 31;
+ /** RegularExpression Id. */
+ int LPARAN = 32;
+ /** RegularExpression Id. */
+ int RPARAN = 33;
+ /** RegularExpression Id. */
+ int COMPARE = 34;
+ /** RegularExpression Id. */
+ int OR = 35;
+ /** RegularExpression Id. */
+ int AND = 36;
+ /** RegularExpression Id. */
+ int NOT_EQ = 37;
+ /** RegularExpression Id. */
+ int COLON = 38;
+ /** RegularExpression Id. */
+ int INTERPOLATION = 39;
+ /** RegularExpression Id. */
+ int NONASCII = 40;
+ /** RegularExpression Id. */
+ int H = 41;
+ /** RegularExpression Id. */
+ int UNICODE = 42;
+ /** RegularExpression Id. */
+ int ESCAPE = 43;
+ /** RegularExpression Id. */
+ int NMSTART = 44;
+ /** RegularExpression Id. */
+ int NMCHAR = 45;
+ /** RegularExpression Id. */
+ int STRINGCHAR = 46;
+ /** RegularExpression Id. */
+ int D = 47;
+ /** RegularExpression Id. */
+ int NAME = 48;
+ /** RegularExpression Id. */
+ int TO = 49;
+ /** RegularExpression Id. */
+ int THROUGH = 50;
+ /** RegularExpression Id. */
+ int EACH_IN = 51;
+ /** RegularExpression Id. */
+ int FROM = 52;
+ /** RegularExpression Id. */
+ int MIXIN_SYM = 53;
+ /** RegularExpression Id. */
+ int INCLUDE_SYM = 54;
+ /** RegularExpression Id. */
+ int FUNCTION_SYM = 55;
+ /** RegularExpression Id. */
+ int RETURN_SYM = 56;
+ /** RegularExpression Id. */
+ int DEBUG_SYM = 57;
+ /** RegularExpression Id. */
+ int WARN_SYM = 58;
+ /** RegularExpression Id. */
+ int FOR_SYM = 59;
+ /** RegularExpression Id. */
+ int EACH_SYM = 60;
+ /** RegularExpression Id. */
+ int WHILE_SYM = 61;
+ /** RegularExpression Id. */
+ int IF_SYM = 62;
+ /** RegularExpression Id. */
+ int ELSE_SYM = 63;
+ /** RegularExpression Id. */
+ int EXTEND_SYM = 64;
+ /** RegularExpression Id. */
+ int MOZ_DOCUMENT_SYM = 65;
+ /** RegularExpression Id. */
+ int SUPPORTS_SYM = 66;
+ /** RegularExpression Id. */
+ int CONTENT_SYM = 67;
+ /** RegularExpression Id. */
+ int MICROSOFT_RULE = 68;
+ /** RegularExpression Id. */
+ int IF = 69;
+ /** RegularExpression Id. */
+ int GUARDED_SYM = 70;
+ /** RegularExpression Id. */
+ int STRING = 71;
+ /** RegularExpression Id. */
+ int IDENT = 72;
+ /** RegularExpression Id. */
+ int NUMBER = 73;
+ /** RegularExpression Id. */
+ int _URL = 74;
+ /** RegularExpression Id. */
+ int URL = 75;
+ /** RegularExpression Id. */
+ int VARIABLE = 76;
+ /** RegularExpression Id. */
+ int PERCENTAGE = 77;
+ /** RegularExpression Id. */
+ int PT = 78;
+ /** RegularExpression Id. */
+ int MM = 79;
+ /** RegularExpression Id. */
+ int CM = 80;
+ /** RegularExpression Id. */
+ int PC = 81;
+ /** RegularExpression Id. */
+ int IN = 82;
+ /** RegularExpression Id. */
+ int PX = 83;
+ /** RegularExpression Id. */
+ int EMS = 84;
+ /** RegularExpression Id. */
+ int LEM = 85;
+ /** RegularExpression Id. */
+ int REM = 86;
+ /** RegularExpression Id. */
+ int EXS = 87;
+ /** RegularExpression Id. */
+ int DEG = 88;
+ /** RegularExpression Id. */
+ int RAD = 89;
+ /** RegularExpression Id. */
+ int GRAD = 90;
+ /** RegularExpression Id. */
+ int MS = 91;
+ /** RegularExpression Id. */
+ int SECOND = 92;
+ /** RegularExpression Id. */
+ int HZ = 93;
+ /** RegularExpression Id. */
+ int KHZ = 94;
+ /** RegularExpression Id. */
+ int DIMEN = 95;
+ /** RegularExpression Id. */
+ int HASH = 96;
+ /** RegularExpression Id. */
+ int IMPORT_SYM = 97;
+ /** RegularExpression Id. */
+ int MEDIA_SYM = 98;
+ /** RegularExpression Id. */
+ int CHARSET_SYM = 99;
+ /** RegularExpression Id. */
+ int PAGE_SYM = 100;
+ /** RegularExpression Id. */
+ int FONT_FACE_SYM = 101;
+ /** RegularExpression Id. */
+ int KEY_FRAME_SYM = 102;
+ /** RegularExpression Id. */
+ int ATKEYWORD = 103;
+ /** RegularExpression Id. */
+ int IMPORTANT_SYM = 104;
+ /** RegularExpression Id. */
+ int RANGE0 = 105;
+ /** RegularExpression Id. */
+ int RANGE1 = 106;
+ /** RegularExpression Id. */
+ int RANGE2 = 107;
+ /** RegularExpression Id. */
+ int RANGE3 = 108;
+ /** RegularExpression Id. */
+ int RANGE4 = 109;
+ /** RegularExpression Id. */
+ int RANGE5 = 110;
+ /** RegularExpression Id. */
+ int RANGE6 = 111;
+ /** RegularExpression Id. */
+ int RANGE = 112;
+ /** RegularExpression Id. */
+ int UNI = 113;
+ /** RegularExpression Id. */
+ int UNICODERANGE = 114;
+ /** RegularExpression Id. */
+ int REMOVE = 115;
+ /** RegularExpression Id. */
+ int APPEND = 116;
+ /** RegularExpression Id. */
+ int CONTAINS = 117;
+ /** RegularExpression Id. */
+ int FUNCTION = 118;
+ /** RegularExpression Id. */
+ int UNKNOWN = 119;
- /** Lexical state. */
- int DEFAULT = 0;
- /** Lexical state. */
- int IN_FORMAL_COMMENT = 1;
- /** Lexical state. */
- int IN_MULTI_LINE_COMMENT = 2;
+ /** Lexical state. */
+ int DEFAULT = 0;
+ /** Lexical state. */
+ int IN_FORMAL_COMMENT = 1;
+ /** Lexical state. */
+ int IN_MULTI_LINE_COMMENT = 2;
- /** Literal token values. */
- String[] tokenImage = { "<EOF>", "<S>", "<SINGLE_LINE_COMMENT>",
- "<token of kind 3>", "\"/*\"", "\"*/\"", "\"*/\"",
- "<token of kind 7>", "\"<!--\"", "\"-->\"", "\"{\"", "\"}\"",
- "\"|=\"", "\"^=\"", "\"$=\"", "\"*=\"", "\"~=\"", "\"=\"", "\"+\"",
- "\"-\"", "\",\"", "\";\"", "\">\"", "\"~\"", "\"<\"", "\"/\"",
- "\"[\"", "\"]\"", "\"*\"", "\"%\"", "\"&\"", "\".\"", "\"(\"",
- "\")\"", "\"==\"", "\"||\"", "\"&&\"", "\"!=\"", "\":\"",
- "<INTERPOLATION>", "<NONASCII>", "<H>", "<UNICODE>", "<ESCAPE>",
- "<NMSTART>", "<NMCHAR>", "<STRINGCHAR>", "<D>", "<NAME>", "\"to\"",
- "\"through\"", "\"in\"", "\"from\"", "\"@mixin\"", "\"@include\"",
- "\"@function\"", "\"@return\"", "\"@debug\"", "\"@warn\"",
- "\"@for\"", "\"@each\"", "\"@while\"", "\"@if\"", "\"@else\"",
- "\"@extend\"", "\"@-moz-document\"", "\"@supports\"",
- "\"@content\"", "<MICROSOFT_RULE>", "\"if\"", "<GUARDED_SYM>",
- "<STRING>", "<IDENT>", "<NUMBER>", "<_URL>", "<URL>", "<VARIABLE>",
- "<PERCENTAGE>", "<PT>", "<MM>", "<CM>", "<PC>", "<IN>", "<PX>",
- "<EMS>", "<LEM>", "<REM>", "<EXS>", "<DEG>", "<RAD>", "<GRAD>",
- "<MS>", "<SECOND>", "<HZ>", "<KHZ>", "<DIMEN>", "<HASH>",
- "\"@import\"", "\"@media\"", "\"@charset\"", "\"@page\"",
- "\"@font-face\"", "<KEY_FRAME_SYM>", "<ATKEYWORD>",
- "<IMPORTANT_SYM>", "<RANGE0>", "<RANGE1>", "<RANGE2>", "<RANGE3>",
- "<RANGE4>", "<RANGE5>", "<RANGE6>", "<RANGE>", "<UNI>",
- "<UNICODERANGE>", "<REMOVE>", "<APPEND>", "<CONTAINS>",
- "<FUNCTION>", "<UNKNOWN>", };
+ /** Literal token values. */
+ String[] tokenImage = {
+ "<EOF>",
+ "<S>",
+ "<SINGLE_LINE_COMMENT>",
+ "<token of kind 3>",
+ "\"/*\"",
+ "\"*/\"",
+ "\"*/\"",
+ "<token of kind 7>",
+ "\"<!--\"",
+ "\"-->\"",
+ "\"{\"",
+ "\"}\"",
+ "\"|=\"",
+ "\"^=\"",
+ "\"$=\"",
+ "\"*=\"",
+ "\"~=\"",
+ "\"=\"",
+ "\"+\"",
+ "\"-\"",
+ "\",\"",
+ "\";\"",
+ "\">\"",
+ "\"~\"",
+ "\"<\"",
+ "\"/\"",
+ "\"[\"",
+ "\"]\"",
+ "\"*\"",
+ "\"%\"",
+ "\"&\"",
+ "\".\"",
+ "\"(\"",
+ "\")\"",
+ "\"==\"",
+ "\"||\"",
+ "\"&&\"",
+ "\"!=\"",
+ "\":\"",
+ "<INTERPOLATION>",
+ "<NONASCII>",
+ "<H>",
+ "<UNICODE>",
+ "<ESCAPE>",
+ "<NMSTART>",
+ "<NMCHAR>",
+ "<STRINGCHAR>",
+ "<D>",
+ "<NAME>",
+ "\"to\"",
+ "\"through\"",
+ "\"in\"",
+ "\"from\"",
+ "\"@mixin\"",
+ "\"@include\"",
+ "\"@function\"",
+ "\"@return\"",
+ "\"@debug\"",
+ "\"@warn\"",
+ "\"@for\"",
+ "\"@each\"",
+ "\"@while\"",
+ "\"@if\"",
+ "\"@else\"",
+ "\"@extend\"",
+ "\"@-moz-document\"",
+ "\"@supports\"",
+ "\"@content\"",
+ "<MICROSOFT_RULE>",
+ "\"if\"",
+ "<GUARDED_SYM>",
+ "<STRING>",
+ "<IDENT>",
+ "<NUMBER>",
+ "<_URL>",
+ "<URL>",
+ "<VARIABLE>",
+ "<PERCENTAGE>",
+ "<PT>",
+ "<MM>",
+ "<CM>",
+ "<PC>",
+ "<IN>",
+ "<PX>",
+ "<EMS>",
+ "<LEM>",
+ "<REM>",
+ "<EXS>",
+ "<DEG>",
+ "<RAD>",
+ "<GRAD>",
+ "<MS>",
+ "<SECOND>",
+ "<HZ>",
+ "<KHZ>",
+ "<DIMEN>",
+ "<HASH>",
+ "\"@import\"",
+ "\"@media\"",
+ "\"@charset\"",
+ "\"@page\"",
+ "\"@font-face\"",
+ "<KEY_FRAME_SYM>",
+ "<ATKEYWORD>",
+ "<IMPORTANT_SYM>",
+ "<RANGE0>",
+ "<RANGE1>",
+ "<RANGE2>",
+ "<RANGE3>",
+ "<RANGE4>",
+ "<RANGE5>",
+ "<RANGE6>",
+ "<RANGE>",
+ "<UNI>",
+ "<UNICODERANGE>",
+ "<REMOVE>",
+ "<APPEND>",
+ "<CONTAINS>",
+ "<FUNCTION>",
+ "<UNKNOWN>",
+ };
}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java b/theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java
index bf4ebf5c06..d54ab4fa7e 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java
@@ -15,5965 +15,4983 @@
*/
/* Generated By:JavaCC: Do not edit this line. ParserTokenManager.java */
package com.vaadin.sass.internal.parser;
+import java.io.*;
+import java.net.*;
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.Map;
+import java.util.UUID;
+import org.w3c.css.sac.ConditionFactory;
+import org.w3c.css.sac.Condition;
+import org.w3c.css.sac.SelectorFactory;
+import org.w3c.css.sac.SelectorList;
+import org.w3c.css.sac.Selector;
+import org.w3c.css.sac.SimpleSelector;
+import org.w3c.css.sac.DocumentHandler;
+import org.w3c.css.sac.InputSource;
+import org.w3c.css.sac.ErrorHandler;
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.CSSParseException;
+import org.w3c.css.sac.Locator;
+import org.w3c.css.sac.LexicalUnit;
+import org.w3c.flute.parser.selectors.SelectorFactoryImpl;
+import org.w3c.flute.parser.selectors.ConditionFactoryImpl;
+import org.w3c.flute.util.Encoding;
+import com.vaadin.sass.internal.handler.*;
+import com.vaadin.sass.internal.tree.*;
/** Token Manager. */
-public class ParserTokenManager implements ParserConstants {
+public class ParserTokenManager implements ParserConstants
+{
- /** Debug output. */
- public java.io.PrintStream debugStream = System.out;
-
- /** Set debug output. */
- public void setDebugStream(java.io.PrintStream ds) {
- debugStream = ds;
- }
-
- private final int jjStopStringLiteralDfa_0(int pos, long active0,
- long active1) {
- switch (pos) {
- case 0:
- if ((active0 & 0xffe0000000000000L) != 0L
- || (active1 & 0x3e0000000fL) != 0L) {
- return 162;
- }
- if ((active0 & 0xe000000000000L) != 0L || (active1 & 0x20L) != 0L) {
- jjmatchedKind = 72;
- return 522;
- }
- if ((active0 & 0x80000000L) != 0L) {
- return 523;
- }
- if ((active0 & 0x10000000000000L) != 0L) {
- jjmatchedKind = 72;
- return 29;
- }
- if ((active0 & 0x4000L) != 0L) {
- return 75;
- }
- if ((active0 & 0x2000010L) != 0L) {
- return 216;
- }
- if ((active0 & 0x80200L) != 0L) {
- return 38;
- }
- if ((active0 & 0x2000000000L) != 0L) {
- return 524;
- }
- return -1;
- case 1:
- if ((active1 & 0x2L) != 0L) {
- return 174;
- }
- if ((active0 & 0xffe0000000000000L) != 0L
- || (active1 & 0x3e0000000dL) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 1;
- return 525;
- }
- if ((active0 & 0x14000000000000L) != 0L) {
- jjmatchedKind = 72;
- jjmatchedPos = 1;
- return 522;
- }
- if ((active0 & 0xa000000000000L) != 0L || (active1 & 0x20L) != 0L) {
- return 522;
- }
- if ((active0 & 0x10L) != 0L) {
- return 221;
- }
- return -1;
- case 2:
- if ((active0 & 0xbfe0000000000000L) != 0L
- || (active1 & 0x3e0000000dL) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 2;
- return 525;
- }
- if ((active0 & 0x4000000000000000L) != 0L) {
- return 525;
- }
- if ((active1 & 0x2L) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 2;
- return 173;
- }
- if ((active0 & 0x14000000000000L) != 0L) {
- jjmatchedKind = 72;
- jjmatchedPos = 2;
- return 522;
- }
- return -1;
- case 3:
- if ((active0 & 0xb7e0000000000000L) != 0L
- || (active1 & 0x3e0000000dL) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 3;
- return 525;
- }
- if ((active0 & 0x800000000000000L) != 0L) {
- return 525;
- }
- if ((active0 & 0x4000000000000L) != 0L) {
- jjmatchedKind = 72;
- jjmatchedPos = 3;
- return 522;
- }
- if ((active0 & 0x10000000000000L) != 0L) {
- return 522;
- }
- if ((active1 & 0x2L) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 3;
- return 172;
- }
- return -1;
- case 4:
- if ((active0 & 0x9400000000000000L) != 0L
- || (active1 & 0x1000000000L) != 0L) {
- return 525;
- }
- if ((active1 & 0x2L) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 4;
- return 171;
- }
- if ((active0 & 0x4000000000000L) != 0L) {
- jjmatchedKind = 72;
- jjmatchedPos = 4;
- return 522;
- }
- if ((active0 & 0x23e0000000000000L) != 0L
- || (active1 & 0x2e0000000dL) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 4;
- return 525;
- }
- return -1;
- case 5:
- if ((active1 & 0x2L) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 5;
- return 170;
- }
- if ((active0 & 0x4000000000000L) != 0L) {
- jjmatchedKind = 72;
- jjmatchedPos = 5;
- return 522;
- }
- if ((active0 & 0x2220000000000000L) != 0L
- || (active1 & 0x400000000L) != 0L) {
- return 525;
- }
- if ((active0 & 0x1c0000000000000L) != 0L
- || (active1 & 0x2a0000000dL) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 5;
- return 525;
- }
- return -1;
- case 6:
- if ((active0 & 0x100000000000000L) != 0L
- || (active1 & 0x200000001L) != 0L) {
- return 525;
- }
- if ((active0 & 0x4000000000000L) != 0L) {
- return 522;
- }
- if ((active0 & 0xc0000000000000L) != 0L
- || (active1 & 0x280000000eL) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 6;
- return 525;
- }
- return -1;
- case 7:
- if ((active0 & 0x40000000000000L) != 0L
- || (active1 & 0x800000008L) != 0L) {
- return 525;
- }
- if ((active0 & 0x80000000000000L) != 0L
- || (active1 & 0x2000000006L) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 7;
- return 525;
- }
- return -1;
- case 8:
- if ((active1 & 0x2000000002L) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 8;
- return 525;
- }
- if ((active0 & 0x80000000000000L) != 0L || (active1 & 0x4L) != 0L) {
- return 525;
- }
- return -1;
- case 9:
- if ((active1 & 0x2L) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 9;
- return 525;
- }
- if ((active1 & 0x2000000000L) != 0L) {
- return 525;
- }
- return -1;
- case 10:
- if ((active1 & 0x2L) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 10;
- return 525;
- }
- return -1;
- case 11:
- if ((active1 & 0x2L) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 11;
- return 525;
- }
- return -1;
- case 12:
- if ((active1 & 0x2L) != 0L) {
- jjmatchedKind = 103;
- jjmatchedPos = 12;
- return 525;
- }
- return -1;
- default:
- return -1;
- }
- }
-
- private final int jjStartNfa_0(int pos, long active0, long active1) {
- return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1),
- pos + 1);
- }
-
- private int jjStopAtPos(int pos, int kind) {
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- return pos + 1;
- }
-
- private int jjMoveStringLiteralDfa0_0() {
- switch (curChar) {
- case 33:
- return jjMoveStringLiteralDfa1_0(0x2000000000L, 0x0L);
- case 36:
- return jjMoveStringLiteralDfa1_0(0x4000L, 0x0L);
- case 37:
- return jjStopAtPos(0, 29);
- case 38:
- jjmatchedKind = 30;
- return jjMoveStringLiteralDfa1_0(0x1000000000L, 0x0L);
- case 40:
- return jjStopAtPos(0, 32);
- case 41:
- return jjStopAtPos(0, 33);
- case 42:
- jjmatchedKind = 28;
- return jjMoveStringLiteralDfa1_0(0x8000L, 0x0L);
- case 43:
- return jjStopAtPos(0, 18);
- case 44:
- return jjStopAtPos(0, 20);
- case 45:
- jjmatchedKind = 19;
- return jjMoveStringLiteralDfa1_0(0x200L, 0x0L);
- case 46:
- return jjStartNfaWithStates_0(0, 31, 523);
- case 47:
- jjmatchedKind = 25;
- return jjMoveStringLiteralDfa1_0(0x10L, 0x0L);
- case 58:
- return jjStopAtPos(0, 38);
- case 59:
- return jjStopAtPos(0, 21);
- case 60:
- jjmatchedKind = 24;
- return jjMoveStringLiteralDfa1_0(0x100L, 0x0L);
- case 61:
- jjmatchedKind = 17;
- return jjMoveStringLiteralDfa1_0(0x400000000L, 0x0L);
- case 62:
- return jjStopAtPos(0, 22);
- case 64:
- return jjMoveStringLiteralDfa1_0(0xffe0000000000000L, 0x3e0000000fL);
- case 91:
- return jjStopAtPos(0, 26);
- case 93:
- return jjStopAtPos(0, 27);
- case 94:
- return jjMoveStringLiteralDfa1_0(0x2000L, 0x0L);
- case 70:
- case 102:
- return jjMoveStringLiteralDfa1_0(0x10000000000000L, 0x0L);
- case 73:
- case 105:
- return jjMoveStringLiteralDfa1_0(0x8000000000000L, 0x20L);
- case 84:
- case 116:
- return jjMoveStringLiteralDfa1_0(0x6000000000000L, 0x0L);
- case 123:
- return jjStopAtPos(0, 10);
- case 124:
- return jjMoveStringLiteralDfa1_0(0x800001000L, 0x0L);
- case 125:
- return jjStopAtPos(0, 11);
- case 126:
- jjmatchedKind = 23;
- return jjMoveStringLiteralDfa1_0(0x10000L, 0x0L);
- default:
- return jjMoveNfa_0(24, 0);
- }
- }
-
- private int jjMoveStringLiteralDfa1_0(long active0, long active1) {
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(0, active0, active1);
- return 1;
- }
- switch (curChar) {
- case 33:
- return jjMoveStringLiteralDfa2_0(active0, 0x100L, active1, 0L);
- case 38:
- if ((active0 & 0x1000000000L) != 0L) {
- return jjStopAtPos(1, 36);
- }
- break;
- case 42:
- if ((active0 & 0x10L) != 0L) {
- return jjStartNfaWithStates_0(1, 4, 221);
- }
- break;
- case 45:
- return jjMoveStringLiteralDfa2_0(active0, 0x200L, active1, 0x2L);
- case 61:
- if ((active0 & 0x1000L) != 0L) {
- return jjStopAtPos(1, 12);
- } else if ((active0 & 0x2000L) != 0L) {
- return jjStopAtPos(1, 13);
- } else if ((active0 & 0x4000L) != 0L) {
- return jjStopAtPos(1, 14);
- } else if ((active0 & 0x8000L) != 0L) {
- return jjStopAtPos(1, 15);
- } else if ((active0 & 0x10000L) != 0L) {
- return jjStopAtPos(1, 16);
- } else if ((active0 & 0x400000000L) != 0L) {
- return jjStopAtPos(1, 34);
- } else if ((active0 & 0x2000000000L) != 0L) {
- return jjStopAtPos(1, 37);
- }
- break;
- case 67:
- case 99:
- return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000008L);
- case 68:
- case 100:
- return jjMoveStringLiteralDfa2_0(active0, 0x200000000000000L,
- active1, 0L);
- case 69:
- case 101:
- return jjMoveStringLiteralDfa2_0(active0, 0x9000000000000000L,
- active1, 0x1L);
- case 70:
- case 102:
- if ((active1 & 0x20L) != 0L) {
- return jjStartNfaWithStates_0(1, 69, 522);
- }
- return jjMoveStringLiteralDfa2_0(active0, 0x880000000000000L,
- active1, 0x2000000000L);
- case 72:
- case 104:
- return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L,
- active1, 0L);
- case 73:
- case 105:
- return jjMoveStringLiteralDfa2_0(active0, 0x4040000000000000L,
- active1, 0x200000000L);
- case 77:
- case 109:
- return jjMoveStringLiteralDfa2_0(active0, 0x20000000000000L,
- active1, 0x400000000L);
- case 78:
- case 110:
- if ((active0 & 0x8000000000000L) != 0L) {
- return jjStartNfaWithStates_0(1, 51, 522);
- }
- break;
- case 79:
- case 111:
- if ((active0 & 0x2000000000000L) != 0L) {
- return jjStartNfaWithStates_0(1, 49, 522);
- }
- break;
- case 80:
- case 112:
- return jjMoveStringLiteralDfa2_0(active0, 0L, active1,
- 0x1000000000L);
- case 82:
- case 114:
- return jjMoveStringLiteralDfa2_0(active0, 0x110000000000000L,
- active1, 0L);
- case 83:
- case 115:
- return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4L);
- case 87:
- case 119:
- return jjMoveStringLiteralDfa2_0(active0, 0x2400000000000000L,
- active1, 0L);
- case 124:
- if ((active0 & 0x800000000L) != 0L) {
- return jjStopAtPos(1, 35);
- }
- break;
- default:
- break;
- }
- return jjStartNfa_0(0, active0, active1);
- }
-
- private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1,
- long active1) {
- if (((active0 &= old0) | (active1 &= old1)) == 0L) {
- return jjStartNfa_0(0, old0, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(1, active0, active1);
- return 2;
- }
- switch (curChar) {
- case 45:
- return jjMoveStringLiteralDfa3_0(active0, 0x100L, active1, 0L);
- case 62:
- if ((active0 & 0x200L) != 0L) {
- return jjStopAtPos(2, 9);
- }
- break;
- case 65:
- case 97:
- return jjMoveStringLiteralDfa3_0(active0, 0x1400000000000000L,
- active1, 0x1000000000L);
- case 69:
- case 101:
- return jjMoveStringLiteralDfa3_0(active0, 0x300000000000000L,
- active1, 0x400000000L);
- case 70:
- case 102:
- if ((active0 & 0x4000000000000000L) != 0L) {
- return jjStartNfaWithStates_0(2, 62, 525);
- }
- break;
- case 72:
- case 104:
- return jjMoveStringLiteralDfa3_0(active0, 0x2000000000000000L,
- active1, 0x800000000L);
- case 73:
- case 105:
- return jjMoveStringLiteralDfa3_0(active0, 0x20000000000000L,
- active1, 0L);
- case 76:
- case 108:
- return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000000L,
- active1, 0L);
- case 77:
- case 109:
- return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x200000002L);
- case 78:
- case 110:
- return jjMoveStringLiteralDfa3_0(active0, 0x40000000000000L,
- active1, 0L);
- case 79:
- case 111:
- return jjMoveStringLiteralDfa3_0(active0, 0x810000000000000L,
- active1, 0x2000000008L);
- case 82:
- case 114:
- return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L,
- active1, 0L);
- case 85:
- case 117:
- return jjMoveStringLiteralDfa3_0(active0, 0x80000000000000L,
- active1, 0x4L);
- case 88:
- case 120:
- return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1L);
- default:
- break;
- }
- return jjStartNfa_0(1, active0, active1);
- }
-
- private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1,
- long active1) {
- if (((active0 &= old0) | (active1 &= old1)) == 0L) {
- return jjStartNfa_0(1, old0, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(2, active0, active1);
- return 3;
- }
- switch (curChar) {
- case 45:
- if ((active0 & 0x100L) != 0L) {
- return jjStopAtPos(3, 8);
- }
- break;
- case 65:
- case 97:
- return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800000000L);
- case 66:
- case 98:
- return jjMoveStringLiteralDfa4_0(active0, 0x200000000000000L,
- active1, 0L);
- case 67:
- case 99:
- return jjMoveStringLiteralDfa4_0(active0, 0x1040000000000000L,
- active1, 0L);
- case 68:
- case 100:
- return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x400000000L);
- case 71:
- case 103:
- return jjMoveStringLiteralDfa4_0(active0, 0L, active1,
- 0x1000000000L);
- case 73:
- case 105:
- return jjMoveStringLiteralDfa4_0(active0, 0x2000000000000000L,
- active1, 0L);
- case 77:
- case 109:
- if ((active0 & 0x10000000000000L) != 0L) {
- return jjStartNfaWithStates_0(3, 52, 522);
- }
- break;
- case 78:
- case 110:
- return jjMoveStringLiteralDfa4_0(active0, 0x80000000000000L,
- active1, 0x2000000008L);
- case 79:
- case 111:
- return jjMoveStringLiteralDfa4_0(active0, 0x4000000000000L,
- active1, 0x2L);
- case 80:
- case 112:
- return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x200000004L);
- case 82:
- case 114:
- if ((active0 & 0x800000000000000L) != 0L) {
- return jjStartNfaWithStates_0(3, 59, 525);
- }
- return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L,
- active1, 0L);
- case 83:
- case 115:
- return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000000L,
- active1, 0L);
- case 84:
- case 116:
- return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L,
- active1, 0x1L);
- case 88:
- case 120:
- return jjMoveStringLiteralDfa4_0(active0, 0x20000000000000L,
- active1, 0L);
- default:
- break;
- }
- return jjStartNfa_0(2, active0, active1);
- }
-
- private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1,
- long active1) {
- if (((active0 &= old0) | (active1 &= old1)) == 0L) {
- return jjStartNfa_0(2, old0, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(3, active0, active1);
- return 4;
- }
- switch (curChar) {
- case 67:
- case 99:
- return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L,
- active1, 0L);
- case 69:
- case 101:
- if ((active0 & 0x8000000000000000L) != 0L) {
- return jjStartNfaWithStates_0(4, 63, 525);
- } else if ((active1 & 0x1000000000L) != 0L) {
- return jjStartNfaWithStates_0(4, 100, 525);
+ /** Debug output. */
+ public java.io.PrintStream debugStream = System.out;
+ /** Set debug output. */
+ public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
+private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
+{
+ switch (pos)
+ {
+ case 0:
+ if ((active0 & 0xffe0000000000000L) != 0L || (active1 & 0x3e0000000fL) != 0L)
+ return 162;
+ if ((active0 & 0xe000000000000L) != 0L || (active1 & 0x20L) != 0L)
+ {
+ jjmatchedKind = 72;
+ return 522;
+ }
+ if ((active0 & 0x80000000L) != 0L)
+ return 523;
+ if ((active0 & 0x10000000000000L) != 0L)
+ {
+ jjmatchedKind = 72;
+ return 29;
+ }
+ if ((active0 & 0x4000L) != 0L)
+ return 75;
+ if ((active0 & 0x2000010L) != 0L)
+ return 216;
+ if ((active0 & 0x80200L) != 0L)
+ return 38;
+ if ((active0 & 0x2000000000L) != 0L)
+ return 524;
+ return -1;
+ case 1:
+ if ((active1 & 0x2L) != 0L)
+ return 174;
+ if ((active0 & 0xffe0000000000000L) != 0L || (active1 & 0x3e0000000dL) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 1;
+ return 525;
+ }
+ if ((active0 & 0x14000000000000L) != 0L)
+ {
+ jjmatchedKind = 72;
+ jjmatchedPos = 1;
+ return 522;
+ }
+ if ((active0 & 0xa000000000000L) != 0L || (active1 & 0x20L) != 0L)
+ return 522;
+ if ((active0 & 0x10L) != 0L)
+ return 221;
+ return -1;
+ case 2:
+ if ((active0 & 0xbfe0000000000000L) != 0L || (active1 & 0x3e0000000dL) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 2;
+ return 525;
+ }
+ if ((active0 & 0x4000000000000000L) != 0L)
+ return 525;
+ if ((active1 & 0x2L) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 2;
+ return 173;
+ }
+ if ((active0 & 0x14000000000000L) != 0L)
+ {
+ jjmatchedKind = 72;
+ jjmatchedPos = 2;
+ return 522;
+ }
+ return -1;
+ case 3:
+ if ((active0 & 0xb7e0000000000000L) != 0L || (active1 & 0x3e0000000dL) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 3;
+ return 525;
+ }
+ if ((active0 & 0x800000000000000L) != 0L)
+ return 525;
+ if ((active0 & 0x4000000000000L) != 0L)
+ {
+ jjmatchedKind = 72;
+ jjmatchedPos = 3;
+ return 522;
+ }
+ if ((active0 & 0x10000000000000L) != 0L)
+ return 522;
+ if ((active1 & 0x2L) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 3;
+ return 172;
+ }
+ return -1;
+ case 4:
+ if ((active0 & 0x9400000000000000L) != 0L || (active1 & 0x1000000000L) != 0L)
+ return 525;
+ if ((active1 & 0x2L) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 4;
+ return 171;
+ }
+ if ((active0 & 0x4000000000000L) != 0L)
+ {
+ jjmatchedKind = 72;
+ jjmatchedPos = 4;
+ return 522;
+ }
+ if ((active0 & 0x23e0000000000000L) != 0L || (active1 & 0x2e0000000dL) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 4;
+ return 525;
+ }
+ return -1;
+ case 5:
+ if ((active1 & 0x2L) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 5;
+ return 170;
+ }
+ if ((active0 & 0x4000000000000L) != 0L)
+ {
+ jjmatchedKind = 72;
+ jjmatchedPos = 5;
+ return 522;
+ }
+ if ((active0 & 0x2220000000000000L) != 0L || (active1 & 0x400000000L) != 0L)
+ return 525;
+ if ((active0 & 0x1c0000000000000L) != 0L || (active1 & 0x2a0000000dL) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 5;
+ return 525;
+ }
+ return -1;
+ case 6:
+ if ((active0 & 0x100000000000000L) != 0L || (active1 & 0x200000001L) != 0L)
+ return 525;
+ if ((active0 & 0x4000000000000L) != 0L)
+ return 522;
+ if ((active0 & 0xc0000000000000L) != 0L || (active1 & 0x280000000eL) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 6;
+ return 525;
+ }
+ return -1;
+ case 7:
+ if ((active0 & 0x40000000000000L) != 0L || (active1 & 0x800000008L) != 0L)
+ return 525;
+ if ((active0 & 0x80000000000000L) != 0L || (active1 & 0x2000000006L) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 7;
+ return 525;
+ }
+ return -1;
+ case 8:
+ if ((active1 & 0x2000000002L) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 8;
+ return 525;
+ }
+ if ((active0 & 0x80000000000000L) != 0L || (active1 & 0x4L) != 0L)
+ return 525;
+ return -1;
+ case 9:
+ if ((active1 & 0x2L) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 9;
+ return 525;
+ }
+ if ((active1 & 0x2000000000L) != 0L)
+ return 525;
+ return -1;
+ case 10:
+ if ((active1 & 0x2L) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 10;
+ return 525;
+ }
+ return -1;
+ case 11:
+ if ((active1 & 0x2L) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 11;
+ return 525;
+ }
+ return -1;
+ case 12:
+ if ((active1 & 0x2L) != 0L)
+ {
+ jjmatchedKind = 103;
+ jjmatchedPos = 12;
+ return 525;
+ }
+ return -1;
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_0(int pos, long active0, long active1)
+{
+ return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1), pos + 1);
+}
+private int jjStopAtPos(int pos, int kind)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ return pos + 1;
+}
+private int jjMoveStringLiteralDfa0_0()
+{
+ switch(curChar)
+ {
+ case 33:
+ return jjMoveStringLiteralDfa1_0(0x2000000000L, 0x0L);
+ case 36:
+ return jjMoveStringLiteralDfa1_0(0x4000L, 0x0L);
+ case 37:
+ return jjStopAtPos(0, 29);
+ case 38:
+ jjmatchedKind = 30;
+ return jjMoveStringLiteralDfa1_0(0x1000000000L, 0x0L);
+ case 40:
+ return jjStopAtPos(0, 32);
+ case 41:
+ return jjStopAtPos(0, 33);
+ case 42:
+ jjmatchedKind = 28;
+ return jjMoveStringLiteralDfa1_0(0x8000L, 0x0L);
+ case 43:
+ return jjStopAtPos(0, 18);
+ case 44:
+ return jjStopAtPos(0, 20);
+ case 45:
+ jjmatchedKind = 19;
+ return jjMoveStringLiteralDfa1_0(0x200L, 0x0L);
+ case 46:
+ return jjStartNfaWithStates_0(0, 31, 523);
+ case 47:
+ jjmatchedKind = 25;
+ return jjMoveStringLiteralDfa1_0(0x10L, 0x0L);
+ case 58:
+ return jjStopAtPos(0, 38);
+ case 59:
+ return jjStopAtPos(0, 21);
+ case 60:
+ jjmatchedKind = 24;
+ return jjMoveStringLiteralDfa1_0(0x100L, 0x0L);
+ case 61:
+ jjmatchedKind = 17;
+ return jjMoveStringLiteralDfa1_0(0x400000000L, 0x0L);
+ case 62:
+ return jjStopAtPos(0, 22);
+ case 64:
+ return jjMoveStringLiteralDfa1_0(0xffe0000000000000L, 0x3e0000000fL);
+ case 91:
+ return jjStopAtPos(0, 26);
+ case 93:
+ return jjStopAtPos(0, 27);
+ case 94:
+ return jjMoveStringLiteralDfa1_0(0x2000L, 0x0L);
+ case 70:
+ case 102:
+ return jjMoveStringLiteralDfa1_0(0x10000000000000L, 0x0L);
+ case 73:
+ case 105:
+ return jjMoveStringLiteralDfa1_0(0x8000000000000L, 0x20L);
+ case 84:
+ case 116:
+ return jjMoveStringLiteralDfa1_0(0x6000000000000L, 0x0L);
+ case 123:
+ return jjStopAtPos(0, 10);
+ case 124:
+ return jjMoveStringLiteralDfa1_0(0x800001000L, 0x0L);
+ case 125:
+ return jjStopAtPos(0, 11);
+ case 126:
+ jjmatchedKind = 23;
+ return jjMoveStringLiteralDfa1_0(0x10000L, 0x0L);
+ default :
+ return jjMoveNfa_0(24, 0);
+ }
+}
+private int jjMoveStringLiteralDfa1_0(long active0, long active1)
+{
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(0, active0, active1);
+ return 1;
+ }
+ switch(curChar)
+ {
+ case 33:
+ return jjMoveStringLiteralDfa2_0(active0, 0x100L, active1, 0L);
+ case 38:
+ if ((active0 & 0x1000000000L) != 0L)
+ return jjStopAtPos(1, 36);
+ break;
+ case 42:
+ if ((active0 & 0x10L) != 0L)
+ return jjStartNfaWithStates_0(1, 4, 221);
+ break;
+ case 45:
+ return jjMoveStringLiteralDfa2_0(active0, 0x200L, active1, 0x2L);
+ case 61:
+ if ((active0 & 0x1000L) != 0L)
+ return jjStopAtPos(1, 12);
+ else if ((active0 & 0x2000L) != 0L)
+ return jjStopAtPos(1, 13);
+ else if ((active0 & 0x4000L) != 0L)
+ return jjStopAtPos(1, 14);
+ else if ((active0 & 0x8000L) != 0L)
+ return jjStopAtPos(1, 15);
+ else if ((active0 & 0x10000L) != 0L)
+ return jjStopAtPos(1, 16);
+ else if ((active0 & 0x400000000L) != 0L)
+ return jjStopAtPos(1, 34);
+ else if ((active0 & 0x2000000000L) != 0L)
+ return jjStopAtPos(1, 37);
+ break;
+ case 67:
+ case 99:
+ return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000008L);
+ case 68:
+ case 100:
+ return jjMoveStringLiteralDfa2_0(active0, 0x200000000000000L, active1, 0L);
+ case 69:
+ case 101:
+ return jjMoveStringLiteralDfa2_0(active0, 0x9000000000000000L, active1, 0x1L);
+ case 70:
+ case 102:
+ if ((active1 & 0x20L) != 0L)
+ return jjStartNfaWithStates_0(1, 69, 522);
+ return jjMoveStringLiteralDfa2_0(active0, 0x880000000000000L, active1, 0x2000000000L);
+ case 72:
+ case 104:
+ return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L, active1, 0L);
+ case 73:
+ case 105:
+ return jjMoveStringLiteralDfa2_0(active0, 0x4040000000000000L, active1, 0x200000000L);
+ case 77:
+ case 109:
+ return jjMoveStringLiteralDfa2_0(active0, 0x20000000000000L, active1, 0x400000000L);
+ case 78:
+ case 110:
+ if ((active0 & 0x8000000000000L) != 0L)
+ return jjStartNfaWithStates_0(1, 51, 522);
+ break;
+ case 79:
+ case 111:
+ if ((active0 & 0x2000000000000L) != 0L)
+ return jjStartNfaWithStates_0(1, 49, 522);
+ break;
+ case 80:
+ case 112:
+ return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x1000000000L);
+ case 82:
+ case 114:
+ return jjMoveStringLiteralDfa2_0(active0, 0x110000000000000L, active1, 0L);
+ case 83:
+ case 115:
+ return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4L);
+ case 87:
+ case 119:
+ return jjMoveStringLiteralDfa2_0(active0, 0x2400000000000000L, active1, 0L);
+ case 124:
+ if ((active0 & 0x800000000L) != 0L)
+ return jjStopAtPos(1, 35);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_0(0, active0, active1);
+}
+private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(0, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(1, active0, active1);
+ return 2;
+ }
+ switch(curChar)
+ {
+ case 45:
+ return jjMoveStringLiteralDfa3_0(active0, 0x100L, active1, 0L);
+ case 62:
+ if ((active0 & 0x200L) != 0L)
+ return jjStopAtPos(2, 9);
+ break;
+ case 65:
+ case 97:
+ return jjMoveStringLiteralDfa3_0(active0, 0x1400000000000000L, active1, 0x1000000000L);
+ case 69:
+ case 101:
+ return jjMoveStringLiteralDfa3_0(active0, 0x300000000000000L, active1, 0x400000000L);
+ case 70:
+ case 102:
+ if ((active0 & 0x4000000000000000L) != 0L)
+ return jjStartNfaWithStates_0(2, 62, 525);
+ break;
+ case 72:
+ case 104:
+ return jjMoveStringLiteralDfa3_0(active0, 0x2000000000000000L, active1, 0x800000000L);
+ case 73:
+ case 105:
+ return jjMoveStringLiteralDfa3_0(active0, 0x20000000000000L, active1, 0L);
+ case 76:
+ case 108:
+ return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000000L, active1, 0L);
+ case 77:
+ case 109:
+ return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x200000002L);
+ case 78:
+ case 110:
+ return jjMoveStringLiteralDfa3_0(active0, 0x40000000000000L, active1, 0L);
+ case 79:
+ case 111:
+ return jjMoveStringLiteralDfa3_0(active0, 0x810000000000000L, active1, 0x2000000008L);
+ case 82:
+ case 114:
+ return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0L);
+ case 85:
+ case 117:
+ return jjMoveStringLiteralDfa3_0(active0, 0x80000000000000L, active1, 0x4L);
+ case 88:
+ case 120:
+ return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(1, active0, active1);
+}
+private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(1, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(2, active0, active1);
+ return 3;
+ }
+ switch(curChar)
+ {
+ case 45:
+ if ((active0 & 0x100L) != 0L)
+ return jjStopAtPos(3, 8);
+ break;
+ case 65:
+ case 97:
+ return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800000000L);
+ case 66:
+ case 98:
+ return jjMoveStringLiteralDfa4_0(active0, 0x200000000000000L, active1, 0L);
+ case 67:
+ case 99:
+ return jjMoveStringLiteralDfa4_0(active0, 0x1040000000000000L, active1, 0L);
+ case 68:
+ case 100:
+ return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x400000000L);
+ case 71:
+ case 103:
+ return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x1000000000L);
+ case 73:
+ case 105:
+ return jjMoveStringLiteralDfa4_0(active0, 0x2000000000000000L, active1, 0L);
+ case 77:
+ case 109:
+ if ((active0 & 0x10000000000000L) != 0L)
+ return jjStartNfaWithStates_0(3, 52, 522);
+ break;
+ case 78:
+ case 110:
+ return jjMoveStringLiteralDfa4_0(active0, 0x80000000000000L, active1, 0x2000000008L);
+ case 79:
+ case 111:
+ return jjMoveStringLiteralDfa4_0(active0, 0x4000000000000L, active1, 0x2L);
+ case 80:
+ case 112:
+ return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x200000004L);
+ case 82:
+ case 114:
+ if ((active0 & 0x800000000000000L) != 0L)
+ return jjStartNfaWithStates_0(3, 59, 525);
+ return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0L);
+ case 83:
+ case 115:
+ return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000000L, active1, 0L);
+ case 84:
+ case 116:
+ return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L, active1, 0x1L);
+ case 88:
+ case 120:
+ return jjMoveStringLiteralDfa4_0(active0, 0x20000000000000L, active1, 0L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(2, active0, active1);
+}
+private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(2, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(3, active0, active1);
+ return 4;
+ }
+ switch(curChar)
+ {
+ case 67:
+ case 99:
+ return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0L);
+ case 69:
+ case 101:
+ if ((active0 & 0x8000000000000000L) != 0L)
+ return jjStartNfaWithStates_0(4, 63, 525);
+ else if ((active1 & 0x1000000000L) != 0L)
+ return jjStartNfaWithStates_0(4, 100, 525);
+ return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x1L);
+ case 72:
+ case 104:
+ if ((active0 & 0x1000000000000000L) != 0L)
+ return jjStartNfaWithStates_0(4, 60, 525);
+ break;
+ case 73:
+ case 105:
+ return jjMoveStringLiteralDfa5_0(active0, 0x20000000000000L, active1, 0x400000000L);
+ case 76:
+ case 108:
+ return jjMoveStringLiteralDfa5_0(active0, 0x2040000000000000L, active1, 0L);
+ case 78:
+ case 110:
+ if ((active0 & 0x400000000000000L) != 0L)
+ return jjStartNfaWithStates_0(4, 58, 525);
+ break;
+ case 79:
+ case 111:
+ return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x200000000L);
+ case 80:
+ case 112:
+ return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x4L);
+ case 82:
+ case 114:
+ return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000000L);
+ case 84:
+ case 116:
+ return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000008L);
+ case 85:
+ case 117:
+ return jjMoveStringLiteralDfa5_0(active0, 0x304000000000000L, active1, 0L);
+ case 90:
+ case 122:
+ return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(3, active0, active1);
+}
+private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(3, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(4, active0, active1);
+ return 5;
+ }
+ switch(curChar)
+ {
+ case 45:
+ return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000000002L);
+ case 65:
+ case 97:
+ if ((active1 & 0x400000000L) != 0L)
+ return jjStartNfaWithStates_0(5, 98, 525);
+ break;
+ case 69:
+ case 101:
+ if ((active0 & 0x2000000000000000L) != 0L)
+ return jjStartNfaWithStates_0(5, 61, 525);
+ return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x8L);
+ case 71:
+ case 103:
+ if ((active0 & 0x200000000000000L) != 0L)
+ return jjStartNfaWithStates_0(5, 57, 525);
+ return jjMoveStringLiteralDfa6_0(active0, 0x4000000000000L, active1, 0L);
+ case 78:
+ case 110:
+ if ((active0 & 0x20000000000000L) != 0L)
+ return jjStartNfaWithStates_0(5, 53, 525);
+ return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x1L);
+ case 79:
+ case 111:
+ return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4L);
+ case 82:
+ case 114:
+ return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L, active1, 0x200000000L);
+ case 83:
+ case 115:
+ return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800000000L);
+ case 84:
+ case 116:
+ return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0L);
+ case 85:
+ case 117:
+ return jjMoveStringLiteralDfa6_0(active0, 0x40000000000000L, active1, 0L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(4, active0, active1);
+}
+private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(4, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(5, active0, active1);
+ return 6;
+ }
+ switch(curChar)
+ {
+ case 68:
+ case 100:
+ if ((active1 & 0x1L) != 0L)
+ return jjStartNfaWithStates_0(6, 64, 525);
+ return jjMoveStringLiteralDfa7_0(active0, 0x40000000000000L, active1, 0x2L);
+ case 69:
+ case 101:
+ return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x800000000L);
+ case 70:
+ case 102:
+ return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2000000000L);
+ case 72:
+ case 104:
+ if ((active0 & 0x4000000000000L) != 0L)
+ return jjStartNfaWithStates_0(6, 50, 522);
+ break;
+ case 73:
+ case 105:
+ return jjMoveStringLiteralDfa7_0(active0, 0x80000000000000L, active1, 0L);
+ case 78:
+ case 110:
+ if ((active0 & 0x100000000000000L) != 0L)
+ return jjStartNfaWithStates_0(6, 56, 525);
+ return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x8L);
+ case 82:
+ case 114:
+ return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4L);
+ case 84:
+ case 116:
+ if ((active1 & 0x200000000L) != 0L)
+ return jjStartNfaWithStates_0(6, 97, 525);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_0(5, active0, active1);
+}
+private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(5, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(6, active0, active1);
+ return 7;
+ }
+ switch(curChar)
+ {
+ case 65:
+ case 97:
+ return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x2000000000L);
+ case 69:
+ case 101:
+ if ((active0 & 0x40000000000000L) != 0L)
+ return jjStartNfaWithStates_0(7, 54, 525);
+ break;
+ case 79:
+ case 111:
+ return jjMoveStringLiteralDfa8_0(active0, 0x80000000000000L, active1, 0x2L);
+ case 84:
+ case 116:
+ if ((active1 & 0x8L) != 0L)
+ return jjStartNfaWithStates_0(7, 67, 525);
+ else if ((active1 & 0x800000000L) != 0L)
+ return jjStartNfaWithStates_0(7, 99, 525);
+ return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x4L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(6, active0, active1);
+}
+private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(6, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(7, active0, active1);
+ return 8;
+ }
+ switch(curChar)
+ {
+ case 67:
+ case 99:
+ return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x2000000002L);
+ case 78:
+ case 110:
+ if ((active0 & 0x80000000000000L) != 0L)
+ return jjStartNfaWithStates_0(8, 55, 525);
+ break;
+ case 83:
+ case 115:
+ if ((active1 & 0x4L) != 0L)
+ return jjStartNfaWithStates_0(8, 66, 525);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_0(7, active0, active1);
+}
+private int jjMoveStringLiteralDfa9_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(7, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(8, 0L, active1);
+ return 9;
+ }
+ switch(curChar)
+ {
+ case 69:
+ case 101:
+ if ((active1 & 0x2000000000L) != 0L)
+ return jjStartNfaWithStates_0(9, 101, 525);
+ break;
+ case 85:
+ case 117:
+ return jjMoveStringLiteralDfa10_0(active1, 0x2L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(8, 0L, active1);
+}
+private int jjMoveStringLiteralDfa10_0(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_0(8, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(9, 0L, active1);
+ return 10;
+ }
+ switch(curChar)
+ {
+ case 77:
+ case 109:
+ return jjMoveStringLiteralDfa11_0(active1, 0x2L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(9, 0L, active1);
+}
+private int jjMoveStringLiteralDfa11_0(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_0(9, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(10, 0L, active1);
+ return 11;
+ }
+ switch(curChar)
+ {
+ case 69:
+ case 101:
+ return jjMoveStringLiteralDfa12_0(active1, 0x2L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(10, 0L, active1);
+}
+private int jjMoveStringLiteralDfa12_0(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_0(10, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(11, 0L, active1);
+ return 12;
+ }
+ switch(curChar)
+ {
+ case 78:
+ case 110:
+ return jjMoveStringLiteralDfa13_0(active1, 0x2L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(11, 0L, active1);
+}
+private int jjMoveStringLiteralDfa13_0(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_0(11, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(12, 0L, active1);
+ return 13;
+ }
+ switch(curChar)
+ {
+ case 84:
+ case 116:
+ if ((active1 & 0x2L) != 0L)
+ return jjStartNfaWithStates_0(13, 65, 525);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_0(12, 0L, active1);
+}
+private int jjStartNfaWithStates_0(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_0(state, pos + 1);
+}
+static final long[] jjbitVec0 = {
+ 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+private int jjMoveNfa_0(int startState, int curPos)
+{
+ int startsAt = 0;
+ jjnewStateCnt = 522;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 524:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddTwoStates(256, 265);
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddTwoStates(248, 255);
+ break;
+ case 162:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 108;
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 213;
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 201;
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 185;
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 174;
+ break;
+ case 29:
+ if ((0x3ff200000000000L & l) != 0L)
+ jjCheckNAddStates(0, 3);
+ else if ((0x100003600L & l) != 0L)
+ jjCheckNAddTwoStates(236, 237);
+ else if (curChar == 40)
+ {
+ if (kind > 118)
+ kind = 118;
+ }
+ if ((0x3ff200000000000L & l) != 0L)
+ {
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ }
+ break;
+ case 171:
+ if ((0x3ff200000000000L & l) != 0L)
+ {
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ }
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 170;
+ break;
+ case 523:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(4, 8);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(327, 330);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(324, 326);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(322, 323);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(319, 321);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(314, 318);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(310, 313);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(306, 309);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(303, 305);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(299, 302);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(295, 298);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(292, 294);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(289, 291);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(286, 288);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(283, 285);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(280, 282);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(277, 279);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(274, 276);
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(272, 273);
+ if ((0x3ff000000000000L & l) != 0L)
+ {
+ if (kind > 73)
+ kind = 73;
+ jjCheckNAdd(271);
+ }
+ break;
+ case 525:
+ case 109:
+ if ((0x3ff200000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 216:
+ if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 221;
+ else if (curChar == 47)
+ {
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddStates(9, 11);
+ }
+ break;
+ case 173:
+ if ((0x3ff200000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 24:
+ if ((0x3ff000000000000L & l) != 0L)
+ {
+ if (kind > 73)
+ kind = 73;
+ jjCheckNAddStates(12, 93);
+ }
+ else if ((0x100003600L & l) != 0L)
+ {
+ if (kind > 1)
+ kind = 1;
+ jjCheckNAdd(0);
+ }
+ else if (curChar == 46)
+ jjCheckNAddStates(94, 113);
+ else if (curChar == 45)
+ jjAddStates(114, 115);
+ else if (curChar == 33)
+ jjCheckNAddStates(116, 119);
+ else if (curChar == 47)
+ jjAddStates(120, 121);
+ else if (curChar == 35)
+ jjCheckNAddTwoStates(96, 97);
+ else if (curChar == 36)
+ jjCheckNAddStates(122, 125);
+ else if (curChar == 39)
+ jjCheckNAddStates(126, 129);
+ else if (curChar == 34)
+ jjCheckNAddStates(130, 133);
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 38;
+ else if (curChar == 35)
+ jjstateSet[jjnewStateCnt++] = 1;
+ break;
+ case 172:
+ if ((0x3ff200000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 170:
+ if ((0x3ff200000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 75:
+ if (curChar == 45)
+ jjCheckNAdd(76);
+ break;
+ case 522:
+ if ((0x3ff200000000000L & l) != 0L)
+ jjCheckNAddStates(0, 3);
+ else if ((0x100003600L & l) != 0L)
+ jjCheckNAddTwoStates(236, 237);
+ else if (curChar == 40)
+ {
+ if (kind > 118)
+ kind = 118;
+ }
+ if ((0x3ff200000000000L & l) != 0L)
+ {
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ }
+ break;
+ case 0:
+ if ((0x100003600L & l) == 0L)
+ break;
+ if (kind > 1)
+ kind = 1;
+ jjCheckNAdd(0);
+ break;
+ case 2:
+ if (curChar == 36)
+ jjCheckNAddStates(134, 137);
+ break;
+ case 3:
+ if (curChar == 45)
+ jjCheckNAdd(4);
+ break;
+ case 5:
+ if ((0x3ff200000000000L & l) != 0L)
+ jjCheckNAddStates(138, 140);
+ break;
+ case 8:
+ if ((0xffffffff00000000L & l) != 0L)
+ jjCheckNAddStates(138, 140);
+ break;
+ case 9:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(141, 145);
+ break;
+ case 10:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddStates(138, 140);
+ break;
+ case 11:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(146, 153);
+ break;
+ case 12:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(154, 157);
+ break;
+ case 13:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(158, 162);
+ break;
+ case 14:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(163, 168);
+ break;
+ case 15:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(169, 175);
+ break;
+ case 18:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(176, 180);
+ break;
+ case 19:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(181, 188);
+ break;
+ case 20:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(189, 192);
+ break;
+ case 21:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(193, 197);
+ break;
+ case 22:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(198, 203);
+ break;
+ case 23:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(204, 210);
+ break;
+ case 36:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 35;
+ break;
+ case 39:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 38;
+ break;
+ case 40:
+ if (curChar == 34)
+ jjCheckNAddStates(130, 133);
+ break;
+ case 41:
+ if ((0xfffffffb00000200L & l) != 0L)
+ jjCheckNAddStates(130, 133);
+ break;
+ case 42:
+ if (curChar == 34 && kind > 71)
+ kind = 71;
+ break;
+ case 44:
+ if (curChar == 12)
+ jjCheckNAddStates(130, 133);
+ break;
+ case 46:
+ if ((0xffffffff00000000L & l) != 0L)
+ jjCheckNAddStates(130, 133);
+ break;
+ case 47:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(211, 216);
+ break;
+ case 48:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddStates(130, 133);
+ break;
+ case 49:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(217, 225);
+ break;
+ case 50:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(226, 230);
+ break;
+ case 51:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(231, 236);
+ break;
+ case 52:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(237, 243);
+ break;
+ case 53:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(244, 251);
+ break;
+ case 54:
+ if (curChar == 13)
+ jjCheckNAddStates(130, 133);
+ break;
+ case 55:
+ if (curChar == 10)
+ jjCheckNAddStates(130, 133);
+ break;
+ case 56:
+ if (curChar == 13)
+ jjstateSet[jjnewStateCnt++] = 55;
+ break;
+ case 57:
+ if (curChar == 39)
+ jjCheckNAddStates(126, 129);
+ break;
+ case 58:
+ if ((0xffffff7f00000200L & l) != 0L)
+ jjCheckNAddStates(126, 129);
+ break;
+ case 59:
+ if (curChar == 39 && kind > 71)
+ kind = 71;
+ break;
+ case 61:
+ if (curChar == 12)
+ jjCheckNAddStates(126, 129);
+ break;
+ case 63:
+ if ((0xffffffff00000000L & l) != 0L)
+ jjCheckNAddStates(126, 129);
+ break;
+ case 64:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(252, 257);
+ break;
+ case 65:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddStates(126, 129);
+ break;
+ case 66:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(258, 266);
+ break;
+ case 67:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(267, 271);
+ break;
+ case 68:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(272, 277);
+ break;
+ case 69:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(278, 284);
+ break;
+ case 70:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(285, 292);
+ break;
+ case 71:
+ if (curChar == 13)
+ jjCheckNAddStates(126, 129);
+ break;
+ case 72:
+ if (curChar == 10)
+ jjCheckNAddStates(126, 129);
+ break;
+ case 73:
+ if (curChar == 13)
+ jjstateSet[jjnewStateCnt++] = 72;
+ break;
+ case 74:
+ if (curChar == 36)
+ jjCheckNAddStates(122, 125);
+ break;
+ case 77:
+ if ((0x3ff200000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddTwoStates(77, 78);
+ break;
+ case 79:
+ if ((0xffffffff00000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddTwoStates(77, 78);
+ break;
+ case 80:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(293, 296);
+ break;
+ case 81:
+ if ((0x100003600L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddTwoStates(77, 78);
+ break;
+ case 82:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(297, 303);
+ break;
+ case 83:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(304, 306);
+ break;
+ case 84:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(307, 310);
+ break;
+ case 85:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(311, 315);
+ break;
+ case 86:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(316, 321);
+ break;
+ case 89:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(322, 325);
+ break;
+ case 90:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(326, 332);
+ break;
+ case 91:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(333, 335);
+ break;
+ case 92:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(336, 339);
+ break;
+ case 93:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(340, 344);
+ break;
+ case 94:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(345, 350);
+ break;
+ case 95:
+ if (curChar == 35)
+ jjCheckNAddTwoStates(96, 97);
+ break;
+ case 96:
+ if ((0x3ff200000000000L & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddTwoStates(96, 97);
+ break;
+ case 98:
+ if ((0xffffffff00000000L & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddTwoStates(96, 97);
+ break;
+ case 99:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(351, 354);
+ break;
+ case 100:
+ if ((0x100003600L & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddTwoStates(96, 97);
+ break;
+ case 101:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(355, 361);
+ break;
+ case 102:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(362, 364);
+ break;
+ case 103:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(365, 368);
+ break;
+ case 104:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(369, 373);
+ break;
+ case 105:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(374, 379);
+ break;
+ case 107:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 108;
+ break;
+ case 111:
+ if ((0xffffffff00000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 112:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(380, 383);
+ break;
+ case 113:
+ if ((0x100003600L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 114:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(384, 390);
+ break;
+ case 115:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(391, 393);
+ break;
+ case 116:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(394, 397);
+ break;
+ case 117:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(398, 402);
+ break;
+ case 118:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(403, 408);
+ break;
+ case 121:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(409, 412);
+ break;
+ case 122:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(413, 419);
+ break;
+ case 123:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(420, 422);
+ break;
+ case 124:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(423, 426);
+ break;
+ case 125:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(427, 431);
+ break;
+ case 126:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(432, 437);
+ break;
+ case 128:
+ if ((0x100003600L & l) != 0L)
+ jjAddStates(438, 439);
+ break;
+ case 129:
+ if (curChar == 40 && kind > 115)
+ kind = 115;
+ break;
+ case 136:
+ if ((0x100003600L & l) != 0L)
+ jjAddStates(440, 441);
+ break;
+ case 137:
+ if (curChar == 40 && kind > 116)
+ kind = 116;
+ break;
+ case 144:
+ if ((0x100003600L & l) != 0L)
+ jjAddStates(442, 443);
+ break;
+ case 145:
+ if (curChar == 40 && kind > 117)
+ kind = 117;
+ break;
+ case 175:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 174;
+ break;
+ case 184:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 183;
+ break;
+ case 186:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 185;
+ break;
+ case 195:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 194;
+ break;
+ case 202:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 201;
+ break;
+ case 211:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 210;
+ break;
+ case 214:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 213;
+ break;
+ case 215:
+ if (curChar == 47)
+ jjAddStates(120, 121);
+ break;
+ case 217:
+ if ((0xffffffffffffdbffL & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddStates(9, 11);
+ break;
+ case 218:
+ if ((0x2400L & l) != 0L && kind > 2)
+ kind = 2;
+ break;
+ case 219:
+ if (curChar == 10 && kind > 2)
+ kind = 2;
+ break;
+ case 220:
+ if (curChar == 13)
+ jjstateSet[jjnewStateCnt++] = 219;
+ break;
+ case 221:
+ if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 222;
+ break;
+ case 222:
+ if ((0xffff7fffffffffffL & l) != 0L && kind > 3)
+ kind = 3;
+ break;
+ case 223:
+ if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 221;
+ break;
+ case 225:
+ if ((0x3ff200000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ break;
+ case 227:
+ if ((0xffffffff00000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ break;
+ case 228:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(444, 447);
+ break;
+ case 229:
+ if ((0x100003600L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ break;
+ case 230:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(448, 454);
+ break;
+ case 231:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(455, 457);
+ break;
+ case 232:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(458, 461);
+ break;
+ case 233:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(462, 466);
+ break;
+ case 234:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(467, 472);
+ break;
+ case 235:
+ if ((0x3ff200000000000L & l) != 0L)
+ jjCheckNAddStates(0, 3);
+ break;
+ case 236:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddTwoStates(236, 237);
+ break;
+ case 237:
+ if (curChar == 40 && kind > 118)
+ kind = 118;
+ break;
+ case 239:
+ if ((0xffffffff00000000L & l) != 0L)
+ jjCheckNAddStates(0, 3);
+ break;
+ case 240:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(473, 477);
+ break;
+ case 241:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddStates(0, 3);
+ break;
+ case 242:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(478, 485);
+ break;
+ case 243:
+ case 457:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(486, 489);
+ break;
+ case 244:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(490, 494);
+ break;
+ case 245:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(495, 500);
+ break;
+ case 246:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(501, 507);
+ break;
+ case 247:
+ if (curChar == 33)
+ jjCheckNAddStates(116, 119);
+ break;
+ case 248:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddTwoStates(248, 255);
+ break;
+ case 256:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddTwoStates(256, 265);
+ break;
+ case 266:
+ if (curChar == 45)
+ jjAddStates(114, 115);
+ break;
+ case 270:
+ if (curChar == 46)
+ jjCheckNAddStates(94, 113);
+ break;
+ case 271:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 73)
+ kind = 73;
+ jjCheckNAdd(271);
+ break;
+ case 272:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(272, 273);
+ break;
+ case 273:
+ if (curChar == 37 && kind > 77)
+ kind = 77;
+ break;
+ case 274:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(274, 276);
+ break;
+ case 277:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(277, 279);
+ break;
+ case 280:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(280, 282);
+ break;
+ case 283:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(283, 285);
+ break;
+ case 286:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(286, 288);
+ break;
+ case 289:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(289, 291);
+ break;
+ case 292:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(292, 294);
+ break;
+ case 295:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(295, 298);
+ break;
+ case 299:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(299, 302);
+ break;
+ case 303:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(303, 305);
+ break;
+ case 306:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(306, 309);
+ break;
+ case 310:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(310, 313);
+ break;
+ case 314:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(314, 318);
+ break;
+ case 319:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(319, 321);
+ break;
+ case 322:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(322, 323);
+ break;
+ case 324:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(324, 326);
+ break;
+ case 327:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(327, 330);
+ break;
+ case 331:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(4, 8);
+ break;
+ case 332:
+ if (curChar == 45)
+ jjCheckNAdd(333);
+ break;
+ case 334:
+ if ((0x3ff200000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddTwoStates(334, 335);
+ break;
+ case 336:
+ if ((0xffffffff00000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddTwoStates(334, 335);
+ break;
+ case 337:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(508, 511);
+ break;
+ case 338:
+ if ((0x100003600L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddTwoStates(334, 335);
+ break;
+ case 339:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(512, 518);
+ break;
+ case 340:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(519, 521);
+ break;
+ case 341:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(522, 525);
+ break;
+ case 342:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(526, 530);
+ break;
+ case 343:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(531, 536);
+ break;
+ case 346:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(537, 540);
+ break;
+ case 347:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(541, 547);
+ break;
+ case 348:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(548, 550);
+ break;
+ case 349:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(551, 554);
+ break;
+ case 350:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(555, 559);
+ break;
+ case 351:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(560, 565);
+ break;
+ case 353:
+ if (curChar == 40)
+ jjCheckNAddStates(566, 571);
+ break;
+ case 354:
+ if ((0xfffffc7a00000000L & l) != 0L)
+ jjCheckNAddStates(572, 575);
+ break;
+ case 355:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddTwoStates(355, 356);
+ break;
+ case 356:
+ if (curChar == 41 && kind > 75)
+ kind = 75;
+ break;
+ case 358:
+ if ((0xffffffff00000000L & l) != 0L)
+ jjCheckNAddStates(572, 575);
+ break;
+ case 359:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(576, 580);
+ break;
+ case 360:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddStates(572, 575);
+ break;
+ case 361:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(581, 588);
+ break;
+ case 362:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(589, 592);
+ break;
+ case 363:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(593, 597);
+ break;
+ case 364:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(598, 603);
+ break;
+ case 365:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(604, 610);
+ break;
+ case 366:
+ if (curChar == 39)
+ jjCheckNAddStates(611, 614);
+ break;
+ case 367:
+ if ((0xffffff7f00000200L & l) != 0L)
+ jjCheckNAddStates(611, 614);
+ break;
+ case 368:
+ if (curChar == 39)
+ jjCheckNAddTwoStates(355, 356);
+ break;
+ case 370:
+ if (curChar == 12)
+ jjCheckNAddStates(611, 614);
+ break;
+ case 372:
+ if ((0xffffffff00000000L & l) != 0L)
+ jjCheckNAddStates(611, 614);
+ break;
+ case 373:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(615, 620);
+ break;
+ case 374:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddStates(611, 614);
+ break;
+ case 375:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(621, 629);
+ break;
+ case 376:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(630, 634);
+ break;
+ case 377:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(635, 640);
+ break;
+ case 378:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(641, 647);
+ break;
+ case 379:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(648, 655);
+ break;
+ case 380:
+ if (curChar == 13)
+ jjCheckNAddStates(611, 614);
+ break;
+ case 381:
+ if (curChar == 10)
+ jjCheckNAddStates(611, 614);
+ break;
+ case 382:
+ if (curChar == 13)
+ jjstateSet[jjnewStateCnt++] = 381;
+ break;
+ case 383:
+ if (curChar == 34)
+ jjCheckNAddStates(656, 659);
+ break;
+ case 384:
+ if ((0xfffffffb00000200L & l) != 0L)
+ jjCheckNAddStates(656, 659);
+ break;
+ case 385:
+ if (curChar == 34)
+ jjCheckNAddTwoStates(355, 356);
+ break;
+ case 387:
+ if (curChar == 12)
+ jjCheckNAddStates(656, 659);
+ break;
+ case 389:
+ if ((0xffffffff00000000L & l) != 0L)
+ jjCheckNAddStates(656, 659);
+ break;
+ case 390:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(660, 665);
+ break;
+ case 391:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddStates(656, 659);
+ break;
+ case 392:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(666, 674);
+ break;
+ case 393:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(675, 679);
+ break;
+ case 394:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(680, 685);
+ break;
+ case 395:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(686, 692);
+ break;
+ case 396:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(693, 700);
+ break;
+ case 397:
+ if (curChar == 13)
+ jjCheckNAddStates(656, 659);
+ break;
+ case 398:
+ if (curChar == 10)
+ jjCheckNAddStates(656, 659);
+ break;
+ case 399:
+ if (curChar == 13)
+ jjstateSet[jjnewStateCnt++] = 398;
+ break;
+ case 400:
+ if ((0x100003600L & l) != 0L)
+ jjCheckNAddStates(701, 707);
+ break;
+ case 403:
+ if (curChar == 43)
+ jjAddStates(708, 709);
+ break;
+ case 404:
+ if (curChar != 63)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjstateSet[jjnewStateCnt++] = 405;
+ break;
+ case 405:
+ if (curChar != 63)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddStates(710, 713);
+ break;
+ case 406:
+ if (curChar == 63 && kind > 114)
+ kind = 114;
+ break;
+ case 407:
+ case 422:
+ case 426:
+ case 429:
+ case 432:
+ if (curChar != 63)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAdd(406);
+ break;
+ case 408:
+ if (curChar != 63)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddTwoStates(406, 407);
+ break;
+ case 409:
+ if (curChar != 63)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddStates(714, 716);
+ break;
+ case 410:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjAddStates(717, 722);
+ break;
+ case 411:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 412;
+ break;
+ case 412:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 413;
+ break;
+ case 413:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAdd(414);
+ break;
+ case 414:
+ if ((0x3ff000000000000L & l) != 0L && kind > 114)
+ kind = 114;
+ break;
+ case 415:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 416;
+ break;
+ case 416:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 417;
+ break;
+ case 417:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 418;
+ break;
+ case 418:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAdd(406);
+ break;
+ case 419:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 420;
+ break;
+ case 420:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 421;
+ break;
+ case 421:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjstateSet[jjnewStateCnt++] = 422;
+ break;
+ case 423:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 424;
+ break;
+ case 424:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjstateSet[jjnewStateCnt++] = 425;
+ break;
+ case 425:
+ if (curChar != 63)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddTwoStates(406, 426);
+ break;
+ case 427:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjstateSet[jjnewStateCnt++] = 428;
+ break;
+ case 428:
+ if (curChar != 63)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddStates(723, 725);
+ break;
+ case 430:
+ if (curChar != 63)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddTwoStates(406, 429);
+ break;
+ case 431:
+ if (curChar != 63)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddStates(726, 729);
+ break;
+ case 433:
+ if (curChar != 63)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddTwoStates(406, 432);
+ break;
+ case 434:
+ if (curChar != 63)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddStates(730, 732);
+ break;
+ case 435:
+ if (curChar == 43)
+ jjstateSet[jjnewStateCnt++] = 436;
+ break;
+ case 436:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(437, 443);
+ break;
+ case 437:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 438;
+ break;
+ case 438:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjstateSet[jjnewStateCnt++] = 439;
+ break;
+ case 439:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddStates(733, 736);
+ break;
+ case 440:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAdd(414);
+ break;
+ case 441:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddTwoStates(414, 440);
+ break;
+ case 442:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddStates(737, 739);
+ break;
+ case 443:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(740, 744);
+ break;
+ case 444:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAdd(437);
+ break;
+ case 445:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(444, 437);
+ break;
+ case 446:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(745, 747);
+ break;
+ case 447:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(748, 751);
+ break;
+ case 449:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(752, 755);
+ break;
+ case 450:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(756, 762);
+ break;
+ case 451:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(763, 765);
+ break;
+ case 452:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(766, 769);
+ break;
+ case 453:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(770, 774);
+ break;
+ case 454:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(775, 780);
+ break;
+ case 455:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(781, 785);
+ break;
+ case 456:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(786, 793);
+ break;
+ case 458:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(794, 798);
+ break;
+ case 459:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(799, 804);
+ break;
+ case 460:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(805, 811);
+ break;
+ case 461:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 73)
+ kind = 73;
+ jjCheckNAddStates(12, 93);
+ break;
+ case 462:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 73)
+ kind = 73;
+ jjCheckNAdd(462);
+ break;
+ case 463:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(463, 464);
+ break;
+ case 464:
+ if (curChar == 46)
+ jjCheckNAdd(271);
+ break;
+ case 465:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(465, 273);
+ break;
+ case 466:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(466, 467);
+ break;
+ case 467:
+ if (curChar == 46)
+ jjCheckNAdd(272);
+ break;
+ case 468:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(468, 276);
+ break;
+ case 469:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(469, 470);
+ break;
+ case 470:
+ if (curChar == 46)
+ jjCheckNAdd(274);
+ break;
+ case 471:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(471, 279);
+ break;
+ case 472:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(472, 473);
+ break;
+ case 473:
+ if (curChar == 46)
+ jjCheckNAdd(277);
+ break;
+ case 474:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(474, 282);
+ break;
+ case 475:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(475, 476);
+ break;
+ case 476:
+ if (curChar == 46)
+ jjCheckNAdd(280);
+ break;
+ case 477:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(477, 285);
+ break;
+ case 478:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(478, 479);
+ break;
+ case 479:
+ if (curChar == 46)
+ jjCheckNAdd(283);
+ break;
+ case 480:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(480, 288);
+ break;
+ case 481:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(481, 482);
+ break;
+ case 482:
+ if (curChar == 46)
+ jjCheckNAdd(286);
+ break;
+ case 483:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(483, 291);
+ break;
+ case 484:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(484, 485);
+ break;
+ case 485:
+ if (curChar == 46)
+ jjCheckNAdd(289);
+ break;
+ case 486:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(486, 294);
+ break;
+ case 487:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(487, 488);
+ break;
+ case 488:
+ if (curChar == 46)
+ jjCheckNAdd(292);
+ break;
+ case 489:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(489, 298);
+ break;
+ case 490:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(490, 491);
+ break;
+ case 491:
+ if (curChar == 46)
+ jjCheckNAdd(295);
+ break;
+ case 492:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(492, 302);
+ break;
+ case 493:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(493, 494);
+ break;
+ case 494:
+ if (curChar == 46)
+ jjCheckNAdd(299);
+ break;
+ case 495:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(495, 305);
+ break;
+ case 496:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(496, 497);
+ break;
+ case 497:
+ if (curChar == 46)
+ jjCheckNAdd(303);
+ break;
+ case 498:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(498, 309);
+ break;
+ case 499:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(499, 500);
+ break;
+ case 500:
+ if (curChar == 46)
+ jjCheckNAdd(306);
+ break;
+ case 501:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(501, 313);
+ break;
+ case 502:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(502, 503);
+ break;
+ case 503:
+ if (curChar == 46)
+ jjCheckNAdd(310);
+ break;
+ case 504:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(504, 318);
+ break;
+ case 505:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(505, 506);
+ break;
+ case 506:
+ if (curChar == 46)
+ jjCheckNAdd(314);
+ break;
+ case 507:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(507, 321);
+ break;
+ case 508:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(508, 509);
+ break;
+ case 509:
+ if (curChar == 46)
+ jjCheckNAdd(319);
+ break;
+ case 510:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(510, 323);
+ break;
+ case 511:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(511, 512);
+ break;
+ case 512:
+ if (curChar == 46)
+ jjCheckNAdd(322);
+ break;
+ case 513:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(513, 326);
+ break;
+ case 514:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(514, 515);
+ break;
+ case 515:
+ if (curChar == 46)
+ jjCheckNAdd(324);
+ break;
+ case 516:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(516, 330);
+ break;
+ case 517:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(517, 518);
+ break;
+ case 518:
+ if (curChar == 46)
+ jjCheckNAdd(327);
+ break;
+ case 519:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(812, 816);
+ break;
+ case 520:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(520, 521);
+ break;
+ case 521:
+ if (curChar == 46)
+ jjCheckNAdd(331);
+ break;
+ default : break;
}
- return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x1L);
- case 72:
- case 104:
- if ((active0 & 0x1000000000000000L) != 0L) {
- return jjStartNfaWithStates_0(4, 60, 525);
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 524:
+ if ((0x20000000200L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 264;
+ else if ((0x1000000010L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 254;
+ break;
+ case 162:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ }
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(111, 121);
+ if ((0x80000000800L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 161;
+ break;
+ case 29:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(0, 3);
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(227, 228);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ }
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(239, 240);
+ if ((0x20000000200L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 28;
+ break;
+ case 171:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ }
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(111, 112);
+ break;
+ case 525:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ }
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(111, 112);
+ break;
+ case 38:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(0, 3);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ }
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 37;
+ break;
+ case 173:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ }
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(111, 112);
+ if ((0x8000000080000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 211;
+ else if ((0x800000008000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 172;
+ break;
+ case 24:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(817, 822);
+ }
+ else if (curChar == 92)
+ jjCheckNAddStates(823, 826);
+ else if (curChar == 64)
+ jjAddStates(827, 831);
+ if ((0x20000000200000L & l) != 0L)
+ jjAddStates(832, 834);
+ else if ((0x800000008L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 151;
+ else if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 141;
+ else if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 133;
+ else if ((0x4000000040L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 29;
+ else if (curChar == 64)
+ jjAddStates(835, 838);
+ break;
+ case 172:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ }
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(111, 112);
+ if ((0x400000004000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 171;
+ break;
+ case 170:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ }
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(111, 112);
+ if ((0x80000000800L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 169;
+ break;
+ case 174:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ }
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 212;
+ else if ((0x80000000800000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 200;
+ else if ((0x800000008000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 184;
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 173;
+ break;
+ case 75:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddTwoStates(77, 78);
+ }
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(79, 89);
+ break;
+ case 522:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(0, 3);
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(227, 228);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ }
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(239, 240);
+ break;
+ case 1:
+ if (curChar == 123)
+ jjstateSet[jjnewStateCnt++] = 2;
+ break;
+ case 4:
+ case 5:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(138, 140);
+ break;
+ case 6:
+ if (curChar == 125 && kind > 39)
+ kind = 39;
+ break;
+ case 7:
+ if (curChar == 92)
+ jjCheckNAddTwoStates(8, 9);
+ break;
+ case 8:
+ if ((0x7fffffffffffffffL & l) != 0L)
+ jjCheckNAddStates(138, 140);
+ break;
+ case 9:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(141, 145);
+ break;
+ case 11:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(146, 153);
+ break;
+ case 12:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(154, 157);
+ break;
+ case 13:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(158, 162);
+ break;
+ case 14:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(163, 168);
+ break;
+ case 15:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(169, 175);
+ break;
+ case 17:
+ if (curChar == 92)
+ jjCheckNAddTwoStates(8, 18);
+ break;
+ case 18:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(176, 180);
+ break;
+ case 19:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(181, 188);
+ break;
+ case 20:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(189, 192);
+ break;
+ case 21:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(193, 197);
+ break;
+ case 22:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(198, 203);
+ break;
+ case 23:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(204, 210);
+ break;
+ case 25:
+ if ((0x4000000040000L & l) != 0L && kind > 68)
+ kind = 68;
+ break;
+ case 26:
+ case 31:
+ if ((0x2000000020L & l) != 0L)
+ jjCheckNAdd(25);
+ break;
+ case 27:
+ if ((0x10000000100000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 26;
+ break;
+ case 28:
+ if ((0x100000001000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 27;
+ break;
+ case 30:
+ if ((0x4000000040L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 29;
+ break;
+ case 32:
+ if ((0x10000000100000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 31;
+ break;
+ case 33:
+ if ((0x100000001000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 32;
+ break;
+ case 34:
+ if ((0x20000000200L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 33;
+ break;
+ case 35:
+ if ((0x4000000040L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 34;
+ break;
+ case 37:
+ if ((0x8000000080000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 36;
+ break;
+ case 41:
+ case 46:
+ if ((0x7fffffffffffffffL & l) != 0L)
+ jjCheckNAddStates(130, 133);
+ break;
+ case 43:
+ if (curChar == 92)
+ jjAddStates(839, 842);
+ break;
+ case 45:
+ if (curChar == 92)
+ jjAddStates(843, 844);
+ break;
+ case 47:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(211, 216);
+ break;
+ case 49:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(217, 225);
+ break;
+ case 50:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(226, 230);
+ break;
+ case 51:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(231, 236);
+ break;
+ case 52:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(237, 243);
+ break;
+ case 53:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(244, 251);
+ break;
+ case 58:
+ case 63:
+ if ((0x7fffffffffffffffL & l) != 0L)
+ jjCheckNAddStates(126, 129);
+ break;
+ case 60:
+ if (curChar == 92)
+ jjAddStates(845, 848);
+ break;
+ case 62:
+ if (curChar == 92)
+ jjAddStates(849, 850);
+ break;
+ case 64:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(252, 257);
+ break;
+ case 66:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(258, 266);
+ break;
+ case 67:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(267, 271);
+ break;
+ case 68:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(272, 277);
+ break;
+ case 69:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(278, 284);
+ break;
+ case 70:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(285, 292);
+ break;
+ case 76:
+ case 77:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddTwoStates(77, 78);
+ break;
+ case 78:
+ if (curChar == 92)
+ jjCheckNAddTwoStates(79, 80);
+ break;
+ case 79:
+ if ((0x7fffffffffffffffL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddTwoStates(77, 78);
+ break;
+ case 80:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(293, 296);
+ break;
+ case 82:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(297, 303);
+ break;
+ case 83:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(304, 306);
+ break;
+ case 84:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(307, 310);
+ break;
+ case 85:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(311, 315);
+ break;
+ case 86:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(316, 321);
+ break;
+ case 88:
+ if (curChar == 92)
+ jjCheckNAddTwoStates(79, 89);
+ break;
+ case 89:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(322, 325);
+ break;
+ case 90:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(326, 332);
+ break;
+ case 91:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(333, 335);
+ break;
+ case 92:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(336, 339);
+ break;
+ case 93:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(340, 344);
+ break;
+ case 94:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddStates(345, 350);
+ break;
+ case 96:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddTwoStates(96, 97);
+ break;
+ case 97:
+ if (curChar == 92)
+ jjAddStates(851, 852);
+ break;
+ case 98:
+ if ((0x7fffffffffffffffL & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddTwoStates(96, 97);
+ break;
+ case 99:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(351, 354);
+ break;
+ case 101:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(355, 361);
+ break;
+ case 102:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(362, 364);
+ break;
+ case 103:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(365, 368);
+ break;
+ case 104:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(369, 373);
+ break;
+ case 105:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddStates(374, 379);
+ break;
+ case 106:
+ if (curChar == 64)
+ jjAddStates(835, 838);
+ break;
+ case 108:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 109:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 110:
+ if (curChar == 92)
+ jjCheckNAddTwoStates(111, 112);
+ break;
+ case 111:
+ if ((0x7fffffffffffffffL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 112:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(380, 383);
+ break;
+ case 114:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(384, 390);
+ break;
+ case 115:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(391, 393);
+ break;
+ case 116:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(394, 397);
+ break;
+ case 117:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(398, 402);
+ break;
+ case 118:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(403, 408);
+ break;
+ case 120:
+ if (curChar == 92)
+ jjCheckNAddTwoStates(111, 121);
+ break;
+ case 121:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(409, 412);
+ break;
+ case 122:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(413, 419);
+ break;
+ case 123:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(420, 422);
+ break;
+ case 124:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(423, 426);
+ break;
+ case 125:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(427, 431);
+ break;
+ case 126:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddStates(432, 437);
+ break;
+ case 127:
+ if ((0x2000000020L & l) != 0L)
+ jjAddStates(438, 439);
+ break;
+ case 130:
+ if ((0x40000000400000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 127;
+ break;
+ case 131:
+ if ((0x800000008000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 130;
+ break;
+ case 132:
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 131;
+ break;
+ case 133:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 132;
+ break;
+ case 134:
+ if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 133;
+ break;
+ case 135:
+ if ((0x1000000010L & l) != 0L)
+ jjAddStates(440, 441);
+ break;
+ case 138:
+ if ((0x400000004000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 135;
+ break;
+ case 139:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 138;
+ break;
+ case 140:
+ if ((0x1000000010000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 139;
+ break;
+ case 141:
+ if ((0x1000000010000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 140;
+ break;
+ case 142:
+ if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 141;
+ break;
+ case 143:
+ if ((0x8000000080000L & l) != 0L)
+ jjAddStates(442, 443);
+ break;
+ case 146:
+ if ((0x400000004000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 143;
+ break;
+ case 147:
+ if ((0x20000000200L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 146;
+ break;
+ case 148:
+ if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 147;
+ break;
+ case 149:
+ if ((0x10000000100000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 148;
+ break;
+ case 150:
+ if ((0x400000004000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 149;
+ break;
+ case 151:
+ if ((0x800000008000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 150;
+ break;
+ case 152:
+ if ((0x800000008L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 151;
+ break;
+ case 153:
+ if (curChar == 64)
+ jjAddStates(827, 831);
+ break;
+ case 154:
+ if ((0x8000000080000L & l) != 0L && kind > 102)
+ kind = 102;
+ break;
+ case 155:
+ case 163:
+ case 176:
+ case 187:
+ case 203:
+ if ((0x2000000020L & l) != 0L)
+ jjCheckNAdd(154);
+ break;
+ case 156:
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 155;
+ break;
+ case 157:
+ if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 156;
+ break;
+ case 158:
+ if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 157;
+ break;
+ case 159:
+ if ((0x4000000040L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 158;
+ break;
+ case 160:
+ if ((0x200000002000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 159;
+ break;
+ case 161:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 160;
+ break;
+ case 164:
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 163;
+ break;
+ case 165:
+ if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 164;
+ break;
+ case 166:
+ if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 165;
+ break;
+ case 167:
+ if ((0x4000000040L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 166;
+ break;
+ case 168:
+ if ((0x200000002000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 167;
+ break;
+ case 169:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 168;
+ break;
+ case 177:
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 176;
+ break;
+ case 178:
+ if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 177;
+ break;
+ case 179:
+ if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 178;
+ break;
+ case 180:
+ if ((0x4000000040L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 179;
+ break;
+ case 181:
+ if ((0x200000002000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 180;
+ break;
+ case 182:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 181;
+ break;
+ case 183:
+ if ((0x80000000800L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 182;
+ break;
+ case 185:
+ if ((0x800000008000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 184;
+ break;
+ case 188:
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 187;
+ break;
+ case 189:
+ if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 188;
+ break;
+ case 190:
+ if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 189;
+ break;
+ case 191:
+ if ((0x4000000040L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 190;
+ break;
+ case 192:
+ if ((0x200000002000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 191;
+ break;
+ case 193:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 192;
+ break;
+ case 194:
+ if ((0x80000000800L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 193;
+ break;
+ case 196:
+ if ((0x10000000100000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 195;
+ break;
+ case 197:
+ if ((0x20000000200L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 196;
+ break;
+ case 198:
+ if ((0x80000000800L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 197;
+ break;
+ case 199:
+ if ((0x400000004L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 198;
+ break;
+ case 200:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 199;
+ break;
+ case 201:
+ if ((0x80000000800000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 200;
+ break;
+ case 204:
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 203;
+ break;
+ case 205:
+ if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 204;
+ break;
+ case 206:
+ if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 205;
+ break;
+ case 207:
+ if ((0x4000000040L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 206;
+ break;
+ case 208:
+ if ((0x200000002000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 207;
+ break;
+ case 209:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 208;
+ break;
+ case 210:
+ if ((0x80000000800L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 209;
+ break;
+ case 212:
+ if ((0x8000000080000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 211;
+ break;
+ case 213:
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 212;
+ break;
+ case 217:
+ if (kind > 2)
+ kind = 2;
+ jjAddStates(9, 11);
+ break;
+ case 222:
+ if (kind > 3)
+ kind = 3;
+ break;
+ case 225:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ break;
+ case 226:
+ if (curChar == 92)
+ jjCheckNAddTwoStates(227, 228);
+ break;
+ case 227:
+ if ((0x7fffffffffffffffL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ break;
+ case 228:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(444, 447);
+ break;
+ case 230:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(448, 454);
+ break;
+ case 231:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(455, 457);
+ break;
+ case 232:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(458, 461);
+ break;
+ case 233:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(462, 466);
+ break;
+ case 234:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(467, 472);
+ break;
+ case 235:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(0, 3);
+ break;
+ case 238:
+ if (curChar == 92)
+ jjCheckNAddTwoStates(239, 240);
+ break;
+ case 239:
+ if ((0x7fffffffffffffffL & l) != 0L)
+ jjCheckNAddStates(0, 3);
+ break;
+ case 240:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(473, 477);
+ break;
+ case 242:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(478, 485);
+ break;
+ case 243:
+ case 457:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(486, 489);
+ break;
+ case 244:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(490, 494);
+ break;
+ case 245:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(495, 500);
+ break;
+ case 246:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(501, 507);
+ break;
+ case 249:
+ if ((0x10000000100000L & l) != 0L && kind > 70)
+ kind = 70;
+ break;
+ case 250:
+ if ((0x100000001000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 249;
+ break;
+ case 251:
+ if ((0x20000000200000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 250;
+ break;
+ case 252:
+ if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 251;
+ break;
+ case 253:
+ if ((0x4000000040L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 252;
+ break;
+ case 254:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 253;
+ break;
+ case 255:
+ if ((0x1000000010L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 254;
+ break;
+ case 257:
+ if ((0x10000000100000L & l) != 0L && kind > 104)
+ kind = 104;
+ break;
+ case 258:
+ if ((0x400000004000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 257;
+ break;
+ case 259:
+ if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 258;
+ break;
+ case 260:
+ if ((0x10000000100000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 259;
+ break;
+ case 261:
+ if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 260;
+ break;
+ case 262:
+ if ((0x800000008000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 261;
+ break;
+ case 263:
+ if ((0x1000000010000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 262;
+ break;
+ case 264:
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 263;
+ break;
+ case 265:
+ if ((0x20000000200L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 264;
+ break;
+ case 267:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ break;
+ case 268:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(0, 3);
+ break;
+ case 269:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(817, 822);
+ break;
+ case 275:
+ if ((0x10000000100000L & l) != 0L && kind > 78)
+ kind = 78;
+ break;
+ case 276:
+ if ((0x1000000010000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 275;
+ break;
+ case 278:
+ if ((0x200000002000L & l) != 0L && kind > 79)
+ kind = 79;
+ break;
+ case 279:
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 278;
+ break;
+ case 281:
+ if ((0x200000002000L & l) != 0L && kind > 80)
+ kind = 80;
+ break;
+ case 282:
+ if ((0x800000008L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 281;
+ break;
+ case 284:
+ if ((0x800000008L & l) != 0L && kind > 81)
+ kind = 81;
+ break;
+ case 285:
+ if ((0x1000000010000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 284;
+ break;
+ case 287:
+ if ((0x400000004000L & l) != 0L && kind > 82)
+ kind = 82;
+ break;
+ case 288:
+ if ((0x20000000200L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 287;
+ break;
+ case 290:
+ if ((0x100000001000000L & l) != 0L && kind > 83)
+ kind = 83;
+ break;
+ case 291:
+ if ((0x1000000010000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 290;
+ break;
+ case 293:
+ if ((0x200000002000L & l) != 0L && kind > 84)
+ kind = 84;
+ break;
+ case 294:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 293;
+ break;
+ case 296:
+ if ((0x200000002000L & l) != 0L && kind > 85)
+ kind = 85;
+ break;
+ case 297:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 296;
+ break;
+ case 298:
+ if ((0x100000001000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 297;
+ break;
+ case 300:
+ if ((0x200000002000L & l) != 0L && kind > 86)
+ kind = 86;
+ break;
+ case 301:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 300;
+ break;
+ case 302:
+ if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 301;
+ break;
+ case 304:
+ if ((0x100000001000000L & l) != 0L && kind > 87)
+ kind = 87;
+ break;
+ case 305:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 304;
+ break;
+ case 307:
+ if ((0x8000000080L & l) != 0L && kind > 88)
+ kind = 88;
+ break;
+ case 308:
+ if ((0x2000000020L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 307;
+ break;
+ case 309:
+ if ((0x1000000010L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 308;
+ break;
+ case 311:
+ if ((0x1000000010L & l) != 0L && kind > 89)
+ kind = 89;
+ break;
+ case 312:
+ if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 311;
+ break;
+ case 313:
+ if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 312;
+ break;
+ case 315:
+ if ((0x1000000010L & l) != 0L && kind > 90)
+ kind = 90;
+ break;
+ case 316:
+ if ((0x200000002L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 315;
+ break;
+ case 317:
+ if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 316;
+ break;
+ case 318:
+ if ((0x8000000080L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 317;
+ break;
+ case 320:
+ if ((0x8000000080000L & l) != 0L && kind > 91)
+ kind = 91;
+ break;
+ case 321:
+ if ((0x200000002000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 320;
+ break;
+ case 323:
+ if ((0x8000000080000L & l) != 0L && kind > 92)
+ kind = 92;
+ break;
+ case 325:
+ if ((0x400000004000000L & l) != 0L && kind > 93)
+ kind = 93;
+ break;
+ case 326:
+ if ((0x10000000100L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 325;
+ break;
+ case 328:
+ if ((0x400000004000000L & l) != 0L && kind > 94)
+ kind = 94;
+ break;
+ case 329:
+ if ((0x10000000100L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 328;
+ break;
+ case 330:
+ if ((0x80000000800L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 329;
+ break;
+ case 333:
+ case 334:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddTwoStates(334, 335);
+ break;
+ case 335:
+ if (curChar == 92)
+ jjCheckNAddTwoStates(336, 337);
+ break;
+ case 336:
+ if ((0x7fffffffffffffffL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddTwoStates(334, 335);
+ break;
+ case 337:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(508, 511);
+ break;
+ case 339:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(512, 518);
+ break;
+ case 340:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(519, 521);
+ break;
+ case 341:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(522, 525);
+ break;
+ case 342:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(526, 530);
+ break;
+ case 343:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(531, 536);
+ break;
+ case 345:
+ if (curChar == 92)
+ jjCheckNAddTwoStates(336, 346);
+ break;
+ case 346:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(537, 540);
+ break;
+ case 347:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(541, 547);
+ break;
+ case 348:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(548, 550);
+ break;
+ case 349:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(551, 554);
+ break;
+ case 350:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(555, 559);
+ break;
+ case 351:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddStates(560, 565);
+ break;
+ case 352:
+ if ((0x20000000200000L & l) != 0L)
+ jjAddStates(832, 834);
+ break;
+ case 354:
+ case 358:
+ if ((0x7fffffffffffffffL & l) != 0L)
+ jjCheckNAddStates(572, 575);
+ break;
+ case 357:
+ if (curChar == 92)
+ jjAddStates(853, 854);
+ break;
+ case 359:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(576, 580);
+ break;
+ case 361:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(581, 588);
+ break;
+ case 362:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(589, 592);
+ break;
+ case 363:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(593, 597);
+ break;
+ case 364:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(598, 603);
+ break;
+ case 365:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(604, 610);
+ break;
+ case 367:
+ case 372:
+ if ((0x7fffffffffffffffL & l) != 0L)
+ jjCheckNAddStates(611, 614);
+ break;
+ case 369:
+ if (curChar == 92)
+ jjAddStates(855, 858);
+ break;
+ case 371:
+ if (curChar == 92)
+ jjAddStates(859, 860);
+ break;
+ case 373:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(615, 620);
+ break;
+ case 375:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(621, 629);
+ break;
+ case 376:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(630, 634);
+ break;
+ case 377:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(635, 640);
+ break;
+ case 378:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(641, 647);
+ break;
+ case 379:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(648, 655);
+ break;
+ case 384:
+ case 389:
+ if ((0x7fffffffffffffffL & l) != 0L)
+ jjCheckNAddStates(656, 659);
+ break;
+ case 386:
+ if (curChar == 92)
+ jjAddStates(861, 864);
+ break;
+ case 388:
+ if (curChar == 92)
+ jjAddStates(865, 866);
+ break;
+ case 390:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(660, 665);
+ break;
+ case 392:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(666, 674);
+ break;
+ case 393:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(675, 679);
+ break;
+ case 394:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(680, 685);
+ break;
+ case 395:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(686, 692);
+ break;
+ case 396:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(693, 700);
+ break;
+ case 401:
+ if ((0x100000001000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 353;
+ break;
+ case 402:
+ if ((0x4000000040000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 401;
+ break;
+ case 410:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjAddStates(717, 722);
+ break;
+ case 411:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 412;
+ break;
+ case 412:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 413;
+ break;
+ case 413:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAdd(414);
+ break;
+ case 414:
+ if ((0x7e0000007eL & l) != 0L && kind > 114)
+ kind = 114;
+ break;
+ case 415:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 416;
+ break;
+ case 416:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 417;
+ break;
+ case 417:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 418;
+ break;
+ case 418:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjstateSet[jjnewStateCnt++] = 406;
+ break;
+ case 419:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 420;
+ break;
+ case 420:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 421;
+ break;
+ case 421:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjstateSet[jjnewStateCnt++] = 422;
+ break;
+ case 423:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 424;
+ break;
+ case 424:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjstateSet[jjnewStateCnt++] = 425;
+ break;
+ case 427:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjstateSet[jjnewStateCnt++] = 428;
+ break;
+ case 436:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddTwoStates(437, 443);
+ break;
+ case 438:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjstateSet[jjnewStateCnt++] = 439;
+ break;
+ case 439:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddStates(733, 736);
+ break;
+ case 440:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAdd(414);
+ break;
+ case 441:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddTwoStates(414, 440);
+ break;
+ case 442:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddStates(737, 739);
+ break;
+ case 443:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(740, 744);
+ break;
+ case 444:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAdd(437);
+ break;
+ case 445:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddTwoStates(444, 437);
+ break;
+ case 446:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(745, 747);
+ break;
+ case 447:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(748, 751);
+ break;
+ case 448:
+ if (curChar == 92)
+ jjCheckNAddStates(823, 826);
+ break;
+ case 449:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(752, 755);
+ break;
+ case 450:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(756, 762);
+ break;
+ case 451:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(763, 765);
+ break;
+ case 452:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(766, 769);
+ break;
+ case 453:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(770, 774);
+ break;
+ case 454:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddStates(775, 780);
+ break;
+ case 455:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(781, 785);
+ break;
+ case 456:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(786, 793);
+ break;
+ case 458:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(794, 798);
+ break;
+ case 459:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(799, 804);
+ break;
+ case 460:
+ if ((0x7e0000007eL & l) != 0L)
+ jjCheckNAddStates(805, 811);
+ break;
+ default : break;
}
- break;
- case 73:
- case 105:
- return jjMoveStringLiteralDfa5_0(active0, 0x20000000000000L,
- active1, 0x400000000L);
- case 76:
- case 108:
- return jjMoveStringLiteralDfa5_0(active0, 0x2040000000000000L,
- active1, 0L);
- case 78:
- case 110:
- if ((active0 & 0x400000000000000L) != 0L) {
- return jjStartNfaWithStates_0(4, 58, 525);
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 162:
+ case 111:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 29:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ {
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ }
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjCheckNAddStates(0, 3);
+ break;
+ case 171:
+ case 109:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 525:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 173:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 24:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 40)
+ kind = 40;
+ jjCheckNAddStates(817, 822);
+ break;
+ case 172:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 170:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 103)
+ kind = 103;
+ jjCheckNAddTwoStates(109, 110);
+ break;
+ case 75:
+ case 77:
+ case 79:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 76)
+ kind = 76;
+ jjCheckNAddTwoStates(77, 78);
+ break;
+ case 522:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ {
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ }
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjCheckNAddStates(0, 3);
+ break;
+ case 5:
+ case 8:
+ case 16:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjCheckNAddStates(138, 140);
+ break;
+ case 41:
+ case 46:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjCheckNAddStates(130, 133);
+ break;
+ case 58:
+ case 63:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjCheckNAddStates(126, 129);
+ break;
+ case 96:
+ case 98:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 96)
+ kind = 96;
+ jjCheckNAddTwoStates(96, 97);
+ break;
+ case 217:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjAddStates(9, 11);
+ break;
+ case 222:
+ if ((jjbitVec0[i2] & l2) != 0L && kind > 3)
+ kind = 3;
+ break;
+ case 225:
+ case 227:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 72)
+ kind = 72;
+ jjCheckNAddTwoStates(225, 226);
+ break;
+ case 235:
+ case 239:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjCheckNAddStates(0, 3);
+ break;
+ case 334:
+ case 336:
+ case 344:
+ if ((jjbitVec0[i2] & l2) == 0L)
+ break;
+ if (kind > 95)
+ kind = 95;
+ jjCheckNAddTwoStates(334, 335);
+ break;
+ case 354:
+ case 358:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjCheckNAddStates(572, 575);
+ break;
+ case 367:
+ case 372:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjCheckNAddStates(611, 614);
+ break;
+ case 384:
+ case 389:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjCheckNAddStates(656, 659);
+ break;
+ default : break;
}
- break;
- case 79:
- case 111:
- return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x200000000L);
- case 80:
- case 112:
- return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x4L);
- case 82:
- case 114:
- return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000000L);
- case 84:
- case 116:
- return jjMoveStringLiteralDfa5_0(active0, 0L, active1,
- 0x2000000008L);
- case 85:
- case 117:
- return jjMoveStringLiteralDfa5_0(active0, 0x304000000000000L,
- active1, 0L);
- case 90:
- case 122:
- return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2L);
- default:
- break;
- }
- return jjStartNfa_0(3, active0, active1);
- }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 522 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private int jjMoveStringLiteralDfa0_2()
+{
+ switch(curChar)
+ {
+ case 42:
+ return jjMoveStringLiteralDfa1_2(0x40L);
+ default :
+ return 1;
+ }
+}
+private int jjMoveStringLiteralDfa1_2(long active0)
+{
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ return 1;
+ }
+ switch(curChar)
+ {
+ case 47:
+ if ((active0 & 0x40L) != 0L)
+ return jjStopAtPos(1, 6);
+ break;
+ default :
+ return 2;
+ }
+ return 2;
+}
+private int jjMoveStringLiteralDfa0_1()
+{
+ switch(curChar)
+ {
+ case 42:
+ return jjMoveStringLiteralDfa1_1(0x20L);
+ default :
+ return 1;
+ }
+}
+private int jjMoveStringLiteralDfa1_1(long active0)
+{
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ return 1;
+ }
+ switch(curChar)
+ {
+ case 47:
+ if ((active0 & 0x20L) != 0L)
+ return jjStopAtPos(1, 5);
+ break;
+ default :
+ return 2;
+ }
+ return 2;
+}
+static final int[] jjnextStates = {
+ 235, 236, 237, 238, 331, 332, 333, 344, 345, 217, 218, 220, 462, 463, 464, 465,
+ 466, 467, 273, 468, 469, 470, 276, 471, 472, 473, 279, 474, 475, 476, 282, 477,
+ 478, 479, 285, 480, 481, 482, 288, 483, 484, 485, 291, 486, 487, 488, 294, 489,
+ 490, 491, 298, 492, 493, 494, 302, 495, 496, 497, 305, 498, 499, 500, 309, 501,
+ 502, 503, 313, 504, 505, 506, 318, 507, 508, 509, 321, 510, 511, 512, 323, 513,
+ 514, 515, 326, 516, 517, 518, 330, 519, 520, 521, 332, 333, 344, 345, 271, 272,
+ 274, 277, 280, 283, 286, 289, 292, 295, 299, 303, 306, 310, 314, 319, 322, 324,
+ 327, 331, 267, 268, 248, 255, 256, 265, 216, 223, 75, 76, 87, 88, 58, 59,
+ 60, 62, 41, 42, 43, 45, 3, 4, 16, 17, 5, 6, 7, 5, 10, 6,
+ 7, 11, 5, 12, 10, 6, 7, 13, 14, 15, 5, 10, 6, 7, 5, 12,
+ 10, 6, 7, 5, 12, 10, 6, 7, 13, 5, 12, 10, 6, 7, 13, 14,
+ 10, 5, 6, 7, 19, 20, 10, 5, 6, 7, 21, 22, 23, 10, 5, 6,
+ 7, 20, 10, 5, 6, 7, 20, 10, 5, 6, 7, 21, 20, 10, 5, 6,
+ 7, 21, 22, 41, 48, 42, 43, 45, 49, 41, 50, 48, 42, 43, 45, 51,
+ 52, 53, 41, 48, 42, 43, 45, 41, 50, 48, 42, 43, 45, 41, 50, 48,
+ 42, 43, 45, 51, 41, 50, 48, 42, 43, 45, 51, 52, 58, 65, 59, 60,
+ 62, 66, 58, 67, 65, 59, 60, 62, 68, 69, 70, 58, 65, 59, 60, 62,
+ 58, 67, 65, 59, 60, 62, 58, 67, 65, 59, 60, 62, 68, 58, 67, 65,
+ 59, 60, 62, 68, 69, 77, 81, 78, 82, 77, 83, 81, 78, 84, 85, 86,
+ 77, 81, 78, 77, 83, 81, 78, 77, 83, 81, 78, 84, 77, 83, 81, 78,
+ 84, 85, 81, 77, 78, 90, 91, 81, 77, 78, 92, 93, 94, 81, 77, 78,
+ 91, 81, 77, 78, 91, 81, 77, 78, 92, 91, 81, 77, 78, 92, 93, 96,
+ 100, 97, 101, 96, 102, 100, 97, 103, 104, 105, 96, 100, 97, 96, 102, 100,
+ 97, 96, 102, 100, 97, 103, 96, 102, 100, 97, 103, 104, 109, 113, 110, 114,
+ 109, 115, 113, 110, 116, 117, 118, 109, 113, 110, 109, 115, 113, 110, 109, 115,
+ 113, 110, 116, 109, 115, 113, 110, 116, 117, 113, 109, 110, 122, 123, 113, 109,
+ 110, 124, 125, 126, 113, 109, 110, 123, 113, 109, 110, 123, 113, 109, 110, 124,
+ 123, 113, 109, 110, 124, 125, 128, 129, 136, 137, 144, 145, 225, 229, 226, 230,
+ 225, 231, 229, 226, 232, 233, 234, 225, 229, 226, 225, 231, 229, 226, 225, 231,
+ 229, 226, 232, 225, 231, 229, 226, 232, 233, 235, 237, 238, 241, 242, 235, 243,
+ 237, 238, 241, 244, 245, 246, 235, 237, 238, 241, 235, 243, 237, 238, 241, 235,
+ 243, 237, 238, 241, 244, 235, 243, 237, 238, 241, 244, 245, 334, 338, 335, 339,
+ 334, 340, 338, 335, 341, 342, 343, 334, 338, 335, 334, 340, 338, 335, 334, 340,
+ 338, 335, 341, 334, 340, 338, 335, 341, 342, 338, 334, 335, 347, 348, 338, 334,
+ 335, 349, 350, 351, 338, 334, 335, 348, 338, 334, 335, 348, 338, 334, 335, 349,
+ 348, 338, 334, 335, 349, 350, 354, 366, 383, 356, 357, 400, 354, 355, 356, 357,
+ 354, 356, 357, 360, 361, 354, 362, 356, 357, 360, 363, 364, 365, 354, 356, 357,
+ 360, 354, 362, 356, 357, 360, 354, 362, 356, 357, 360, 363, 354, 362, 356, 357,
+ 360, 363, 364, 367, 368, 369, 371, 367, 374, 368, 369, 371, 375, 367, 376, 374,
+ 368, 369, 371, 377, 378, 379, 367, 374, 368, 369, 371, 367, 376, 374, 368, 369,
+ 371, 367, 376, 374, 368, 369, 371, 377, 367, 376, 374, 368, 369, 371, 377, 378,
+ 384, 385, 386, 388, 384, 391, 385, 386, 388, 392, 384, 393, 391, 385, 386, 388,
+ 394, 395, 396, 384, 391, 385, 386, 388, 384, 393, 391, 385, 386, 388, 384, 393,
+ 391, 385, 386, 388, 394, 384, 393, 391, 385, 386, 388, 394, 395, 354, 366, 383,
+ 355, 356, 357, 400, 404, 410, 406, 407, 408, 409, 406, 407, 408, 411, 415, 419,
+ 423, 427, 431, 406, 429, 430, 406, 432, 433, 434, 406, 432, 433, 414, 440, 441,
+ 442, 414, 440, 441, 444, 437, 445, 446, 447, 444, 437, 445, 444, 437, 445, 446,
+ 229, 225, 226, 450, 451, 229, 225, 226, 452, 453, 454, 229, 225, 226, 451, 229,
+ 225, 226, 451, 229, 225, 226, 452, 451, 229, 225, 226, 452, 453, 235, 237, 238,
+ 241, 456, 457, 235, 237, 238, 241, 458, 459, 460, 457, 235, 237, 238, 241, 457,
+ 235, 237, 238, 241, 458, 457, 235, 237, 238, 241, 458, 459, 519, 332, 333, 344,
+ 345, 225, 235, 236, 237, 238, 226, 227, 449, 239, 455, 162, 175, 186, 202, 214,
+ 402, 403, 435, 107, 108, 119, 120, 44, 54, 56, 55, 46, 47, 61, 71, 73,
+ 72, 63, 64, 98, 99, 358, 359, 370, 380, 382, 381, 372, 373, 387, 397, 399,
+ 398, 389, 390,
+};
- private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1,
- long active1) {
- if (((active0 &= old0) | (active1 &= old1)) == 0L) {
- return jjStartNfa_0(3, old0, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(4, active0, active1);
- return 5;
- }
- switch (curChar) {
- case 45:
- return jjMoveStringLiteralDfa6_0(active0, 0L, active1,
- 0x2000000002L);
- case 65:
- case 97:
- if ((active1 & 0x400000000L) != 0L) {
- return jjStartNfaWithStates_0(5, 98, 525);
- }
- break;
- case 69:
- case 101:
- if ((active0 & 0x2000000000000000L) != 0L) {
- return jjStartNfaWithStates_0(5, 61, 525);
- }
- return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x8L);
- case 71:
- case 103:
- if ((active0 & 0x200000000000000L) != 0L) {
- return jjStartNfaWithStates_0(5, 57, 525);
- }
- return jjMoveStringLiteralDfa6_0(active0, 0x4000000000000L,
- active1, 0L);
- case 78:
- case 110:
- if ((active0 & 0x20000000000000L) != 0L) {
- return jjStartNfaWithStates_0(5, 53, 525);
- }
- return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x1L);
- case 79:
- case 111:
- return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4L);
- case 82:
- case 114:
- return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L,
- active1, 0x200000000L);
- case 83:
- case 115:
- return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800000000L);
- case 84:
- case 116:
- return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L,
- active1, 0L);
- case 85:
- case 117:
- return jjMoveStringLiteralDfa6_0(active0, 0x40000000000000L,
- active1, 0L);
- default:
- break;
- }
- return jjStartNfa_0(4, active0, active1);
- }
+/** Token literal values. */
+public static final String[] jjstrLiteralImages = {
+"", null, null, null, null, null, null, null, "\74\41\55\55", "\55\55\76",
+"\173", "\175", "\174\75", "\136\75", "\44\75", "\52\75", "\176\75", "\75", "\53",
+"\55", "\54", "\73", "\76", "\176", "\74", "\57", "\133", "\135", "\52", "\45",
+"\46", "\56", "\50", "\51", "\75\75", "\174\174", "\46\46", "\41\75", "\72", null,
+null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+null, null, null, null, null, null, null, null, null, null, };
- private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1,
- long active1) {
- if (((active0 &= old0) | (active1 &= old1)) == 0L) {
- return jjStartNfa_0(4, old0, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(5, active0, active1);
- return 6;
- }
- switch (curChar) {
- case 68:
- case 100:
- if ((active1 & 0x1L) != 0L) {
- return jjStartNfaWithStates_0(6, 64, 525);
- }
- return jjMoveStringLiteralDfa7_0(active0, 0x40000000000000L,
- active1, 0x2L);
- case 69:
- case 101:
- return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x800000000L);
- case 70:
- case 102:
- return jjMoveStringLiteralDfa7_0(active0, 0L, active1,
- 0x2000000000L);
- case 72:
- case 104:
- if ((active0 & 0x4000000000000L) != 0L) {
- return jjStartNfaWithStates_0(6, 50, 522);
- }
- break;
- case 73:
- case 105:
- return jjMoveStringLiteralDfa7_0(active0, 0x80000000000000L,
- active1, 0L);
- case 78:
- case 110:
- if ((active0 & 0x100000000000000L) != 0L) {
- return jjStartNfaWithStates_0(6, 56, 525);
- }
- return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x8L);
- case 82:
- case 114:
- return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4L);
- case 84:
- case 116:
- if ((active1 & 0x200000000L) != 0L) {
- return jjStartNfaWithStates_0(6, 97, 525);
- }
- break;
- default:
- break;
- }
- return jjStartNfa_0(5, active0, active1);
- }
+/** Lexer state names. */
+public static final String[] lexStateNames = {
+ "DEFAULT",
+ "IN_FORMAL_COMMENT",
+ "IN_MULTI_LINE_COMMENT",
+};
- private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1,
- long active1) {
- if (((active0 &= old0) | (active1 &= old1)) == 0L) {
- return jjStartNfa_0(5, old0, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(6, active0, active1);
- return 7;
- }
- switch (curChar) {
- case 65:
- case 97:
- return jjMoveStringLiteralDfa8_0(active0, 0L, active1,
- 0x2000000000L);
- case 69:
- case 101:
- if ((active0 & 0x40000000000000L) != 0L) {
- return jjStartNfaWithStates_0(7, 54, 525);
- }
- break;
- case 79:
- case 111:
- return jjMoveStringLiteralDfa8_0(active0, 0x80000000000000L,
- active1, 0x2L);
- case 84:
- case 116:
- if ((active1 & 0x8L) != 0L) {
- return jjStartNfaWithStates_0(7, 67, 525);
- } else if ((active1 & 0x800000000L) != 0L) {
- return jjStartNfaWithStates_0(7, 99, 525);
- }
- return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x4L);
- default:
- break;
- }
- return jjStartNfa_0(6, active0, active1);
- }
+/** Lex State array. */
+public static final int[] jjnewLexState = {
+ -1, -1, -1, 1, 2, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+};
+static final long[] jjtoToken = {
+ 0xfffe01ffffffff03L, 0xfc01fffffffbffL,
+};
+static final long[] jjtoSkip = {
+ 0x64L, 0x0L,
+};
+static final long[] jjtoSpecial = {
+ 0x24L, 0x0L,
+};
+static final long[] jjtoMore = {
+ 0x98L, 0x0L,
+};
+protected CharStream input_stream;
+private final int[] jjrounds = new int[522];
+private final int[] jjstateSet = new int[1044];
+private final StringBuilder jjimage = new StringBuilder();
+private StringBuilder image = jjimage;
+private int jjimageLen;
+private int lengthOfMatch;
+protected char curChar;
+/** Constructor. */
+public ParserTokenManager(CharStream stream){
+ input_stream = stream;
+}
- private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1,
- long active1) {
- if (((active0 &= old0) | (active1 &= old1)) == 0L) {
- return jjStartNfa_0(6, old0, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(7, active0, active1);
- return 8;
- }
- switch (curChar) {
- case 67:
- case 99:
- return jjMoveStringLiteralDfa9_0(active0, 0L, active1,
- 0x2000000002L);
- case 78:
- case 110:
- if ((active0 & 0x80000000000000L) != 0L) {
- return jjStartNfaWithStates_0(8, 55, 525);
- }
- break;
- case 83:
- case 115:
- if ((active1 & 0x4L) != 0L) {
- return jjStartNfaWithStates_0(8, 66, 525);
- }
- break;
- default:
- break;
- }
- return jjStartNfa_0(7, active0, active1);
- }
+/** Constructor. */
+public ParserTokenManager(CharStream stream, int lexState){
+ this(stream);
+ SwitchTo(lexState);
+}
- private int jjMoveStringLiteralDfa9_0(long old0, long active0, long old1,
- long active1) {
- if (((active0 &= old0) | (active1 &= old1)) == 0L) {
- return jjStartNfa_0(7, old0, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(8, 0L, active1);
- return 9;
- }
- switch (curChar) {
- case 69:
- case 101:
- if ((active1 & 0x2000000000L) != 0L) {
- return jjStartNfaWithStates_0(9, 101, 525);
- }
- break;
- case 85:
- case 117:
- return jjMoveStringLiteralDfa10_0(active1, 0x2L);
- default:
- break;
- }
- return jjStartNfa_0(8, 0L, active1);
- }
+/** Reinitialise parser. */
+public void ReInit(CharStream stream)
+{
+ jjmatchedPos = jjnewStateCnt = 0;
+ curLexState = defaultLexState;
+ input_stream = stream;
+ ReInitRounds();
+}
+private void ReInitRounds()
+{
+ int i;
+ jjround = 0x80000001;
+ for (i = 522; i-- > 0;)
+ jjrounds[i] = 0x80000000;
+}
- private int jjMoveStringLiteralDfa10_0(long old1, long active1) {
- if (((active1 &= old1)) == 0L) {
- return jjStartNfa_0(8, 0L, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(9, 0L, active1);
- return 10;
- }
- switch (curChar) {
- case 77:
- case 109:
- return jjMoveStringLiteralDfa11_0(active1, 0x2L);
- default:
- break;
- }
- return jjStartNfa_0(9, 0L, active1);
- }
+/** Reinitialise parser. */
+public void ReInit(CharStream stream, int lexState)
+{
+ ReInit(stream);
+ SwitchTo(lexState);
+}
- private int jjMoveStringLiteralDfa11_0(long old1, long active1) {
- if (((active1 &= old1)) == 0L) {
- return jjStartNfa_0(9, 0L, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(10, 0L, active1);
- return 11;
- }
- switch (curChar) {
- case 69:
- case 101:
- return jjMoveStringLiteralDfa12_0(active1, 0x2L);
- default:
- break;
- }
- return jjStartNfa_0(10, 0L, active1);
- }
+/** Switch to specified lex state. */
+public void SwitchTo(int lexState)
+{
+ if (lexState >= 3 || lexState < 0)
+ throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+ else
+ curLexState = lexState;
+}
- private int jjMoveStringLiteralDfa12_0(long old1, long active1) {
- if (((active1 &= old1)) == 0L) {
- return jjStartNfa_0(10, 0L, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(11, 0L, active1);
- return 12;
- }
- switch (curChar) {
- case 78:
- case 110:
- return jjMoveStringLiteralDfa13_0(active1, 0x2L);
- default:
- break;
- }
- return jjStartNfa_0(11, 0L, active1);
- }
+protected Token jjFillToken()
+{
+ final Token t;
+ final String curTokenImage;
+ final int beginLine;
+ final int endLine;
+ final int beginColumn;
+ final int endColumn;
+ String im = jjstrLiteralImages[jjmatchedKind];
+ curTokenImage = (im == null) ? input_stream.GetImage() : im;
+ beginLine = input_stream.getBeginLine();
+ beginColumn = input_stream.getBeginColumn();
+ endLine = input_stream.getEndLine();
+ endColumn = input_stream.getEndColumn();
+ t = Token.newToken(jjmatchedKind, curTokenImage);
- private int jjMoveStringLiteralDfa13_0(long old1, long active1) {
- if (((active1 &= old1)) == 0L) {
- return jjStartNfa_0(11, 0L, old1);
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- jjStopStringLiteralDfa_0(12, 0L, active1);
- return 13;
- }
- switch (curChar) {
- case 84:
- case 116:
- if ((active1 & 0x2L) != 0L) {
- return jjStartNfaWithStates_0(13, 65, 525);
- }
- break;
- default:
- break;
- }
- return jjStartNfa_0(12, 0L, active1);
- }
+ t.beginLine = beginLine;
+ t.endLine = endLine;
+ t.beginColumn = beginColumn;
+ t.endColumn = endColumn;
- private int jjStartNfaWithStates_0(int pos, int kind, int state) {
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- return pos + 1;
- }
- return jjMoveNfa_0(state, pos + 1);
- }
+ return t;
+}
- static final long[] jjbitVec0 = { 0x0L, 0x0L, 0xffffffffffffffffL,
- 0xffffffffffffffffL };
+int curLexState = 0;
+int defaultLexState = 0;
+int jjnewStateCnt;
+int jjround;
+int jjmatchedPos;
+int jjmatchedKind;
- private int jjMoveNfa_0(int startState, int curPos) {
- int startsAt = 0;
- jjnewStateCnt = 522;
- int i = 1;
- jjstateSet[0] = startState;
- int kind = 0x7fffffff;
- for (;;) {
- if (++jjround == 0x7fffffff) {
- ReInitRounds();
- }
- if (curChar < 64) {
- long l = 1L << curChar;
- do {
- switch (jjstateSet[--i]) {
- case 524:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddTwoStates(256, 265);
- }
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddTwoStates(248, 255);
- }
- break;
- case 162:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 108;
- }
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 213;
- }
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 201;
- }
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 185;
- }
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 174;
- }
- break;
- case 29:
- if ((0x3ff200000000000L & l) != 0L) {
- jjCheckNAddStates(0, 3);
- } else if ((0x100003600L & l) != 0L) {
- jjCheckNAddTwoStates(236, 237);
- } else if (curChar == 40) {
- if (kind > 118) {
- kind = 118;
- }
- }
- if ((0x3ff200000000000L & l) != 0L) {
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- }
- break;
- case 171:
- if ((0x3ff200000000000L & l) != 0L) {
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- }
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 170;
- }
- break;
- case 523:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(4, 8);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(327, 330);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(324, 326);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(322, 323);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(319, 321);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(314, 318);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(310, 313);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(306, 309);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(303, 305);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(299, 302);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(295, 298);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(292, 294);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(289, 291);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(286, 288);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(283, 285);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(280, 282);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(277, 279);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(274, 276);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(272, 273);
- }
- if ((0x3ff000000000000L & l) != 0L) {
- if (kind > 73) {
- kind = 73;
- }
- jjCheckNAdd(271);
- }
- break;
- case 525:
- case 109:
- if ((0x3ff200000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 216:
- if (curChar == 42) {
- jjstateSet[jjnewStateCnt++] = 221;
- } else if (curChar == 47) {
- if (kind > 2) {
- kind = 2;
- }
- jjCheckNAddStates(9, 11);
- }
- break;
- case 173:
- if ((0x3ff200000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 24:
- if ((0x3ff000000000000L & l) != 0L) {
- if (kind > 73) {
- kind = 73;
- }
- jjCheckNAddStates(12, 93);
- } else if ((0x100003600L & l) != 0L) {
- if (kind > 1) {
- kind = 1;
- }
- jjCheckNAdd(0);
- } else if (curChar == 46) {
- jjCheckNAddStates(94, 113);
- } else if (curChar == 45) {
- jjAddStates(114, 115);
- } else if (curChar == 33) {
- jjCheckNAddStates(116, 119);
- } else if (curChar == 47) {
- jjAddStates(120, 121);
- } else if (curChar == 35) {
- jjCheckNAddTwoStates(96, 97);
- } else if (curChar == 36) {
- jjCheckNAddStates(122, 125);
- } else if (curChar == 39) {
- jjCheckNAddStates(126, 129);
- } else if (curChar == 34) {
- jjCheckNAddStates(130, 133);
- }
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 38;
- } else if (curChar == 35) {
- jjstateSet[jjnewStateCnt++] = 1;
- }
- break;
- case 172:
- if ((0x3ff200000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 170:
- if ((0x3ff200000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 75:
- if (curChar == 45) {
- jjCheckNAdd(76);
- }
- break;
- case 522:
- if ((0x3ff200000000000L & l) != 0L) {
- jjCheckNAddStates(0, 3);
- } else if ((0x100003600L & l) != 0L) {
- jjCheckNAddTwoStates(236, 237);
- } else if (curChar == 40) {
- if (kind > 118) {
- kind = 118;
- }
- }
- if ((0x3ff200000000000L & l) != 0L) {
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- }
- break;
- case 0:
- if ((0x100003600L & l) == 0L) {
- break;
- }
- if (kind > 1) {
- kind = 1;
- }
- jjCheckNAdd(0);
- break;
- case 2:
- if (curChar == 36) {
- jjCheckNAddStates(134, 137);
- }
- break;
- case 3:
- if (curChar == 45) {
- jjCheckNAdd(4);
- }
- break;
- case 5:
- if ((0x3ff200000000000L & l) != 0L) {
- jjCheckNAddStates(138, 140);
- }
- break;
- case 8:
- if ((0xffffffff00000000L & l) != 0L) {
- jjCheckNAddStates(138, 140);
- }
- break;
- case 9:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(141, 145);
- }
- break;
- case 10:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddStates(138, 140);
- }
- break;
- case 11:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(146, 153);
- }
- break;
- case 12:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(154, 157);
- }
- break;
- case 13:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(158, 162);
- }
- break;
- case 14:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(163, 168);
- }
- break;
- case 15:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(169, 175);
- }
- break;
- case 18:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(176, 180);
- }
- break;
- case 19:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(181, 188);
- }
- break;
- case 20:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(189, 192);
- }
- break;
- case 21:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(193, 197);
- }
- break;
- case 22:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(198, 203);
- }
- break;
- case 23:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(204, 210);
- }
- break;
- case 36:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 35;
- }
- break;
- case 39:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 38;
- }
- break;
- case 40:
- if (curChar == 34) {
- jjCheckNAddStates(130, 133);
- }
- break;
- case 41:
- if ((0xfffffffb00000200L & l) != 0L) {
- jjCheckNAddStates(130, 133);
- }
- break;
- case 42:
- if (curChar == 34 && kind > 71) {
- kind = 71;
- }
- break;
- case 44:
- if (curChar == 12) {
- jjCheckNAddStates(130, 133);
- }
- break;
- case 46:
- if ((0xffffffff00000000L & l) != 0L) {
- jjCheckNAddStates(130, 133);
- }
- break;
- case 47:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(211, 216);
- }
- break;
- case 48:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddStates(130, 133);
- }
- break;
- case 49:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(217, 225);
- }
- break;
- case 50:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(226, 230);
- }
- break;
- case 51:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(231, 236);
- }
- break;
- case 52:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(237, 243);
- }
- break;
- case 53:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(244, 251);
- }
- break;
- case 54:
- if (curChar == 13) {
- jjCheckNAddStates(130, 133);
- }
- break;
- case 55:
- if (curChar == 10) {
- jjCheckNAddStates(130, 133);
- }
- break;
- case 56:
- if (curChar == 13) {
- jjstateSet[jjnewStateCnt++] = 55;
- }
- break;
- case 57:
- if (curChar == 39) {
- jjCheckNAddStates(126, 129);
- }
- break;
- case 58:
- if ((0xffffff7f00000200L & l) != 0L) {
- jjCheckNAddStates(126, 129);
- }
- break;
- case 59:
- if (curChar == 39 && kind > 71) {
- kind = 71;
- }
- break;
- case 61:
- if (curChar == 12) {
- jjCheckNAddStates(126, 129);
- }
- break;
- case 63:
- if ((0xffffffff00000000L & l) != 0L) {
- jjCheckNAddStates(126, 129);
- }
- break;
- case 64:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(252, 257);
- }
- break;
- case 65:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddStates(126, 129);
- }
- break;
- case 66:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(258, 266);
- }
- break;
- case 67:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(267, 271);
- }
- break;
- case 68:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(272, 277);
- }
- break;
- case 69:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(278, 284);
- }
- break;
- case 70:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(285, 292);
- }
- break;
- case 71:
- if (curChar == 13) {
- jjCheckNAddStates(126, 129);
- }
- break;
- case 72:
- if (curChar == 10) {
- jjCheckNAddStates(126, 129);
- }
- break;
- case 73:
- if (curChar == 13) {
- jjstateSet[jjnewStateCnt++] = 72;
- }
- break;
- case 74:
- if (curChar == 36) {
- jjCheckNAddStates(122, 125);
- }
- break;
- case 77:
- if ((0x3ff200000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddTwoStates(77, 78);
- break;
- case 79:
- if ((0xffffffff00000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddTwoStates(77, 78);
- break;
- case 80:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(293, 296);
- break;
- case 81:
- if ((0x100003600L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddTwoStates(77, 78);
- break;
- case 82:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(297, 303);
- break;
- case 83:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(304, 306);
- break;
- case 84:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(307, 310);
- break;
- case 85:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(311, 315);
- break;
- case 86:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(316, 321);
- break;
- case 89:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(322, 325);
- break;
- case 90:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(326, 332);
- break;
- case 91:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(333, 335);
- break;
- case 92:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(336, 339);
- break;
- case 93:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(340, 344);
- break;
- case 94:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(345, 350);
- break;
- case 95:
- if (curChar == 35) {
- jjCheckNAddTwoStates(96, 97);
- }
- break;
- case 96:
- if ((0x3ff200000000000L & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddTwoStates(96, 97);
- break;
- case 98:
- if ((0xffffffff00000000L & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddTwoStates(96, 97);
- break;
- case 99:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(351, 354);
- break;
- case 100:
- if ((0x100003600L & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddTwoStates(96, 97);
- break;
- case 101:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(355, 361);
- break;
- case 102:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(362, 364);
- break;
- case 103:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(365, 368);
- break;
- case 104:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(369, 373);
- break;
- case 105:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(374, 379);
- break;
- case 107:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 108;
- }
- break;
- case 111:
- if ((0xffffffff00000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 112:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(380, 383);
- break;
- case 113:
- if ((0x100003600L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 114:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(384, 390);
- break;
- case 115:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(391, 393);
- break;
- case 116:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(394, 397);
- break;
- case 117:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(398, 402);
- break;
- case 118:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(403, 408);
- break;
- case 121:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(409, 412);
- break;
- case 122:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(413, 419);
- break;
- case 123:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(420, 422);
- break;
- case 124:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(423, 426);
- break;
- case 125:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(427, 431);
- break;
- case 126:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(432, 437);
- break;
- case 128:
- if ((0x100003600L & l) != 0L) {
- jjAddStates(438, 439);
- }
- break;
- case 129:
- if (curChar == 40 && kind > 115) {
- kind = 115;
- }
- break;
- case 136:
- if ((0x100003600L & l) != 0L) {
- jjAddStates(440, 441);
- }
- break;
- case 137:
- if (curChar == 40 && kind > 116) {
- kind = 116;
- }
- break;
- case 144:
- if ((0x100003600L & l) != 0L) {
- jjAddStates(442, 443);
- }
- break;
- case 145:
- if (curChar == 40 && kind > 117) {
- kind = 117;
- }
- break;
- case 175:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 174;
- }
- break;
- case 184:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 183;
- }
- break;
- case 186:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 185;
- }
- break;
- case 195:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 194;
- }
- break;
- case 202:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 201;
- }
- break;
- case 211:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 210;
- }
- break;
- case 214:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 213;
- }
- break;
- case 215:
- if (curChar == 47) {
- jjAddStates(120, 121);
- }
- break;
- case 217:
- if ((0xffffffffffffdbffL & l) == 0L) {
- break;
- }
- if (kind > 2) {
- kind = 2;
- }
- jjCheckNAddStates(9, 11);
- break;
- case 218:
- if ((0x2400L & l) != 0L && kind > 2) {
- kind = 2;
- }
- break;
- case 219:
- if (curChar == 10 && kind > 2) {
- kind = 2;
- }
- break;
- case 220:
- if (curChar == 13) {
- jjstateSet[jjnewStateCnt++] = 219;
- }
- break;
- case 221:
- if (curChar == 42) {
- jjstateSet[jjnewStateCnt++] = 222;
- }
- break;
- case 222:
- if ((0xffff7fffffffffffL & l) != 0L && kind > 3) {
- kind = 3;
- }
- break;
- case 223:
- if (curChar == 42) {
- jjstateSet[jjnewStateCnt++] = 221;
- }
- break;
- case 225:
- if ((0x3ff200000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- break;
- case 227:
- if ((0xffffffff00000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- break;
- case 228:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(444, 447);
- break;
- case 229:
- if ((0x100003600L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- break;
- case 230:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(448, 454);
- break;
- case 231:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(455, 457);
- break;
- case 232:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(458, 461);
- break;
- case 233:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(462, 466);
- break;
- case 234:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(467, 472);
- break;
- case 235:
- if ((0x3ff200000000000L & l) != 0L) {
- jjCheckNAddStates(0, 3);
- }
- break;
- case 236:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddTwoStates(236, 237);
- }
- break;
- case 237:
- if (curChar == 40 && kind > 118) {
- kind = 118;
- }
- break;
- case 239:
- if ((0xffffffff00000000L & l) != 0L) {
- jjCheckNAddStates(0, 3);
- }
- break;
- case 240:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(473, 477);
- }
- break;
- case 241:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddStates(0, 3);
- }
- break;
- case 242:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(478, 485);
- }
- break;
- case 243:
- case 457:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(486, 489);
- }
- break;
- case 244:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(490, 494);
- }
- break;
- case 245:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(495, 500);
- }
- break;
- case 246:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(501, 507);
- }
- break;
- case 247:
- if (curChar == 33) {
- jjCheckNAddStates(116, 119);
- }
- break;
- case 248:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddTwoStates(248, 255);
- }
- break;
- case 256:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddTwoStates(256, 265);
- }
- break;
- case 266:
- if (curChar == 45) {
- jjAddStates(114, 115);
- }
- break;
- case 270:
- if (curChar == 46) {
- jjCheckNAddStates(94, 113);
- }
- break;
- case 271:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 73) {
- kind = 73;
- }
- jjCheckNAdd(271);
- break;
- case 272:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(272, 273);
- }
- break;
- case 273:
- if (curChar == 37 && kind > 77) {
- kind = 77;
- }
- break;
- case 274:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(274, 276);
- }
- break;
- case 277:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(277, 279);
- }
- break;
- case 280:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(280, 282);
- }
- break;
- case 283:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(283, 285);
- }
- break;
- case 286:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(286, 288);
- }
- break;
- case 289:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(289, 291);
- }
- break;
- case 292:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(292, 294);
- }
- break;
- case 295:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(295, 298);
- }
- break;
- case 299:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(299, 302);
- }
- break;
- case 303:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(303, 305);
- }
- break;
- case 306:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(306, 309);
- }
- break;
- case 310:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(310, 313);
- }
- break;
- case 314:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(314, 318);
- }
- break;
- case 319:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(319, 321);
- }
- break;
- case 322:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(322, 323);
- }
- break;
- case 324:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(324, 326);
- }
- break;
- case 327:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(327, 330);
- }
- break;
- case 331:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(4, 8);
- }
- break;
- case 332:
- if (curChar == 45) {
- jjCheckNAdd(333);
- }
- break;
- case 334:
- if ((0x3ff200000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddTwoStates(334, 335);
- break;
- case 336:
- if ((0xffffffff00000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddTwoStates(334, 335);
- break;
- case 337:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(508, 511);
- break;
- case 338:
- if ((0x100003600L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddTwoStates(334, 335);
- break;
- case 339:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(512, 518);
- break;
- case 340:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(519, 521);
- break;
- case 341:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(522, 525);
- break;
- case 342:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(526, 530);
- break;
- case 343:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(531, 536);
- break;
- case 346:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(537, 540);
- break;
- case 347:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(541, 547);
- break;
- case 348:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(548, 550);
- break;
- case 349:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(551, 554);
- break;
- case 350:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(555, 559);
- break;
- case 351:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(560, 565);
- break;
- case 353:
- if (curChar == 40) {
- jjCheckNAddStates(566, 571);
- }
- break;
- case 354:
- if ((0xfffffc7a00000000L & l) != 0L) {
- jjCheckNAddStates(572, 575);
- }
- break;
- case 355:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddTwoStates(355, 356);
- }
- break;
- case 356:
- if (curChar == 41 && kind > 75) {
- kind = 75;
- }
- break;
- case 358:
- if ((0xffffffff00000000L & l) != 0L) {
- jjCheckNAddStates(572, 575);
- }
- break;
- case 359:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(576, 580);
- }
- break;
- case 360:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddStates(572, 575);
- }
- break;
- case 361:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(581, 588);
- }
- break;
- case 362:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(589, 592);
- }
- break;
- case 363:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(593, 597);
- }
- break;
- case 364:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(598, 603);
- }
- break;
- case 365:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(604, 610);
- }
- break;
- case 366:
- if (curChar == 39) {
- jjCheckNAddStates(611, 614);
- }
- break;
- case 367:
- if ((0xffffff7f00000200L & l) != 0L) {
- jjCheckNAddStates(611, 614);
- }
- break;
- case 368:
- if (curChar == 39) {
- jjCheckNAddTwoStates(355, 356);
- }
- break;
- case 370:
- if (curChar == 12) {
- jjCheckNAddStates(611, 614);
- }
- break;
- case 372:
- if ((0xffffffff00000000L & l) != 0L) {
- jjCheckNAddStates(611, 614);
- }
- break;
- case 373:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(615, 620);
- }
- break;
- case 374:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddStates(611, 614);
- }
- break;
- case 375:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(621, 629);
- }
- break;
- case 376:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(630, 634);
- }
- break;
- case 377:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(635, 640);
- }
- break;
- case 378:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(641, 647);
- }
- break;
- case 379:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(648, 655);
- }
- break;
- case 380:
- if (curChar == 13) {
- jjCheckNAddStates(611, 614);
- }
- break;
- case 381:
- if (curChar == 10) {
- jjCheckNAddStates(611, 614);
- }
- break;
- case 382:
- if (curChar == 13) {
- jjstateSet[jjnewStateCnt++] = 381;
- }
- break;
- case 383:
- if (curChar == 34) {
- jjCheckNAddStates(656, 659);
- }
- break;
- case 384:
- if ((0xfffffffb00000200L & l) != 0L) {
- jjCheckNAddStates(656, 659);
- }
- break;
- case 385:
- if (curChar == 34) {
- jjCheckNAddTwoStates(355, 356);
- }
- break;
- case 387:
- if (curChar == 12) {
- jjCheckNAddStates(656, 659);
- }
- break;
- case 389:
- if ((0xffffffff00000000L & l) != 0L) {
- jjCheckNAddStates(656, 659);
- }
- break;
- case 390:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(660, 665);
- }
- break;
- case 391:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddStates(656, 659);
- }
- break;
- case 392:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(666, 674);
- }
- break;
- case 393:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(675, 679);
- }
- break;
- case 394:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(680, 685);
- }
- break;
- case 395:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(686, 692);
- }
- break;
- case 396:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(693, 700);
- }
- break;
- case 397:
- if (curChar == 13) {
- jjCheckNAddStates(656, 659);
- }
- break;
- case 398:
- if (curChar == 10) {
- jjCheckNAddStates(656, 659);
- }
- break;
- case 399:
- if (curChar == 13) {
- jjstateSet[jjnewStateCnt++] = 398;
- }
- break;
- case 400:
- if ((0x100003600L & l) != 0L) {
- jjCheckNAddStates(701, 707);
- }
- break;
- case 403:
- if (curChar == 43) {
- jjAddStates(708, 709);
- }
- break;
- case 404:
- if (curChar != 63) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjstateSet[jjnewStateCnt++] = 405;
- break;
- case 405:
- if (curChar != 63) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddStates(710, 713);
- break;
- case 406:
- if (curChar == 63 && kind > 114) {
- kind = 114;
- }
- break;
- case 407:
- case 422:
- case 426:
- case 429:
- case 432:
- if (curChar != 63) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAdd(406);
- break;
- case 408:
- if (curChar != 63) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddTwoStates(406, 407);
- break;
- case 409:
- if (curChar != 63) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddStates(714, 716);
- break;
- case 410:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjAddStates(717, 722);
- break;
- case 411:
- if ((0x3ff000000000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 412;
- }
- break;
- case 412:
- if ((0x3ff000000000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 413;
- }
- break;
- case 413:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAdd(414);
- }
- break;
- case 414:
- if ((0x3ff000000000000L & l) != 0L && kind > 114) {
- kind = 114;
- }
- break;
- case 415:
- if ((0x3ff000000000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 416;
- }
- break;
- case 416:
- if ((0x3ff000000000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 417;
- }
- break;
- case 417:
- if ((0x3ff000000000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 418;
- }
- break;
- case 418:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAdd(406);
- break;
- case 419:
- if ((0x3ff000000000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 420;
- }
- break;
- case 420:
- if ((0x3ff000000000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 421;
- }
- break;
- case 421:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjstateSet[jjnewStateCnt++] = 422;
- break;
- case 423:
- if ((0x3ff000000000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 424;
- }
- break;
- case 424:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjstateSet[jjnewStateCnt++] = 425;
- break;
- case 425:
- if (curChar != 63) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddTwoStates(406, 426);
- break;
- case 427:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjstateSet[jjnewStateCnt++] = 428;
- break;
- case 428:
- if (curChar != 63) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddStates(723, 725);
- break;
- case 430:
- if (curChar != 63) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddTwoStates(406, 429);
- break;
- case 431:
- if (curChar != 63) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddStates(726, 729);
- break;
- case 433:
- if (curChar != 63) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddTwoStates(406, 432);
- break;
- case 434:
- if (curChar != 63) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddStates(730, 732);
- break;
- case 435:
- if (curChar == 43) {
- jjstateSet[jjnewStateCnt++] = 436;
- }
- break;
- case 436:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(437, 443);
- }
- break;
- case 437:
- if (curChar == 45) {
- jjstateSet[jjnewStateCnt++] = 438;
- }
- break;
- case 438:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjstateSet[jjnewStateCnt++] = 439;
- break;
- case 439:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddStates(733, 736);
- break;
- case 440:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAdd(414);
- break;
- case 441:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddTwoStates(414, 440);
- break;
- case 442:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddStates(737, 739);
- break;
- case 443:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(740, 744);
- }
- break;
- case 444:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAdd(437);
- }
- break;
- case 445:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(444, 437);
- }
- break;
- case 446:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(745, 747);
- }
- break;
- case 447:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(748, 751);
- }
- break;
- case 449:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(752, 755);
- break;
- case 450:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(756, 762);
- break;
- case 451:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(763, 765);
- break;
- case 452:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(766, 769);
- break;
- case 453:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(770, 774);
- break;
- case 454:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(775, 780);
- break;
- case 455:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(781, 785);
- }
- break;
- case 456:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(786, 793);
- }
- break;
- case 458:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(794, 798);
- }
- break;
- case 459:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(799, 804);
- }
- break;
- case 460:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(805, 811);
- }
- break;
- case 461:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 73) {
- kind = 73;
- }
- jjCheckNAddStates(12, 93);
- break;
- case 462:
- if ((0x3ff000000000000L & l) == 0L) {
- break;
- }
- if (kind > 73) {
- kind = 73;
- }
- jjCheckNAdd(462);
- break;
- case 463:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(463, 464);
- }
- break;
- case 464:
- if (curChar == 46) {
- jjCheckNAdd(271);
- }
- break;
- case 465:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(465, 273);
- }
- break;
- case 466:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(466, 467);
- }
- break;
- case 467:
- if (curChar == 46) {
- jjCheckNAdd(272);
- }
- break;
- case 468:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(468, 276);
- }
- break;
- case 469:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(469, 470);
- }
- break;
- case 470:
- if (curChar == 46) {
- jjCheckNAdd(274);
- }
- break;
- case 471:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(471, 279);
- }
- break;
- case 472:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(472, 473);
- }
- break;
- case 473:
- if (curChar == 46) {
- jjCheckNAdd(277);
- }
- break;
- case 474:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(474, 282);
- }
- break;
- case 475:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(475, 476);
- }
- break;
- case 476:
- if (curChar == 46) {
- jjCheckNAdd(280);
- }
- break;
- case 477:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(477, 285);
- }
- break;
- case 478:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(478, 479);
- }
- break;
- case 479:
- if (curChar == 46) {
- jjCheckNAdd(283);
- }
- break;
- case 480:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(480, 288);
- }
- break;
- case 481:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(481, 482);
- }
- break;
- case 482:
- if (curChar == 46) {
- jjCheckNAdd(286);
- }
- break;
- case 483:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(483, 291);
- }
- break;
- case 484:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(484, 485);
- }
- break;
- case 485:
- if (curChar == 46) {
- jjCheckNAdd(289);
- }
- break;
- case 486:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(486, 294);
- }
- break;
- case 487:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(487, 488);
- }
- break;
- case 488:
- if (curChar == 46) {
- jjCheckNAdd(292);
- }
- break;
- case 489:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(489, 298);
- }
- break;
- case 490:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(490, 491);
- }
- break;
- case 491:
- if (curChar == 46) {
- jjCheckNAdd(295);
- }
- break;
- case 492:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(492, 302);
- }
- break;
- case 493:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(493, 494);
- }
- break;
- case 494:
- if (curChar == 46) {
- jjCheckNAdd(299);
- }
- break;
- case 495:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(495, 305);
- }
- break;
- case 496:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(496, 497);
- }
- break;
- case 497:
- if (curChar == 46) {
- jjCheckNAdd(303);
- }
- break;
- case 498:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(498, 309);
- }
- break;
- case 499:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(499, 500);
- }
- break;
- case 500:
- if (curChar == 46) {
- jjCheckNAdd(306);
- }
- break;
- case 501:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(501, 313);
- }
- break;
- case 502:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(502, 503);
- }
- break;
- case 503:
- if (curChar == 46) {
- jjCheckNAdd(310);
- }
- break;
- case 504:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(504, 318);
- }
- break;
- case 505:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(505, 506);
- }
- break;
- case 506:
- if (curChar == 46) {
- jjCheckNAdd(314);
- }
- break;
- case 507:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(507, 321);
- }
- break;
- case 508:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(508, 509);
- }
- break;
- case 509:
- if (curChar == 46) {
- jjCheckNAdd(319);
- }
- break;
- case 510:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(510, 323);
- }
- break;
- case 511:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(511, 512);
- }
- break;
- case 512:
- if (curChar == 46) {
- jjCheckNAdd(322);
- }
- break;
- case 513:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(513, 326);
- }
- break;
- case 514:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(514, 515);
- }
- break;
- case 515:
- if (curChar == 46) {
- jjCheckNAdd(324);
- }
- break;
- case 516:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(516, 330);
- }
- break;
- case 517:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(517, 518);
- }
- break;
- case 518:
- if (curChar == 46) {
- jjCheckNAdd(327);
- }
- break;
- case 519:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(812, 816);
- }
- break;
- case 520:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddTwoStates(520, 521);
- }
- break;
- case 521:
- if (curChar == 46) {
- jjCheckNAdd(331);
- }
- break;
- default:
- break;
- }
- } while (i != startsAt);
- } else if (curChar < 128) {
- long l = 1L << (curChar & 077);
- do {
- switch (jjstateSet[--i]) {
- case 524:
- if ((0x20000000200L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 264;
- } else if ((0x1000000010L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 254;
- }
- break;
- case 162:
- if ((0x7fffffe07fffffeL & l) != 0L) {
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- } else if (curChar == 92) {
- jjCheckNAddTwoStates(111, 121);
- }
- if ((0x80000000800L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 161;
- }
- break;
- case 29:
- if ((0x7fffffe87fffffeL & l) != 0L) {
- jjCheckNAddStates(0, 3);
- } else if (curChar == 92) {
- jjCheckNAddTwoStates(227, 228);
- }
- if ((0x7fffffe87fffffeL & l) != 0L) {
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- } else if (curChar == 92) {
- jjCheckNAddTwoStates(239, 240);
- }
- if ((0x20000000200L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 28;
- }
- break;
- case 171:
- if ((0x7fffffe87fffffeL & l) != 0L) {
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- } else if (curChar == 92) {
- jjCheckNAddTwoStates(111, 112);
- }
- break;
- case 525:
- if ((0x7fffffe87fffffeL & l) != 0L) {
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- } else if (curChar == 92) {
- jjCheckNAddTwoStates(111, 112);
- }
- break;
- case 38:
- if ((0x7fffffe07fffffeL & l) != 0L) {
- jjCheckNAddStates(0, 3);
- }
- if ((0x7fffffe07fffffeL & l) != 0L) {
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- }
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 37;
- }
- break;
- case 173:
- if ((0x7fffffe87fffffeL & l) != 0L) {
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- } else if (curChar == 92) {
- jjCheckNAddTwoStates(111, 112);
- }
- if ((0x8000000080000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 211;
- } else if ((0x800000008000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 172;
- }
- break;
- case 24:
- if ((0x7fffffe07fffffeL & l) != 0L) {
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(817, 822);
- } else if (curChar == 92) {
- jjCheckNAddStates(823, 826);
- } else if (curChar == 64) {
- jjAddStates(827, 831);
- }
- if ((0x20000000200000L & l) != 0L) {
- jjAddStates(832, 834);
- } else if ((0x800000008L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 151;
- } else if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 141;
- } else if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 133;
- } else if ((0x4000000040L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 29;
- } else if (curChar == 64) {
- jjAddStates(835, 838);
- }
- break;
- case 172:
- if ((0x7fffffe87fffffeL & l) != 0L) {
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- } else if (curChar == 92) {
- jjCheckNAddTwoStates(111, 112);
- }
- if ((0x400000004000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 171;
- }
- break;
- case 170:
- if ((0x7fffffe87fffffeL & l) != 0L) {
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- } else if (curChar == 92) {
- jjCheckNAddTwoStates(111, 112);
- }
- if ((0x80000000800L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 169;
- }
- break;
- case 174:
- if ((0x7fffffe07fffffeL & l) != 0L) {
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- }
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 212;
- } else if ((0x80000000800000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 200;
- } else if ((0x800000008000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 184;
- }
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 173;
- }
- break;
- case 75:
- if ((0x7fffffe07fffffeL & l) != 0L) {
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddTwoStates(77, 78);
- } else if (curChar == 92) {
- jjCheckNAddTwoStates(79, 89);
- }
- break;
- case 522:
- if ((0x7fffffe87fffffeL & l) != 0L) {
- jjCheckNAddStates(0, 3);
- } else if (curChar == 92) {
- jjCheckNAddTwoStates(227, 228);
- }
- if ((0x7fffffe87fffffeL & l) != 0L) {
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- } else if (curChar == 92) {
- jjCheckNAddTwoStates(239, 240);
- }
- break;
- case 1:
- if (curChar == 123) {
- jjstateSet[jjnewStateCnt++] = 2;
- }
- break;
- case 4:
- if ((0x7fffffe07fffffeL & l) != 0L) {
- jjCheckNAddStates(138, 140);
- }
- break;
- case 5:
- if ((0x7fffffe87fffffeL & l) != 0L) {
- jjCheckNAddStates(138, 140);
- }
- break;
- case 6:
- if (curChar == 125 && kind > 39) {
- kind = 39;
- }
- break;
- case 7:
- if (curChar == 92) {
- jjCheckNAddTwoStates(8, 9);
- }
- break;
- case 8:
- if ((0x7fffffffffffffffL & l) != 0L) {
- jjCheckNAddStates(138, 140);
- }
- break;
- case 9:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(141, 145);
- }
- break;
- case 11:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(146, 153);
- }
- break;
- case 12:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(154, 157);
- }
- break;
- case 13:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(158, 162);
- }
- break;
- case 14:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(163, 168);
- }
- break;
- case 15:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(169, 175);
- }
- break;
- case 17:
- if (curChar == 92) {
- jjCheckNAddTwoStates(8, 18);
- }
- break;
- case 18:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(176, 180);
- }
- break;
- case 19:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(181, 188);
- }
- break;
- case 20:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(189, 192);
- }
- break;
- case 21:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(193, 197);
- }
- break;
- case 22:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(198, 203);
- }
- break;
- case 23:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(204, 210);
- }
- break;
- case 25:
- if ((0x4000000040000L & l) != 0L && kind > 68) {
- kind = 68;
- }
- break;
- case 26:
- case 31:
- if ((0x2000000020L & l) != 0L) {
- jjCheckNAdd(25);
- }
- break;
- case 27:
- if ((0x10000000100000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 26;
- }
- break;
- case 28:
- if ((0x100000001000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 27;
- }
- break;
- case 30:
- if ((0x4000000040L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 29;
- }
- break;
- case 32:
- if ((0x10000000100000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 31;
- }
- break;
- case 33:
- if ((0x100000001000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 32;
- }
- break;
- case 34:
- if ((0x20000000200L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 33;
- }
- break;
- case 35:
- if ((0x4000000040L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 34;
- }
- break;
- case 37:
- if ((0x8000000080000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 36;
- }
- break;
- case 41:
- case 46:
- if ((0x7fffffffffffffffL & l) != 0L) {
- jjCheckNAddStates(130, 133);
- }
- break;
- case 43:
- if (curChar == 92) {
- jjAddStates(839, 842);
- }
- break;
- case 45:
- if (curChar == 92) {
- jjAddStates(843, 844);
- }
- break;
- case 47:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(211, 216);
- }
- break;
- case 49:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(217, 225);
- }
- break;
- case 50:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(226, 230);
- }
- break;
- case 51:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(231, 236);
- }
- break;
- case 52:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(237, 243);
- }
- break;
- case 53:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(244, 251);
- }
- break;
- case 58:
- case 63:
- if ((0x7fffffffffffffffL & l) != 0L) {
- jjCheckNAddStates(126, 129);
- }
- break;
- case 60:
- if (curChar == 92) {
- jjAddStates(845, 848);
- }
- break;
- case 62:
- if (curChar == 92) {
- jjAddStates(849, 850);
- }
- break;
- case 64:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(252, 257);
- }
- break;
- case 66:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(258, 266);
- }
- break;
- case 67:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(267, 271);
- }
- break;
- case 68:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(272, 277);
- }
- break;
- case 69:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(278, 284);
- }
- break;
- case 70:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(285, 292);
- }
- break;
- case 76:
- if ((0x7fffffe07fffffeL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddTwoStates(77, 78);
- break;
- case 77:
- if ((0x7fffffe87fffffeL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddTwoStates(77, 78);
- break;
- case 78:
- if (curChar == 92) {
- jjCheckNAddTwoStates(79, 80);
- }
- break;
- case 79:
- if ((0x7fffffffffffffffL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddTwoStates(77, 78);
- break;
- case 80:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(293, 296);
- break;
- case 82:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(297, 303);
- break;
- case 83:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(304, 306);
- break;
- case 84:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(307, 310);
- break;
- case 85:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(311, 315);
- break;
- case 86:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(316, 321);
- break;
- case 88:
- if (curChar == 92) {
- jjCheckNAddTwoStates(79, 89);
- }
- break;
- case 89:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(322, 325);
- break;
- case 90:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(326, 332);
- break;
- case 91:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(333, 335);
- break;
- case 92:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(336, 339);
- break;
- case 93:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(340, 344);
- break;
- case 94:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddStates(345, 350);
- break;
- case 96:
- if ((0x7fffffe87fffffeL & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddTwoStates(96, 97);
- break;
- case 97:
- if (curChar == 92) {
- jjAddStates(851, 852);
- }
- break;
- case 98:
- if ((0x7fffffffffffffffL & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddTwoStates(96, 97);
- break;
- case 99:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(351, 354);
- break;
- case 101:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(355, 361);
- break;
- case 102:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(362, 364);
- break;
- case 103:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(365, 368);
- break;
- case 104:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(369, 373);
- break;
- case 105:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddStates(374, 379);
- break;
- case 106:
- if (curChar == 64) {
- jjAddStates(835, 838);
- }
- break;
- case 108:
- if ((0x7fffffe07fffffeL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 109:
- if ((0x7fffffe87fffffeL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 110:
- if (curChar == 92) {
- jjCheckNAddTwoStates(111, 112);
- }
- break;
- case 111:
- if ((0x7fffffffffffffffL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 112:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(380, 383);
- break;
- case 114:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(384, 390);
- break;
- case 115:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(391, 393);
- break;
- case 116:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(394, 397);
- break;
- case 117:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(398, 402);
- break;
- case 118:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(403, 408);
- break;
- case 120:
- if (curChar == 92) {
- jjCheckNAddTwoStates(111, 121);
- }
- break;
- case 121:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(409, 412);
- break;
- case 122:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(413, 419);
- break;
- case 123:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(420, 422);
- break;
- case 124:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(423, 426);
- break;
- case 125:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(427, 431);
- break;
- case 126:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddStates(432, 437);
- break;
- case 127:
- if ((0x2000000020L & l) != 0L) {
- jjAddStates(438, 439);
- }
- break;
- case 130:
- if ((0x40000000400000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 127;
- }
- break;
- case 131:
- if ((0x800000008000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 130;
- }
- break;
- case 132:
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 131;
- }
- break;
- case 133:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 132;
- }
- break;
- case 134:
- if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 133;
- }
- break;
- case 135:
- if ((0x1000000010L & l) != 0L) {
- jjAddStates(440, 441);
- }
- break;
- case 138:
- if ((0x400000004000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 135;
- }
- break;
- case 139:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 138;
- }
- break;
- case 140:
- if ((0x1000000010000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 139;
- }
- break;
- case 141:
- if ((0x1000000010000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 140;
- }
- break;
- case 142:
- if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 141;
- }
- break;
- case 143:
- if ((0x8000000080000L & l) != 0L) {
- jjAddStates(442, 443);
- }
- break;
- case 146:
- if ((0x400000004000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 143;
- }
- break;
- case 147:
- if ((0x20000000200L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 146;
- }
- break;
- case 148:
- if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 147;
- }
- break;
- case 149:
- if ((0x10000000100000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 148;
- }
- break;
- case 150:
- if ((0x400000004000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 149;
- }
- break;
- case 151:
- if ((0x800000008000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 150;
- }
- break;
- case 152:
- if ((0x800000008L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 151;
- }
- break;
- case 153:
- if (curChar == 64) {
- jjAddStates(827, 831);
- }
- break;
- case 154:
- if ((0x8000000080000L & l) != 0L && kind > 102) {
- kind = 102;
- }
- break;
- case 155:
- case 163:
- case 176:
- case 187:
- case 203:
- if ((0x2000000020L & l) != 0L) {
- jjCheckNAdd(154);
- }
- break;
- case 156:
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 155;
- }
- break;
- case 157:
- if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 156;
- }
- break;
- case 158:
- if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 157;
- }
- break;
- case 159:
- if ((0x4000000040L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 158;
- }
- break;
- case 160:
- if ((0x200000002000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 159;
- }
- break;
- case 161:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 160;
- }
- break;
- case 164:
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 163;
- }
- break;
- case 165:
- if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 164;
- }
- break;
- case 166:
- if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 165;
- }
- break;
- case 167:
- if ((0x4000000040L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 166;
- }
- break;
- case 168:
- if ((0x200000002000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 167;
- }
- break;
- case 169:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 168;
- }
- break;
- case 177:
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 176;
- }
- break;
- case 178:
- if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 177;
- }
- break;
- case 179:
- if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 178;
- }
- break;
- case 180:
- if ((0x4000000040L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 179;
- }
- break;
- case 181:
- if ((0x200000002000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 180;
- }
- break;
- case 182:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 181;
- }
- break;
- case 183:
- if ((0x80000000800L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 182;
- }
- break;
- case 185:
- if ((0x800000008000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 184;
- }
- break;
- case 188:
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 187;
- }
- break;
- case 189:
- if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 188;
- }
- break;
- case 190:
- if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 189;
- }
- break;
- case 191:
- if ((0x4000000040L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 190;
- }
- break;
- case 192:
- if ((0x200000002000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 191;
- }
- break;
- case 193:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 192;
- }
- break;
- case 194:
- if ((0x80000000800L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 193;
- }
- break;
- case 196:
- if ((0x10000000100000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 195;
- }
- break;
- case 197:
- if ((0x20000000200L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 196;
- }
- break;
- case 198:
- if ((0x80000000800L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 197;
- }
- break;
- case 199:
- if ((0x400000004L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 198;
- }
- break;
- case 200:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 199;
- }
- break;
- case 201:
- if ((0x80000000800000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 200;
- }
- break;
- case 204:
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 203;
- }
- break;
- case 205:
- if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 204;
- }
- break;
- case 206:
- if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 205;
- }
- break;
- case 207:
- if ((0x4000000040L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 206;
- }
- break;
- case 208:
- if ((0x200000002000000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 207;
- }
- break;
- case 209:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 208;
- }
- break;
- case 210:
- if ((0x80000000800L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 209;
- }
- break;
- case 212:
- if ((0x8000000080000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 211;
- }
- break;
- case 213:
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 212;
- }
- break;
- case 217:
- if (kind > 2) {
- kind = 2;
- }
- jjAddStates(9, 11);
- break;
- case 222:
- if (kind > 3) {
- kind = 3;
- }
- break;
- case 225:
- if ((0x7fffffe87fffffeL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- break;
- case 226:
- if (curChar == 92) {
- jjCheckNAddTwoStates(227, 228);
- }
- break;
- case 227:
- if ((0x7fffffffffffffffL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- break;
- case 228:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(444, 447);
- break;
- case 230:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(448, 454);
- break;
- case 231:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(455, 457);
- break;
- case 232:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(458, 461);
- break;
- case 233:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(462, 466);
- break;
- case 234:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(467, 472);
- break;
- case 235:
- if ((0x7fffffe87fffffeL & l) != 0L) {
- jjCheckNAddStates(0, 3);
- }
- break;
- case 238:
- if (curChar == 92) {
- jjCheckNAddTwoStates(239, 240);
- }
- break;
- case 239:
- if ((0x7fffffffffffffffL & l) != 0L) {
- jjCheckNAddStates(0, 3);
- }
- break;
- case 240:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(473, 477);
- }
- break;
- case 242:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(478, 485);
- }
- break;
- case 243:
- case 457:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(486, 489);
- }
- break;
- case 244:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(490, 494);
- }
- break;
- case 245:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(495, 500);
- }
- break;
- case 246:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(501, 507);
- }
- break;
- case 249:
- if ((0x10000000100000L & l) != 0L && kind > 70) {
- kind = 70;
- }
- break;
- case 250:
- if ((0x100000001000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 249;
- }
- break;
- case 251:
- if ((0x20000000200000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 250;
- }
- break;
- case 252:
- if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 251;
- }
- break;
- case 253:
- if ((0x4000000040L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 252;
- }
- break;
- case 254:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 253;
- }
- break;
- case 255:
- if ((0x1000000010L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 254;
- }
- break;
- case 257:
- if ((0x10000000100000L & l) != 0L && kind > 104) {
- kind = 104;
- }
- break;
- case 258:
- if ((0x400000004000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 257;
- }
- break;
- case 259:
- if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 258;
- }
- break;
- case 260:
- if ((0x10000000100000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 259;
- }
- break;
- case 261:
- if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 260;
- }
- break;
- case 262:
- if ((0x800000008000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 261;
- }
- break;
- case 263:
- if ((0x1000000010000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 262;
- }
- break;
- case 264:
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 263;
- }
- break;
- case 265:
- if ((0x20000000200L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 264;
- }
- break;
- case 267:
- if ((0x7fffffe07fffffeL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- break;
- case 268:
- if ((0x7fffffe07fffffeL & l) != 0L) {
- jjCheckNAddStates(0, 3);
- }
- break;
- case 269:
- if ((0x7fffffe07fffffeL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(817, 822);
- break;
- case 275:
- if ((0x10000000100000L & l) != 0L && kind > 78) {
- kind = 78;
- }
- break;
- case 276:
- if ((0x1000000010000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 275;
- }
- break;
- case 278:
- if ((0x200000002000L & l) != 0L && kind > 79) {
- kind = 79;
- }
- break;
- case 279:
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 278;
- }
- break;
- case 281:
- if ((0x200000002000L & l) != 0L && kind > 80) {
- kind = 80;
- }
- break;
- case 282:
- if ((0x800000008L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 281;
- }
- break;
- case 284:
- if ((0x800000008L & l) != 0L && kind > 81) {
- kind = 81;
- }
- break;
- case 285:
- if ((0x1000000010000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 284;
- }
- break;
- case 287:
- if ((0x400000004000L & l) != 0L && kind > 82) {
- kind = 82;
- }
- break;
- case 288:
- if ((0x20000000200L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 287;
- }
- break;
- case 290:
- if ((0x100000001000000L & l) != 0L && kind > 83) {
- kind = 83;
- }
- break;
- case 291:
- if ((0x1000000010000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 290;
- }
- break;
- case 293:
- if ((0x200000002000L & l) != 0L && kind > 84) {
- kind = 84;
- }
- break;
- case 294:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 293;
- }
- break;
- case 296:
- if ((0x200000002000L & l) != 0L && kind > 85) {
- kind = 85;
- }
- break;
- case 297:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 296;
- }
- break;
- case 298:
- if ((0x100000001000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 297;
- }
- break;
- case 300:
- if ((0x200000002000L & l) != 0L && kind > 86) {
- kind = 86;
- }
- break;
- case 301:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 300;
- }
- break;
- case 302:
- if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 301;
- }
- break;
- case 304:
- if ((0x100000001000000L & l) != 0L && kind > 87) {
- kind = 87;
- }
- break;
- case 305:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 304;
- }
- break;
- case 307:
- if ((0x8000000080L & l) != 0L && kind > 88) {
- kind = 88;
- }
- break;
- case 308:
- if ((0x2000000020L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 307;
- }
- break;
- case 309:
- if ((0x1000000010L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 308;
- }
- break;
- case 311:
- if ((0x1000000010L & l) != 0L && kind > 89) {
- kind = 89;
- }
- break;
- case 312:
- if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 311;
- }
- break;
- case 313:
- if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 312;
- }
- break;
- case 315:
- if ((0x1000000010L & l) != 0L && kind > 90) {
- kind = 90;
- }
- break;
- case 316:
- if ((0x200000002L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 315;
- }
- break;
- case 317:
- if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 316;
- }
- break;
- case 318:
- if ((0x8000000080L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 317;
- }
- break;
- case 320:
- if ((0x8000000080000L & l) != 0L && kind > 91) {
- kind = 91;
- }
- break;
- case 321:
- if ((0x200000002000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 320;
- }
- break;
- case 323:
- if ((0x8000000080000L & l) != 0L && kind > 92) {
- kind = 92;
- }
- break;
- case 325:
- if ((0x400000004000000L & l) != 0L && kind > 93) {
- kind = 93;
- }
- break;
- case 326:
- if ((0x10000000100L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 325;
- }
- break;
- case 328:
- if ((0x400000004000000L & l) != 0L && kind > 94) {
- kind = 94;
- }
- break;
- case 329:
- if ((0x10000000100L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 328;
- }
- break;
- case 330:
- if ((0x80000000800L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 329;
- }
- break;
- case 333:
- if ((0x7fffffe07fffffeL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddTwoStates(334, 335);
- break;
- case 334:
- if ((0x7fffffe87fffffeL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddTwoStates(334, 335);
- break;
- case 335:
- if (curChar == 92) {
- jjCheckNAddTwoStates(336, 337);
- }
- break;
- case 336:
- if ((0x7fffffffffffffffL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddTwoStates(334, 335);
- break;
- case 337:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(508, 511);
- break;
- case 339:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(512, 518);
- break;
- case 340:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(519, 521);
- break;
- case 341:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(522, 525);
- break;
- case 342:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(526, 530);
- break;
- case 343:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(531, 536);
- break;
- case 345:
- if (curChar == 92) {
- jjCheckNAddTwoStates(336, 346);
- }
- break;
- case 346:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(537, 540);
- break;
- case 347:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(541, 547);
- break;
- case 348:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(548, 550);
- break;
- case 349:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(551, 554);
- break;
- case 350:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(555, 559);
- break;
- case 351:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddStates(560, 565);
- break;
- case 352:
- if ((0x20000000200000L & l) != 0L) {
- jjAddStates(832, 834);
- }
- break;
- case 354:
- case 358:
- if ((0x7fffffffffffffffL & l) != 0L) {
- jjCheckNAddStates(572, 575);
- }
- break;
- case 357:
- if (curChar == 92) {
- jjAddStates(853, 854);
- }
- break;
- case 359:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(576, 580);
- }
- break;
- case 361:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(581, 588);
- }
- break;
- case 362:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(589, 592);
- }
- break;
- case 363:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(593, 597);
- }
- break;
- case 364:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(598, 603);
- }
- break;
- case 365:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(604, 610);
- }
- break;
- case 367:
- case 372:
- if ((0x7fffffffffffffffL & l) != 0L) {
- jjCheckNAddStates(611, 614);
- }
- break;
- case 369:
- if (curChar == 92) {
- jjAddStates(855, 858);
- }
- break;
- case 371:
- if (curChar == 92) {
- jjAddStates(859, 860);
- }
- break;
- case 373:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(615, 620);
- }
- break;
- case 375:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(621, 629);
- }
- break;
- case 376:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(630, 634);
- }
- break;
- case 377:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(635, 640);
- }
- break;
- case 378:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(641, 647);
- }
- break;
- case 379:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(648, 655);
- }
- break;
- case 384:
- case 389:
- if ((0x7fffffffffffffffL & l) != 0L) {
- jjCheckNAddStates(656, 659);
- }
- break;
- case 386:
- if (curChar == 92) {
- jjAddStates(861, 864);
- }
- break;
- case 388:
- if (curChar == 92) {
- jjAddStates(865, 866);
- }
- break;
- case 390:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(660, 665);
- }
- break;
- case 392:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(666, 674);
- }
- break;
- case 393:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(675, 679);
- }
- break;
- case 394:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(680, 685);
- }
- break;
- case 395:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(686, 692);
- }
- break;
- case 396:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(693, 700);
- }
- break;
- case 401:
- if ((0x100000001000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 353;
- }
- break;
- case 402:
- if ((0x4000000040000L & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 401;
- }
- break;
- case 410:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjAddStates(717, 722);
- break;
- case 411:
- if ((0x7e0000007eL & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 412;
- }
- break;
- case 412:
- if ((0x7e0000007eL & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 413;
- }
- break;
- case 413:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAdd(414);
- }
- break;
- case 414:
- if ((0x7e0000007eL & l) != 0L && kind > 114) {
- kind = 114;
- }
- break;
- case 415:
- if ((0x7e0000007eL & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 416;
- }
- break;
- case 416:
- if ((0x7e0000007eL & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 417;
- }
- break;
- case 417:
- if ((0x7e0000007eL & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 418;
- }
- break;
- case 418:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjstateSet[jjnewStateCnt++] = 406;
- break;
- case 419:
- if ((0x7e0000007eL & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 420;
- }
- break;
- case 420:
- if ((0x7e0000007eL & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 421;
- }
- break;
- case 421:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjstateSet[jjnewStateCnt++] = 422;
- break;
- case 423:
- if ((0x7e0000007eL & l) != 0L) {
- jjstateSet[jjnewStateCnt++] = 424;
- }
- break;
- case 424:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjstateSet[jjnewStateCnt++] = 425;
- break;
- case 427:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjstateSet[jjnewStateCnt++] = 428;
- break;
- case 436:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddTwoStates(437, 443);
- }
- break;
- case 438:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjstateSet[jjnewStateCnt++] = 439;
- break;
- case 439:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddStates(733, 736);
- break;
- case 440:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAdd(414);
- break;
- case 441:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddTwoStates(414, 440);
- break;
- case 442:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 114) {
- kind = 114;
- }
- jjCheckNAddStates(737, 739);
- break;
- case 443:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(740, 744);
- }
- break;
- case 444:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAdd(437);
- }
- break;
- case 445:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddTwoStates(444, 437);
- }
- break;
- case 446:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(745, 747);
- }
- break;
- case 447:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(748, 751);
- }
- break;
- case 448:
- if (curChar == 92) {
- jjCheckNAddStates(823, 826);
- }
- break;
- case 449:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(752, 755);
- break;
- case 450:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(756, 762);
- break;
- case 451:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(763, 765);
- break;
- case 452:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(766, 769);
- break;
- case 453:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(770, 774);
- break;
- case 454:
- if ((0x7e0000007eL & l) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddStates(775, 780);
- break;
- case 455:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(781, 785);
- }
- break;
- case 456:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(786, 793);
- }
- break;
- case 458:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(794, 798);
- }
- break;
- case 459:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(799, 804);
- }
- break;
- case 460:
- if ((0x7e0000007eL & l) != 0L) {
- jjCheckNAddStates(805, 811);
- }
- break;
- default:
- break;
- }
- } while (i != startsAt);
- } else {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- do {
- switch (jjstateSet[--i]) {
- case 162:
- case 111:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 29:
- if ((jjbitVec0[i2] & l2) != 0L) {
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- }
- if ((jjbitVec0[i2] & l2) != 0L) {
- jjCheckNAddStates(0, 3);
- }
- break;
- case 171:
- case 109:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 525:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 173:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 24:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 40) {
- kind = 40;
- }
- jjCheckNAddStates(817, 822);
- break;
- case 172:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 170:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 103) {
- kind = 103;
- }
- jjCheckNAddTwoStates(109, 110);
- break;
- case 75:
- case 77:
- case 79:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 76) {
- kind = 76;
- }
- jjCheckNAddTwoStates(77, 78);
- break;
- case 522:
- if ((jjbitVec0[i2] & l2) != 0L) {
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- }
- if ((jjbitVec0[i2] & l2) != 0L) {
- jjCheckNAddStates(0, 3);
- }
- break;
- case 5:
- case 8:
- case 16:
- if ((jjbitVec0[i2] & l2) != 0L) {
- jjCheckNAddStates(138, 140);
- }
- break;
- case 41:
- case 46:
- if ((jjbitVec0[i2] & l2) != 0L) {
- jjCheckNAddStates(130, 133);
- }
- break;
- case 58:
- case 63:
- if ((jjbitVec0[i2] & l2) != 0L) {
- jjCheckNAddStates(126, 129);
- }
- break;
- case 96:
- case 98:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 96) {
- kind = 96;
- }
- jjCheckNAddTwoStates(96, 97);
- break;
- case 217:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 2) {
- kind = 2;
- }
- jjAddStates(9, 11);
- break;
- case 222:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 3) {
- kind = 3;
- }
- break;
- case 225:
- case 227:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 72) {
- kind = 72;
- }
- jjCheckNAddTwoStates(225, 226);
- break;
- case 235:
- case 239:
- if ((jjbitVec0[i2] & l2) != 0L) {
- jjCheckNAddStates(0, 3);
- }
- break;
- case 334:
- case 336:
- case 344:
- if ((jjbitVec0[i2] & l2) == 0L) {
- break;
- }
- if (kind > 95) {
- kind = 95;
- }
- jjCheckNAddTwoStates(334, 335);
- break;
- case 354:
- case 358:
- if ((jjbitVec0[i2] & l2) != 0L) {
- jjCheckNAddStates(572, 575);
- }
- break;
- case 367:
- case 372:
- if ((jjbitVec0[i2] & l2) != 0L) {
- jjCheckNAddStates(611, 614);
- }
- break;
- case 384:
- case 389:
- if ((jjbitVec0[i2] & l2) != 0L) {
- jjCheckNAddStates(656, 659);
- }
- break;
- default:
- break;
- }
- } while (i != startsAt);
- }
- if (kind != 0x7fffffff) {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 522 - (jjnewStateCnt = startsAt))) {
- return curPos;
- }
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- return curPos;
- }
- }
- }
+/** Get the next Token. */
+public Token getNextToken()
+{
+ Token specialToken = null;
+ Token matchedToken;
+ int curPos = 0;
- private int jjMoveStringLiteralDfa0_2() {
- switch (curChar) {
- case 42:
- return jjMoveStringLiteralDfa1_2(0x40L);
- default:
- return 1;
- }
- }
+ EOFLoop :
+ for (;;)
+ {
+ try
+ {
+ curChar = input_stream.BeginToken();
+ }
+ catch(java.io.IOException e)
+ {
+ jjmatchedKind = 0;
+ matchedToken = jjFillToken();
+ matchedToken.specialToken = specialToken;
+ return matchedToken;
+ }
+ image = jjimage;
+ image.setLength(0);
+ jjimageLen = 0;
- private int jjMoveStringLiteralDfa1_2(long active0) {
- try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- return 1;
+ for (;;)
+ {
+ switch(curLexState)
+ {
+ case 0:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_0();
+ if (jjmatchedPos == 0 && jjmatchedKind > 119)
+ {
+ jjmatchedKind = 119;
+ }
+ break;
+ case 1:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_1();
+ if (jjmatchedPos == 0 && jjmatchedKind > 7)
+ {
+ jjmatchedKind = 7;
+ }
+ break;
+ case 2:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_2();
+ if (jjmatchedPos == 0 && jjmatchedKind > 7)
+ {
+ jjmatchedKind = 7;
+ }
+ break;
+ }
+ if (jjmatchedKind != 0x7fffffff)
+ {
+ if (jjmatchedPos + 1 < curPos)
+ input_stream.backup(curPos - jjmatchedPos - 1);
+ if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+ {
+ matchedToken = jjFillToken();
+ matchedToken.specialToken = specialToken;
+ TokenLexicalActions(matchedToken);
+ if (jjnewLexState[jjmatchedKind] != -1)
+ curLexState = jjnewLexState[jjmatchedKind];
+ return matchedToken;
}
- switch (curChar) {
- case 47:
- if ((active0 & 0x40L) != 0L) {
- return jjStopAtPos(1, 6);
- }
- break;
- default:
- return 2;
+ else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+ {
+ if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+ {
+ matchedToken = jjFillToken();
+ if (specialToken == null)
+ specialToken = matchedToken;
+ else
+ {
+ matchedToken.specialToken = specialToken;
+ specialToken = (specialToken.next = matchedToken);
+ }
+ SkipLexicalActions(matchedToken);
+ }
+ else
+ SkipLexicalActions(null);
+ if (jjnewLexState[jjmatchedKind] != -1)
+ curLexState = jjnewLexState[jjmatchedKind];
+ continue EOFLoop;
}
- return 2;
- }
-
- private int jjMoveStringLiteralDfa0_1() {
- switch (curChar) {
- case 42:
- return jjMoveStringLiteralDfa1_1(0x20L);
- default:
- return 1;
- }
- }
-
- private int jjMoveStringLiteralDfa1_1(long active0) {
+ MoreLexicalActions();
+ if (jjnewLexState[jjmatchedKind] != -1)
+ curLexState = jjnewLexState[jjmatchedKind];
+ curPos = 0;
+ jjmatchedKind = 0x7fffffff;
try {
- curChar = input_stream.readChar();
- } catch (java.io.IOException e) {
- return 1;
+ curChar = input_stream.readChar();
+ continue;
}
- switch (curChar) {
- case 47:
- if ((active0 & 0x20L) != 0L) {
- return jjStopAtPos(1, 5);
- }
- break;
- default:
- return 2;
+ catch (java.io.IOException e1) { }
+ }
+ int error_line = input_stream.getEndLine();
+ int error_column = input_stream.getEndColumn();
+ String error_after = null;
+ boolean EOFSeen = false;
+ try { input_stream.readChar(); input_stream.backup(1); }
+ catch (java.io.IOException e1) {
+ EOFSeen = true;
+ error_after = curPos <= 1 ? "" : input_stream.GetImage();
+ if (curChar == '\n' || curChar == '\r') {
+ error_line++;
+ error_column = 0;
}
- return 2;
- }
-
- static final int[] jjnextStates = { 235, 236, 237, 238, 331, 332, 333, 344,
- 345, 217, 218, 220, 462, 463, 464, 465, 466, 467, 273, 468, 469,
- 470, 276, 471, 472, 473, 279, 474, 475, 476, 282, 477, 478, 479,
- 285, 480, 481, 482, 288, 483, 484, 485, 291, 486, 487, 488, 294,
- 489, 490, 491, 298, 492, 493, 494, 302, 495, 496, 497, 305, 498,
- 499, 500, 309, 501, 502, 503, 313, 504, 505, 506, 318, 507, 508,
- 509, 321, 510, 511, 512, 323, 513, 514, 515, 326, 516, 517, 518,
- 330, 519, 520, 521, 332, 333, 344, 345, 271, 272, 274, 277, 280,
- 283, 286, 289, 292, 295, 299, 303, 306, 310, 314, 319, 322, 324,
- 327, 331, 267, 268, 248, 255, 256, 265, 216, 223, 75, 76, 87, 88,
- 58, 59, 60, 62, 41, 42, 43, 45, 3, 4, 16, 17, 5, 6, 7, 5, 10, 6, 7,
- 11, 5, 12, 10, 6, 7, 13, 14, 15, 5, 10, 6, 7, 5, 12, 10, 6, 7, 5,
- 12, 10, 6, 7, 13, 5, 12, 10, 6, 7, 13, 14, 10, 5, 6, 7, 19, 20, 10,
- 5, 6, 7, 21, 22, 23, 10, 5, 6, 7, 20, 10, 5, 6, 7, 20, 10, 5, 6, 7,
- 21, 20, 10, 5, 6, 7, 21, 22, 41, 48, 42, 43, 45, 49, 41, 50, 48,
- 42, 43, 45, 51, 52, 53, 41, 48, 42, 43, 45, 41, 50, 48, 42, 43, 45,
- 41, 50, 48, 42, 43, 45, 51, 41, 50, 48, 42, 43, 45, 51, 52, 58, 65,
- 59, 60, 62, 66, 58, 67, 65, 59, 60, 62, 68, 69, 70, 58, 65, 59, 60,
- 62, 58, 67, 65, 59, 60, 62, 58, 67, 65, 59, 60, 62, 68, 58, 67, 65,
- 59, 60, 62, 68, 69, 77, 81, 78, 82, 77, 83, 81, 78, 84, 85, 86, 77,
- 81, 78, 77, 83, 81, 78, 77, 83, 81, 78, 84, 77, 83, 81, 78, 84, 85,
- 81, 77, 78, 90, 91, 81, 77, 78, 92, 93, 94, 81, 77, 78, 91, 81, 77,
- 78, 91, 81, 77, 78, 92, 91, 81, 77, 78, 92, 93, 96, 100, 97, 101,
- 96, 102, 100, 97, 103, 104, 105, 96, 100, 97, 96, 102, 100, 97, 96,
- 102, 100, 97, 103, 96, 102, 100, 97, 103, 104, 109, 113, 110, 114,
- 109, 115, 113, 110, 116, 117, 118, 109, 113, 110, 109, 115, 113,
- 110, 109, 115, 113, 110, 116, 109, 115, 113, 110, 116, 117, 113,
- 109, 110, 122, 123, 113, 109, 110, 124, 125, 126, 113, 109, 110,
- 123, 113, 109, 110, 123, 113, 109, 110, 124, 123, 113, 109, 110,
- 124, 125, 128, 129, 136, 137, 144, 145, 225, 229, 226, 230, 225,
- 231, 229, 226, 232, 233, 234, 225, 229, 226, 225, 231, 229, 226,
- 225, 231, 229, 226, 232, 225, 231, 229, 226, 232, 233, 235, 237,
- 238, 241, 242, 235, 243, 237, 238, 241, 244, 245, 246, 235, 237,
- 238, 241, 235, 243, 237, 238, 241, 235, 243, 237, 238, 241, 244,
- 235, 243, 237, 238, 241, 244, 245, 334, 338, 335, 339, 334, 340,
- 338, 335, 341, 342, 343, 334, 338, 335, 334, 340, 338, 335, 334,
- 340, 338, 335, 341, 334, 340, 338, 335, 341, 342, 338, 334, 335,
- 347, 348, 338, 334, 335, 349, 350, 351, 338, 334, 335, 348, 338,
- 334, 335, 348, 338, 334, 335, 349, 348, 338, 334, 335, 349, 350,
- 354, 366, 383, 356, 357, 400, 354, 355, 356, 357, 354, 356, 357,
- 360, 361, 354, 362, 356, 357, 360, 363, 364, 365, 354, 356, 357,
- 360, 354, 362, 356, 357, 360, 354, 362, 356, 357, 360, 363, 354,
- 362, 356, 357, 360, 363, 364, 367, 368, 369, 371, 367, 374, 368,
- 369, 371, 375, 367, 376, 374, 368, 369, 371, 377, 378, 379, 367,
- 374, 368, 369, 371, 367, 376, 374, 368, 369, 371, 367, 376, 374,
- 368, 369, 371, 377, 367, 376, 374, 368, 369, 371, 377, 378, 384,
- 385, 386, 388, 384, 391, 385, 386, 388, 392, 384, 393, 391, 385,
- 386, 388, 394, 395, 396, 384, 391, 385, 386, 388, 384, 393, 391,
- 385, 386, 388, 384, 393, 391, 385, 386, 388, 394, 384, 393, 391,
- 385, 386, 388, 394, 395, 354, 366, 383, 355, 356, 357, 400, 404,
- 410, 406, 407, 408, 409, 406, 407, 408, 411, 415, 419, 423, 427,
- 431, 406, 429, 430, 406, 432, 433, 434, 406, 432, 433, 414, 440,
- 441, 442, 414, 440, 441, 444, 437, 445, 446, 447, 444, 437, 445,
- 444, 437, 445, 446, 229, 225, 226, 450, 451, 229, 225, 226, 452,
- 453, 454, 229, 225, 226, 451, 229, 225, 226, 451, 229, 225, 226,
- 452, 451, 229, 225, 226, 452, 453, 235, 237, 238, 241, 456, 457,
- 235, 237, 238, 241, 458, 459, 460, 457, 235, 237, 238, 241, 457,
- 235, 237, 238, 241, 458, 457, 235, 237, 238, 241, 458, 459, 519,
- 332, 333, 344, 345, 225, 235, 236, 237, 238, 226, 227, 449, 239,
- 455, 162, 175, 186, 202, 214, 402, 403, 435, 107, 108, 119, 120,
- 44, 54, 56, 55, 46, 47, 61, 71, 73, 72, 63, 64, 98, 99, 358, 359,
- 370, 380, 382, 381, 372, 373, 387, 397, 399, 398, 389, 390, };
-
- /** Token literal values. */
- public static final String[] jjstrLiteralImages = { "", null, null, null,
- null, null, null, null, "\74\41\55\55", "\55\55\76", "\173",
- "\175", "\174\75", "\136\75", "\44\75", "\52\75", "\176\75", "\75",
- "\53", "\55", "\54", "\73", "\76", "\176", "\74", "\57", "\133",
- "\135", "\52", "\45", "\46", "\56", "\50", "\51", "\75\75",
- "\174\174", "\46\46", "\41\75", "\72", null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, };
-
- /** Lexer state names. */
- public static final String[] lexStateNames = { "DEFAULT",
- "IN_FORMAL_COMMENT", "IN_MULTI_LINE_COMMENT", };
-
- /** Lex State array. */
- public static final int[] jjnewLexState = { -1, -1, -1, 1, 2, 0, 0, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, };
- static final long[] jjtoToken = { 0xfffe01ffffffff03L, 0xfc01fffffffbffL, };
- static final long[] jjtoSkip = { 0x64L, 0x0L, };
- static final long[] jjtoSpecial = { 0x24L, 0x0L, };
- static final long[] jjtoMore = { 0x98L, 0x0L, };
- protected CharStream input_stream;
- private final int[] jjrounds = new int[522];
- private final int[] jjstateSet = new int[1044];
- private final StringBuilder jjimage = new StringBuilder();
- private StringBuilder image = jjimage;
- private int jjimageLen;
- private int lengthOfMatch;
- protected char curChar;
-
- /** Constructor. */
- public ParserTokenManager(CharStream stream) {
- input_stream = stream;
- }
-
- /** Constructor. */
- public ParserTokenManager(CharStream stream, int lexState) {
- this(stream);
- SwitchTo(lexState);
- }
-
- /** Reinitialise parser. */
- public void ReInit(CharStream stream) {
- jjmatchedPos = jjnewStateCnt = 0;
- curLexState = defaultLexState;
- input_stream = stream;
- ReInitRounds();
- }
-
- private void ReInitRounds() {
- int i;
- jjround = 0x80000001;
- for (i = 522; i-- > 0;) {
- jjrounds[i] = 0x80000000;
- }
- }
-
- /** Reinitialise parser. */
- public void ReInit(CharStream stream, int lexState) {
- ReInit(stream);
- SwitchTo(lexState);
- }
-
- /** Switch to specified lex state. */
- public void SwitchTo(int lexState) {
- if (lexState >= 3 || lexState < 0) {
- throw new TokenMgrError("Error: Ignoring invalid lexical state : "
- + lexState + ". State unchanged.",
- TokenMgrError.INVALID_LEXICAL_STATE);
- } else {
- curLexState = lexState;
- }
- }
-
- protected Token jjFillToken() {
- final Token t;
- final String curTokenImage;
- final int beginLine;
- final int endLine;
- final int beginColumn;
- final int endColumn;
- String im = jjstrLiteralImages[jjmatchedKind];
- curTokenImage = (im == null) ? input_stream.GetImage() : im;
- beginLine = input_stream.getBeginLine();
- beginColumn = input_stream.getBeginColumn();
- endLine = input_stream.getEndLine();
- endColumn = input_stream.getEndColumn();
- t = Token.newToken(jjmatchedKind, curTokenImage);
-
- t.beginLine = beginLine;
- t.endLine = endLine;
- t.beginColumn = beginColumn;
- t.endColumn = endColumn;
-
- return t;
- }
-
- int curLexState = 0;
- int defaultLexState = 0;
- int jjnewStateCnt;
- int jjround;
- int jjmatchedPos;
- int jjmatchedKind;
-
- /** Get the next Token. */
- public Token getNextToken() {
- Token specialToken = null;
- Token matchedToken;
- int curPos = 0;
-
- EOFLoop: for (;;) {
- try {
- curChar = input_stream.BeginToken();
- } catch (java.io.IOException e) {
- jjmatchedKind = 0;
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- return matchedToken;
- }
- image = jjimage;
- image.setLength(0);
- jjimageLen = 0;
-
- for (;;) {
- switch (curLexState) {
- case 0:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_0();
- if (jjmatchedPos == 0 && jjmatchedKind > 119) {
- jjmatchedKind = 119;
- }
- break;
- case 1:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_1();
- if (jjmatchedPos == 0 && jjmatchedKind > 7) {
- jjmatchedKind = 7;
- }
- break;
- case 2:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_2();
- if (jjmatchedPos == 0 && jjmatchedKind > 7) {
- jjmatchedKind = 7;
- }
- break;
- }
- if (jjmatchedKind != 0x7fffffff) {
- if (jjmatchedPos + 1 < curPos) {
- input_stream.backup(curPos - jjmatchedPos - 1);
- }
- if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) {
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- TokenLexicalActions(matchedToken);
- if (jjnewLexState[jjmatchedKind] != -1) {
- curLexState = jjnewLexState[jjmatchedKind];
- }
- return matchedToken;
- } else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) {
- if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) {
- matchedToken = jjFillToken();
- if (specialToken == null) {
- specialToken = matchedToken;
- } else {
- matchedToken.specialToken = specialToken;
- specialToken = (specialToken.next = matchedToken);
- }
- SkipLexicalActions(matchedToken);
- } else {
- SkipLexicalActions(null);
- }
- if (jjnewLexState[jjmatchedKind] != -1) {
- curLexState = jjnewLexState[jjmatchedKind];
- }
- continue EOFLoop;
- }
- MoreLexicalActions();
- if (jjnewLexState[jjmatchedKind] != -1) {
- curLexState = jjnewLexState[jjmatchedKind];
- }
- curPos = 0;
- jjmatchedKind = 0x7fffffff;
- try {
- curChar = input_stream.readChar();
- continue;
- } catch (java.io.IOException e1) {
- }
- }
- int error_line = input_stream.getEndLine();
- int error_column = input_stream.getEndColumn();
- String error_after = null;
- boolean EOFSeen = false;
- try {
- input_stream.readChar();
- input_stream.backup(1);
- } catch (java.io.IOException e1) {
- EOFSeen = true;
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- if (curChar == '\n' || curChar == '\r') {
- error_line++;
- error_column = 0;
- } else {
- error_column++;
- }
- }
- if (!EOFSeen) {
- input_stream.backup(1);
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- }
- throw new TokenMgrError(EOFSeen, curLexState, error_line,
- error_column, error_after, curChar,
- TokenMgrError.LEXICAL_ERROR);
- }
- }
- }
-
- void SkipLexicalActions(Token matchedToken) {
- switch (jjmatchedKind) {
- default:
- break;
- }
- }
-
- void MoreLexicalActions() {
- jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
- switch (jjmatchedKind) {
- case 3:
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- input_stream.backup(1);
- break;
- default:
- break;
- }
- }
-
- void TokenLexicalActions(Token matchedToken) {
- switch (jjmatchedKind) {
- case 1:
- image.append(input_stream.GetSuffix(jjimageLen
- + (lengthOfMatch = jjmatchedPos + 1)));
- image = Parser.SPACE;
- break;
- default:
- break;
- }
- }
-
- private void jjCheckNAdd(int state) {
- if (jjrounds[state] != jjround) {
- jjstateSet[jjnewStateCnt++] = state;
- jjrounds[state] = jjround;
- }
- }
-
- private void jjAddStates(int start, int end) {
- do {
- jjstateSet[jjnewStateCnt++] = jjnextStates[start];
- } while (start++ != end);
- }
+ else
+ error_column++;
+ }
+ if (!EOFSeen) {
+ input_stream.backup(1);
+ error_after = curPos <= 1 ? "" : input_stream.GetImage();
+ }
+ throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+ }
+ }
+}
- private void jjCheckNAddTwoStates(int state1, int state2) {
- jjCheckNAdd(state1);
- jjCheckNAdd(state2);
- }
+void SkipLexicalActions(Token matchedToken)
+{
+ switch(jjmatchedKind)
+ {
+ default :
+ break;
+ }
+}
+void MoreLexicalActions()
+{
+ jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
+ switch(jjmatchedKind)
+ {
+ case 3 :
+ image.append(input_stream.GetSuffix(jjimageLen));
+ jjimageLen = 0;
+ input_stream.backup(1);
+ break;
+ default :
+ break;
+ }
+}
+void TokenLexicalActions(Token matchedToken)
+{
+ switch(jjmatchedKind)
+ {
+ case 1 :
+ image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
+ image = Parser.SPACE;
+ break;
+ default :
+ break;
+ }
+}
+private void jjCheckNAdd(int state)
+{
+ if (jjrounds[state] != jjround)
+ {
+ jjstateSet[jjnewStateCnt++] = state;
+ jjrounds[state] = jjround;
+ }
+}
+private void jjAddStates(int start, int end)
+{
+ do {
+ jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+ } while (start++ != end);
+}
+private void jjCheckNAddTwoStates(int state1, int state2)
+{
+ jjCheckNAdd(state1);
+ jjCheckNAdd(state2);
+}
- private void jjCheckNAddStates(int start, int end) {
- do {
- jjCheckNAdd(jjnextStates[start]);
- } while (start++ != end);
- }
+private void jjCheckNAddStates(int start, int end)
+{
+ do {
+ jjCheckNAdd(jjnextStates[start]);
+ } while (start++ != end);
+}
}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/resolver/AbstractResolver.java b/theme-compiler/src/com/vaadin/sass/internal/resolver/AbstractResolver.java
new file mode 100644
index 0000000000..5de1f95264
--- /dev/null
+++ b/theme-compiler/src/com/vaadin/sass/internal/resolver/AbstractResolver.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.sass.internal.resolver;
+
+import java.io.File;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+import org.w3c.css.sac.InputSource;
+
+import com.vaadin.sass.internal.ScssStylesheet;
+
+/**
+ * Base class for resolvers. Implements functionality for locating paths which
+ * an import can be relative to and helpers for extracting path information from
+ * the identifier.
+ *
+ * @since 7.2
+ * @author Vaadin Ltd
+ */
+public abstract class AbstractResolver implements ScssStylesheetResolver,
+ Serializable {
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.vaadin.sass.internal.resolver.ScssStylesheetResolver#resolve(java
+ * .lang.String)
+ */
+ @Override
+ public InputSource resolve(ScssStylesheet parentStylesheet,
+ String identifier) {
+ // Remove a possible ".scss" suffix
+ identifier = identifier.replaceFirst(".scss$", "");
+
+ List<String> potentialParentPaths = getPotentialParentPaths(
+ parentStylesheet, identifier);
+
+ // remove path from identifier as it has already been added to the
+ // parent path
+ if (identifier.contains("/")) {
+ identifier = identifier.substring(identifier.lastIndexOf("/") + 1);
+ }
+
+ for (String path : potentialParentPaths) {
+ InputSource source = normalizeAndResolve(path + "/" + identifier);
+
+ if (source != null) {
+ return source;
+ }
+
+ // Try to find partial import (_identifier.scss)
+ source = normalizeAndResolve(path + "/_" + identifier);
+
+ if (source != null) {
+ return source;
+ }
+
+ }
+
+ return normalizeAndResolve(identifier);
+ }
+
+ /**
+ * Retrieves the parent paths which should be used while resolving relative
+ * identifiers. By default uses the parent stylesheet location and a
+ * possible absolute path in the identifier.
+ *
+ * @param parentStylesheet
+ * The parent stylesheet or null if there is no parent
+ * @param identifier
+ * The identifier to be resolved
+ * @return a list of paths in which to look for the relative import
+ */
+ protected List<String> getPotentialParentPaths(
+ ScssStylesheet parentStylesheet, String identifier) {
+ List<String> potentialParents = new ArrayList<String>();
+ if (parentStylesheet != null) {
+ potentialParents.add(extractFullPath(
+ parentStylesheet.getDirectory(), identifier));
+ }
+
+ // Identifier can be a full path so extract the path part also as a
+ // potential parent
+ if (identifier.contains("/")) {
+ potentialParents.add(extractFullPath("", identifier));
+ }
+
+ return potentialParents;
+
+ }
+
+ /**
+ * Extracts the full path from the path combined with the identifier
+ *
+ * @param path
+ * The base path
+ * @param identifier
+ * The identifier which may contain a path part, separated by "/"
+ * from the real identifier
+ * @return a normalized version of the path where identifier does not
+ * contain any directory information
+ */
+ protected String extractFullPath(String path, String identifier) {
+ int lastSlashPosition = identifier.lastIndexOf("/");
+ if (lastSlashPosition == -1) {
+ return path;
+ }
+ String identifierPath = identifier.substring(0, lastSlashPosition);
+ if ("".equals(path)) {
+ return identifierPath;
+ } else {
+ return path + "/" + identifierPath;
+ }
+ }
+
+ /**
+ * Resolves the normalized version of the given identifier
+ *
+ * @param identifier
+ * The identifier to resolve
+ * @return An input source if the resolver found one or null otherwise
+ */
+ protected InputSource normalizeAndResolve(String identifier) {
+ String normalized = normalize(identifier);
+ return resolveNormalized(normalized);
+ }
+
+ /**
+ * Resolves the identifier after it has been normalized using
+ * {@link #normalize(String)}.
+ *
+ * @param identifier
+ * The normalized identifier
+ * @return an InputSource if the resolver found a source or null otherwise
+ */
+ protected abstract InputSource resolveNormalized(String identifier);
+
+ /**
+ * Normalizes "." and ".." from the path string where parent path segments
+ * can be removed. Preserve leading "..". Also ensure / is used instead of \
+ * in all places.
+ *
+ * @param path
+ * A relative or absolute file path
+ * @return The normalized path
+ */
+ protected String normalize(String path) {
+
+ // Ensure only "/" is used, also in Windows
+ path = path.replace(File.separatorChar, '/');
+
+ // Split into segments
+ String[] segments = path.split("/");
+ Stack<String> result = new Stack<String>();
+
+ // Replace '.' and '..' segments
+ for (int i = 0; i < segments.length; i++) {
+ if (segments[i].equals(".")) {
+ // Segments marked '.' are ignored
+
+ } else if (segments[i].equals("..") && !result.isEmpty()
+ && !result.lastElement().equals("..")) {
+ // If segment is ".." then remove the previous iff the previous
+ // element is not a ".." and the result stack is not empty
+ result.pop();
+ } else {
+ // Other segments are just added to the stack
+ result.push(segments[i]);
+ }
+ }
+
+ // Reconstruct path
+ StringBuilder pathBuilder = new StringBuilder();
+ for (int i = 0; i < result.size(); i++) {
+ if (i > 0) {
+ pathBuilder.append("/");
+ }
+ pathBuilder.append(result.get(i));
+ }
+ return pathBuilder.toString();
+ }
+
+}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/resolver/ClassloaderResolver.java b/theme-compiler/src/com/vaadin/sass/internal/resolver/ClassloaderResolver.java
index 8711a0a3e9..755073bc4c 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/resolver/ClassloaderResolver.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/resolver/ClassloaderResolver.java
@@ -15,31 +15,19 @@
*/
package com.vaadin.sass.internal.resolver;
-import java.io.File;
import java.io.InputStream;
import org.w3c.css.sac.InputSource;
-public class ClassloaderResolver implements ScssStylesheetResolver {
+public class ClassloaderResolver extends AbstractResolver {
@Override
- public InputSource resolve(String identifier) {
- // identifier should not have .scss, fileName should
- String ext = ".scss";
- if (identifier.endsWith(".css")) {
- ext = ".css";
- }
+ public InputSource resolveNormalized(String identifier) {
String fileName = identifier;
- if (identifier.endsWith(ext)) {
- identifier = identifier.substring(0,
- identifier.length() - ext.length());
- } else {
- fileName = fileName + ext;
+ if (!fileName.endsWith(".css")) {
+ fileName += ".scss";
}
- // Ensure only "/" is used, also in Windows
- fileName = fileName.replace(File.separatorChar, '/');
-
// Filename should be a relative path starting with VAADIN/...
int vaadinIdx = fileName.lastIndexOf("VAADIN/");
if (vaadinIdx > -1) {
diff --git a/theme-compiler/src/com/vaadin/sass/internal/resolver/FilesystemResolver.java b/theme-compiler/src/com/vaadin/sass/internal/resolver/FilesystemResolver.java
index 9bb1969ab1..786d0875da 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/resolver/FilesystemResolver.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/resolver/FilesystemResolver.java
@@ -18,24 +18,46 @@ package com.vaadin.sass.internal.resolver;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
+import java.util.List;
import org.w3c.css.sac.InputSource;
-public class FilesystemResolver implements ScssStylesheetResolver {
+import com.vaadin.sass.internal.ScssStylesheet;
+public class FilesystemResolver extends AbstractResolver {
+
+ private String[] customPaths = null;
+
+ public FilesystemResolver(String... customPaths) {
+ this.customPaths = customPaths;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.vaadin.sass.internal.resolver.AbstractResolver#getPotentialPaths(
+ * com.vaadin.sass.internal.ScssStylesheet, java.lang.String)
+ */
@Override
- public InputSource resolve(String identifier) {
- // identifier should not have .scss, fileName should
- String ext = ".scss";
- if (identifier.endsWith(".css")) {
- ext = ".css";
+ protected List<String> getPotentialParentPaths(
+ ScssStylesheet parentStyleSheet, String identifier) {
+ List<String> potentialPaths = super.getPotentialParentPaths(
+ parentStyleSheet, identifier);
+ if (customPaths != null) {
+ for (String path : customPaths) {
+ potentialPaths.add(extractFullPath(path, identifier));
+ }
}
+
+ return potentialPaths;
+ }
+
+ @Override
+ public InputSource resolveNormalized(String identifier) {
String fileName = identifier;
- if (identifier.endsWith(ext)) {
- identifier = identifier.substring(0,
- identifier.length() - ext.length());
- } else {
- fileName = fileName + ext;
+ if (!fileName.endsWith(".css")) {
+ fileName += ".scss";
}
try {
diff --git a/theme-compiler/src/com/vaadin/sass/internal/resolver/ScssStylesheetResolver.java b/theme-compiler/src/com/vaadin/sass/internal/resolver/ScssStylesheetResolver.java
index 45f10836a3..64b3d10d88 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/resolver/ScssStylesheetResolver.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/resolver/ScssStylesheetResolver.java
@@ -17,6 +17,8 @@ package com.vaadin.sass.internal.resolver;
import org.w3c.css.sac.InputSource;
+import com.vaadin.sass.internal.ScssStylesheet;
+
public interface ScssStylesheetResolver {
/**
* Called with the "identifier" of a stylesheet that the resolver should try
@@ -26,9 +28,12 @@ public interface ScssStylesheetResolver {
* stylesheet was found, e.g "runo.scss" might result in a URI like
* "VAADIN/themes/runo/runo.scss".
*
+ * @param parentStylesheet
+ * The parent style sheet
* @param identifier
* used fo find stylesheet
* @return InputSource for stylesheet (with URI set) or null if not found
*/
- public InputSource resolve(String identifier);
+ public InputSource resolve(ScssStylesheet parentStylesheet,
+ String identifier);
} \ No newline at end of file
diff --git a/theme-compiler/src/com/vaadin/sass/internal/resolver/VaadinResolver.java b/theme-compiler/src/com/vaadin/sass/internal/resolver/VaadinResolver.java
deleted file mode 100644
index fec16a54c8..0000000000
--- a/theme-compiler/src/com/vaadin/sass/internal/resolver/VaadinResolver.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2000-2013 Vaadin Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.vaadin.sass.internal.resolver;
-
-import java.io.File;
-import java.util.Stack;
-
-import org.w3c.css.sac.InputSource;
-
-public class VaadinResolver implements ScssStylesheetResolver {
-
- @Override
- public InputSource resolve(String identifier) {
-
- // Remove extra "." and ".."
- identifier = normalize(identifier);
-
- InputSource source = null;
-
- // Can we find the scss from the file system?
- ScssStylesheetResolver resolver = new FilesystemResolver();
- source = resolver.resolve(identifier);
-
- if (source == null) {
- // How about the classpath?
- resolver = new ClassloaderResolver();
- source = resolver.resolve(identifier);
- }
-
- return source;
- }
-
- /**
- * Normalizes "." and ".." from the path string where parent path segments
- * can be removed. Preserve leading "..".
- *
- * @param path
- * A relative or absolute file path
- * @return The normalized path
- */
- private static String normalize(String path) {
-
- // Ensure only "/" is used, also in Windows
- path = path.replace(File.separatorChar, '/');
-
- // Split into segments
- String[] segments = path.split("/");
- Stack<String> result = new Stack<String>();
-
- // Replace '.' and '..' segments
- for (int i = 0; i < segments.length; i++) {
- if (segments[i].equals(".")) {
- // Segments marked '.' are ignored
-
- } else if (segments[i].equals("..") && !result.isEmpty()
- && !result.lastElement().equals("..")) {
- // If segment is ".." then remove the previous iff the previous
- // element is not a ".." and the result stack is not empty
- result.pop();
- } else {
- // Other segments are just added to the stack
- result.push(segments[i]);
- }
- }
-
- // Reconstruct path
- StringBuilder pathBuilder = new StringBuilder();
- for (int i = 0; i < result.size(); i++) {
- if (i > 0) {
- pathBuilder.append("/");
- }
- pathBuilder.append(result.get(i));
- }
- return pathBuilder.toString();
- }
-
-}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/tree/BlockNode.java b/theme-compiler/src/com/vaadin/sass/internal/tree/BlockNode.java
index 4b364168cf..6ce67a3abd 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/tree/BlockNode.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/tree/BlockNode.java
@@ -80,7 +80,8 @@ public class BlockNode extends Node implements IVariableNode {
String interpolation = "#{$" + var.getName() + "}";
if (selector.contains(interpolation)) {
String replace = selector.replace(interpolation, var
- .getExpr().toString());
+ .getExpr().unquotedString());
+
selectorList.add(selectorList.indexOf(selector), replace);
selectorList.remove(selector);
}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/tree/KeyframesNode.java b/theme-compiler/src/com/vaadin/sass/internal/tree/KeyframesNode.java
index af4fec1ec3..b5e7491639 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/tree/KeyframesNode.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/tree/KeyframesNode.java
@@ -54,7 +54,8 @@ public class KeyframesNode extends Node implements IVariableNode {
if (animationName != null && animationName.contains(interpolation)) {
if (animationName.contains(interpolation)) {
animationName = animationName.replaceAll(Pattern
- .quote(interpolation), node.getExpr().toString());
+ .quote(interpolation), node.getExpr()
+ .unquotedString());
}
}
}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/tree/RuleNode.java b/theme-compiler/src/com/vaadin/sass/internal/tree/RuleNode.java
index 19880e4ce5..cc6dbb7b75 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/tree/RuleNode.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/tree/RuleNode.java
@@ -91,7 +91,8 @@ public class RuleNode extends Node implements IVariableNode {
if (variable != null && variable.contains(interpolation)) {
variable = variable.replaceAll(Pattern.quote(interpolation),
- node.getExpr().toString());
+ node.getExpr().unquotedString());
+
}
if (value.getLexicalUnitType() == LexicalUnitImpl.SAC_FUNCTION) {
@@ -120,7 +121,7 @@ public class RuleNode extends Node implements IVariableNode {
.getValue()
.toString()
.replaceAll(Pattern.quote(interpolation),
- node.getExpr().toString()));
+ node.getExpr().unquotedString()));
}
current = current.getNextLexicalUnit();
}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/visitor/ImportNodeHandler.java b/theme-compiler/src/com/vaadin/sass/internal/visitor/ImportNodeHandler.java
index 87c7cadcf8..e52767bb5a 100644
--- a/theme-compiler/src/com/vaadin/sass/internal/visitor/ImportNodeHandler.java
+++ b/theme-compiler/src/com/vaadin/sass/internal/visitor/ImportNodeHandler.java
@@ -16,7 +16,6 @@
package com.vaadin.sass.internal.visitor;
-import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
@@ -57,21 +56,9 @@ public class ImportNodeHandler {
ImportNode importNode = (ImportNode) n;
if (!importNode.isPureCssImport()) {
try {
- StringBuilder filePathBuilder = new StringBuilder(
- styleSheet.getDirectory());
- filePathBuilder.append(File.separatorChar).append(
- importNode.getUri());
- if (!filePathBuilder.toString().endsWith(".scss")) {
- filePathBuilder.append(".scss");
- }
-
// set parent's charset to imported node.
ScssStylesheet imported = ScssStylesheet.get(
- filePathBuilder.toString(),
- styleSheet.getCharset());
- if (imported == null) {
- imported = ScssStylesheet.get(importNode.getUri());
- }
+ importNode.getUri(), styleSheet);
if (imported == null) {
throw new FileNotFoundException("Import '"
+ importNode.getUri() + "' in '"
diff --git a/theme-compiler/tests/resources/automatic/css/at-directive-in-if.css b/theme-compiler/tests/resources/automatic/css/at-directive-in-if.css
new file mode 100644
index 0000000000..80d4821ead
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/css/at-directive-in-if.css
@@ -0,0 +1 @@
+@font-face {} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/css/fontface-in-mixin_new.css b/theme-compiler/tests/resources/automatic/css/fontface-in-mixin_new.css
new file mode 100644
index 0000000000..cb842a647d
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/css/fontface-in-mixin_new.css
@@ -0,0 +1,9 @@
+p {
+ @font-face {
+ font-family: "vdebugfont";
+ src: url('fonts/font.eot');
+ src: url('fonts/font.eot?#iefix') format("embedded-opentype"), url('fonts/font.woff') format("woff"), url('fonts/font.ttf') format("truetype"), url('fonts/font.svg#fontawesome') format("svg");
+ font-weight: normal;
+ font-style: normal;
+}
+}
diff --git a/theme-compiler/tests/resources/automatic/css/functions/abs.css b/theme-compiler/tests/resources/automatic/css/functions/abs.css
new file mode 100644
index 0000000000..3c43804a13
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/css/functions/abs.css
@@ -0,0 +1,11 @@
+.foo {
+ a: 0;
+ b: 12.51;
+ c: 1.1px;
+ d: 12;
+ e: 12px;
+ f: 12.9999;
+ g: 12.9999em;
+ h: 13.0001;
+ i: 13.0001%;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/css/functions/ceil.css b/theme-compiler/tests/resources/automatic/css/functions/ceil.css
new file mode 100644
index 0000000000..9956ff3612
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/css/functions/ceil.css
@@ -0,0 +1,11 @@
+.foo {
+ a: 0;
+ b: -12;
+ c: -1px;
+ d: 12;
+ e: 12px;
+ f: 13;
+ g: 13em;
+ h: 14;
+ i: 14%;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/css/functions/floor.css b/theme-compiler/tests/resources/automatic/css/functions/floor.css
new file mode 100644
index 0000000000..f96e99d809
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/css/functions/floor.css
@@ -0,0 +1,11 @@
+.foo {
+ a: 0;
+ b: -13;
+ c: -2px;
+ d: 12;
+ e: 12px;
+ f: 12;
+ g: 12em;
+ h: 13;
+ i: 13%;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/css/functions/round.css b/theme-compiler/tests/resources/automatic/css/functions/round.css
new file mode 100644
index 0000000000..72d9a8596d
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/css/functions/round.css
@@ -0,0 +1,11 @@
+.foo {
+ a: 0;
+ b: -13;
+ c: -1px;
+ d: 12;
+ e: 12px;
+ f: 13;
+ g: 13em;
+ h: 13;
+ i: 13%;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/css/interpolation-singlequote.css b/theme-compiler/tests/resources/automatic/css/interpolation-singlequote.css
new file mode 100644
index 0000000000..58c6a3d37a
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/css/interpolation-singlequote.css
@@ -0,0 +1 @@
+body { background-color: white; } \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/css/mixin-content-parameters.css b/theme-compiler/tests/resources/automatic/css/mixin-content-parameters.css
new file mode 100644
index 0000000000..ddae1ed036
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/css/mixin-content-parameters.css
@@ -0,0 +1,2 @@
+foo {
+ lorem: ipsum; } \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/css/mixin-keyframes.css b/theme-compiler/tests/resources/automatic/css/mixin-keyframes.css
new file mode 100644
index 0000000000..c1f2ccd6c0
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/css/mixin-keyframes.css
@@ -0,0 +1,10 @@
+@-webkit-keyframes fade-in {
+ 0% { opacity: 0; }
+ 20% , 50%,100% { opacity: 1; }
+ 30%, 75% { opacity: 0; }
+}
+@-moz-keyframes fade-in {
+ 0% { opacity: 0; }
+ 20% , 50%,100% { opacity: 1; }
+ 30%, 75% { opacity: 0; }
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/css/negative-ch-value.css b/theme-compiler/tests/resources/automatic/css/negative-ch-value.css
new file mode 100644
index 0000000000..2cc75b2a6d
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/css/negative-ch-value.css
@@ -0,0 +1,3 @@
+* {
+ top: -0.1ch;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/scss/at-directive-in-if.scss b/theme-compiler/tests/resources/automatic/scss/at-directive-in-if.scss
new file mode 100644
index 0000000000..30556fb382
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/scss/at-directive-in-if.scss
@@ -0,0 +1,8 @@
+@mixin test($italic: true) {
+ @if $italic {
+ @font-face {
+ }
+ }
+}
+
+@include test; \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/scss/fontface-in-mixin_new.scss b/theme-compiler/tests/resources/automatic/scss/fontface-in-mixin_new.scss
new file mode 100644
index 0000000000..22356f724e
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/scss/fontface-in-mixin_new.scss
@@ -0,0 +1,17 @@
+@mixin debug-globals {
+ @font-face {
+ font-family: 'vdebugfont';
+ src:url('fonts/font.eot');
+ src:url('fonts/font.eot?#iefix') format('embedded-opentype'),
+ url('fonts/font.woff') format('woff'),
+ url('fonts/font.ttf') format('truetype'),
+ url('fonts/font.svg#fontawesome') format('svg');
+ font-weight: normal;
+ font-style: normal;
+ }
+
+}
+
+p {
+ @include debug-globals;
+}
diff --git a/theme-compiler/tests/resources/automatic/scss/foo/bar.scss b/theme-compiler/tests/resources/automatic/scss/foo/_bar.scss
index 326d34232d..326d34232d 100644
--- a/theme-compiler/tests/resources/automatic/scss/foo/bar.scss
+++ b/theme-compiler/tests/resources/automatic/scss/foo/_bar.scss
diff --git a/theme-compiler/tests/resources/automatic/scss/functions/abs.scss b/theme-compiler/tests/resources/automatic/scss/functions/abs.scss
new file mode 100644
index 0000000000..91946f0556
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/scss/functions/abs.scss
@@ -0,0 +1,11 @@
+.foo {
+a: abs(0);
+b: abs(-12.51);
+c: abs(-1.1px);
+d: abs(12);
+e: abs(12px);
+f: abs(12.9999);
+g: abs(12.9999em);
+h: abs(-13.0001);
+i: abs(-13.0001%);
+}
diff --git a/theme-compiler/tests/resources/automatic/scss/functions/ceil.scss b/theme-compiler/tests/resources/automatic/scss/functions/ceil.scss
new file mode 100644
index 0000000000..ad7ceed4b4
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/scss/functions/ceil.scss
@@ -0,0 +1,11 @@
+.foo {
+a: ceil(0);
+b: ceil(-12.51);
+c: ceil(-1.1px);
+d: ceil(12);
+e: ceil(12px);
+f: ceil(12.9999);
+g: ceil(12.9999em);
+h: ceil(13.000001);
+i: ceil(13.000001%);
+}
diff --git a/theme-compiler/tests/resources/automatic/scss/functions/floor.scss b/theme-compiler/tests/resources/automatic/scss/functions/floor.scss
new file mode 100644
index 0000000000..a10f1b4fc1
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/scss/functions/floor.scss
@@ -0,0 +1,11 @@
+.foo {
+a: floor(0);
+b: floor(-12.51);
+c: floor(-1.1px);
+d: floor(12);
+e: floor(12px);
+f: floor(12.9999);
+g: floor(12.9999em);
+h: floor(13.000001);
+i: floor(13.000001%);
+}
diff --git a/theme-compiler/tests/resources/automatic/scss/functions/round.scss b/theme-compiler/tests/resources/automatic/scss/functions/round.scss
new file mode 100644
index 0000000000..3f1fa06aec
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/scss/functions/round.scss
@@ -0,0 +1,11 @@
+.foo {
+a: round(0);
+b: round(-12.51);
+c: round(-1.1px);
+d: round(12);
+e: round(12px);
+f: round(12.9999);
+g: round(12.9999em);
+h: round(13.000001);
+i: round(13.000001%);
+}
diff --git a/theme-compiler/tests/resources/automatic/scss/import-file-which-contains-comment-in-last-line.scss b/theme-compiler/tests/resources/automatic/scss/import-file-which-contains-comment-in-last-line.scss
index 41adc908ed..8292d4efe3 100644
--- a/theme-compiler/tests/resources/automatic/scss/import-file-which-contains-comment-in-last-line.scss
+++ b/theme-compiler/tests/resources/automatic/scss/import-file-which-contains-comment-in-last-line.scss
@@ -1,4 +1,4 @@
-@import "to-be-imported/imported-file-contains-comments-in-last-line.scss";
+@import "to-be-imported/_imported-file-contains-comments-in-last-line.scss";
.foo{
foo: $foo;
} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/scss/interpolation-singlequote.scss b/theme-compiler/tests/resources/automatic/scss/interpolation-singlequote.scss
new file mode 100644
index 0000000000..4cdd7bf165
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/scss/interpolation-singlequote.scss
@@ -0,0 +1,7 @@
+@mixin bgcolor ($name, $color) {
+ #{$name}{
+ background-color: $color;
+ }
+}
+
+@include bgcolor('body', white);
diff --git a/theme-compiler/tests/resources/automatic/scss/mixin-content-parameters.scss b/theme-compiler/tests/resources/automatic/scss/mixin-content-parameters.scss
new file mode 100644
index 0000000000..dc64ddf6f8
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/scss/mixin-content-parameters.scss
@@ -0,0 +1,9 @@
+@mixin test($foo) {
+ #{$foo} {
+ @content;
+ }
+}
+
+@include test("foo") {
+ lorem: ipsum;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/scss/mixin-keyframes.scss b/theme-compiler/tests/resources/automatic/scss/mixin-keyframes.scss
new file mode 100644
index 0000000000..931d102e3f
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/scss/mixin-keyframes.scss
@@ -0,0 +1,14 @@
+@mixin keyframes ($name) {
+ @-webkit-keyframes #{$name} {
+ @content;
+ }
+ @-moz-keyframes #{$name} {
+ @content;
+ }
+}
+
+@include keyframes("fade-in") {
+ 0% {opacity: 0;}
+ 20% , 50%,100%{opacity: 1;}
+ 30%, 75% {opacity: 0;}
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/scss/negative-ch-value.scss b/theme-compiler/tests/resources/automatic/scss/negative-ch-value.scss
new file mode 100644
index 0000000000..2cc75b2a6d
--- /dev/null
+++ b/theme-compiler/tests/resources/automatic/scss/negative-ch-value.scss
@@ -0,0 +1,3 @@
+* {
+ top: -0.1ch;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/scss/nested-import.scss b/theme-compiler/tests/resources/automatic/scss/nested-import.scss
index 605d64a13a..df720a5584 100644
--- a/theme-compiler/tests/resources/automatic/scss/nested-import.scss
+++ b/theme-compiler/tests/resources/automatic/scss/nested-import.scss
@@ -1,3 +1,3 @@
.foo {
- @import "foo/bar.scss";
+ @import "foo/_bar.scss";
} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/scss/to-be-imported/imported-file-contains-comments-in-last-line.scss b/theme-compiler/tests/resources/automatic/scss/to-be-imported/_imported-file-contains-comments-in-last-line.scss
index 16244f2bfd..16244f2bfd 100644
--- a/theme-compiler/tests/resources/automatic/scss/to-be-imported/imported-file-contains-comments-in-last-line.scss
+++ b/theme-compiler/tests/resources/automatic/scss/to-be-imported/_imported-file-contains-comments-in-last-line.scss
diff --git a/theme-compiler/tests/resources/automatic/scss/url-path.scss b/theme-compiler/tests/resources/automatic/scss/url-path.scss
index 0cc954bfb4..6903d389b5 100644
--- a/theme-compiler/tests/resources/automatic/scss/url-path.scss
+++ b/theme-compiler/tests/resources/automatic/scss/url-path.scss
@@ -1 +1 @@
-@import "foo/bar.scss"; \ No newline at end of file
+@import "foo/_bar.scss"; \ No newline at end of file
diff --git a/theme-compiler/tests/resources/automatic/scss/utf8-imported/to-be-imported-scss-file-contains-utf8.scss b/theme-compiler/tests/resources/automatic/scss/utf8-imported/_to-be-imported-scss-file-contains-utf8.scss
index f8a08a4a96..f8a08a4a96 100644
--- a/theme-compiler/tests/resources/automatic/scss/utf8-imported/to-be-imported-scss-file-contains-utf8.scss
+++ b/theme-compiler/tests/resources/automatic/scss/utf8-imported/_to-be-imported-scss-file-contains-utf8.scss
diff --git a/theme-compiler/tests/resources/automatic/scss/utf8.scss b/theme-compiler/tests/resources/automatic/scss/utf8.scss
index b568674073..251d6e6513 100644
--- a/theme-compiler/tests/resources/automatic/scss/utf8.scss
+++ b/theme-compiler/tests/resources/automatic/scss/utf8.scss
@@ -1,4 +1,4 @@
@charset "UTF-8";
-@import "utf8-imported/to-be-imported-scss-file-contains-utf8";
+@import "utf8-imported/_to-be-imported-scss-file-contains-utf8";
.bar {content: "\1f4c5";}
.raw_utf {content: "📈";} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/css/compass-import.css b/theme-compiler/tests/resources/css/compass-import.css
new file mode 100644
index 0000000000..e3d4b5fcca
--- /dev/null
+++ b/theme-compiler/tests/resources/css/compass-import.css
@@ -0,0 +1,49 @@
+.content-navigation {
+ border-color: #3bbfce;
+ color: #0000ff;
+}
+
+.border {
+ padding: 8px;
+ margin: 8px;
+ border-color: #3bbfce;
+}
+
+.body {
+ background-image: url(compass/folder-test2/bg.png);
+ background: transparent url(compass/folder-test2/img/loading-indicator.gif);
+ background-image: url(http://abc/bg.png);
+ background-image: url(/abc/bg.png);
+}
+
+.base {
+ color: red;
+}
+
+.text {
+ font-weight: bold;
+}
+
+.footer {
+ border: 2px solid black;
+ -webkit-border-radius: 10px;
+ -moz-border-radius: 10px;
+ border-radius: 10px;
+}
+
+.banner {
+ border: 1px solid black;
+ font-color: red;
+}
+
+.interpolation-test {
+ font-size: 14px;
+}
+
+.header {
+ width: 100%;
+}
+
+.badError {
+ border-width: 3px;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/sasslang/css/100-test_optional_extend_does_not_warn_when_extension_fails.css b/theme-compiler/tests/resources/sasslangbroken/css/100-test_optional_extend_does_not_warn_when_extension_fails.css
index 29116d880b..29116d880b 100644
--- a/theme-compiler/tests/resources/sasslang/css/100-test_optional_extend_does_not_warn_when_extension_fails.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/100-test_optional_extend_does_not_warn_when_extension_fails.css
diff --git a/theme-compiler/tests/resources/sasslang/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css b/theme-compiler/tests/resources/sasslangbroken/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css
index 77b7586abb..77b7586abb 100644
--- a/theme-compiler/tests/resources/sasslang/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.css
diff --git a/theme-compiler/tests/resources/sasslang/css/36-test_extend_self_loop.css b/theme-compiler/tests/resources/sasslangbroken/css/36-test_extend_self_loop.css
index 234d524066..234d524066 100644
--- a/theme-compiler/tests/resources/sasslang/css/36-test_extend_self_loop.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/36-test_extend_self_loop.css
diff --git a/theme-compiler/tests/resources/sasslang/css/37-test_extend_warns_when_extendee_doesnt_exist.css b/theme-compiler/tests/resources/sasslangbroken/css/37-test_extend_warns_when_extendee_doesnt_exist.css
index 8b13789179..8b13789179 100644
--- a/theme-compiler/tests/resources/sasslang/css/37-test_extend_warns_when_extendee_doesnt_exist.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/37-test_extend_warns_when_extendee_doesnt_exist.css
diff --git a/theme-compiler/tests/resources/sasslang/css/38-test_extend_warns_when_extension_fails.css b/theme-compiler/tests/resources/sasslangbroken/css/38-test_extend_warns_when_extension_fails.css
index 29116d880b..29116d880b 100644
--- a/theme-compiler/tests/resources/sasslang/css/38-test_extend_warns_when_extension_fails.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/38-test_extend_warns_when_extension_fails.css
diff --git a/theme-compiler/tests/resources/sasslang/css/57-test_long_extendee_requires_all_selectors.css b/theme-compiler/tests/resources/sasslangbroken/css/57-test_long_extendee_requires_all_selectors.css
index 234d524066..234d524066 100644
--- a/theme-compiler/tests/resources/sasslang/css/57-test_long_extendee_requires_all_selectors.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/57-test_long_extendee_requires_all_selectors.css
diff --git a/theme-compiler/tests/resources/sasslang/css/60-test_long_extender_aborts_unification.css b/theme-compiler/tests/resources/sasslangbroken/css/60-test_long_extender_aborts_unification.css
index 18bc24e7cd..18bc24e7cd 100644
--- a/theme-compiler/tests/resources/sasslang/css/60-test_long_extender_aborts_unification.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/60-test_long_extender_aborts_unification.css
diff --git a/theme-compiler/tests/resources/sasslang/css/71-test_nested_extender_aborts_unification.css b/theme-compiler/tests/resources/sasslangbroken/css/71-test_nested_extender_aborts_unification.css
index 2337e9af40..2337e9af40 100644
--- a/theme-compiler/tests/resources/sasslang/css/71-test_nested_extender_aborts_unification.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/71-test_nested_extender_aborts_unification.css
diff --git a/theme-compiler/tests/resources/sasslang/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css b/theme-compiler/tests/resources/sasslangbroken/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css
index 09b4ccac27..09b4ccac27 100644
--- a/theme-compiler/tests/resources/sasslang/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css
diff --git a/theme-compiler/tests/resources/sasslang/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css b/theme-compiler/tests/resources/sasslangbroken/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css
index 8b13789179..8b13789179 100644
--- a/theme-compiler/tests/resources/sasslang/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css
+++ b/theme-compiler/tests/resources/sasslangbroken/css/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.css
diff --git a/theme-compiler/tests/resources/sasslang/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss b/theme-compiler/tests/resources/sasslangbroken/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss
index 6d707236f2..6d707236f2 100644
--- a/theme-compiler/tests/resources/sasslang/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/100-test_optional_extend_does_not_warn_when_extension_fails.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss b/theme-compiler/tests/resources/sasslangbroken/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss
index 713644b221..713644b221 100644
--- a/theme-compiler/tests/resources/sasslang/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/34-test_extend_redundancy_elimination_when_it_would_preserve_specificity.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/36-test_extend_self_loop.scss b/theme-compiler/tests/resources/sasslangbroken/scss/36-test_extend_self_loop.scss
index ac40f00573..ac40f00573 100644
--- a/theme-compiler/tests/resources/sasslang/scss/36-test_extend_self_loop.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/36-test_extend_self_loop.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss b/theme-compiler/tests/resources/sasslangbroken/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss
index cd54108c97..cd54108c97 100644
--- a/theme-compiler/tests/resources/sasslang/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/37-test_extend_warns_when_extendee_doesnt_exist.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/38-test_extend_warns_when_extension_fails.scss b/theme-compiler/tests/resources/sasslangbroken/scss/38-test_extend_warns_when_extension_fails.scss
index 8381c7279a..8381c7279a 100644
--- a/theme-compiler/tests/resources/sasslang/scss/38-test_extend_warns_when_extension_fails.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/38-test_extend_warns_when_extension_fails.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/57-test_long_extendee_requires_all_selectors.scss b/theme-compiler/tests/resources/sasslangbroken/scss/57-test_long_extendee_requires_all_selectors.scss
index 011d26a83e..011d26a83e 100644
--- a/theme-compiler/tests/resources/sasslang/scss/57-test_long_extendee_requires_all_selectors.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/57-test_long_extendee_requires_all_selectors.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/60-test_long_extender_aborts_unification.scss b/theme-compiler/tests/resources/sasslangbroken/scss/60-test_long_extender_aborts_unification.scss
index 5238f3f93e..5238f3f93e 100644
--- a/theme-compiler/tests/resources/sasslang/scss/60-test_long_extender_aborts_unification.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/60-test_long_extender_aborts_unification.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/71-test_nested_extender_aborts_unification.scss b/theme-compiler/tests/resources/sasslangbroken/scss/71-test_nested_extender_aborts_unification.scss
index bcbb6e181d..bcbb6e181d 100644
--- a/theme-compiler/tests/resources/sasslang/scss/71-test_nested_extender_aborts_unification.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/71-test_nested_extender_aborts_unification.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss b/theme-compiler/tests/resources/sasslangbroken/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss
index 73f6254f21..73f6254f21 100644
--- a/theme-compiler/tests/resources/sasslang/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss
diff --git a/theme-compiler/tests/resources/sasslang/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss b/theme-compiler/tests/resources/sasslangbroken/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss
index 551764036f..551764036f 100644
--- a/theme-compiler/tests/resources/sasslang/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss
+++ b/theme-compiler/tests/resources/sasslangbroken/scss/99-test_optional_extend_does_not_warn_when_extendee_doesnt_exist.scss
diff --git a/theme-compiler/tests/resources/scss/compass-test/compass-import.scss b/theme-compiler/tests/resources/scss/compass-test/compass-import.scss
new file mode 100644
index 0000000000..36d041b33c
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test/compass-import.scss
@@ -0,0 +1,4 @@
+@import "compass";
+.badError {
+ border-width: 3px;
+}
diff --git a/theme-compiler/tests/resources/scss/compass-test2/_compass.scss b/theme-compiler/tests/resources/scss/compass-test2/_compass.scss
new file mode 100644
index 0000000000..9b741c0f03
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/_compass.scss
@@ -0,0 +1,3 @@
+@import "compass/utilities";
+@import "compass/typography";
+@import "compass/css3";
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass-import2.scss b/theme-compiler/tests/resources/scss/compass-test2/compass-import2.scss
new file mode 100644
index 0000000000..36d041b33c
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass-import2.scss
@@ -0,0 +1,4 @@
+@import "compass";
+.badError {
+ border-width: 3px;
+}
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/_css3.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/_css3.scss
new file mode 100644
index 0000000000..42163ba193
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/_css3.scss
@@ -0,0 +1,3 @@
+@import "css3/border-radius";
+@import "css3/inline-block";
+@import "css3/opacity";
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/_typography.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/_typography.scss
new file mode 100644
index 0000000000..a65c1ff292
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/_typography.scss
@@ -0,0 +1,3 @@
+@import "typography/links";
+@import "typography/lists";
+@import "typography/text";
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/_utilities.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/_utilities.scss
new file mode 100644
index 0000000000..644ad3368b
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/_utilities.scss
@@ -0,0 +1,3 @@
+@import "utilities/color";
+@import "utilities/general";
+@import "utilities/sprites";
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_border-radius.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_border-radius.scss
new file mode 100644
index 0000000000..752003104b
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_border-radius.scss
@@ -0,0 +1,4 @@
+.banner {
+ border: 1px solid black;
+ font-color: red;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_inline-block.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_inline-block.scss
new file mode 100644
index 0000000000..3fefab83b2
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_inline-block.scss
@@ -0,0 +1,3 @@
+.interpolation-test {
+ font-size: 14px;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_opacity.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_opacity.scss
new file mode 100644
index 0000000000..f6bf34fe24
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/css3/_opacity.scss
@@ -0,0 +1,3 @@
+.header {
+ width: 100%;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_links.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_links.scss
new file mode 100644
index 0000000000..bc7318558e
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_links.scss
@@ -0,0 +1,3 @@
+.base {
+ color: red;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_lists.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_lists.scss
new file mode 100644
index 0000000000..af174b7095
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_lists.scss
@@ -0,0 +1,3 @@
+.text {
+ font-weight: bold;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_text.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_text.scss
new file mode 100644
index 0000000000..8239527f7b
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/typography/_text.scss
@@ -0,0 +1,6 @@
+.footer {
+ border: 2px solid black;
+ -webkit-border-radius: 10px;
+ -moz-border-radius: 10px;
+ border-radius: 10px;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_color.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_color.scss
new file mode 100644
index 0000000000..ea1b7a55f0
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_color.scss
@@ -0,0 +1,4 @@
+.content-navigation {
+ border-color: #3bbfce;
+ color: #0000ff;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_general.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_general.scss
new file mode 100644
index 0000000000..0c58c6433d
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_general.scss
@@ -0,0 +1,5 @@
+.border {
+ padding: 8px;
+ margin: 8px;
+ border-color: #3bbfce;
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_sprites.scss b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_sprites.scss
new file mode 100644
index 0000000000..28960f89fc
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/compass/utilities/_sprites.scss
@@ -0,0 +1,6 @@
+.body {
+ background-image: url(../folder-test2/bg.png);
+ background: transparent url(../folder-test2/img/loading-indicator.gif);
+ background-image: url(http://abc/bg.png);
+ background-image: url(/abc/bg.png);
+} \ No newline at end of file
diff --git a/theme-compiler/tests/resources/scss/compass-test2/license-readme.txt b/theme-compiler/tests/resources/scss/compass-test2/license-readme.txt
new file mode 100644
index 0000000000..90ba808179
--- /dev/null
+++ b/theme-compiler/tests/resources/scss/compass-test2/license-readme.txt
@@ -0,0 +1,26 @@
+The design here is to use the stylesheets located at:
+https://github com/chriseppstein/compass/tree/stable/frameworks/compass/stylesheets
+
+and update the VAADIN code to be able to read them in such that an existing JRuby implementation can be replaced with VAADIN without any changes to one's *.scss and *.css files.
+
+The current short snippets of SCSS that are included here only for testing Compass compatibility might not qualify as significant or substantial parts, but in any case Compass is being mentioned for related tests pointing to the original implementation. These small portions of Compass are copied and modified for the testing of compatibility only.
+
+The license for Compass mentioned here:
+https://github.com/chriseppstein/compass/blob/stable/LICENSE.markdown
+
+is as follows:
+
+
+
+
+Copyright (c) 2009 Christopher M. Eppstein
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. No attribution is required by products that make use of this software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization.
+
+Contributors to this project agree to grant all rights to the copyright holder of the primary product. Attribution is maintained in the source control history of the product.
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.0.scss
new file mode 100644
index 0000000000..2f1e55e87e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-001.htm */
+
+html { margin:10px; border:20px solid black; padding:30px; }
+body { height:10000px; margin:0; }
+div { position:absolute; width:100px; height:100px; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.1.scss
new file mode 100644
index 0000000000..7b5eace311
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-001.htm */
+.style { top:0; background:yellow; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.2.scss
new file mode 100644
index 0000000000..c94661f654
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-001.htm */
+.style { right:0; background:orange; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.3.scss
new file mode 100644
index 0000000000..893b95ca14
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-001.htm */
+.style { bottom:0; background:brown; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.4.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.4.scss
new file mode 100644
index 0000000000..71d199866c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-001.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-001.htm */
+.style { left:0; background:pink; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004a.0.scss
new file mode 100644
index 0000000000..457f6a2d2f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004a.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004a.htm */
+.style { position:absolute; left:100px; top:100px; width:100px; height:100px; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004b.0.scss
new file mode 100644
index 0000000000..8990089fb6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004b.htm */
+.style { position:fixed; left:100px; top:100px; width:100px; height:100px; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004c.0.scss
new file mode 100644
index 0000000000..1bad688abe
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004c.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004c.htm */
+.style { position:absolute; left:100px; top:100px; width:100px; height:100px; background:yellow; border:10px solid black; display:table; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004d.0.scss
new file mode 100644
index 0000000000..8f8b50e4c7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004d.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004d.htm */
+.style { position:fixed; left:100px; top:100px; width:100px; height:100px; background:yellow; border:10px solid black; display:table }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.0.scss
new file mode 100644
index 0000000000..0c460b5c3f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004e.htm */
+.style { display:table }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.1.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.1.scss
new file mode 100644
index 0000000000..29c22194fd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004e.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004e.htm */
+.style { position:absolute; left:100px; top:100px; width:100px; height:100px; border:10px solid black; background:yellow; margin:0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.0.scss
new file mode 100644
index 0000000000..33f39b6ab6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004f.htm */
+.style { display:table }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.1.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.1.scss
new file mode 100644
index 0000000000..c458e5dc33
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-004f.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-004f.htm */
+.style { position:fixed; left:100px; top:100px; width:100px; height:100px; border:10px solid black; background:yellow; margin:0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005a.0.scss
new file mode 100644
index 0000000000..a724d1b918
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005a.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-005a.htm */
+.style { position:absolute; width:100px; height:100px; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005b.0.scss
new file mode 100644
index 0000000000..d9b1214a4b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-005b.htm */
+.style { position:absolute; width:100px; height:100px; display:table; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005c.0.scss
new file mode 100644
index 0000000000..e6e7f6b90b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005c.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-005c.htm */
+.style { position:fixed; width:100px; height:100px; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005d.0.scss
new file mode 100644
index 0000000000..1bc05d796a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-005d.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-005d.htm */
+.style { position:fixed; width:100px; height:100px; display:table; background:yellow; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.0.scss
new file mode 100644
index 0000000000..9080cba258
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-007.htm */
+.style { position:relative; top:100px; left:100px; height:100px; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.1.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.1.scss
new file mode 100644
index 0000000000..40f293c03b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-007.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-007.htm */
+.style { position:absolute; margin:0; bottom:0; height:30px; border:10px solid orange; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009a.0.scss
new file mode 100644
index 0000000000..ac865fb846
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009a.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-009a.htm */
+.style { width:50%; height:50%; margin:50px; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009b.0.scss
new file mode 100644
index 0000000000..0b108fff62
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-009b.htm */
+.style { position:absolute; left:50px; top:50px; width:50%; height:50%; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009e.0.scss
new file mode 100644
index 0000000000..f5bda4dc9f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009e.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-009e.htm */
+.style { position:absolute; width:50%; height:50%; top:50px; left:50px; margin:0; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.0.scss
new file mode 100644
index 0000000000..788e50c119
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-009f.htm */
+.style { position:relative; height:50%; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.1.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.1.scss
new file mode 100644
index 0000000000..e1c3142ad8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-containing-block-initial-009f.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-containing-block-initial-009f.htm */
+.style { position:absolute; width:50%; top:50px; left:50px; height:100%; margin:0; border:10px solid black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-non-replaced-width-margin-000.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-non-replaced-width-margin-000.0.scss
new file mode 100644
index 0000000000..69f5c2fa6a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-non-replaced-width-margin-000.0.scss
@@ -0,0 +1,93 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-non-replaced-width-margin-000.htm */
+
+
+div { height: 1px; direction: ltr; }
+
+/*
+ * Every case here has three divs nested inside of each other. The
+ * innermost div (absolutely positioned) is the testcase (and has
+ * color). The middle div's content edge establishes the containing
+ * block it would have if it were statically positioned. The outermost
+ * div is actually its containing block.
+ *
+ * the abs pos containing block runs from 50px to 700px from the left edge
+ * the static pos containing block runs from 150px to 650px from the left edge
+ */
+
+/* totals for html and body: 21px on the left, 34px on the right */
+html, body { border: transparent medium solid; }
+html { margin: 0 3px 0 2px; padding: 0 4px 0 3px; border-width: 0 3px 0 8px; }
+body { margin: 0 6px 0 3px; padding: 0 7px 0 1px; border-width: 0 11px 0 4px; }
+
+body > div {
+ position: relative;
+
+ top: 0;
+ left: 4px;
+
+ margin-left: 16px;
+ border-left: 9px solid transparent;
+ /* sum of above items (29px), plus 21px above, is 50px */
+ padding-left: 40px;
+
+ width: 595px;
+
+ padding-right: 15px;
+ /* sum of above items (650px), plus 50px above, is 700px */
+
+ border-right: 27px solid transparent;
+ margin-right: 13px;
+}
+
+body > div > div {
+ /* padding-left above: 40px */
+ margin-left: 7px;
+ border-left: 29px solid transparent;
+ padding-left: 24px;
+ /* sum of above items (100px), plus 50px above, is 150px */
+
+ /* padding-right above: 15px */
+ padding-right: 14px;
+ border-right: 3px solid transparent;
+ margin-right: 18px;
+ /* sum of above items (50px), subtracted from 700px, is 650px */
+}
+
+body > div > div > div {
+ background: navy;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+
+ /* specify everything; we'll put the autos as overrides below */
+ left: 3px;
+ margin-left: 17px;
+ border-left: 6px solid transparent;
+ padding-left: 1px;
+ padding-right: 9px;
+ border-right: 8px solid transparent;
+ margin-right: 19px;
+ right: 8px;
+}
+
+/* and give it 72px of intrinsic width for the case where it has width:auto */
+body > div > div > div > div {
+ width: 72px;
+}
+
+/* now we want to test all 128 combinations of presence of the following */
+
+body > div.adir { direction: rtl; }
+body > div.sdir > div { direction: rtl; }
+body > div.edir > div > div { direction: rtl; }
+body > div.ol > div > div { left: auto; }
+body > div.or > div > div { right: auto; }
+body > div.ml > div > div { margin-left: auto; }
+body > div.mr > div > div { margin-right: auto; }
+
+/* combined with each of these three */
+body > div.narrowwidth > div > div { width: 153px; }
+body > div.autowidth > div > div { width: auto; }
+body > div.widewidth > div > div { width: 660px; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/abspos-replaced-width-margin-000.0.scss b/theme-compiler/tests/resources/w3ctests/scss/abspos-replaced-width-margin-000.0.scss
new file mode 100644
index 0000000000..99f2a308f3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/abspos-replaced-width-margin-000.0.scss
@@ -0,0 +1,88 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/abspos-replaced-width-margin-000.htm */
+
+
+div { height: 1px; direction: ltr; }
+
+/*
+ * Every case here has two divs and an image nested inside of each other. The
+ * innermost div (absolutely positioned) is the testcase (and has
+ * color). The middle div's content edge establishes the containing
+ * block it would have if it were statically positioned. The outermost
+ * div is actually its containing block.
+ *
+ * the abs pos containing block runs from 50px to 700px from the left edge
+ * the static pos containing block runs from 150px to 650px from the left edge
+ */
+
+/* totals for html and body: 21px on the left, 34px on the right */
+html, body { border: transparent medium solid; }
+html { margin: 0 3px 0 2px; padding: 0 4px 0 3px; border-width: 0 3px 0 8px; }
+body { margin: 0 6px 0 3px; padding: 0 7px 0 1px; border-width: 0 11px 0 4px; }
+
+body > div {
+ position: relative;
+
+ top: 0;
+ left: 4px;
+
+ margin-left: 16px;
+ border-left: 9px solid transparent;
+ /* sum of above items (29px), plus 21px above, is 50px */
+ padding-left: 40px;
+
+ width: 595px;
+
+ padding-right: 15px;
+ /* sum of above items (650px), plus 50px above, is 700px */
+
+ border-right: 27px solid transparent;
+ margin-right: 13px;
+}
+
+body > div > div {
+ /* padding-left above: 40px */
+ margin-left: 7px;
+ border-left: 29px solid transparent;
+ padding-left: 24px;
+ /* sum of above items (100px), plus 50px above, is 150px */
+
+ /* padding-right above: 15px */
+ padding-right: 14px;
+ border-right: 3px solid transparent;
+ margin-right: 18px;
+ /* sum of above items (50px), subtracted from 700px, is 650px */
+}
+
+body > div > div > img {
+ background: navy;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+
+ /* specify everything; we'll put the autos as overrides below */
+ left: 3px;
+ margin-left: 17px;
+ border-left: 6px solid transparent;
+ padding-left: 1px;
+ padding-right: 9px;
+ border-right: 8px solid transparent;
+ margin-right: 19px;
+ right: 8px;
+}
+
+/* now we want to test all 128 combinations of presence of the following */
+
+body > div.adir { direction: rtl; }
+body > div.sdir > div { direction: rtl; }
+body > div.edir > div > img { direction: rtl; }
+body > div.ol > div > img { left: auto; }
+body > div.or > div > img { right: auto; }
+body > div.ml > div > img { margin-left: auto; }
+body > div.mr > div > img { margin-right: auto; }
+
+/* combined with each of these three (as appropriate for narrow/wide images) */
+body > div.narrowwidth > div > img { width: 153px; height: 1px; }
+body > div.autowidth > div > img { width: auto; }
+body > div.widewidth > div > img { width: 660px; height: 1px; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/anonymous-boxes-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/anonymous-boxes-001.0.scss
new file mode 100644
index 0000000000..3c30052779
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/anonymous-boxes-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/anonymous-boxes-001.htm */
+
+ #parent { height: 200px; position: relative; }
+ #child { float: left; height: 50%; width: 100px; background: green; position: relative }
+ #background { position: absolute; top: 0; left: 0; width: 100px; height: 100px; background: red }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.0.scss
new file mode 100644
index 0000000000..3a4f2c68a2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-quotes-001.htm */
+
+ body { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.1.scss
new file mode 100644
index 0000000000..f9ff59ef63
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-quotes-001.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.0.scss
new file mode 100644
index 0000000000..e81cd566d8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-space-001.htm */
+
+ body { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.1.scss
new file mode 100644
index 0000000000..89cf375ace
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-001.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.0.scss
new file mode 100644
index 0000000000..f37bd48b03
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-space-002.htm */
+
+ body { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.1.scss
new file mode 100644
index 0000000000..4ca1f3465a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-space-002.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.0.scss
new file mode 100644
index 0000000000..82b8dcb50a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-be-001.htm */
+
+ body { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.1.scss
new file mode 100644
index 0000000000..3bf9f5f6b4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-be-001.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.0.scss
new file mode 100644
index 0000000000..92ca00bc53
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-le-001.htm */
+
+ body { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.1.scss
new file mode 100644
index 0000000000..483b8494dd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/at-charset-utf16-le-001.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-001.0.scss
new file mode 100644
index 0000000000..ed10b1ea02
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-001.0.scss
@@ -0,0 +1,40 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-001.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ /* 100 x 120 bgpaint area */
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-none.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-none.svg);
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-002.0.scss
new file mode 100644
index 0000000000..849421d055
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-002.0.scss
@@ -0,0 +1,42 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-002.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-width.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-width.svg);
+ }
+ .control {
+ width: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-003.0.scss
new file mode 100644
index 0000000000..baac57662f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-003.0.scss
@@ -0,0 +1,42 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-003.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-height.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-height.svg);
+ }
+ .control {
+ height: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-004.0.scss
new file mode 100644
index 0000000000..22a6983830
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-004.0.scss
@@ -0,0 +1,45 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-004.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-ratio-portrait.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-ratio-portrait.svg);
+ }
+ .cover .control {
+ width: 66px;
+ }
+ .limit .control {
+ width: 67px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-005.0.scss
new file mode 100644
index 0000000000..cc0e002964
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-005.0.scss
@@ -0,0 +1,45 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-005.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-ratio-landscape.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-ratio-landscape.svg);
+ }
+ .cover .control {
+ height: 53px;
+ }
+ .limit .control {
+ height: 54px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-006.0.scss
new file mode 100644
index 0000000000..fda8699018
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-006.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-006.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-width-pc-height-pc.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-width-pc-height-pc.svg);
+ }
+ .control {
+ width: 32px;
+ height: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-007.0.scss
new file mode 100644
index 0000000000..09b38ffacb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-007.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-007.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-width-ratio.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-width-ratio.svg);
+ }
+ .control {
+ width: 40px;
+ height: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-008.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-008.0.scss
new file mode 100644
index 0000000000..f54ce9a61a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-008.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-008.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-height-ratio.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-height-ratio.svg);
+ }
+ .control {
+ width: 40px;
+ height: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-009.0.scss b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-009.0.scss
new file mode 100644
index 0000000000..6b9b2d6456
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/background-intrinsic-009.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/background-intrinsic-009.htm */
+
+ /* Setup. Use 5:6 ratio because it's weird and unlikely to be hard-coded anywhere. */
+ div {
+ position: relative;
+ }
+ .cover, .limit {
+ width: 120px;
+ height: 120px;
+ margin: 0.5em;
+ background: green; /* Used to match reference; remove for debugging. */
+ }
+ .control {
+ position: absolute;
+ top: 10px; bottom: 10px;
+ left: 10px; right: 30px;
+ }
+ .cover .control {
+ background: red;
+ }
+ .limit .control {
+ background: green;
+ }
+ .test {
+ /* 80x100 bgpos area */
+ height: 80px;
+ width: 60px;
+ padding: 10px;
+ border: 10px solid transparent;
+ }
+
+ /* Test */
+ .cover .test {
+ background: no-repeat url(support/green-intrinsic-width-height.svg);
+ }
+ .limit .test {
+ background: no-repeat url(support/red-intrinsic-width-height.svg);
+ }
+ .control {
+ width: 40px;
+ height: 60px;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-display-types-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-display-types-001.0.scss
new file mode 100644
index 0000000000..5a3d20fd24
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-display-types-001.0.scss
@@ -0,0 +1,25 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-display-types-001.htm */
+
+div { counter-reset:ctr; quotes:"\0022" "\0022" "\0022" "\0022"}
+
+div:before {
+ content:counter(ctr) url(support/square-outline-32x32.png) open-quote "Before " attr(class);
+ counter-increment:ctr;
+}
+div:after {
+ content:counter(ctr) url(support/square-outline-32x32.png) "After " attr(class) close-quote;
+ counter-increment:ctr;
+}
+
+.block:before, .block:after { display:block; }
+.inline:before, .inline:after { display:inline; }
+.inline-block:before, .inline-block:after { display:inline-block; }
+.table:before, .table:after { display:table; }
+.inline-table:before, .inline-table:after { display:inline-table; }
+.table-row-group:before, .table-row-group:after { display:table-row-group; }
+.table-row:before, .table-row:after { display:table-row; }
+.table-cell:before, .table-cell:after { display:table-cell; }
+.table-caption:before, .table-caption:after { display:table-caption; }
+
+div { border:1px solid green; margin:5px; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-attr-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-attr-001.0.scss
new file mode 100644
index 0000000000..b2b28a5c97
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-attr-001.0.scss
@@ -0,0 +1,12 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-dynamic-attr-001.htm */
+
+body {
+ font-family:sans-serif;
+}
+body:before {
+ content:attr(my-attr);
+}
+body:after {
+ content:attr(my-attr-2);
+}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-restyle-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-restyle-001.0.scss
new file mode 100644
index 0000000000..4a1861941e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-dynamic-restyle-001.0.scss
@@ -0,0 +1,11 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-dynamic-restyle-001.htm */
+
+body:before {
+ content:"Before";
+ border:inherit;
+}
+.cl:after {
+ display:block;
+ content:"After";
+}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-floated-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-floated-001.0.scss
new file mode 100644
index 0000000000..324cae53d2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-floated-001.0.scss
@@ -0,0 +1,29 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-floated-001.htm */
+
+div { counter-reset:ctr; quotes:"\0022" "\0022" "\0022" "\0022"; }
+
+div:before {
+ content:counter(ctr) url(support/square-outline-32x32.png) open-quote "Before " attr(class);
+ counter-increment:ctr;
+}
+div:after {
+ content:counter(ctr) url(support/square-outline-32x32.png) "After " attr(class) close-quote;
+ counter-increment:ctr;
+}
+
+.beforeleft:before {
+ float:left;
+}
+.beforeright:before {
+ float:right;
+}
+.afterleft:after {
+ float:left;
+}
+.afterright:after {
+ float:right;
+}
+
+div { border:1px solid green; margin:5px; }
+div { overflow:auto; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-images-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-images-001.0.scss
new file mode 100644
index 0000000000..c419306c2a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-images-001.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-images-001.htm */
+
+div:before {
+ content:url(missing-image.png);
+}
+div { border:1px solid green; margin:5px; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.0.scss
new file mode 100644
index 0000000000..a5b7d7b26b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-positioned-001.htm */
+
+div { counter-reset:ctr; quotes:"\0022" "\0022" "\0022" "\0022"; }
+
+.gen:before {
+ content:counter(ctr) url(support/square-outline-32x32.png) open-quote "Before " attr(class);
+ counter-increment:ctr;
+}
+.gen:after {
+ content:counter(ctr) url(support/square-outline-32x32.png) "After " attr(class) close-quote;
+ counter-increment:ctr;
+}
+
+.abs:before {
+ position:absolute;
+ left:0;
+}
+.abs:after {
+ position:absolute;
+ right:0;
+}
+
+.rel:before {
+ position:relative;
+ top:-10px;
+}
+.rel:after {
+ position:relative;
+ top:10px;
+}
+
+div { border:1px solid green; margin:5px; height:100px; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.1.scss
new file mode 100644
index 0000000000..33ee1ef76b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-positioned-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-positioned-001.htm */
+.style { position:relative; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.0.scss
new file mode 100644
index 0000000000..f199f3ae10
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.0.scss
@@ -0,0 +1,44 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-table-parts-001.htm */
+
+table, div.gen { counter-reset:ctr; quotes:"\0022" "\0022" "\0022" "\0022"; }
+
+.gen:before {
+ content:counter(ctr) url(support/square-outline-32x32.png) open-quote "Before " attr(class);
+ counter-increment:ctr;
+}
+.gen:after {
+ content:counter(ctr) url(support/square-outline-32x32.png) "After " attr(class) close-quote;
+ counter-increment:ctr;
+}
+
+table { border:1px solid blue; }
+td { border:1px solid cyan; }
+td { border-spacing:0; padding:0; }
+
+tr.gen:before, tr.gen:after { display:table-cell; }
+tbody.gen:before, tbody.gen:after { display:table-row; }
+table.gen:before, table.gen:after { display:table-row-group; }
+table.col:before, table.gen.col:after { display:table-column-group; }
+/* note reordering here! */
+table.headfoot:after { display:table-header-group; }
+table.headfoot:before { display:table-footer-group; }
+
+.cell { display:table-cell; }
+.row { display:table-row; }
+.rowgroup { display:table-row-group; }
+.table { display:table; }
+div.gencell:before, div.gencell:after { display:table-cell; }
+div.genrow:before, div.genrow:after { display:table-row; }
+div.genblock:before, div.genblock:after { display:block; }
+div.geninline:before, div.geninline:after { display:inline; }
+
+div { border:1px solid green; margin:5px; }
+
+.varyheight:before { height:100px; background:yellow; }
+.varyheight > div { height:80px; background:orange; }
+.varyheight:after { height:60px; background:brown; }
+
+.varywidth:before { background:yellow; }
+.varywidth > div { background:orange; }
+.varywidth:after { background:brown; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.1.scss
new file mode 100644
index 0000000000..652b7fb64f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-parts-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-table-parts-001.htm */
+.style { border:none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/before-after-table-whitespace-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-whitespace-001.0.scss
new file mode 100644
index 0000000000..a4bd9b3f27
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/before-after-table-whitespace-001.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/before-after-table-whitespace-001.htm */
+
+.gen0:before {
+ padding:1px;
+}
+.gen1:before {
+ content: " ";
+}
+.gen2:before {
+ content: attr(missing);
+}
+.gen3:before {
+ content: url(missing-image.png);
+}
+
+div { border:1px solid green; margin:5px; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-001.0.scss
new file mode 100644
index 0000000000..f2d73053d4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-001.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-append-001.htm */
+
+
+ body > span { outline: 1px dotted black; }
+ body > span > span { display: block; width: 10em; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.0.scss
new file mode 100644
index 0000000000..15821f265e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-append-002.htm */
+
+ #outermost { border: 2px solid; }
+ #outer { border: 4px solid yellow; }
+ #inner { border: 6px sold green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.1.scss
new file mode 100644
index 0000000000..92b70020f2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-append-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-append-002.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.0.scss
new file mode 100644
index 0000000000..c59fe1cefd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-001.htm */
+.style { direction: ltr }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.1.scss
new file mode 100644
index 0000000000..24f75e5c03
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-001.htm */
+.style { border: 5px solid blue; border-left: none; border-right: none; padding-right: 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.2.scss
new file mode 100644
index 0000000000..578cdb672b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-001.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.0.scss
new file mode 100644
index 0000000000..ebd82de172
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-002.htm */
+.style { direction: rtl }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.1.scss
new file mode 100644
index 0000000000..800d89067f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-002.htm */
+.style { border: 5px solid blue; border-left: none; border-right: none; padding-right: 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.2.scss
new file mode 100644
index 0000000000..47d968fb36
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-002.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.0.scss
new file mode 100644
index 0000000000..bec0ff7a45
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-003.htm */
+.style { direction: ltr }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.1.scss
new file mode 100644
index 0000000000..d55949134e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-003.htm */
+.style { border: 5px solid blue; border-left: none; border-right: none; padding-left: 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.2.scss
new file mode 100644
index 0000000000..972cbf30eb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-003.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.0.scss
new file mode 100644
index 0000000000..6259effef6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-004.htm */
+.style { direction: rtl }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.1.scss
new file mode 100644
index 0000000000..85f7e37a8c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-004.htm */
+.style { border: 5px solid blue; border-left: none; border-right: none; padding-left: 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.2.scss
new file mode 100644
index 0000000000..e4dfb13524
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-empty-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-empty-004.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.0.scss
new file mode 100644
index 0000000000..081e58affc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-float-between-001.htm */
+.style { position: relative; left: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.1.scss
new file mode 100644
index 0000000000..99babd326f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-float-between-001.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.2.scss
new file mode 100644
index 0000000000..8f5a27f693
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-float-between-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-float-between-001.htm */
+.style { float: left }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001a.0.scss
new file mode 100644
index 0000000000..4482654240
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001a.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001b.0.scss
new file mode 100644
index 0000000000..d0b1193abc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001b.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001c.0.scss
new file mode 100644
index 0000000000..a820d992bc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001c.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001c.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001d.0.scss
new file mode 100644
index 0000000000..dc7c044309
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001d.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001d.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001e.0.scss
new file mode 100644
index 0000000000..4ee59b7c3c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001e.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001e.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001f.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001f.0.scss
new file mode 100644
index 0000000000..544fddaee6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001f.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001f.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001g.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001g.0.scss
new file mode 100644
index 0000000000..5bbfb01512
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001g.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001g.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001h.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001h.0.scss
new file mode 100644
index 0000000000..d03bbf51a7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001h.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001h.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001i.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001i.0.scss
new file mode 100644
index 0000000000..d48cc6477c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001i.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001i.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001j.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001j.0.scss
new file mode 100644
index 0000000000..8662fec547
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001j.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001j.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001k.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001k.0.scss
new file mode 100644
index 0000000000..ed1c00b772
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001k.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001k.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001l.0.scss
new file mode 100644
index 0000000000..7e792b2f0b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-001l.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-001l.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002a.0.scss
new file mode 100644
index 0000000000..76a2977e4f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002a.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002b.0.scss
new file mode 100644
index 0000000000..1c468dc942
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002b.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002c.0.scss
new file mode 100644
index 0000000000..17517332ea
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002c.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002c.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002d.0.scss
new file mode 100644
index 0000000000..697822ae0a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002d.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002d.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002e.0.scss
new file mode 100644
index 0000000000..20d8d46d16
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002e.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002e.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002f.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002f.0.scss
new file mode 100644
index 0000000000..b0680028e7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002f.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002f.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002g.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002g.0.scss
new file mode 100644
index 0000000000..67bc7ebadc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002g.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002g.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002h.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002h.0.scss
new file mode 100644
index 0000000000..5c7c0a767d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002h.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002h.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002i.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002i.0.scss
new file mode 100644
index 0000000000..810b088676
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-002i.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-002i.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-003.0.scss
new file mode 100644
index 0000000000..71760d321c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-003.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-003.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-004.0.scss
new file mode 100644
index 0000000000..7d18b5f0bb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-004.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-004.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-006.0.scss
new file mode 100644
index 0000000000..5fae99411f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-006.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-006.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-007.0.scss
new file mode 100644
index 0000000000..3e59471379
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-007.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-007.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008a.0.scss
new file mode 100644
index 0000000000..840e4c41ac
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-008a.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008b.0.scss
new file mode 100644
index 0000000000..b1e3f46489
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-008b.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008c.0.scss
new file mode 100644
index 0000000000..9ccc845aa6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-008c.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-008c.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-009.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-009.0.scss
new file mode 100644
index 0000000000..134414535f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-009.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-009.htm */
+
+ body > span { border: 3px solid blue }
+ body > span > span { border: 3px solid cyan }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-010.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-010.0.scss
new file mode 100644
index 0000000000..62431c82a3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-010.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-010.htm */
+
+ body > span { border: 3px solid blue }
+ body > span > span { border: 3px solid cyan }
+ body > span > span:after { content: "Ten" }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-011.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-011.0.scss
new file mode 100644
index 0000000000..2844241d70
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-011.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-011.htm */
+
+ body > span { border: 3px solid blue }
+ body > span > span { border: 3px solid cyan }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-012.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-012.0.scss
new file mode 100644
index 0000000000..105753b69f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-012.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-012.htm */
+
+ #i { display: inline; border: 2px solid; }
+ #i:after { display: block; content: "Three"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.0.scss
new file mode 100644
index 0000000000..dd0da56c7d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-013.htm */
+
+ #i { border: 2px solid; }
+ #i:before { display: block; content: "One"; }
+ #i:after { content: "Three"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.1.scss
new file mode 100644
index 0000000000..fce9f7e44a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-013.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-013.htm */
+.style { display: none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.0.scss
new file mode 100644
index 0000000000..0d1f7f3a3e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-014.htm */
+
+ #i { border: 2px solid; }
+ #i:before { display: block; content: "One"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.1.scss
new file mode 100644
index 0000000000..4fb8ca38ec
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-014.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-014.htm */
+.style { display: none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-015.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-015.0.scss
new file mode 100644
index 0000000000..064cb0734c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-015.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-015.htm */
+
+ #i { display: inline; border: 2px solid; }
+ #i:after { display: block; content: "Three"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.0.scss
new file mode 100644
index 0000000000..27a0dd79bd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-016a.htm */
+
+ #i { border: 2px solid; }
+ #i:after { display: block; content: "Two"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.1.scss
new file mode 100644
index 0000000000..e2ddc868f4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016a.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-016a.htm */
+.style { display: none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016b.0.scss
new file mode 100644
index 0000000000..7b53f1212b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-016b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-016b.htm */
+
+ #i { border: 2px solid; }
+ #i:after { display: block; content: "Two"; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.0.scss
new file mode 100644
index 0000000000..fb90ff7fde
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-017.htm */
+.style { width: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.1.scss
new file mode 100644
index 0000000000..7efbd77d83
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-017.htm */
+.style { border: 2px solid blue; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.2.scss
new file mode 100644
index 0000000000..95aac0261c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-insert-017.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-insert-017.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.0.scss
new file mode 100644
index 0000000000..d683f3fa54
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-001a.htm */
+.style { direction: ltr; width: 100px; border: 1px solid green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.1.scss
new file mode 100644
index 0000000000..aae6310bf0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001a.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-001a.htm */
+.style { display: block; height: 20px; width: 80px; margin: 10px; border: 5px solid black }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.0.scss
new file mode 100644
index 0000000000..4a040231ea
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-001b.htm */
+.style { direction: ltr; width: 100px; border: 1px solid green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.1.scss
new file mode 100644
index 0000000000..5f99cd4c5c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-001b.htm */
+.style { direction: rtl }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.2.scss
new file mode 100644
index 0000000000..bede015e4e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-001b.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-001b.htm */
+.style { display: block; height: 20px; width: 80px; margin: 10px; border: 5px solid black }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.0.scss
new file mode 100644
index 0000000000..7c7cbd0808
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-002a.htm */
+.style { direction: rtl; width: 100px; border: 1px solid green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.1.scss
new file mode 100644
index 0000000000..305b8ac11a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002a.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-002a.htm */
+.style { display: block; height: 20px; width: 80px; margin: 10px; border: 5px solid black }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.0.scss
new file mode 100644
index 0000000000..7b8252e044
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-002b.htm */
+.style { direction: rtl; width: 100px; border: 1px solid green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.1.scss
new file mode 100644
index 0000000000..11e90f792e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-002b.htm */
+.style { direction: ltr }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.2.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.2.scss
new file mode 100644
index 0000000000..3416f8de01
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-margins-002b.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-margins-002b.htm */
+.style { display: block; height: 20px; width: 80px; margin: 10px; border: 5px solid black }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-001.0.scss
new file mode 100644
index 0000000000..e78538e895
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-nested-001.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.0.scss
new file mode 100644
index 0000000000..9367c041d0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-nested-002.htm */
+.style { border: 5px solid blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.1.scss
new file mode 100644
index 0000000000..fee6eb9e60
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-nested-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-nested-002.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.0.scss
new file mode 100644
index 0000000000..efb841d5dc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-percents-001.htm */
+.style { height: 200px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.1.scss
new file mode 100644
index 0000000000..57e6d10c49
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-percents-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-percents-001.htm */
+.style { display: block; height: 50%; border: 10px solid black }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-001.0.scss
new file mode 100644
index 0000000000..ebe1d5373b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-001.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-002.0.scss
new file mode 100644
index 0000000000..ca9c6e7a45
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-002.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-002.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-003.0.scss
new file mode 100644
index 0000000000..dc223e8297
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-003.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-003.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-004.0.scss
new file mode 100644
index 0000000000..ed1891d7f0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-004.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-004.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-005.0.scss
new file mode 100644
index 0000000000..c3f1c4fcc0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-005.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-005.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-006.0.scss
new file mode 100644
index 0000000000..2f4d5643be
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-remove-006.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-remove-006.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001a.0.scss
new file mode 100644
index 0000000000..a0fdf69e23
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-whitespace-001a.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001b.0.scss
new file mode 100644
index 0000000000..4c860c2a7e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/block-in-inline-whitespace-001b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/block-in-inline-whitespace-001b.htm */
+
+ body > span { border: 3px solid blue }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.0.scss
new file mode 100644
index 0000000000..898d753e68
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-001.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.1.scss
new file mode 100644
index 0000000000..7a2f6b66db
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-001.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.2.scss
new file mode 100644
index 0000000000..bfd8fdb6e5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-001.htm */
+.style { border-style:none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.0.scss
new file mode 100644
index 0000000000..e0dbae8b77
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.1.scss
new file mode 100644
index 0000000000..a5f32321c6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-002.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.2.scss
new file mode 100644
index 0000000000..49b52904b4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-002.htm */
+.style { border-width:11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.0.scss
new file mode 100644
index 0000000000..8b018c1980
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-003.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.1.scss
new file mode 100644
index 0000000000..c4dc834384
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-003.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.0.scss
new file mode 100644
index 0000000000..1f0a0f3c56
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-004.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.1.scss
new file mode 100644
index 0000000000..14810d15b6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-004.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.2.scss
new file mode 100644
index 0000000000..15f89578e1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-004.htm */
+.style { border-style:none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.0.scss
new file mode 100644
index 0000000000..5117efb468
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-005.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.1.scss
new file mode 100644
index 0000000000..2e248a0aaa
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-005.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.2.scss
new file mode 100644
index 0000000000..15ba20a79f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-cell-005.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-cell-005.htm */
+.style { border-style:none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.0.scss
new file mode 100644
index 0000000000..d6af94204f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-001.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.1.scss
new file mode 100644
index 0000000000..1d942d6b38
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-001.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.2.scss
new file mode 100644
index 0000000000..27a43b6bd8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-001.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.0.scss
new file mode 100644
index 0000000000..ae15dde154
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.1.scss
new file mode 100644
index 0000000000..8ee152dc38
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-002.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.2.scss
new file mode 100644
index 0000000000..c6318a3584
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-002.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.0.scss
new file mode 100644
index 0000000000..0d7f407a9d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-003.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.1.scss
new file mode 100644
index 0000000000..e58b8bb8df
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-003.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.2.scss
new file mode 100644
index 0000000000..cadad9538f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-colgroup-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-colgroup-003.htm */
+.style { border:outset green 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.0.scss
new file mode 100644
index 0000000000..ba42b5052f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-001.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.1.scss
new file mode 100644
index 0000000000..262d6bbedd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-001.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.2.scss
new file mode 100644
index 0000000000..d32773435c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-001.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.0.scss
new file mode 100644
index 0000000000..4ca986a899
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.1.scss
new file mode 100644
index 0000000000..caf207660d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-002.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.2.scss
new file mode 100644
index 0000000000..f7228f354e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-002.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.0.scss
new file mode 100644
index 0000000000..d5b7eae31a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-003.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.1.scss
new file mode 100644
index 0000000000..4b42a2998c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-003.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.2.scss
new file mode 100644
index 0000000000..a967891706
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-column-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-column-003.htm */
+.style { border:outset green 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.0.scss
new file mode 100644
index 0000000000..070b886636
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-001.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.1.scss
new file mode 100644
index 0000000000..0aec943a6c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-001.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.2.scss
new file mode 100644
index 0000000000..1c23b85d86
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-001.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.0.scss
new file mode 100644
index 0000000000..7bfdeac373
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.1.scss
new file mode 100644
index 0000000000..f50de68330
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-002.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.2.scss
new file mode 100644
index 0000000000..62bb238c7a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-002.htm */
+.style { border:solid green 2px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.0.scss
new file mode 100644
index 0000000000..a18235986c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-003.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.1.scss
new file mode 100644
index 0000000000..16f289c84f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-003.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.2.scss
new file mode 100644
index 0000000000..0cef689399
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-row-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-row-003.htm */
+.style { border:outset green 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.0.scss
new file mode 100644
index 0000000000..aa87c0c1d3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-001.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.1.scss
new file mode 100644
index 0000000000..9d26fe3df3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-001.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.2.scss
new file mode 100644
index 0000000000..7195bcef72
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-001.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.0.scss
new file mode 100644
index 0000000000..be951ef050
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.1.scss
new file mode 100644
index 0000000000..8fde9220db
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-002.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.2.scss
new file mode 100644
index 0000000000..86f188e449
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-002.htm */
+.style { border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.0.scss
new file mode 100644
index 0000000000..7a94d7c74b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-003.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.1.scss
new file mode 100644
index 0000000000..2c43199f38
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-003.htm */
+.style { border-collapse:collapse }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.2.scss
new file mode 100644
index 0000000000..08d7e668d6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-rowgroup-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-rowgroup-003.htm */
+.style { border:outset green 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.0.scss
new file mode 100644
index 0000000000..98f04c7a57
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-001.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.1.scss
new file mode 100644
index 0000000000..7a7cf28388
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-001.htm */
+.style { border-collapse:collapse; border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.0.scss
new file mode 100644
index 0000000000..d5453532b4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-002.htm */
+
+td { border: 10px green solid;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.1.scss
new file mode 100644
index 0000000000..da3a1b0a1b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-002.htm */
+.style { border-collapse:collapse; border:solid green 11px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.0.scss
new file mode 100644
index 0000000000..aff4d99c71
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-003.htm */
+
+td { border: 10px green outset;}
+table {margin: 30px}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.1.scss
new file mode 100644
index 0000000000..fd48bad69d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-dynamic-table-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-dynamic-table-003.htm */
+.style { border-collapse:collapse; border:none green 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.0.scss
new file mode 100644
index 0000000000..10da13d64d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-001.htm */
+
+td {width: 100px; text-align:center}
+div {position:absolute; border:green 4px solid}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.1.scss
new file mode 100644
index 0000000000..c87fcbc76a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-001.htm */
+.style { border-collapse:collapse; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.2.scss
new file mode 100644
index 0000000000..340f309e2e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-001.htm */
+.style { border:solid 4px orange; height:30px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.0.scss
new file mode 100644
index 0000000000..d33ffa4284
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-002.htm */
+
+td {width: 100px; text-align:center}
+caption {border:solid 4px green}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.1.scss
new file mode 100644
index 0000000000..88535218ab
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-002.htm */
+.style { border-collapse:collapse; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.2.scss
new file mode 100644
index 0000000000..ee3eb8c007
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/border-collapse-offset-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/border-collapse-offset-002.htm */
+.style { border:solid 4px orange; height:30px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.0.scss
new file mode 100644
index 0000000000..b09d86f8f7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/charset-attr-001.htm */
+
+ body { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.1.scss
new file mode 100644
index 0000000000..bfaba9dc01
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/charset-attr-001.1.scss
Binary files differ
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-1.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-1.0.scss
new file mode 100644
index 0000000000..f0a8248396
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-1.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-1.html */
+li,p { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-10.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-10.0.scss
new file mode 100644
index 0000000000..d0d1a14d60
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-10.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-10.html */
+p { background-color : red }
+p[title$="bar"] { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-11.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-11.0.scss
new file mode 100644
index 0000000000..ca558792b0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-11.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-11.html */
+p { background-color : red }
+p[title*="bar"] { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-13.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-13.0.scss
new file mode 100644
index 0000000000..344a9e8e46
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-13.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-13.html */
+li { background-color : red }
+.t1 { background-color : lime }
+li.t2 { background-color : lime }
+.t3 { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14.0.scss
new file mode 100644
index 0000000000..faf4d3c7cb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14.0.scss
@@ -0,0 +1,10 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14.html */
+p { background-color : red ; border : thick solid red ; padding : 1em }
+p.t1 { background-color : lime }
+p.t2 { border : thick solid green }
+
+div { background: green; color: white; }
+div.teST { background: red; color: yellow; }
+div.te { background: red; color: yellow; }
+div.st { background: red; color: yellow; }
+div.te.st { background: red; color: yellow; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-144.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-144.0.scss
new file mode 100644
index 0000000000..c669785ac7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-144.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-144.html */
+div :not(:enabled):not(:disabled) { background: lime; }
+p { background : red;}
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-148.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-148.0.scss
new file mode 100644
index 0000000000..a41bb1ed85
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-148.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-148.html */
+
+ p { background: lime; }
+ p:empty { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149.0.scss
new file mode 100644
index 0000000000..23eba2f553
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-149.html */
+
+ address:empty { background: lime; }
+ address { background: red; margin: 0; height: 1em; }
+ .text { margin: -1em 0 0 0; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149b.0.scss
new file mode 100644
index 0000000000..ae6c5ca1c7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-149b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-149b.html */
+
+ address:empty { background: lime; }
+ address { background: red; margin: 0; height: 1em; }
+ .text { margin: -1em 0 0 0; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14b.0.scss
new file mode 100644
index 0000000000..5851edc2e3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14b.0.scss
@@ -0,0 +1,10 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14b.html */
+
+p { background: green; color: white; }
+.t1.fail { background: red; color: yellow; }
+.fail.t1 { background: red; color: yellow; }
+.t2.fail { background: red; color: yellow; }
+.fail.t2 { background: red; color: yellow; }
+/* Note: This is a valid test even per CSS1, since in CSS1 those rules
+ are invalid and should be dropped. */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14c.0.scss
new file mode 100644
index 0000000000..d32fec8496
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14c.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14c.html */
+
+p { background: red; color: yellow; }
+p.t1.t2 { background: green; color: white; }
+div { background: green; color: white; }
+div.t1 { background: red; color: yellow; }
+address { background: red; color: yellow; }
+address.t5.t5 { background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14d.0.scss
new file mode 100644
index 0000000000..3432db6913
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14d.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14d.html */
+
+p { background: green; color: white; }
+.t1:not(.t2) { background: red; color: yellow; }
+:not(.t2).t1 { background: red; color: yellow; }
+.t2:not(.t1) { background: red; color: yellow; }
+:not(.t1).t2 { background: red; color: yellow; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14e.0.scss
new file mode 100644
index 0000000000..979edeed91
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-14e.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14e.html */
+
+p { background: green; color: white; }
+p:not(.t1):not(.t2) { background: red; color: yellow; }
+div { background: red; color: yellow; }
+div:not(.t1) { background: green; color: white; }
+address { background: green; color: white; }
+address:not(.t5):not(.t5) { background: red; color: yellow; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15.0.scss
new file mode 100644
index 0000000000..ff1d3a2d9b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-15.html */
+li { background-color : red }
+#t1 { background-color : lime }
+li#t2 { background-color : lime }
+li#t3 { background-color : lime }
+#t4 { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-150.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-150.0.scss
new file mode 100644
index 0000000000..bb9cc2cb7c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-150.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-150.html */
+
+ address:empty { background: lime; }
+ address { background: red; margin: 0; height: 1em; }
+ .text { margin: -1em 0 0 0; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-151.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-151.0.scss
new file mode 100644
index 0000000000..ec229bdd33
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-151.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-151.html */
+
+ address { background: lime; margin: 0; height: 1em; }
+ address:empty { background: red; }
+ .text { margin: -1em 0 0 0; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-152.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-152.0.scss
new file mode 100644
index 0000000000..bf765f8b5d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-152.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-152.html */
+
+ address { background: lime; margin: 0; height: 1em; }
+ address:empty { background: red; }
+ .text { margin: -1em 0 0 0; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155.0.scss
new file mode 100644
index 0000000000..1f073c35b4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-155.html */
+
+ p { background: lime; }
+ .5cm { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155a.0.scss
new file mode 100644
index 0000000000..9ce3a19428
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-155a.html */
+
+ p { background: lime; }
+ .\5cm { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155b.0.scss
new file mode 100644
index 0000000000..83340f5351
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155b.0.scss
@@ -0,0 +1,10 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-155b.html */
+
+ p { background: lime; }
+ .two\ words { background: red; }
+
+ /* the "." and "~=" forms match on a space separated list of words.
+ In such a list, a word containing a space can never match, since it
+ would by definition be two words. */
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155c.0.scss
new file mode 100644
index 0000000000..516c8de4e0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-155c.html */
+
+ p { background: lime; }
+ .one.word { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155d.0.scss
new file mode 100644
index 0000000000..6930469379
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-155d.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-155d.html */
+
+ .one\.word { background: lime; }
+ p { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156.0.scss
new file mode 100644
index 0000000000..058b6b4290
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-156.html */
+
+ p { background: lime; }
+ foo & address, p { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156b.0.scss
new file mode 100644
index 0000000000..033b8f59a9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-156b.html */
+
+ foo & address, p { background: red; }
+ p { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156c.0.scss
new file mode 100644
index 0000000000..62d2a7ceb6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-156c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-156c.html */
+
+ foo & address, p { background: red ! important; }
+ p { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-159.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-159.0.scss
new file mode 100644
index 0000000000..6f85988756
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-159.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-159.html */
+
+ ::selection { background: lime; }
+ :selection { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15b.0.scss
new file mode 100644
index 0000000000..b2fb3ac6ae
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-15b.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-15b.html */
+
+p { background: green; color: white; }
+#test#fail { background: red; color: yellow; }
+#fail#test { background: red; color: yellow; }
+#fail { background: red; color: yellow; }
+div { background: red; color: yellow; }
+#pass#pass { background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-16.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-16.0.scss
new file mode 100644
index 0000000000..7b909a1ac1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-16.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-16.html */
+p.test a { background-color : red }
+p.test *:link { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-160.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-160.0.scss
new file mode 100644
index 0000000000..45c7c74e02
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-160.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-160.html */
+
+ p { background: lime; }
+ p:subject { background: red; } /* this is not valid CSS, and if UAs
+ implemented the experimental :subject pseudo-class they should have
+ used the :-vnd-ident syntax. */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-161.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-161.0.scss
new file mode 100644
index 0000000000..c10cdd2dfd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-161.0.scss
@@ -0,0 +1,26 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-161.html */
+
+ p { background: lime; }
+ p * { background: lime; }
+ p > * { background: lime; }
+ p + * { background: lime; }
+ p ~ * { background: lime; }
+
+ /* let's try some pseudos that are not valid CSS but are likely to
+ be implemented as extensions in some UAs. These should not be
+ recognised, as UAs implementing such extensions should use the
+ :-vnd-ident syntax. */
+
+ :canvas { background: red; }
+ :viewport { background: red; }
+ :window { background: red; }
+ :menu { background: red; }
+ :table { background: red; }
+ :select { background: red; }
+ ::canvas { background: red; }
+ ::viewport { background: red; }
+ ::window { background: red; }
+ ::menu { background: red; }
+ ::table { background: red; }
+ ::select { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166.0.scss
new file mode 100644
index 0000000000..de27d9ffd2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-166.html */
+
+ p:first-letter { background-color: red; }
+ p::first-letter { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166a.0.scss
new file mode 100644
index 0000000000..ed465fe93b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-166a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-166a.html */
+
+ p::first-letter { background-color: red; }
+ p:first-letter { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167.0.scss
new file mode 100644
index 0000000000..5aad6a87bd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-167.html */
+
+ p:first-line { background-color: red; }
+ p::first-line { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167a.0.scss
new file mode 100644
index 0000000000..109defc654
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-167a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-167a.html */
+
+ p::first-line { background-color: red; }
+ p:first-line { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168.0.scss
new file mode 100644
index 0000000000..81f5c1e9b1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-168.html */
+
+ span:before { background-color: red; content: 'FAILED'; }
+ span::before { background-color: lime; content: 'PASSED'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168a.0.scss
new file mode 100644
index 0000000000..0898dd7d8c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-168a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-168a.html */
+
+ span::before { background-color: red; content: 'FAILED'; }
+ span:before { background-color: lime; content: 'PASSED'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169.0.scss
new file mode 100644
index 0000000000..69ddf7fccc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-169.html */
+
+ span:after { background-color: red; content: 'FAILED'; }
+ span::after { background-color: lime; content: 'PASSED'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169a.0.scss
new file mode 100644
index 0000000000..efb74238ec
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-169a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-169a.html */
+
+ span::after { background-color: red; content: 'FAILED'; }
+ span:after { background-color: lime; content: 'PASSED'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-17.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-17.0.scss
new file mode 100644
index 0000000000..2b881ad09d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-17.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-17.html */
+p.test a { background-color : red }
+p.test *:visited { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170.0.scss
new file mode 100644
index 0000000000..e33d2f5b12
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-170.html */
+
+ span { color: red; }
+ span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span, span { color: green } /* 2049 */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170a.0.scss
new file mode 100644
index 0000000000..7d09cee5ee
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-170a.html */
+
+ .span { color: red; }
+ .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span, .span { color: green } /* 2049 */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170b.0.scss
new file mode 100644
index 0000000000..9144c18516
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-170b.html */
+
+ .span { color: red; }
+ .span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span.span { color: green } /* 2049 */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170c.0.scss
new file mode 100644
index 0000000000..adcf326e76
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-170c.html */
+
+ p.span { color: red; }
+ p:not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span):not(.span) { color: green } /* 2049 */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170d.0.scss
new file mode 100644
index 0000000000..1ace26ae1f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-170d.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-170d.html */
+
+ p { color: red; }
+ p:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child:first-child { color: green } /* 2049 */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175a.0.scss
new file mode 100644
index 0000000000..eb61d12ff2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-175a.html */
+
+ p { color: green; }
+ .13 { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175b.0.scss
new file mode 100644
index 0000000000..91066d4671
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-175b.html */
+
+ p { color: green; }
+ .\13 { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175c.0.scss
new file mode 100644
index 0000000000..d7555e9fa0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-175c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-175c.html */
+
+ p { color: red; }
+ .\31 \33 { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-176.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-176.0.scss
new file mode 100644
index 0000000000..474be8d9e8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-176.0.scss
@@ -0,0 +1,11 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-176.html */
+
+p { background: red; color: yellow; }
+p:not(#other).class:not(.fail).test#id#id { background: green; color: white; }
+div { background: green; color: white; }
+div:not(#theid).class:not(.fail).test#theid#theid { background: red; color: yellow; }
+div:not(#other).notclass:not(.fail).test#theid#theid { background: red; color: yellow; }
+div:not(#other).class:not(.test).test#theid#theid { background: red; color: yellow; }
+div:not(#other).class:not(.fail).nottest#theid#theid { background: red; color: yellow; }
+div:not(#other).class:not(.fail).nottest#theid#other { background: red; color: yellow; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177a.0.scss
new file mode 100644
index 0000000000..29359bcba2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-177a.html */
+
+ p:selection { color: yellow; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177b.0.scss
new file mode 100644
index 0000000000..64f2c84901
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-177b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-177b.html */
+
+ div { color: green; }
+ p::first-child { color: yellow; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-178.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-178.0.scss
new file mode 100644
index 0000000000..92b765dff4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-178.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-178.html */
+
+ div { color: green; }
+ p:not(:first-line) { color: yellow; background: red; }
+ p:not(:after) { color: yellow; background: red; content: ' THIS TEST HAS FAILED! '; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179.0.scss
new file mode 100644
index 0000000000..ce5e3a8630
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-179.html */
+
+ p { color: green; }
+ span:first-line { background: red; color: yellow; font-size: 4em; }
+ span::first-line { background: red; color: yellow; font-size: 4em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179a.0.scss
new file mode 100644
index 0000000000..660e7508dc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-179a.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-179a.html */
+
+ p { color: green; }
+ p:first-line { background: red; color: yellow; font-size: 4em; }
+ p::first-line { background: red; color: yellow; font-size: 4em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18.0.scss
new file mode 100644
index 0000000000..33067afba0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-18.html */
+p:hover { background-color : lime }
+a:hover { background-color : lime }
+
+tr:hover { background-color : green }
+td:hover { background-color : lime }
+
+table { border-spacing: 5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-180a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-180a.0.scss
new file mode 100644
index 0000000000..a7a641bcb6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-180a.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-180a.html */
+
+ p { color: green; }
+ p:first-letter { background: red; color: yellow; font-size: 4em; }
+ p::first-letter { background: red; color: yellow; font-size: 4em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-181.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-181.0.scss
new file mode 100644
index 0000000000..24dbd1031d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-181.0.scss
@@ -0,0 +1,15 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-181.html */
+
+ .cs { color: green; }
+ .cs P { background: red; color: yellow; }
+ .cs .a { background: red; color: yellow; }
+ .cs .span1 span { background: red; color: yellow; }
+ .cs .span2 { color: red; }
+ .cs .span2 SPAN { color: green; }
+ .cs .span2 span { background: red; color: yellow; }
+ .ci { color: red; }
+ .ci P { background: green; color: white; }
+ .ci .a { background: green; color: white; }
+ .ci .span1 span { background: green; color: white; }
+ .ci .span2 SPAN { background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184a.0.scss
new file mode 100644
index 0000000000..7d5c5fd2d4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184a.html */
+
+p { color: lime; }
+p[class$=""] { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184b.0.scss
new file mode 100644
index 0000000000..f0e5f98b15
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184b.html */
+
+p { color: lime; }
+p[class^=""] { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184c.0.scss
new file mode 100644
index 0000000000..892f85f7f3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184c.html */
+
+p { color: lime; }
+p[class*=""] { color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184d.0.scss
new file mode 100644
index 0000000000..ad721d0131
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184d.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184d.html */
+
+p { color: red; }
+p:not([class$=""]) { color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184e.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184e.0.scss
new file mode 100644
index 0000000000..b1ae45984c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184e.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184e.html */
+
+p { color: red; }
+p:not([class^=""]) { color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184f.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184f.0.scss
new file mode 100644
index 0000000000..8d461ff6d6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-184f.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-184f.html */
+
+p { color: red; }
+p:not([class*=""]) { color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18a.0.scss
new file mode 100644
index 0000000000..ccd04a2cef
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18a.0.scss
@@ -0,0 +1,12 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-18a.html */
+
+p { color: navy; }
+
+.a a:hover { background: green; color: white; }
+
+.b a:hover { background: red; color: yellow; }
+.b a:link { background: green; color: white; }
+
+.c :link { background: green; color: white; }
+.c :visited:hover { background: red; color: yellow; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18b.0.scss
new file mode 100644
index 0000000000..87405f66f8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-18b.html */
+div:hover > p:first-child { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18c.0.scss
new file mode 100644
index 0000000000..519cbce0ee
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-18c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-18c.html */
+
+:link, :visited { color: navy; text-decoration: none; }
+:link:hover span { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19.0.scss
new file mode 100644
index 0000000000..8b13ef8766
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-19.html */
+a:active { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19b.0.scss
new file mode 100644
index 0000000000..c5ddec6c1d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-19b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-19b.html */
+button:active { background: green; color: white; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-2.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-2.0.scss
new file mode 100644
index 0000000000..ae64542b1c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-2.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-2.html */
+address { background-color: lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-20.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-20.0.scss
new file mode 100644
index 0000000000..5a2ef60ca9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-20.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-20.html */
+a:focus { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21.0.scss
new file mode 100644
index 0000000000..c391cb4d6f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-21.html */
+p:target { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21b.0.scss
new file mode 100644
index 0000000000..ef7b904578
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-21b.html */
+p { background-color: lime; }
+p:target { background-color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21c.0.scss
new file mode 100644
index 0000000000..842e11db74
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-21c.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-21c.html */
+:root { background-color: green; }
+:target { background-color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-22.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-22.0.scss
new file mode 100644
index 0000000000..62a0370b78
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-22.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-22.html */
+ul > li { background-color : red }
+li:lang(en-GB) { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-23.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-23.0.scss
new file mode 100644
index 0000000000..4415be07a9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-23.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-23.html */
+button { background-color : red }
+input { background-color : red }
+button:enabled { background-color : lime }
+input:enabled { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-24.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-24.0.scss
new file mode 100644
index 0000000000..40f518adc3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-24.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-24.html */
+button { background-color : red }
+input { background-color : red }
+button:disabled { background-color : lime }
+input:disabled { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-25.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-25.0.scss
new file mode 100644
index 0000000000..a9d194c71e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-25.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-25.html */
+input, span { background-color : red }
+input:checked, input:checked + span { background-color : lime}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27.0.scss
new file mode 100644
index 0000000000..6451254f09
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-27.html */
+html { background-color : red }
+*:root { background-color: lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27a.0.scss
new file mode 100644
index 0000000000..4482386911
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27a.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-27a.html */
+
+:root:first-child { background-color: red; }
+:root:last-child { background-color: red; }
+:root:only-child { background-color: red; }
+:root:nth-child(1) { background-color: red; }
+:root:nth-child(n) { background-color: red; }
+:root:nth-last-child(1) { background-color: red; }
+:root:nth-last-child(n) { background-color: red; }
+:root:first-of-type { background-color: red; }
+:root:last-of-type { background-color: red; }
+:root:only-of-type { background-color: red; }
+:root:nth-of-type(1) { background-color: red; }
+:root:nth-of-type(n) { background-color: red; }
+:root:nth-last-of-type(1) { background-color: red; }
+:root:nth-last-of-type(n) { background-color: red; }
+p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27b.0.scss
new file mode 100644
index 0000000000..a21c7dbf6d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-27b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-27b.html */
+* html { background-color: red; }
+* :root { background-color: red; }
+p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28.0.scss
new file mode 100644
index 0000000000..3546bfc898
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-28.html */
+.red { background-color : red }
+ul > li:nth-child(odd) { background-color : lime }
+ol > li:nth-child(even) { background-color : lime }
+table.t1 tr:nth-child(-n+4) { background-color : lime }
+table.t2 td:nth-child(3n+1) { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28b.0.scss
new file mode 100644
index 0000000000..a91ad30283
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-28b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-28b.html */
+.green { background-color : lime ! important }
+ul > li:nth-child(odd) { background-color : red }
+ol > li:nth-child(even) { background-color : red }
+table.t1 tr:nth-child(-n+4) { background-color : red }
+table.t2 td:nth-child(3n+1) { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29.0.scss
new file mode 100644
index 0000000000..0860aa4956
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-29.html */
+.red { background-color : red }
+ul > li:nth-last-child(odd) { background-color : green }
+ol > li:nth-last-child(even) { background-color : green }
+table.t1 tr:nth-last-child(-n+4) { background-color : green }
+table.t2 td:nth-last-child(3n+1) { background-color : green }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29b.0.scss
new file mode 100644
index 0000000000..eb55cc8de4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-29b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-29b.html */
+.green { background-color : lime ! important }
+ul > li:nth-last-child(odd) { background-color : red }
+ol > li:nth-last-child(even) { background-color : red }
+table.t1 tr:nth-last-child(-n+4) { background-color : red }
+table.t2 td:nth-last-child(3n+1) { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-30.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-30.0.scss
new file mode 100644
index 0000000000..46d21fae2a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-30.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-30.html */
+.red { background-color : red }
+p:nth-of-type(3) { background-color : lime }
+dl > :nth-of-type(3n+1) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-31.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-31.0.scss
new file mode 100644
index 0000000000..de45ba5eb1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-31.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-31.html */
+.red { background-color : red }
+p:nth-last-of-type(3) { background-color : lime }
+dl > :nth-last-of-type(3n+1) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-32.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-32.0.scss
new file mode 100644
index 0000000000..5fbf5c2b5e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-32.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-32.html */
+.red { background-color : red }
+.t1 td:first-child { background-color : lime }
+p > *:first-child { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-33.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-33.0.scss
new file mode 100644
index 0000000000..507ac1b3cb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-33.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-33.html */
+.red { background-color : red }
+.t1 td:last-child { background-color : lime }
+p > *:last-child { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-34.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-34.0.scss
new file mode 100644
index 0000000000..697d635940
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-34.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-34.html */
+.red { background-color : red }
+address { margin-bottom : 1em ; margin-left : 1em }
+address:first-of-type { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-35.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-35.0.scss
new file mode 100644
index 0000000000..0fee4326d0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-35.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-35.html */
+.red { background-color : red }
+address { margin-bottom : 1em ; margin-left : 1em }
+address:last-of-type { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-36.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-36.0.scss
new file mode 100644
index 0000000000..5190600df7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-36.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-36.html */
+.red { background-color : red }
+p:only-child { background-color : lime }
+div.testText > div > p { margin-left : 1em }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-37.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-37.0.scss
new file mode 100644
index 0000000000..37d2a23b4c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-37.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-37.html */
+.red { background-color : red }
+.t1 :only-of-type { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-38.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-38.0.scss
new file mode 100644
index 0000000000..9a039639b1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-38.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-38.html */
+p:first-line { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39.0.scss
new file mode 100644
index 0000000000..5243f7505a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-39.html */
+p:first-letter { font-size : xx-large ; background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39a.0.scss
new file mode 100644
index 0000000000..af6c66bd8a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39a.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-39a.html */
+p:first-letter { color: lime; font-size: xx-large; }
+p:before { color: red; content: 'T'; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39b.0.scss
new file mode 100644
index 0000000000..38ff4ba000
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39b.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-39b.html */
+p::first-letter { font-size : xx-large ; background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39c.0.scss
new file mode 100644
index 0000000000..f49d085ddb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-39c.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-39c.html */
+p::first-letter { color: lime; font-size: xx-large; }
+ p::before { color: red; content: 'T'; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-3a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-3a.0.scss
new file mode 100644
index 0000000000..a53bb65f46
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-3a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-3a.html */
+* { color : lime }
+ul, p { color : red }
+*.t1 { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-4.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-4.0.scss
new file mode 100644
index 0000000000..232286f470
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-4.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-4.html */
+#foo { background-color : lime }
+p { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41.0.scss
new file mode 100644
index 0000000000..12049ebc09
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-41.html */
+p::before { background-color : lime ; content : "GENERATED CONTENT "}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41a.0.scss
new file mode 100644
index 0000000000..9092fb307f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-41a.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-41a.html */
+p:before { background-color : lime ; content : "GENERATED CONTENT "}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42.0.scss
new file mode 100644
index 0000000000..2c7b3c5930
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-42.html */
+p::after { background-color : lime ; content : "GENERATED CONTENT "}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42a.0.scss
new file mode 100644
index 0000000000..319f9620b6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-42a.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-42a.html */
+p:after { background-color : lime ; content : "GENERATED CONTENT "}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43.0.scss
new file mode 100644
index 0000000000..6bac1431f1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-43.html */
+.white { background-color: transparent ! important; }
+.red { background-color: red; }
+div.t1 p { background-color: lime; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43b.0.scss
new file mode 100644
index 0000000000..57d2e390f0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-43b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-43b.html */
+.white { background-color: transparent ! important; }
+.green { background-color: lime; }
+div.t1 p { background-color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44.0.scss
new file mode 100644
index 0000000000..909bbca20e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-44.html */
+.white { background-color: transparent ! important; }
+.red { background-color: red; }
+div > p.test { background-color: lime; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44b.0.scss
new file mode 100644
index 0000000000..b26c14087f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-44b.html */
+.white { background-color: transparent ! important; }
+.green { background-color: lime; }
+div > p.test { background-color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44c.0.scss
new file mode 100644
index 0000000000..9279385479
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-44c.html */
+
+ .fail > div { background: red; color: yellow; }
+ .control { background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44d.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44d.0.scss
new file mode 100644
index 0000000000..a8ed5ed793
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-44d.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-44d.html */
+
+ #fail > div { background: red; }
+ p { background: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45.0.scss
new file mode 100644
index 0000000000..3de4e06318
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-45.html */
+.red { background-color : red }
+div.stub > p + p { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45b.0.scss
new file mode 100644
index 0000000000..02ddbde845
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-45b.html */
+.green { background-color: lime; }
+.white { background-color: transparent ! important; }
+div.stub > p + p { background-color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45c.0.scss
new file mode 100644
index 0000000000..6ed552f04e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-45c.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-45c.html */
+
+ .fail + div { background: red; }
+ .control { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46.0.scss
new file mode 100644
index 0000000000..be3866cefe
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-46.html */
+.red { background-color : red }
+div.stub > p ~ p { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46b.0.scss
new file mode 100644
index 0000000000..4de9c09290
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-46b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-46b.html */
+.green { background-color : lime ! important }
+div.stub > p ~ p { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-5.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-5.0.scss
new file mode 100644
index 0000000000..acf0689798
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-5.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-5.html */
+p { background-color : red }
+p[title] { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-54.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-54.0.scss
new file mode 100644
index 0000000000..4be84ca7f0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-54.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-54.html */
+div.stub > * { color : red }
+div.stub *:not([title^="si on"]) { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-55.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-55.0.scss
new file mode 100644
index 0000000000..eb3a0e6341
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-55.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-55.html */
+div.stub > * { color : red }
+div.stub *:not([title$="tait"]) { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-56.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-56.0.scss
new file mode 100644
index 0000000000..e9a01bdad8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-56.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-56.html */
+div.stub > * { color : red }
+div.stub *:not([title*=" on"]) { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-59.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-59.0.scss
new file mode 100644
index 0000000000..8c8d5d061c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-59.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-59.html */
+div.stub > * { color : red }
+div.stub *:not(.foo) { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-6.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-6.0.scss
new file mode 100644
index 0000000000..514e4c3a8c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-6.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-6.html */
+address { background-color : red }
+address[title="foo"] { background-color : lime }
+span[title="a"] { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-60.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-60.0.scss
new file mode 100644
index 0000000000..726b9f378b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-60.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-60.html */
+div.stub > * { color : red }
+div.stub *:not(#foo) { color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-61.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-61.0.scss
new file mode 100644
index 0000000000..2b346351b6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-61.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-61.html */
+div.stub > * { background-color : red }
+div.stub *:not(:link) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-62.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-62.0.scss
new file mode 100644
index 0000000000..4181d2eec7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-62.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-62.html */
+div.stub > * { background-color : red }
+div.stub *:not(:visited) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-63.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-63.0.scss
new file mode 100644
index 0000000000..24d4e99c5d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-63.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-63.html */
+div.stub * { color: lime; text-decoration: none; }
+div.stub > * > *:not(:hover) { color: black }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-64.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-64.0.scss
new file mode 100644
index 0000000000..480b30d221
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-64.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-64.html */
+div.stub * { color : lime }
+div.stub > * > *:not(:active) { color : black }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-65.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-65.0.scss
new file mode 100644
index 0000000000..30615dc8ef
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-65.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-65.html */
+a:not(:focus) { background-color: transparent; }
+a { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66.0.scss
new file mode 100644
index 0000000000..6532029b34
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-66.html */
+p { background-color: navy; color: white; }
+p:not(:target) { background-color: white; color: black; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66b.0.scss
new file mode 100644
index 0000000000..6323784598
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-66b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-66b.html */
+p { background-color: red; }
+p:not(:target) { background-color: lime; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-67.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-67.0.scss
new file mode 100644
index 0000000000..4e177b1149
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-67.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-67.html */
+div.stub * { background-color : red }
+div.stub *:not(:lang(fr)) { background-color : green }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-68.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-68.0.scss
new file mode 100644
index 0000000000..b6f16cb7a8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-68.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-68.html */
+button { background-color : red }
+input { background-color : red }
+button:not(:enabled) { background-color : lime }
+input:not(:enabled) { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-69.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-69.0.scss
new file mode 100644
index 0000000000..9f407b8406
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-69.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-69.html */
+button { background-color : red }
+input { background-color : red }
+button:not(:disabled) { background-color : lime }
+input:not(:disabled) { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7.0.scss
new file mode 100644
index 0000000000..8f1a711e3e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-7.html */
+p { background-color : red }
+p[class~="b"] { background-color : lime }
+address { background-color : red }
+address[title~="foo"] { background-color : lime }
+span[class~="b"] { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-70.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-70.0.scss
new file mode 100644
index 0000000000..23ec933cc2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-70.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-70.html */
+input, span { background-color : red }
+input:not(:checked), input:not(:checked) + span { background-color : lime}
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72.0.scss
new file mode 100644
index 0000000000..ee7aae040e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-72.html */
+p:not(:root) { background-color: lime; }
+div * { background-color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72b.0.scss
new file mode 100644
index 0000000000..2e52ad5595
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-72b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-72b.html */
+html:not(:root), test:not(:root) { background-color: red; }
+p { background-color: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77.0.scss
new file mode 100644
index 0000000000..43036386f6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-77.html */
+.red { background-color : red }
+.t1 td:not(:first-child) { background-color : lime }
+p > *:not(:first-child) { background-color : lime }
+table.t1 td { border : thin black solid }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77b.0.scss
new file mode 100644
index 0000000000..fd95f40ed5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-77b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-77b.html */
+.green { background-color : lime ! important }
+.t1 td:not(:first-child) { background-color : red }
+p > *:not(:first-child) { background-color : red }
+table.t1 td { border : thin black solid }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78.0.scss
new file mode 100644
index 0000000000..4d99f1ceca
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-78.html */
+.red { background-color : red }
+.t1 td:not(:last-child) { background-color : lime }
+p > *:not(:last-child) { background-color : lime }
+table.t1 td { border : thin black solid }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78b.0.scss
new file mode 100644
index 0000000000..8e3c173b9c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-78b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-78b.html */
+.green { background-color : lime ! important }
+.t1 td:not(:last-child) { background-color : red }
+p > *:not(:last-child) { background-color : red }
+table.t1 td { border : thin black solid }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-79.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-79.0.scss
new file mode 100644
index 0000000000..1d1ff21830
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-79.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-79.html */
+.red { background-color : red }
+address { margin-bottom : 1em ; margin-left : 1em }
+address:not(:first-of-type) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7b.0.scss
new file mode 100644
index 0000000000..8043e647d2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-7b.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-7b.html */
+
+p { background: lime; }
+[title~="hello world"] { background: red; }
+/* Section 6.3.1: Represents the att attribute whose value is a
+space-separated list of words, one of which is exactly "val". If this
+selector is used, the words in the value must not contain spaces
+(since they are separated by spaces). */
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-8.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-8.0.scss
new file mode 100644
index 0000000000..8afa5ca99d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-8.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-8.html */
+p { background-color : red }
+p[lang|="en"] { background-color : lime }
+address { background-color : red }
+address[lang="fi"] { background-color : lime }
+span[lang|="fr"] { background-color : red }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-80.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-80.0.scss
new file mode 100644
index 0000000000..697846a18f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-80.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-80.html */
+.red { background-color : red }
+address { margin-bottom : 1em ; margin-left : 1em }
+address:not(:last-of-type) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81.0.scss
new file mode 100644
index 0000000000..7b6f700901
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-81.html */
+.red { background-color : red }
+p:not(:only-child) { background-color : lime }
+div.testText > div > p { margin-left : 1em }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81b.0.scss
new file mode 100644
index 0000000000..af6a6cb054
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-81b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-81b.html */
+.green { background-color : lime ! important }
+p:not(:only-child) { background-color : lime }
+div.testText > div > p { margin-left : 1em }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82.0.scss
new file mode 100644
index 0000000000..5869d3161a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-82.html */
+.red { background-color : red }
+.t1 *:not(:only-of-type) { background-color : lime }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82b.0.scss
new file mode 100644
index 0000000000..c9e4c2cc94
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-82b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-82b.html */
+.green { background-color : lime ! important }
+.t1 *:not(:only-of-type) { background-color : red }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-86.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-86.0.scss
new file mode 100644
index 0000000000..7022b8c830
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-86.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-86.html */
+p { color: red; }
+blockquote > div p { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87.0.scss
new file mode 100644
index 0000000000..275d4274ca
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-87.html */
+p { color: red; }
+blockquote + div ~ p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87b.0.scss
new file mode 100644
index 0000000000..1776b027f7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-87b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-87b.html */
+p { color: green ! important; }
+blockquote + div ~ p { color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88.0.scss
new file mode 100644
index 0000000000..57814ed7c0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-88.html */
+p { color: red; }
+blockquote + div p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88b.0.scss
new file mode 100644
index 0000000000..2d0e34e3c8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-88b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-88b.html */
+p { color: green ! important; }
+blockquote + div p { color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-89.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-89.0.scss
new file mode 100644
index 0000000000..d6c797e143
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-89.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-89.html */
+p { color: red; }
+blockquote div > p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-9.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-9.0.scss
new file mode 100644
index 0000000000..cba3eded20
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-9.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-9.html */
+p { background-color : red }
+p[title^="foo"] { background-color : lime }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90.0.scss
new file mode 100644
index 0000000000..32175261e4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-90.html */
+p { color: red; }
+blockquote ~ div + p { color: green; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90b.0.scss
new file mode 100644
index 0000000000..afcdbafe4d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-90b.0.scss
@@ -0,0 +1,3 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-90b.html */
+p { color: green ! important; }
+blockquote ~ div + p { color: red; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1.0.scss
new file mode 100644
index 0000000000..b669874e11
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-d1.html */
+
+ #test { background: red; display: block; padding: 1em; }
+ #test:not(:empty) { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1b.0.scss
new file mode 100644
index 0000000000..0ac92bcd18
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d1b.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-d1b.html */
+
+ #test1 { background: red; display: block; padding: 1em; margin: 1em; }
+ #test1:empty { background: lime; }
+ #test2 { background: lime; display: block; padding: 1em; margin: 1em; }
+ #test2:empty { background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d2.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d2.0.scss
new file mode 100644
index 0000000000..c3f0544bb5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d2.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-d2.html */
+
+ #test { background: red; display: block; padding: 1em; }
+ #stub ~ div div + div > div { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d4.0.scss b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d4.0.scss
new file mode 100644
index 0000000000..dbf2bdda74
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/css3-modsel-d4.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-d4.html */
+
+ #two:first-child { background: red; }
+ #three:last-child { background: lime; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-001.0.scss
new file mode 100644
index 0000000000..7e94325735
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-001.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-001.0.scss
new file mode 100644
index 0000000000..3e68199d28
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-dynamic-001.htm */
+
+ span:before { content: open-quote; }
+ span:after { content: close-quote; }
+ span { quotes: '"' '"'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003a.0.scss
new file mode 100644
index 0000000000..30c5445777
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003a.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-dynamic-003a.htm */
+
+ div#x:first-letter { color: blue; float: left; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003b.0.scss
new file mode 100644
index 0000000000..37e3dee7fd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-dynamic-003b.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-dynamic-003b.htm */
+
+ div#x:first-letter { color: blue; float: none }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.0.scss
new file mode 100644
index 0000000000..4aea22c740
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-inherit-001.htm */
+
+div { float: left; overflow: scroll; font-size: 50px; width: 3em; line-height: 10px }
+div:first-letter { float: inherit; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.1.scss
new file mode 100644
index 0000000000..9bc48c3a71
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-inherit-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-inherit-001.htm */
+.style { font-size: 10px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-001.0.scss
new file mode 100644
index 0000000000..7d79ae49d8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-001.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-002.0.scss
new file mode 100644
index 0000000000..8ab9328de6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-002.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-003.0.scss
new file mode 100644
index 0000000000..2c2b8a906f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-003.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-004.0.scss
new file mode 100644
index 0000000000..b568b4430b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-004.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-004.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-005.0.scss
new file mode 100644
index 0000000000..d5f9376161
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-005.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-005.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-006.0.scss
new file mode 100644
index 0000000000..fc0089ccde
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-006.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-006.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-007.0.scss
new file mode 100644
index 0000000000..5fbf16bc9d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-nested-007.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-nested-007.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-001.0.scss
new file mode 100644
index 0000000000..ba956560c8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-001.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-002.0.scss
new file mode 100644
index 0000000000..a5f95536b7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-002.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-002.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+ span:before { content: open-quote; }
+ span:after { content: close-quote; }
+ span { quotes: '"' '"'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-003.0.scss
new file mode 100644
index 0000000000..849c55abf5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-003.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-003.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+ span:before { content: open-quote "This "; }
+ span:after { content: close-quote; }
+ span { quotes: '"' '"'; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-004.0.scss
new file mode 100644
index 0000000000..96706e1f1e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-004.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-004.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-005.0.scss
new file mode 100644
index 0000000000..15214106ba
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-005.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-005.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-006.0.scss
new file mode 100644
index 0000000000..970e5b70b0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-letter-quote-006.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-letter-quote-006.htm */
+
+ div { color: black; }
+ div:first-letter { color: green; }
+ span:before { content: "\"This "; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-001.0.scss
new file mode 100644
index 0000000000..74973ac9a1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-001.htm */
+
+ body { color: red }
+ body:first-line { color: green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.0.scss
new file mode 100644
index 0000000000..5cec148572
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-001.htm */
+
+ div { color: green }
+ div:first-line { color: red }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.1.scss
new file mode 100644
index 0000000000..59ddfc8476
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-001.htm */
+.style { float: left }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.0.scss
new file mode 100644
index 0000000000..89f8cbdeda
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-002.htm */
+
+ div { color: red }
+ div:first-line { color: green }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.1.scss
new file mode 100644
index 0000000000..716528bfc2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-002.htm */
+.style { float: left }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.0.scss
new file mode 100644
index 0000000000..8b793f90aa
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-003.htm */
+
+ div { color: green }
+ div:first-line { color: red }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.1.scss
new file mode 100644
index 0000000000..1da72d9761
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-003.htm */
+.style { float: left }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-004.0.scss
new file mode 100644
index 0000000000..cade4a2861
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-floats-004.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-floats-004.htm */
+
+ div { color: green }
+ div:first-line { color: red }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-001.0.scss
new file mode 100644
index 0000000000..c5e5fe5468
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-001.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-inherit-001.htm */
+
+
+.a:first-line { }
+.a { overflow: scroll; }
+.b, .c { overflow: inherit; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-002.0.scss
new file mode 100644
index 0000000000..ea1027fc24
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-002.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-inherit-002.htm */
+
+ div { background: green; }
+ div:first-line { background-color: red; }
+ span.one { background: inherit; }
+ span.two { background-color: inherit; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-003.0.scss
new file mode 100644
index 0000000000..f498981952
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/first-line-inherit-003.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/first-line-inherit-003.htm */
+
+ div, p { background: green; }
+ div:first-line, p:first-line { background-color: red; }
+ span.one { background: inherit; }
+ span.two { background-color: inherit; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.0.scss
new file mode 100644
index 0000000000..9358f2916e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001a.htm */
+
+.left { float:left; }
+.right { float:right; }
+.left, .right { width:50px; height:50px; background:yellow; }
+p { overflow:auto; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.1.scss
new file mode 100644
index 0000000000..d803b8ffd2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001a.htm */
+.style { width:400px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.2.scss
new file mode 100644
index 0000000000..0a22209fb1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001a.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001a.htm */
+.style { text-align:right; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.0.scss
new file mode 100644
index 0000000000..80fe2ff996
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001b.htm */
+
+.left { float:left; }
+.right { float:right; }
+.left, .right { width:50px; height:50px; background:yellow; }
+p { overflow:auto; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.1.scss
new file mode 100644
index 0000000000..3992160e83
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001b.htm */
+.style { width:400px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.2.scss
new file mode 100644
index 0000000000..f19a8d2088
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001b.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001b.htm */
+.style { text-align:right; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.0.scss
new file mode 100644
index 0000000000..19d1d26dc5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001c.htm */
+
+.left { float:left; }
+.right { float:right; }
+.left, .right { width:50px; height:50px; background:yellow; }
+p { overflow:auto; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.1.scss
new file mode 100644
index 0000000000..c3143dca78
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001c.htm */
+.style { width:400px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.2.scss
new file mode 100644
index 0000000000..e52a60f4ed
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-001c.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-001c.htm */
+.style { text-align:right; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.0.scss
new file mode 100644
index 0000000000..4141a2ba00
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-003.htm */
+.style { width:100px; font-size:5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.1.scss
new file mode 100644
index 0000000000..aecdad0621
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-003.htm */
+.style { background:blue; width:100px; height:100px; float:left; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.2.scss
new file mode 100644
index 0000000000..2e7fc3e31e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-003.htm */
+.style { background:yellow; width:30px; height:30px; float:left; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.3.scss
new file mode 100644
index 0000000000..bacc9de7c9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-003.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-003.htm */
+.style { background:yellow; width:30px; height:30px; float:right; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.0.scss
new file mode 100644
index 0000000000..a1f23b9119
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-004.htm */
+.style { width:200px; font-size:5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.1.scss
new file mode 100644
index 0000000000..be86a0b01e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-004.htm */
+.style { background:green; width:100px; height:100px; float:left; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.2.scss
new file mode 100644
index 0000000000..b9c4341835
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-placement-vertical-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-placement-vertical-004.htm */
+.style { background:blue; width:100px; height:100px; float:left; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.0.scss
new file mode 100644
index 0000000000..1f12c6fb78
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-001.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.1.scss
new file mode 100644
index 0000000000..155ae9bb17
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-001.htm */
+.style { float: right; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.2.scss
new file mode 100644
index 0000000000..03921ad64e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-001.htm */
+.style { margin-right: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.3.scss
new file mode 100644
index 0000000000..82327074bf
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-001.htm */
+.style { float: left; width: 425px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.0.scss
new file mode 100644
index 0000000000..b0659ed170
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-002.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.1.scss
new file mode 100644
index 0000000000..51d4aae421
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-002.htm */
+.style { float: right; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.2.scss
new file mode 100644
index 0000000000..b64d557e23
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-002.htm */
+.style { margin-right: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.3.scss
new file mode 100644
index 0000000000..667087faba
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-left-002.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-left-002.htm */
+.style { float: left; width: 475px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.0.scss
new file mode 100644
index 0000000000..bb6604d005
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-001.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.1.scss
new file mode 100644
index 0000000000..7ee24227e9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-001.htm */
+.style { float: left; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.2.scss
new file mode 100644
index 0000000000..1d11bdf6dc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-001.htm */
+.style { margin-left: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.3.scss
new file mode 100644
index 0000000000..2ce67f6358
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-001.htm */
+.style { float: right; width: 425px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.0.scss
new file mode 100644
index 0000000000..02936f2d05
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-002.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.1.scss
new file mode 100644
index 0000000000..62e70dc857
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-002.htm */
+.style { float: left; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.2.scss
new file mode 100644
index 0000000000..33158539ba
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-002.htm */
+.style { margin-left: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.3.scss
new file mode 100644
index 0000000000..b657772275
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule3-outside-right-002.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule3-outside-right-002.htm */
+.style { float: right; width: 475px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.0.scss
new file mode 100644
index 0000000000..a0b07a7d20
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-left-001.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.1.scss
new file mode 100644
index 0000000000..282d40f7de
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-left-001.htm */
+.style { float: left; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.2.scss
new file mode 100644
index 0000000000..ab40480544
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-left-001.htm */
+.style { margin-left: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.3.scss
new file mode 100644
index 0000000000..3d1bced7d2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-left-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-left-001.htm */
+.style { float: left; width: 425px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.0.scss
new file mode 100644
index 0000000000..808f90847a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-right-001.htm */
+.style { float: left; width: 500px; height: 500px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.1.scss
new file mode 100644
index 0000000000..2591c3de52
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-right-001.htm */
+.style { float: right; width: 50px; height: 300px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.2.scss
new file mode 100644
index 0000000000..2ca9103b55
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-right-001.htm */
+.style { margin-right: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.3.scss
new file mode 100644
index 0000000000..a051758341
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-rule7-outside-right-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-rule7-outside-right-001.htm */
+.style { float: right; width: 425px; height: 10px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.0.scss
new file mode 100644
index 0000000000..55dbbeebaa
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+
+
+ table { margin: 0; border-spacing: 0; }
+ td, th { padding: 0; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.1.scss
new file mode 100644
index 0000000000..59d553acc3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { background: aqua }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.12.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.12.scss
new file mode 100644
index 0000000000..941f9b0c43
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.12.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { float:right; background:blue; width: 100px; height: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.2.scss
new file mode 100644
index 0000000000..231f1d76cf
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { float:left; background:blue; width: 100px; height: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.24.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.24.scss
new file mode 100644
index 0000000000..5304225969
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.24.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { overflow: hidden; background: yellow }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.3.scss
new file mode 100644
index 0000000000..0ffa20c60c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { float:left; background:silver; width: 100px; height: 6px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.4.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.4.scss
new file mode 100644
index 0000000000..3af0c41084
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { background: yellow }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.5.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.5.scss
new file mode 100644
index 0000000000..70e5ab27a3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { width: 150px; height: 10px; background: purple }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.8.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.8.scss
new file mode 100644
index 0000000000..4f0231e636
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-004.8.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-004.htm */
+.style { float:right; background:silver; width: 100px; height: 6px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.0.scss
new file mode 100644
index 0000000000..87b04d41d4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+
+
+ body { font-size: 10px; }
+
+ table { margin: 0; border-spacing: 0; }
+ td, th { padding: 0; vertical-align: top; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.1.scss
new file mode 100644
index 0000000000..4ed6811ec4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+.style { background: aqua }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.2.scss
new file mode 100644
index 0000000000..04ba12051e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+.style { float:left; background:blue; width: 200px; height: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.3.scss
new file mode 100644
index 0000000000..59ff5a258e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+.style { background: yellow }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.5.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.5.scss
new file mode 100644
index 0000000000..1f9328855c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+.style { float:right; background:blue; width: 200px; height: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.9.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.9.scss
new file mode 100644
index 0000000000..53a68a0469
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-005.9.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-005.htm */
+.style { overflow:hidden; background: yellow; width: 50%; height: 20px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.0.scss
new file mode 100644
index 0000000000..ca6d5ed844
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.0.scss
@@ -0,0 +1,12 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+
+
+ body { font-size: 16px; }
+
+ table { margin: 0; border-spacing: 0; }
+ caption, td, th { padding: 0; vertical-align: top; text-align: left; }
+
+ table table caption { background: yellow; }
+ table table { background: purple; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.1.scss
new file mode 100644
index 0000000000..beba9cf330
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { background: aqua }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.10.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.10.scss
new file mode 100644
index 0000000000..49c74a97d9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.10.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:110px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.11.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.11.scss
new file mode 100644
index 0000000000..deee635381
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.11.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:105px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.12.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.12.scss
new file mode 100644
index 0000000000..fdb260729a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.12.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:100px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.13.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.13.scss
new file mode 100644
index 0000000000..4522f57cb8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.13.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:95px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.131.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.131.scss
new file mode 100644
index 0000000000..a274d6ee7f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.131.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { caption-side: bottom; height:30px; width: 192px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.14.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.14.scss
new file mode 100644
index 0000000000..b49fd302a9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.14.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:90px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.15.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.15.scss
new file mode 100644
index 0000000000..2a29f56c3f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.15.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:85px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.16.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.16.scss
new file mode 100644
index 0000000000..e8f11cc823
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.16.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:80px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.17.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.17.scss
new file mode 100644
index 0000000000..231f28519c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.17.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:75px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.18.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.18.scss
new file mode 100644
index 0000000000..a4f78671cb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.18.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:70px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.19.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.19.scss
new file mode 100644
index 0000000000..9e9e29d19c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.19.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:65px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.2.scss
new file mode 100644
index 0000000000..501590ad5d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:150px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.20.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.20.scss
new file mode 100644
index 0000000000..126280a6fe
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.20.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:60px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.21.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.21.scss
new file mode 100644
index 0000000000..a7228173da
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.21.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:55px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.22.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.22.scss
new file mode 100644
index 0000000000..0cc681c041
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.22.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:50px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.23.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.23.scss
new file mode 100644
index 0000000000..f2c07e7838
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.23.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:45px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.24.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.24.scss
new file mode 100644
index 0000000000..b8e2c5796e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.24.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:40px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.25.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.25.scss
new file mode 100644
index 0000000000..ce05ee6888
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.25.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:35px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.26.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.26.scss
new file mode 100644
index 0000000000..d5ab773c5f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.26.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:30px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.27.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.27.scss
new file mode 100644
index 0000000000..3385f4ea30
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.27.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:25px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.28.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.28.scss
new file mode 100644
index 0000000000..6022a36c29
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.28.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:20px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.29.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.29.scss
new file mode 100644
index 0000000000..a352e1fa56
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.29.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:15px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.3.scss
new file mode 100644
index 0000000000..29eb47aa2f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:145px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.30.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.30.scss
new file mode 100644
index 0000000000..5bacfae2f3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.30.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:10px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.31.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.31.scss
new file mode 100644
index 0000000000..0a8445e2b0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.31.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:5px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.32.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.32.scss
new file mode 100644
index 0000000000..ba50d0bd65
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.32.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { caption-side: top; height:30px; width: 100px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.33.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.33.scss
new file mode 100644
index 0000000000..2dc59a3264
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.33.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { height: 30px; width: 230px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.4.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.4.scss
new file mode 100644
index 0000000000..97ec1f9113
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:140px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.5.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.5.scss
new file mode 100644
index 0000000000..0778fc55c9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:135px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.6.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.6.scss
new file mode 100644
index 0000000000..eee0117225
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.6.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:130px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.65.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.65.scss
new file mode 100644
index 0000000000..7c9e6eda76
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.65.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { caption-side: top; height:30px; width: 190px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.66.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.66.scss
new file mode 100644
index 0000000000..bb41e0cbaf
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.66.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { height: 30px; width: 100px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.7.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.7.scss
new file mode 100644
index 0000000000..764745abb1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.7.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:125px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.8.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.8.scss
new file mode 100644
index 0000000000..ae65d3d2e4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.8.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:120px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.9.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.9.scss
new file mode 100644
index 0000000000..c86cc30a7c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.9.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { float:left; clear:left; background:blue; width:115px; height:1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.98.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.98.scss
new file mode 100644
index 0000000000..9cd7749821
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.98.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { caption-side: bottom; height:30px; width: 100px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.99.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.99.scss
new file mode 100644
index 0000000000..eabd2b81b7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-006.99.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-006.htm */
+.style { height: 30px; width: 227px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.0.scss
new file mode 100644
index 0000000000..fe79ead93b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+
+
+ table { margin: 0; border-spacing: 0; }
+ td, th { padding: 0; vertical-align: top; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.1.scss
new file mode 100644
index 0000000000..da32416752
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { background: aqua }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.15.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.15.scss
new file mode 100644
index 0000000000..dc37b6963d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.15.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: 5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.16.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.16.scss
new file mode 100644
index 0000000000..c2fed6240b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.16.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: 5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.19.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.19.scss
new file mode 100644
index 0000000000..a656c57cf1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.19.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: 10px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.2.scss
new file mode 100644
index 0000000000..bcd2f016b0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { float: left; height: 10px; width: 150px; background: blue }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.20.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.20.scss
new file mode 100644
index 0000000000..64956d2143
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.20.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: -5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.23.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.23.scss
new file mode 100644
index 0000000000..9796be893b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.23.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: -5px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.24.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.24.scss
new file mode 100644
index 0000000000..7842444780
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.24.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: 10px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.27.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.27.scss
new file mode 100644
index 0000000000..d2e20e04cc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.27.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: 4px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.28.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.28.scss
new file mode 100644
index 0000000000..74db9f2d40
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.28.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: 4px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.3.scss
new file mode 100644
index 0000000000..b50e1429ae
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: 6px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.31.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.31.scss
new file mode 100644
index 0000000000..f09ed11cee
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.31.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: -1px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.39.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.39.scss
new file mode 100644
index 0000000000..8dcb8d161c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.39.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: -4px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.4.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.4.scss
new file mode 100644
index 0000000000..3a4a85219f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.40.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.40.scss
new file mode 100644
index 0000000000..bfdf7db3b4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.40.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: 0px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.43.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.43.scss
new file mode 100644
index 0000000000..6f0581a068
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.43.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; margin-bottom: 0px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.44.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.44.scss
new file mode 100644
index 0000000000..186f24937b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.44.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: -4px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.48.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.48.scss
new file mode 100644
index 0000000000..489890f8bd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.48.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: -1px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.7.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.7.scss
new file mode 100644
index 0000000000..0ee68c91ce
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.7.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { height: 5px; background: purple; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.8.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.8.scss
new file mode 100644
index 0000000000..5c131b1a4d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-007.8.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-007.htm */
+.style { overflow: hidden; width: 200px; height: 5px; background: yellow; margin-top: 6px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-outside-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-outside-001.0.scss
new file mode 100644
index 0000000000..c7fdc4f3ba
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-bfc-outside-001.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-bfc-outside-001.htm */
+
+#wrap {width:600px; border:1px solid;}
+.a {background:lime; color:#fff; width:80%;}
+.b {float:right; width:18%; background: cyan; color: #000; height:10em;}
+textarea {width: 100%; height:10em;}
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.0.scss
new file mode 100644
index 0000000000..f780444dc2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001l.htm */
+
+
+body { width: 400px; border: medium solid; }
+div { float: left; clear: left; }
+span { display: block; overflow: hidden; width: 200px; height: 50px; background: aqua; margin-right: auto; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.1.scss
new file mode 100644
index 0000000000..a695061dc6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001l.htm */
+.style { width: 50px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.2.scss
new file mode 100644
index 0000000000..94b3728f3d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001l.htm */
+.style { width: 100px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.0.scss
new file mode 100644
index 0000000000..c665929221
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001r.htm */
+
+
+body { width: 400px; border: medium solid; }
+div { float: right; clear: right; }
+span { display: block; overflow: hidden; width: 200px; height: 50px; background: aqua; margin-left: auto; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.1.scss
new file mode 100644
index 0000000000..2775ef585f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001r.htm */
+.style { width: 50px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.2.scss
new file mode 100644
index 0000000000..3c9ab6d376
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-001r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-001r.htm */
+.style { width: 100px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.0.scss
new file mode 100644
index 0000000000..48cf6ec53a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002l.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: block; overflow: hidden; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.1.scss
new file mode 100644
index 0000000000..10ffd0fc80
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002l.htm */
+.style { float: left; width: 150px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.2.scss
new file mode 100644
index 0000000000..3a572e8b03
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002l.htm */
+.style { float: right; width: 300px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.0.scss
new file mode 100644
index 0000000000..fe457370c1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002r.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: block; overflow: hidden; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.1.scss
new file mode 100644
index 0000000000..4e2081dba9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002r.htm */
+.style { float: right; width: 150px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.2.scss
new file mode 100644
index 0000000000..1055fac5ff
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-002r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-002r.htm */
+.style { float: left; width: 300px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.0.scss
new file mode 100644
index 0000000000..ef1a96a2bf
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003l.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: block; overflow: hidden; width: 100px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.1.scss
new file mode 100644
index 0000000000..1c57064ba3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003l.htm */
+.style { float: left; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.2.scss
new file mode 100644
index 0000000000..2e90f18734
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003l.htm */
+.style { float: right; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.0.scss
new file mode 100644
index 0000000000..d2971cb795
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003r.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: block; overflow: hidden; width: 100px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.1.scss
new file mode 100644
index 0000000000..f6306c31aa
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003r.htm */
+.style { float: right; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.2.scss
new file mode 100644
index 0000000000..3b63ad756d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-bfc-003r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-bfc-003r.htm */
+.style { float: left; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.0.scss
new file mode 100644
index 0000000000..6119b6895a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001l.htm */
+
+
+body { width: 400px; border: medium solid; text-align: left; }
+div { float: left; clear: left; }
+span { display: inline-block; vertical-align: top; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.1.scss
new file mode 100644
index 0000000000..60abfaa89f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001l.htm */
+.style { width: 50px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.2.scss
new file mode 100644
index 0000000000..bb8f7d8585
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001l.htm */
+.style { width: 100px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.0.scss
new file mode 100644
index 0000000000..3c674d4165
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001r.htm */
+
+
+body { width: 400px; border: medium solid; text-align: right; }
+div { float: right; clear: right; }
+span { display: inline-block; vertical-align: top; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.1.scss
new file mode 100644
index 0000000000..254cceff5d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001r.htm */
+.style { width: 50px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.2.scss
new file mode 100644
index 0000000000..f9da61827d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-001r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-001r.htm */
+.style { width: 100px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.0.scss
new file mode 100644
index 0000000000..d391fc5bb6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002l.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: inline-block; vertical-align: top; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.1.scss
new file mode 100644
index 0000000000..b8b4e306b2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002l.htm */
+.style { float: left; width: 150px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.2.scss
new file mode 100644
index 0000000000..4fe3554d42
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002l.htm */
+.style { float: right; width: 300px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.0.scss
new file mode 100644
index 0000000000..278a0b20d1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002r.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: inline-block; vertical-align: top; width: 200px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.1.scss
new file mode 100644
index 0000000000..24fc0000cb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002r.htm */
+.style { float: right; width: 150px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.2.scss
new file mode 100644
index 0000000000..5aba32ba55
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-002r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-002r.htm */
+.style { float: left; width: 300px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.0.scss
new file mode 100644
index 0000000000..5af166b155
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003l.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: inline-block; vertical-align: top; width: 100px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.1.scss
new file mode 100644
index 0000000000..ae6e0a84ea
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003l.htm */
+.style { float: left; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.2.scss
new file mode 100644
index 0000000000..f6a110f660
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003l.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003l.htm */
+.style { float: right; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.0.scss
new file mode 100644
index 0000000000..573684a70a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003r.htm */
+
+
+body { width: 400px; border: medium solid; }
+span { display: inline-block; vertical-align: top; width: 100px; height: 50px; background: aqua; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.1.scss
new file mode 100644
index 0000000000..ed8f4d939a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003r.htm */
+.style { float: right; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.2.scss
new file mode 100644
index 0000000000..3156752c2e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-wrap-top-below-inline-003r.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-wrap-top-below-inline-003r.htm */
+.style { float: left; width: 250px; height: 75px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.0.scss
new file mode 100644
index 0000000000..4cb8f644c2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { width: 500px; height: 500px; float: left; font-size: 12px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.1.scss
new file mode 100644
index 0000000000..c1ed4bbe00
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { float: left; width: 10px; height: 30px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.2.scss
new file mode 100644
index 0000000000..b3891027db
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { float: left; clear: left; width: 100px; height: 1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.3.scss
new file mode 100644
index 0000000000..92c36c2b4b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: blue; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.4.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.4.scss
new file mode 100644
index 0000000000..7a4a377d29
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: purple; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.5.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.5.scss
new file mode 100644
index 0000000000..30b08ae999
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-001.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-001.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: fuchsia }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.0.scss
new file mode 100644
index 0000000000..c718bdcd07
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { width: 500px; height: 500px; float: left; font-size: 12px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.1.scss
new file mode 100644
index 0000000000..fa43435f50
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { float: left; width: 10px; height: 30px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.2.scss
new file mode 100644
index 0000000000..302c91ab56
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { float: left; clear: left; width: 100px; height: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.3.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.3.scss
new file mode 100644
index 0000000000..d90881ad6d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: blue; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.4.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.4.scss
new file mode 100644
index 0000000000..1f403a2ed2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: purple; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.5.scss b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.5.scss
new file mode 100644
index 0000000000..901a27fe9d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/floats-zero-height-wrap-002.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/floats-zero-height-wrap-002.htm */
+.style { display:inline-block; vertical-align: bottom; height: 20px; width: 300px; background: fuchsia }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-001.0.scss
new file mode 100644
index 0000000000..f70698a920
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-001.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-001.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTest FamilyName, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-002.0.scss
new file mode 100644
index 0000000000..f1cfd976b2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-002.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-002.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: csstest familyname, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-003.0.scss
new file mode 100644
index 0000000000..55ae604a48
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-003.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-003.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: cssTest familyName, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-004.0.scss
new file mode 100644
index 0000000000..b95f2e94bf
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-004.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-004.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: "CSSTest FamilyName", CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-005.0.scss
new file mode 100644
index 0000000000..3a5f916cce
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-005.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-005.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: 'CSSTest FamilyName', CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-006.0.scss
new file mode 100644
index 0000000000..312f9c8948
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-006.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-006.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTest FamilyName, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-007.0.scss
new file mode 100644
index 0000000000..d6f61aa0da
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-007.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-007.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: "CSSTest FamilyName", CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-008.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-008.0.scss
new file mode 100644
index 0000000000..b0f025d6f0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-008.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-008.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: 'CSSTest FamilyName', CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-009.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-009.0.scss
new file mode 100644
index 0000000000..f6ed3eea3d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-009.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-009.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTest \000046amilyName, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-012.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-012.0.scss
new file mode 100644
index 0000000000..ff9c919acd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-012.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-012.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: "CSSTest Family\Name", CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-013.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-013.0.scss
new file mode 100644
index 0000000000..04100a1326
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-013.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-013.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTest FamilyName Bold, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-014.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-014.0.scss
new file mode 100644
index 0000000000..d98252d89d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-014.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-014.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTestFamilyNameBold, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-016.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-016.0.scss
new file mode 100644
index 0000000000..11566bc342
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-016.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-016.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ p {
+ font-family: CSSTest Weights 400;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-017.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-017.0.scss
new file mode 100644
index 0000000000..ea2b2110b0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-017.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-017.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ body { font-family: CSSTest Fallback; }
+ p, div {
+ font-family: CSSTest Unknown;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-018.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-018.0.scss
new file mode 100644
index 0000000000..81e90cee9c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-018.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-018.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ body { font-family: CSSTest Fallback; }
+ p, div {
+ font-family: "CSSTest Unknown";
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-019.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-019.0.scss
new file mode 100644
index 0000000000..ad32f6351b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-019.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-019.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ div#test { font-family: CSSTest Fallback; }
+ p {
+ font-family: CSSTest Unknown;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-020.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-020.0.scss
new file mode 100644
index 0000000000..0d66b81154
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-020.0.scss
@@ -0,0 +1,9 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-020.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ div#test { font-family: CSSTest Fallback; }
+ p {
+ font-family: "CSSTest Unknown";
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-021.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-021.0.scss
new file mode 100644
index 0000000000..592d994b47
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-021.0.scss
@@ -0,0 +1,10 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-021.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ body { font-family: "CSSTest FamilyName"; }
+ div { font-family: "CSSTest Unknown"; }
+ p {
+ font-family: "CSSTest" Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-022.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-022.0.scss
new file mode 100644
index 0000000000..dc737140a8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-022.0.scss
@@ -0,0 +1,14 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-022.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ div { font-family: "CSSTest Unknown"; }
+ p {
+ }
+ p#test1 {
+ font-family: x-large CSSTest Fallback;
+ }
+ p#test4 {
+ font-family: caption CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-023.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-023.0.scss
new file mode 100644
index 0000000000..4c4dc9c7f3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-023.0.scss
@@ -0,0 +1,20 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-023.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ div.test { font-family: CSSTest Fallback; }
+ p {
+ }
+ p#test1a {
+ font-family: "small-caps 1in CSSTest FamilyName Funky", CSSTest Fallback;
+ }
+ p#test2 {
+ font-family: x-large CSSTest FamilyName Funky, CSSTest Fallback;
+ }
+ p#test2a {
+ font-family: "x-large CSSTest FamilyName Funky", CSSTest Fallback;
+ }
+ p#test3a {
+ font-family: "12px CSSTest FamilyName Funky", CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-family-name-024.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-024.0.scss
new file mode 100644
index 0000000000..79ac477f2c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-family-name-024.0.scss
@@ -0,0 +1,26 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-024.htm */
+
+ body { font-size: 36px; }
+ span#verify { font-family: CSSTest Verify; }
+ div.test { font-family: CSSTest Fallback; }
+ p {
+ }
+ p#test1 {
+ font-family: caption, CSSTest Fallback;
+ }
+ p#test2 {
+ font-family: icon, CSSTest Fallback;
+ }
+ p#test3 {
+ font-family: menu, CSSTest Fallback;
+ }
+ p#test4 {
+ font-family: message-box, CSSTest Fallback;
+ }
+ p#test5 {
+ font-family: small-caption, CSSTest Fallback;
+ }
+ p#test6 {
+ font-family: status-bar, CSSTest Fallback;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-weight-bolder-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-weight-bolder-001.0.scss
new file mode 100644
index 0000000000..e1334dbe2f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-weight-bolder-001.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-weight-bolder-001.htm */
+
+ span#verify { font-family: CSSTest Verify; font-weight: normal; }
+ div { margin-bottom: 1em; }
+ body { margin: 50px; }
+ table {
+ border-collapse: collapse;
+ }
+ th {
+ font-weight: normal;
+ text-align: left;
+ padding-right: 1em;
+ }
+ span { font-weight: bolder; }
+ thead th { text-align: center; padding-bottom: 1em; }
+ td { width: 5em; text-align: center; }
+ td.f1 { font-family: CSSTest Weights Full; }
+ td.f2 { font-family: CSSTest Weights W1479; }
+ td.f3 { font-family: CSSTest Weights W15; }
+ td.f4 { font-family: CSSTest Weights W24; }
+ td.f5 { font-family: CSSTest Weights W2569; }
+ td.f6 { font-family: CSSTest Weights W258; }
+ td.f7 { font-family: CSSTest Weights W3589; }
+ td.f8 { font-family: CSSTest Weights W47; }
+ th.f1 { display: table-cell; }
+ th.f2 { display: table-cell; }
+ th.f3 { display: table-cell; }
+ th.f4 { display: table-cell; }
+ th.f5 { display: table-cell; }
+ th.f6 { display: table-cell; }
+ th.f7 { display: table-cell; }
+ th.f8 { display: table-cell; }
+
+ tr.w1 td { font-weight: 100; }
+ tr.w2 td { font-weight: 200; }
+ tr.w3 td { font-weight: 300; }
+ tr.w4 td { font-weight: 400; }
+ tr.w5 td { font-weight: 500; }
+ tr.w6 td { font-weight: 600; }
+ tr.w7 td { font-weight: 700; }
+ tr.w8 td { font-weight: 800; }
+ tr.w9 td { font-weight: 900; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-weight-lighter-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-weight-lighter-001.0.scss
new file mode 100644
index 0000000000..1840142b38
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-weight-lighter-001.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-weight-lighter-001.htm */
+
+ span#verify { font-family: CSSTest Verify; font-weight: normal; }
+ div { margin-bottom: 1em; }
+ body { margin: 50px; }
+ table {
+ border-collapse: collapse;
+ }
+ th {
+ font-weight: normal;
+ text-align: left;
+ padding-right: 1em;
+ }
+ span { font-weight: lighter; }
+ thead th { text-align: center; padding-bottom: 1em; }
+ td { width: 5em; text-align: center; }
+ td.f1 { font-family: CSSTest Weights Full; }
+ td.f2 { font-family: CSSTest Weights W1479; }
+ td.f3 { font-family: CSSTest Weights W15; }
+ td.f4 { font-family: CSSTest Weights W24; }
+ td.f5 { font-family: CSSTest Weights W2569; }
+ td.f6 { font-family: CSSTest Weights W258; }
+ td.f7 { font-family: CSSTest Weights W3589; }
+ td.f8 { font-family: CSSTest Weights W47; }
+ th.f1 { display: table-cell; }
+ th.f2 { display: table-cell; }
+ th.f3 { display: table-cell; }
+ th.f4 { display: table-cell; }
+ th.f5 { display: table-cell; }
+ th.f6 { display: table-cell; }
+ th.f7 { display: table-cell; }
+ th.f8 { display: table-cell; }
+
+ tr.w1 td { font-weight: 100; }
+ tr.w2 td { font-weight: 200; }
+ tr.w3 td { font-weight: 300; }
+ tr.w4 td { font-weight: 400; }
+ tr.w5 td { font-weight: 500; }
+ tr.w6 td { font-weight: 600; }
+ tr.w7 td { font-weight: 700; }
+ tr.w8 td { font-weight: 800; }
+ tr.w9 td { font-weight: 900; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/font-weight-normal-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/font-weight-normal-001.0.scss
new file mode 100644
index 0000000000..29a665ee9a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/font-weight-normal-001.0.scss
@@ -0,0 +1,43 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/font-weight-normal-001.htm */
+
+ span#verify { font-family: CSSTest Verify; font-weight: normal; }
+ div { margin-bottom: 1em; }
+ body { margin: 50px; }
+ table {
+ border-collapse: collapse;
+ }
+ th {
+ font-weight: normal;
+ text-align: left;
+ padding-right: 1em;
+ }
+ span { }
+ thead th { text-align: center; padding-bottom: 1em; }
+ td { width: 5em; text-align: center; }
+ td.f1 { font-family: CSSTest Weights Full; }
+ td.f2 { font-family: CSSTest Weights W1479; }
+ td.f3 { font-family: CSSTest Weights W15; }
+ td.f4 { font-family: CSSTest Weights W24; }
+ td.f5 { font-family: CSSTest Weights W2569; }
+ td.f6 { font-family: CSSTest Weights W258; }
+ td.f7 { font-family: CSSTest Weights W3589; }
+ td.f8 { font-family: CSSTest Weights W47; }
+ th.f1 { display: table-cell; }
+ th.f2 { display: table-cell; }
+ th.f3 { display: table-cell; }
+ th.f4 { display: table-cell; }
+ th.f5 { display: table-cell; }
+ th.f6 { display: table-cell; }
+ th.f7 { display: table-cell; }
+ th.f8 { display: table-cell; }
+
+ tr.w1 td { font-weight: 100; }
+ tr.w2 td { font-weight: 200; }
+ tr.w3 td { font-weight: 300; }
+ tr.w4 td { font-weight: 400; }
+ tr.w5 td { font-weight: 500; }
+ tr.w6 td { font-weight: 600; }
+ tr.w7 td { font-weight: 700; }
+ tr.w8 td { font-weight: 800; }
+ tr.w9 td { font-weight: 900; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-000.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-000.0.scss
new file mode 100644
index 0000000000..9ddf923d46
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-000.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-000.htm */
+
+span { display: inline-block; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-001.0.scss
new file mode 100644
index 0000000000..595b0fef80
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-height-001.htm */
+
+div { display: inline-block; width: 10em; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-002.0.scss
new file mode 100644
index 0000000000..2876e73ab5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-height-002.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-height-002.htm */
+
+div { display: inline-block; height: 5em; width:10em; vertical-align: baseline; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-001.0.scss
new file mode 100644
index 0000000000..5d2446d71f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-valign-001.htm */
+
+span { display: inline-block; }
+span > span { display: block; visibility: hidden; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-002.0.scss
new file mode 100644
index 0000000000..f262046c2b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-valign-002.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-valign-002.htm */
+
+body { background: white; color: black; }
+span { display: inline-block; margin: 3px 0; border: 4px solid white; border-width: 4px 0; padding: 9px 0; }
+span > span { display: block; visibility: hidden; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001a.0.scss
new file mode 100644
index 0000000000..18c2f89059
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-width-001a.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-block; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001b.0.scss
new file mode 100644
index 0000000000..438331f06c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-001b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-width-001b.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-block; background: green; color: white; width: 10em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002a.0.scss
new file mode 100644
index 0000000000..851a3e0556
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002a.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-width-002a.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-block; background: green; color: white; }
+body > div > div > div { width: 20em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002b.0.scss
new file mode 100644
index 0000000000..652628c616
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-width-002b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-width-002b.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-block; background: green; color: white; width: 20em; }
+body > div > div > div { width: 20em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-001.0.scss
new file mode 100644
index 0000000000..b04dd45c9a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-zorder-001.htm */
+
+div { width: 2em; height: 1em; }
+span { display:inline-block; vertical-align: top; width: 2em; height: 1em; background: green; }
+div#after { margin-top:-1em; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-002.0.scss
new file mode 100644
index 0000000000..f888f84439
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-002.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-zorder-002.htm */
+
+div { width: 2em; height: 1em; }
+span { display:inline-block; vertical-align: top; width: 2em; height: 1em; }
+span span { display: block; background: green; }
+div#after { margin-top: -1em; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-003.0.scss
new file mode 100644
index 0000000000..902c10615b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-003.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-zorder-003.htm */
+
+div { height: 1em; }
+div#test span { display:inline-block; vertical-align: top; height: 1em; background: red; color: red; }
+div#after { margin-top:-1em; }
+div#after span { display: inline; vertical-align: top; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-004.0.scss
new file mode 100644
index 0000000000..2a326680b7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-004.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-zorder-004.htm */
+
+div#test span { display:inline-block; vertical-align: top; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+div#before { height: 1em; margin-bottom:-1em; }
+div#before span { display: inline; vertical-align: top; background: red; color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-005.0.scss
new file mode 100644
index 0000000000..7831203024
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-block-zorder-005.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-block-zorder-005.htm */
+
+div#test > span { display:inline-block; vertical-align: top; }
+div#test > span > span { display: block; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+div#before { height: 1em; margin-bottom:-1em; }
+div#before > span { display: inline; vertical-align: top; background: red; color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-002a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-002a.0.scss
new file mode 100644
index 0000000000..bbb79e3952
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-002a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-002a.htm */
+
+span { display: inline-table; }
+span > span { display: block; visibility: hidden; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-002b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-002b.0.scss
new file mode 100644
index 0000000000..085e0301ae
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-002b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-002b.htm */
+
+span > span { display: table-cell; }
+span > span > span { display: block; visibility: hidden; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-003.0.scss
new file mode 100644
index 0000000000..ced4d93ae8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-003.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-003.htm */
+
+span { display: inline-table; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-001.0.scss
new file mode 100644
index 0000000000..76cf9d68e4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-001.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-height-001.htm */
+
+div { display: inline-table; width: 10em; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-002.0.scss
new file mode 100644
index 0000000000..ee38aae8ea
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-height-002.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-height-002.htm */
+
+div { display: inline-table; height: 5em; vertical-align: baseline; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-valign-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-valign-001.0.scss
new file mode 100644
index 0000000000..73e683bbcd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-valign-001.0.scss
@@ -0,0 +1,15 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-valign-001.htm */
+
+span#table { display: inline-table; }
+span#rowgroup { display: table-row-group; }
+span#row { display: table-row; }
+span#cell { display: table-cell; }
+span#table, span#rowgroup, span#row, span#cell {
+ border: 4px solid white;
+ margin: 3px 0;
+ border-width: 4px 0;
+ padding: 9px 0;
+ border-spacing: 0 5px;
+}
+span#block { display: block; visibility: hidden; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001a.0.scss
new file mode 100644
index 0000000000..78e2c1ecab
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001a.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-width-001a.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-table; background: green; color: white; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001b.0.scss
new file mode 100644
index 0000000000..3a7ba0f225
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-001b.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-width-001b.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-table; background: green; color: white; width: 10em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002a.0.scss
new file mode 100644
index 0000000000..686714f14a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002a.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-width-002a.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-table; background: green; color: white; }
+body > div > div > div { width: 20em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002b.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002b.0.scss
new file mode 100644
index 0000000000..c363def1ac
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-width-002b.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-width-002b.htm */
+
+body > div { width: 10em; }
+body > div > div { display: inline-table; background: green; color: white; width: 20em; }
+body > div > div > div { width: 20em; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-001.0.scss
new file mode 100644
index 0000000000..79c11c95e5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-zorder-001.htm */
+
+div { width: 2em; height: 2em; }
+span { display:inline-table; vertical-align: top; width: 2em; height: 2em; background: green; }
+div#after { margin-top:-2em; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-002.0.scss
new file mode 100644
index 0000000000..6e208ec410
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-002.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-zorder-002.htm */
+
+div { width: 2em; height: 2em; }
+span { display:inline-table; vertical-align: top; width: 2em; height: 2em; }
+span span { display: block; background: green; }
+div#after { margin-top: -2em; background: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-003.0.scss
new file mode 100644
index 0000000000..8722af2fb2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-003.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-zorder-003.htm */
+
+div { height: 1em; }
+div#test > span { display:inline-table; vertical-align: top; height: 1em; background: red; color: red; }
+div#after { margin-top:-1em; }
+div#after > span { display: inline; vertical-align: top; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-004.0.scss
new file mode 100644
index 0000000000..344d56ff21
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-004.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-zorder-004.htm */
+
+div#test > span { display:inline-table; vertical-align: top; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+div#before { height: 1em; margin-bottom:-1em; }
+div#before > span { display: inline; vertical-align: top; background: red; color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-005.0.scss
new file mode 100644
index 0000000000..de883783f6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/inline-table-zorder-005.0.scss
@@ -0,0 +1,7 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/inline-table-zorder-005.htm */
+
+div#test > span { display:inline-table; vertical-align: top; }
+div#test > span > span { display: block; background: green; color: green; border-bottom: 0.25em solid green; border-top: 0.25em solid green; }
+div#before { height: 1em; margin-bottom:-1em; }
+div#before > span { display: inline; vertical-align: top; background: red; color: red; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/quotes-035.0.scss b/theme-compiler/tests/resources/w3ctests/scss/quotes-035.0.scss
new file mode 100644
index 0000000000..7e8809a736
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/quotes-035.0.scss
@@ -0,0 +1,29 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/quotes-035.htm */
+
+
+ .party1 * { display: inline; }
+ .party1 .a { quotes: "Isn" "'"
+ "t" "FAIL!"
+ "FAIL!" " i"; }
+ .party1 .b { quotes: "" "FAIL!!"
+ " wonderful" "!!!"
+ " to " " work"
+ "see " " [FAIL to]"
+ "C" "quotes"
+ "S" " "; }
+ .party1 .c { quotes: none; }
+ .party1 .d { quotes: "FAIL!" "FAIL!"
+ "FAIL!" "FAIL!"
+ "" ""; }
+ .test { margin-left: 2em; }
+ .test .no-open:before { content: no-open-quote; }
+ .test .open:before { content: open-quote; }
+ .test .triple-open:before { content: open-quote open-quote open-quote; }
+ .test .no-close:after { content: no-close-quote; }
+ .test .triple-no-close:after { content: no-close-quote no-close-quote no-close-quote; }
+ .test .close:after { content: close-quote; }
+ .test .triple-close:after { content: close-quote close-quote close-quote; }
+ .test .no-close-open:before { content: no-close-quote open-quote; }
+
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/quotes-035a.0.scss b/theme-compiler/tests/resources/w3ctests/scss/quotes-035a.0.scss
new file mode 100644
index 0000000000..e4e3d17658
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/quotes-035a.0.scss
@@ -0,0 +1,31 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/quotes-035a.htm */
+
+
+ .party1 * { display: inline; }
+ .party1 .a { quotes: "Isn" "'"
+ "t" "FAIL!"
+ "FAIL!" " i"; }
+ .party1 .b { quotes: "" "FAIL!!"
+ " wonderful" "!!!"
+ " to " " work"
+ "see " " [FAIL to]"
+ "C" "quotes"
+ "S" " "
+ "S" " "; }
+ .party1 .c { quotes: none; }
+ .party1 .d { quotes: "FAIL!" "FAIL!"
+ "FAIL!" "FAIL!"
+ "" ""
+ "" ""; }
+ .test { margin-left: 2em; }
+ .test .no-open:before { content: no-open-quote; }
+ .test .open:before { content: open-quote; }
+ .test .triple-open:before { content: open-quote open-quote open-quote; }
+ .test .no-close:after { content: no-close-quote; }
+ .test .triple-no-close:after { content: no-close-quote no-close-quote no-close-quote; }
+ .test .close:after { content: close-quote; }
+ .test .triple-close:after { content: close-quote close-quote close-quote; }
+ .test .no-close-open:before { content: no-close-quote open-quote; }
+
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/quotes-036.0.scss b/theme-compiler/tests/resources/w3ctests/scss/quotes-036.0.scss
new file mode 100644
index 0000000000..2d2927c254
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/quotes-036.0.scss
@@ -0,0 +1,35 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/quotes-036.htm */
+
+
+ .party1 * { display: inline; }
+ .party1 .a { quotes: "Isn" "'"
+ "t" "FAIL!"
+ "FAIL!" " i"; }
+ .party1 .b { quotes: "" "FAIL!!"
+ " wonderful" "!!!"
+ " to " " work"
+ "see " " [FAIL to]"
+ "C" "quotes"
+ "S" " "; }
+ .party1 .c { quotes: none; }
+ .party1 .d { quotes: "FAIL!" "FAIL!"
+ "FAIL!" "FAIL!"
+ "" ""; }
+ .test { margin-left: 2em; }
+ .test .no-open:before { content: no-open-quote; }
+ .test .open:before { content: open-quote; }
+ .test .triple-open:before { content: open-quote open-quote open-quote; }
+ .test .no-close:after { content: no-close-quote; }
+ .test .triple-no-close:after { content: no-close-quote no-close-quote no-close-quote; }
+ .test .close:after { content: close-quote; }
+ .test .triple-close:after { content: close-quote close-quote close-quote; }
+ .test .no-close-open:before { content: no-close-quote open-quote; }
+
+ /* hr br */
+ .test hr, .test br { display: inline; margin: 0; padding: 0;
+ height: auto; width: auto; border: none; color: inherit;
+ background: transparent; }
+ .test br:before { content: "" }
+ .test br:after { content: "" }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/ref-green-box-100x100.0.scss b/theme-compiler/tests/resources/w3ctests/scss/ref-green-box-100x100.0.scss
new file mode 100644
index 0000000000..6ee83f95d6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/ref-green-box-100x100.0.scss
@@ -0,0 +1,8 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/support/ref-green-box-100x100.htm */
+
+ div {
+ width: 100px;
+ height: 100px;
+ background: green;
+ }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-cell-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-cell-001.0.scss
new file mode 100644
index 0000000000..c03a4049a6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-cell-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-cell-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color td.t { background-color: aqua; }
+
+ table.imagetl td.t, table.imagebr td.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl td.t { background-position: top left; /* default */ }
+ table.imagebr td.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-colgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-colgroup-001.0.scss
new file mode 100644
index 0000000000..d0ce72d0e0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-colgroup-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-colgroup-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color colgroup.t { background-color: aqua; }
+
+ table.imagetl colgroup.t, table.imagebr colgroup.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl colgroup.t { background-position: top left; /* default */ }
+ table.imagebr colgroup.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-column-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-column-001.0.scss
new file mode 100644
index 0000000000..c3d2bd0503
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-column-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-column-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color col.t { background-color: aqua; }
+
+ table.imagetl col.t, table.imagebr col.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl col.t { background-position: top left; /* default */ }
+ table.imagebr col.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-row-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-row-001.0.scss
new file mode 100644
index 0000000000..1a7049fba8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-row-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-row-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color tr.t { background-color: aqua; }
+
+ table.imagetl tr.t, table.imagebr tr.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl tr.t { background-position: top left; /* default */ }
+ table.imagebr tr.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-rowgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-rowgroup-001.0.scss
new file mode 100644
index 0000000000..69c10cca9f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-rowgroup-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-rowgroup-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color tbody.t { background-color: aqua; }
+
+ table.imagetl tbody.t, table.imagebr tbody.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl tbody.t { background-position: top left; /* default */ }
+ table.imagebr tbody.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-table-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-table-001.0.scss
new file mode 100644
index 0000000000..b6a8f27ab2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bc-table-001.0.scss
@@ -0,0 +1,33 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bc-table-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 8px 6px; /* collapsed */
+ padding: 3px 7px 8px 6px; /* ignored */
+ border-collapse: collapse;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 0 4px 2px; /* collapsed */
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color { background-color: aqua; }
+
+ table.imagetl, table.imagebr {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl { background-position: top left; /* default */ }
+ table.imagebr { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-cell-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-cell-001.0.scss
new file mode 100644
index 0000000000..02289c80e2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-cell-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-cell-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color td.t { background-color: aqua; }
+
+ table.imagetl td.t, table.imagebr td.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl td.t { background-position: top left; /* default */ }
+ table.imagebr td.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-colgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-colgroup-001.0.scss
new file mode 100644
index 0000000000..dae2af72ae
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-colgroup-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-colgroup-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color colgroup.t { background-color: aqua; }
+
+ table.imagetl colgroup.t, table.imagebr colgroup.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl colgroup.t { background-position: top left; /* default */ }
+ table.imagebr colgroup.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-column-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-column-001.0.scss
new file mode 100644
index 0000000000..8289f3a4bb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-column-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-column-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color col.t { background-color: aqua; }
+
+ table.imagetl col.t, table.imagebr col.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl col.t { background-position: top left; /* default */ }
+ table.imagebr col.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-row-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-row-001.0.scss
new file mode 100644
index 0000000000..f2ec27e38b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-row-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-row-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color tr.t { background-color: aqua; }
+
+ table.imagetl tr.t, table.imagebr tr.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl tr.t { background-position: top left; /* default */ }
+ table.imagebr tr.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-rowgroup-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-rowgroup-001.0.scss
new file mode 100644
index 0000000000..cb5b8f79a6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-rowgroup-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-rowgroup-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color tbody.t { background-color: aqua; }
+
+ table.imagetl tbody.t, table.imagebr tbody.t {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl tbody.t { background-position: top left; /* default */ }
+ table.imagebr tbody.t { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-table-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-table-001.0.scss
new file mode 100644
index 0000000000..6d1eabb6a8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-backgrounds-bs-table-001.0.scss
@@ -0,0 +1,34 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-backgrounds-bs-table-001.htm */
+
+
+ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
+ body { padding: 15px; }
+
+ table {
+ margin: 0 3px 2px 4px; /* zero top to work around collapsing bug */
+ border: transparent solid;
+ border-width: 4px 2px 7px 3px;
+ padding: 3px 7px 8px 6px;
+ border-collapse: separate;
+ border-spacing: 2px 3px;
+ }
+
+ td {
+ border: transparent solid;
+ border-width: 2px 1px 4px 3px;
+ padding: 1px 2px 4px 3px;
+ empty-cells: show;
+ }
+
+ div { height: 10px; width: 50px; }
+
+ table.color { background-color: aqua; }
+
+ table.imagetl, table.imagebr {
+ background-image: url(support/repeatable-diagonal-gradient-with-ticks.png);
+ }
+
+ table.imagetl { background-position: top left; /* default */ }
+ table.imagebr { background-position: bottom right; /* default */ }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.0.scss
new file mode 100644
index 0000000000..bc5733aedd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-in-inline-001.htm */
+.style { display: table-row }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.1.scss
new file mode 100644
index 0000000000..a4d01762bd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-in-inline-001.htm */
+.style { display: block }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.2.scss
new file mode 100644
index 0000000000..fe13eb4cbb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-in-inline-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-in-inline-001.htm */
+.style { display: table-cell }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.0.scss
new file mode 100644
index 0000000000..15d24294d1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-001.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.1.scss
new file mode 100644
index 0000000000..c93d980b57
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-001.htm */
+.style { padding-top: 40px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.2.scss
new file mode 100644
index 0000000000..8c98e302cc
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-001.htm */
+.style { padding-top: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.3.scss
new file mode 100644
index 0000000000..90b0e303b2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-001.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-001.htm */
+.style { padding-top: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.0.scss
new file mode 100644
index 0000000000..9e8fc17d73
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-002.htm */
+
+
+td { vertical-align: baseline; padding-top: 0; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.1.scss
new file mode 100644
index 0000000000..c8a265b2e4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-002.htm */
+.style { padding-top: 40px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.2.scss
new file mode 100644
index 0000000000..84c4a43819
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-002.htm */
+.style { padding-top: 20px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.3.scss
new file mode 100644
index 0000000000..b212fc065f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-002.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-002.htm */
+.style { padding-top: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.0.scss
new file mode 100644
index 0000000000..b623b103e4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-003.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.1.scss
new file mode 100644
index 0000000000..646c3603f7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-003.htm */
+.style { padding-top: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.2.scss
new file mode 100644
index 0000000000..c461bdba34
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-003.htm */
+.style { padding-top: 40px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.3.scss
new file mode 100644
index 0000000000..3b0a262d34
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-003.htm */
+.style { padding-top: 12px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.4.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.4.scss
new file mode 100644
index 0000000000..055905d9d7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-003.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-003.htm */
+.style { padding-top: 3px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.0.scss
new file mode 100644
index 0000000000..3563cde096
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-004.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.1.scss
new file mode 100644
index 0000000000..eac995c41d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-004.htm */
+.style { padding-top: 12px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.2.scss
new file mode 100644
index 0000000000..b2745143e2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-004.htm */
+.style { padding-top: 3px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.3.scss
new file mode 100644
index 0000000000..15214ad16a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-004.htm */
+.style { padding-top: 40px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.4.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.4.scss
new file mode 100644
index 0000000000..4b93164a1b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-004.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-004.htm */
+.style { padding-top: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.0.scss
new file mode 100644
index 0000000000..49e4923cc8
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.1.scss
new file mode 100644
index 0000000000..7896c6342c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 0; height: 80px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.2.scss
new file mode 100644
index 0000000000..e000d2e340
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 40px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.3.scss
new file mode 100644
index 0000000000..0a30e0d376
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 12px; height: 120px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.4.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.4.scss
new file mode 100644
index 0000000000..c4152587ea
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 3px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.5.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.5.scss
new file mode 100644
index 0000000000..ec44e94e6d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 40px; height: 160px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.6.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.6.scss
new file mode 100644
index 0000000000..3a3990256c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-005.6.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-005.htm */
+.style { padding-top: 0 }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.0.scss
new file mode 100644
index 0000000000..3f56772677
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.1.scss
new file mode 100644
index 0000000000..4b20736354
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 0; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.2.scss
new file mode 100644
index 0000000000..9f71b57dd9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 40px; height: 80px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.3.scss
new file mode 100644
index 0000000000..dd8cd111f5
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 12px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.4.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.4.scss
new file mode 100644
index 0000000000..90ef71d106
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 3px; height: 120px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.5.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.5.scss
new file mode 100644
index 0000000000..6d33486f7c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 40px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.6.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.6.scss
new file mode 100644
index 0000000000..0bec2dee1a
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-006.6.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-006.htm */
+.style { padding-top: 0; height: 160px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.0.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.0.scss
new file mode 100644
index 0000000000..6c11f1b90f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.0.scss
@@ -0,0 +1,6 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+
+
+td { vertical-align: baseline; }
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.1.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.1.scss
new file mode 100644
index 0000000000..4863e1df5b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+.style { padding-top: 0; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.2.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.2.scss
new file mode 100644
index 0000000000..d32301afb9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+.style { padding-top: 40px; height: 80px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.3.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.3.scss
new file mode 100644
index 0000000000..b25a964d73
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+.style { padding-top: 12px; height: 160px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.4.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.4.scss
new file mode 100644
index 0000000000..98808066f1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+.style { padding-top: 3px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.5.scss b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.5.scss
new file mode 100644
index 0000000000..8a366d4df2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/table-vertical-align-baseline-007.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/table-vertical-align-baseline-007.htm */
+.style { padding-top: 40px; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-113.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-113.0.scss
new file mode 100644
index 0000000000..01e37d208c
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-113.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-113.htm */
+
+p { text-indent: 100px }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-114.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-114.0.scss
new file mode 100644
index 0000000000..ec19eb2816
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-114.0.scss
@@ -0,0 +1,4 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-114.htm */
+
+p { text-indent: 0px }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-115.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-115.0.scss
new file mode 100644
index 0000000000..569f033276
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-115.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-115.htm */
+
+p { text-indent: 100px }
+span { background: yellow }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.0.scss
new file mode 100644
index 0000000000..6ed93593e9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+
+
+body { font-size: 12px; width: 1px; }
+
+body > div, body > pre {
+ float: left; clear: left; margin: 1px; height: 2em;
+ border: medium solid;
+}
+
+span {
+ display: inline-block;
+ height: 1em;
+ width: 1em;
+}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.1.scss
new file mode 100644
index 0000000000..c71814945e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+.style { text-indent: 3em; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.11.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.11.scss
new file mode 100644
index 0000000000..d43af6804b
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.11.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+.style { width: 6em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.4.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.4.scss
new file mode 100644
index 0000000000..aecf9b104d
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+.style { text-indent: 3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.5.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.5.scss
new file mode 100644
index 0000000000..4d3f04cdf4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+.style { width: 1em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.8.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.8.scss
new file mode 100644
index 0000000000..11f2a1b4c7
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-001.8.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-001.htm */
+.style { width: 2em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.0.scss
new file mode 100644
index 0000000000..7dcafd1001
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+
+
+body { font-size: 12px; }
+
+body > div, body > pre {
+ float: left; clear: left; margin: 1px; height: 2em;
+ border: medium solid;
+}
+
+span {
+ display: inline-block;
+ height: 1em;
+ width: 1em;
+}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.1.scss
new file mode 100644
index 0000000000..fb9ad27680
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+.style { text-indent: 3em; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.11.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.11.scss
new file mode 100644
index 0000000000..9783ca14ac
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.11.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+.style { width: 6em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.4.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.4.scss
new file mode 100644
index 0000000000..dc20dd4b85
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+.style { text-indent: 3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.5.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.5.scss
new file mode 100644
index 0000000000..41cee98d11
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+.style { width: 1em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.8.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.8.scss
new file mode 100644
index 0000000000..49161e2910
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-002.8.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-002.htm */
+.style { width: 2em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.0.scss
new file mode 100644
index 0000000000..98f79df5fd
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+
+
+body { font-size: 12px; }
+
+body > div, body > pre {
+ float: left; clear: left; margin: 1px; height: 2em;
+ border: medium solid;
+}
+
+span {
+ display: inline-block;
+ height: 1em;
+ width: 1em;
+}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.1.scss
new file mode 100644
index 0000000000..ef4f538864
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { width: 1px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.11.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.11.scss
new file mode 100644
index 0000000000..29d824d66e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.11.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { width: 3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.17.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.17.scss
new file mode 100644
index 0000000000..ce29a677f1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.17.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { width: 4em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.2.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.2.scss
new file mode 100644
index 0000000000..d9169cf13e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { text-indent: -3em; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.25.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.25.scss
new file mode 100644
index 0000000000..575d7393f2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.25.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { text-indent: -3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.3.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.3.scss
new file mode 100644
index 0000000000..44021e266f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.3.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { width: 1em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.5.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.5.scss
new file mode 100644
index 0000000000..0b02a652f9
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-003.5.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-003.htm */
+.style { width: 5em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.0.scss
new file mode 100644
index 0000000000..4fcfac5be6
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.0.scss
@@ -0,0 +1,17 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+
+
+body { font-size: 12px; }
+
+body > div, body > pre {
+ float: left; clear: left; margin: 1px; height: 2em;
+ border: medium solid;
+}
+
+span {
+ display: inline-block;
+ height: 1em;
+ width: 1em;
+}
+
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.1.scss
new file mode 100644
index 0000000000..a8cd2367c3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { text-indent: -3em; }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.10.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.10.scss
new file mode 100644
index 0000000000..549eca8142
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.10.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { width: 3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.16.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.16.scss
new file mode 100644
index 0000000000..d97bdc5805
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.16.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { width: 4em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.2.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.2.scss
new file mode 100644
index 0000000000..645265fcee
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.2.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { width: 1em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.24.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.24.scss
new file mode 100644
index 0000000000..a43261231e
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.24.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { text-indent: -3em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.4.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.4.scss
new file mode 100644
index 0000000000..60d30f9cdb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-intrinsic-004.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-intrinsic-004.htm */
+.style { width: 5em }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-percent-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-percent-001.0.scss
new file mode 100644
index 0000000000..2204bedfe4
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-percent-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-percent-001.htm */
+
+div { width: 500px; }
+p { width: 300px; text-indent: 10%; }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-indent-wrap-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-indent-wrap-001.0.scss
new file mode 100644
index 0000000000..fc5dab0d52
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-indent-wrap-001.0.scss
@@ -0,0 +1,5 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-indent-wrap-001.htm */
+
+p { text-indent: 100px }
+span { background: yellow }
+
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.0.scss
new file mode 100644
index 0000000000..515fa762c3
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-001.htm */
+.style { letter-spacing:2px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.1.scss
new file mode 100644
index 0000000000..69ff275066
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-001.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-001.htm */
+.style { text-transform:capitalize }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.0.scss
new file mode 100644
index 0000000000..4d744e17b1
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-002.htm */
+.style { letter-spacing:2px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.1.scss
new file mode 100644
index 0000000000..c6bb7e4bef
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-002.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-002.htm */
+.style { text-transform:capitalize }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.0.scss
new file mode 100644
index 0000000000..0ba48a86c0
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-003.htm */
+.style { letter-spacing:2px }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.1.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.1.scss
new file mode 100644
index 0000000000..e1cb8d6745
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.1.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-003.htm */
+.style { text-transform:capitalize }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.4.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.4.scss
new file mode 100644
index 0000000000..a0d1d9a606
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.4.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-003.htm */
+.style { text-transform:none }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.7.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.7.scss
new file mode 100644
index 0000000000..438a1e4be2
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-capitalize-003.7.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-capitalize-003.htm */
+.style { white-space:nowrap }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-lowercase-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-lowercase-001.0.scss
new file mode 100644
index 0000000000..fe6e97e39f
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-lowercase-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-lowercase-001.htm */
+.style { text-transform:lowercase }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-001.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-001.0.scss
new file mode 100644
index 0000000000..7dc1c293cb
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-001.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-uppercase-001.htm */
+.style { text-transform:uppercase }
diff --git a/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-002.0.scss b/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-002.0.scss
new file mode 100644
index 0000000000..c18eff8824
--- /dev/null
+++ b/theme-compiler/tests/resources/w3ctests/scss/text-transform-uppercase-002.0.scss
@@ -0,0 +1,2 @@
+/* Source: http://test.csswg.org/suites/css2.1/20110323/html4/text-transform-uppercase-002.htm */
+.style { text-transform:uppercase }
diff --git a/theme-compiler/tests/src/com/vaadin/sass/resolvers/VaadinResolverTest.java b/theme-compiler/tests/src/com/vaadin/sass/resolvers/VaadinResolverTest.java
index 59b49888c2..0183142747 100644
--- a/theme-compiler/tests/src/com/vaadin/sass/resolvers/VaadinResolverTest.java
+++ b/theme-compiler/tests/src/com/vaadin/sass/resolvers/VaadinResolverTest.java
@@ -40,16 +40,26 @@ import java.lang.reflect.Method;
import org.junit.Assert;
import org.junit.Test;
-import com.vaadin.sass.internal.resolver.VaadinResolver;
+import com.vaadin.sass.internal.resolver.AbstractResolver;
+import com.vaadin.sass.internal.resolver.ClassloaderResolver;
+import com.vaadin.sass.internal.resolver.FilesystemResolver;
public class VaadinResolverTest {
@Test
- public void testPathNormalization() throws Exception {
+ public void testFilesystemResolverPathNormalization() throws Exception {
+ testPathNormalization(new FilesystemResolver());
+ }
+
+ @Test
+ public void testClassloaderResolverPathNormalization() throws Exception {
+ testPathNormalization(new ClassloaderResolver());
+ }
- VaadinResolver resolver = new VaadinResolver();
+ public void testPathNormalization(AbstractResolver resolver)
+ throws Exception {
- Method normalizeMethod = VaadinResolver.class.getDeclaredMethod(
+ Method normalizeMethod = AbstractResolver.class.getDeclaredMethod(
"normalize", String.class);
normalizeMethod.setAccessible(true);
diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AbstractDirectoryScanningSassTests.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AbstractDirectoryScanningSassTests.java
index 40da6179f6..6a5f8db73d 100644
--- a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AbstractDirectoryScanningSassTests.java
+++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AbstractDirectoryScanningSassTests.java
@@ -19,7 +19,6 @@ package com.vaadin.sass.testcases.scss;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
-import java.io.FilenameFilter;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
@@ -29,54 +28,93 @@ import java.util.List;
import org.apache.commons.io.IOUtils;
import org.junit.Assert;
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.CSSParseException;
import com.vaadin.sass.internal.ScssStylesheet;
+import com.vaadin.sass.internal.handler.SCSSDocumentHandler;
+import com.vaadin.sass.internal.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.internal.handler.SCSSErrorHandler;
import com.vaadin.sass.testcases.scss.SassTestRunner.FactoryTest;
public abstract class AbstractDirectoryScanningSassTests {
public static Collection<String> getScssResourceNames(URL directoryUrl)
- throws URISyntaxException {
+ throws URISyntaxException, IOException {
List<String> resources = new ArrayList<String>();
- for (File scssFile : getScssFiles(directoryUrl)) {
- resources.add(scssFile.getName());
+ for (String scssFile : getScssFiles(directoryUrl)) {
+ resources.add(scssFile);
}
return resources;
}
- private static File[] getScssFiles(URL directoryUrl)
- throws URISyntaxException {
+ private static List<String> getScssFiles(URL directoryUrl)
+ throws URISyntaxException, IOException {
URL sasslangUrl = directoryUrl;
File sasslangDir = new File(sasslangUrl.toURI());
File scssDir = new File(sasslangDir, "scss");
Assert.assertTrue(scssDir.exists());
- return scssDir.listFiles(new FilenameFilter() {
+ List<File> scssFiles = new ArrayList<File>();
+ addScssFilesRecursively(scssDir, scssFiles);
- @Override
- public boolean accept(File dir, String name) {
- return name.endsWith(".scss");
+ List<String> scssRelativeNames = new ArrayList<String>();
+ for (File f : scssFiles) {
+ String relativeName = f.getCanonicalPath().substring(
+ scssDir.getCanonicalPath().length() + 1);
+ scssRelativeNames.add(relativeName);
+ }
+ return scssRelativeNames;
+ }
+
+ private static void addScssFilesRecursively(File scssDir,
+ List<File> scssFiles) {
+ for (File f : scssDir.listFiles()) {
+ if (f.isDirectory()) {
+ addScssFilesRecursively(f, scssFiles);
+ } else if (f.getName().endsWith(".scss")
+ && !f.getName().startsWith("_")) {
+ scssFiles.add(f);
}
- });
+ }
}
protected abstract URL getResourceURL(String path);
@FactoryTest
public void compareScssWithCss(String scssResourceName) throws Exception {
- String referenceCss;
File scssFile = getSassLangResourceFile(scssResourceName);
- File cssFile = getCssFile(scssFile);
- referenceCss = IOUtils.toString(new FileInputStream(cssFile));
- ScssStylesheet scssStylesheet = ScssStylesheet.get(scssFile
- .getAbsolutePath());
+
+ SCSSDocumentHandler documentHandler = new SCSSDocumentHandlerImpl();
+ SCSSErrorHandler errorHandler = new SCSSErrorHandler() {
+ @Override
+ public void error(CSSParseException arg0) throws CSSException {
+ super.error(arg0);
+ Assert.fail(arg0.getMessage());
+ }
+
+ @Override
+ public void fatalError(CSSParseException arg0) throws CSSException {
+ super.error(arg0);
+ Assert.fail(arg0.getMessage());
+ }
+ };
+
+ ScssStylesheet scssStylesheet = ScssStylesheet.get(
+ scssFile.getCanonicalPath(), null, documentHandler,
+ errorHandler);
scssStylesheet.compile();
String parsedCss = scssStylesheet.toString();
- String normalizedReference = normalize(referenceCss);
- String normalizedParsed = normalize(parsedCss);
- Assert.assertEquals("Original CSS and parsed CSS do not match for "
- + scssResourceName, normalizedReference, normalizedParsed);
+ if (getCssFile(scssFile) != null) {
+ String referenceCss = IOUtils.toString(new FileInputStream(
+ getCssFile(scssFile)));
+ String normalizedReference = normalize(referenceCss);
+ String normalizedParsed = normalize(parsedCss);
+
+ Assert.assertEquals("Original CSS and parsed CSS do not match for "
+ + scssResourceName, normalizedReference, normalizedParsed);
+ }
}
private String normalize(String css) {
@@ -88,6 +126,9 @@ public abstract class AbstractDirectoryScanningSassTests {
css = css.replaceAll("^[\n\r\t ]*", "");
// remove trailing whitespace
css = css.replaceAll("[\n\r\t ]*$", "");
+ css = css.replaceAll(";", ";\n");
+ css = css.replaceAll("\\{", "\\{\n");
+ css = css.replaceAll("}", "}\n");
return css;
}
@@ -103,7 +144,7 @@ public abstract class AbstractDirectoryScanningSassTests {
return new File(res.toURI());
}
- private File getCssFile(File scssFile) {
- return new File(scssFile.getAbsolutePath().replace("scss", "css"));
+ protected File getCssFile(File scssFile) throws IOException {
+ return new File(scssFile.getCanonicalPath().replace("scss", "css"));
}
}
diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AutomaticSassTests.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AutomaticSassTests.java
index 4134c564f9..66e0bedac0 100644
--- a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AutomaticSassTests.java
+++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/AutomaticSassTests.java
@@ -15,6 +15,7 @@
*/
package com.vaadin.sass.testcases.scss;
+import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Collection;
@@ -37,7 +38,7 @@ public class AutomaticSassTests extends AbstractDirectoryScanningSassTests {
@TestFactory
public static Collection<String> getScssResourceNames()
- throws URISyntaxException {
+ throws URISyntaxException, IOException {
return getScssResourceNames(getResourceURLInternal(""));
}
diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/CompassImports.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/CompassImports.java
new file mode 100644
index 0000000000..1e3eb09f0c
--- /dev/null
+++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/CompassImports.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.sass.testcases.scss;
+
+import java.io.File;
+import java.io.IOException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.AbstractTestBase;
+import com.vaadin.sass.internal.ScssStylesheet;
+import com.vaadin.sass.internal.handler.SCSSDocumentHandler;
+import com.vaadin.sass.internal.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.internal.parser.Parser;
+import com.vaadin.sass.internal.resolver.FilesystemResolver;
+import com.vaadin.sass.internal.tree.ImportNode;
+
+public class CompassImports extends AbstractTestBase {
+
+ String scssOtherDirectory = "/scss/compass-test/compass-import.scss";
+ String scssSameDirectory = "/scss/compass-test2/compass-import2.scss";
+ String css = "/css/compass-import.css";
+
+ String compassPath = "/scss/compass-test2";
+
+ @Test
+ public void testParser() throws CSSException, IOException {
+ Parser parser = new Parser();
+ SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+ parser.setDocumentHandler(handler);
+ parser.parseStyleSheet(getClass().getResource(scssOtherDirectory)
+ .getPath());
+ ScssStylesheet root = handler.getStyleSheet();
+ ImportNode importVariableNode = (ImportNode) root.getChildren().get(0);
+ Assert.assertEquals("compass", importVariableNode.getUri());
+ Assert.assertFalse(importVariableNode.isPureCssImport());
+ }
+
+ @Test
+ public void testCompiler() throws Exception {
+ testCompiler(scssSameDirectory, css, null);
+ }
+
+ @Test
+ public void testCompilerWithCustomPath() throws Exception {
+ File rootPath = new File(getClass().getResource(compassPath).toURI());
+
+ testCompiler(scssOtherDirectory, css, rootPath.getPath());
+ }
+
+ public void testCompiler(String scss, String css, String additionalPath)
+ throws Exception {
+ comparisonCss = getFileContent(css);
+ ScssStylesheet sheet = getStyleSheet(scss);
+ Assert.assertNotNull(sheet);
+ sheet.addResolver(new FilesystemResolver(additionalPath));
+
+ sheet.compile();
+ parsedScss = sheet.toString();
+ Assert.assertEquals("Original CSS and parsed CSS do not match",
+ comparisonCss, parsedScss);
+ }
+}
diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/SassLangTests.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/SassLangTests.java
index 4b8aada524..a8c9e80a3a 100644
--- a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/SassLangTests.java
+++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/SassLangTests.java
@@ -15,6 +15,7 @@
*/
package com.vaadin.sass.testcases.scss;
+import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Collection;
@@ -42,7 +43,7 @@ public class SassLangTests extends AbstractDirectoryScanningSassTests {
@TestFactory
public static Collection<String> getScssResourceNames()
- throws URISyntaxException {
+ throws URISyntaxException, IOException {
return getScssResourceNames(getResourceURLInternal(""));
}
diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/SassLangTestsBroken.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/SassLangTestsBroken.java
index 6b812a6940..0656565c20 100644
--- a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/SassLangTestsBroken.java
+++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/SassLangTestsBroken.java
@@ -15,6 +15,7 @@
*/
package com.vaadin.sass.testcases.scss;
+import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Collection;
@@ -45,7 +46,7 @@ public class SassLangTestsBroken extends AbstractDirectoryScanningSassTests {
@TestFactory
public static Collection<String> getScssResourceNames()
- throws URISyntaxException {
+ throws URISyntaxException, IOException {
return getScssResourceNames(getResourceURLInternal(""));
}
diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/W3ConformanceTests.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/W3ConformanceTests.java
new file mode 100644
index 0000000000..8dbc6345d6
--- /dev/null
+++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/W3ConformanceTests.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.sass.testcases.scss;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.List;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+import org.junit.runner.RunWith;
+
+import com.vaadin.sass.testcases.scss.SassTestRunner.TestFactory;
+
+@RunWith(SassTestRunner.class)
+public class W3ConformanceTests extends AbstractDirectoryScanningSassTests {
+
+ @Override
+ protected URL getResourceURL(String path) {
+ return getResourceURLInternal(path);
+ }
+
+ private static URL getResourceURLInternal(String path) {
+ return AutomaticSassTests.class.getResource("/w3ctests" + path);
+ }
+
+ @TestFactory
+ public static Collection<String> getScssResourceNames()
+ throws URISyntaxException, IOException {
+ return getScssResourceNames(getResourceURLInternal(""));
+ }
+
+ @Override
+ protected File getCssFile(File scssFile) throws IOException {
+ /*
+ * We should really compare the result of unparse(parse(css)) to css,
+ * but the comparator routine is currently too primitive.
+ */
+ // return scssFile;
+
+ // no comparison step, just parse, in this test
+ return null;
+ }
+
+ /*
+ * Download W3C conformance tests for CSS 2.1 and CSS 3 (selectors),
+ * extracts all CSS (style tags, inline styles, and linked stylesheets),
+ * then tries to parse them. Since each CSS is valid SCSS, the parser should
+ * accept them. As these are browser tests, some are intentionally
+ * malformed, and must be excluded from the test suite.
+ */
+
+ public static void main(String[] args) throws Exception {
+ if (args.length < 1) {
+ System.err.println("Target directory not provided");
+ return;
+ }
+ File targetDir = new File(args[0]);
+ for (URI url : CSS21()) {
+ extractCSS(url, targetDir);
+ }
+ for (URI url : CSS3Selectors()) {
+ extractCSS(url, targetDir);
+ }
+
+ }
+
+ public static Collection<URI> CSS21() throws Exception {
+ /*
+ * Tests explicitly excluded are listed below---case by case motivation
+ * required!
+ */
+ final String[] excludelist = new String[] {
+ // Unsupported character encoding UTF-16
+ "http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-be-002.htm",
+ "http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-be-003.htm",
+ "http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-le-002.htm",
+ "http://test.csswg.org/suites/css2.1/20110323/html4/at-charset-utf16-le-003.htm",
+
+ // Font family name contains (Asian?) cryptoglyphs
+ "http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-010.htm",
+ "http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-011.htm",
+ "http://test.csswg.org/suites/css2.1/20110323/html4/font-family-name-015.htm",
+
+ // Contains syntactically illegal CSS
+ "http://test.csswg.org/suites/css2.1/20110323/html4/uri-013.htm",
+
+ // Missing semicolon on line 29
+ "http://test.csswg.org/suites/css2.1/20110323/html4/z-index-020.htm", };
+
+ // Note: W3C test reference files also not included!
+ return scrapeIndexForTests(
+ "http://test.csswg.org/suites/css2.1/20110323/html4/reftest-toc.html",
+ ".*[0-9][0-9][0-9][a-z]?\\.htm", Integer.MAX_VALUE,
+ new LinkedHashSet<URI>() {
+ {
+ for (String s : excludelist) {
+ add(new URI(s));
+ }
+ }
+ });
+ }
+
+ public static Collection<URI> CSS3Selectors() throws Exception {
+ /*
+ * Tests explicitly excluded are listed below---case by case motivation
+ * required!
+ */
+ final String[] excludelist = new String[] {
+
+ // Probable bug/limitation (filed as #12834)
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-73.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-73b.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-74.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-74b.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-75.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-75b.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-76.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-76b.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-83.html",
+
+ // Invalid CSS, although sass-lang compiler accepts (see #12835)
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-154.html",
+
+ // Invalid CSS? sass-lang compiler fails
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-157.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-158.html",
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-183.html", };
+
+ return scrapeIndexForTests(
+ "http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/",
+ "css3-.*\\.html", Integer.MAX_VALUE, new LinkedHashSet<URI>() {
+ {
+ for (String s : excludelist) {
+ add(new URI(s));
+ }
+ }
+ });
+ }
+
+ /*
+ * Loads up to maxTest tests, excluding any URL in excludeUrls.
+ */
+ protected static Collection<URI> scrapeIndexForTests(String url,
+ String regexp, int maxTests, Collection<URI> excludeUrls)
+ throws Exception {
+
+ URI baseUrl = new URI(url);
+ Document doc = Jsoup.connect(url).timeout(10000).get();
+ Elements elems = doc.select(String.format("a[href~=%s]", regexp));
+ LinkedHashSet<URI> tests = new LinkedHashSet<URI>();
+ for (Element e : elems) {
+ URI testUrl = new URI(e.attr("href"));
+ if (!testUrl.isAbsolute()) {
+ testUrl = baseUrl.resolve(testUrl);
+ }
+ if (tests.size() < maxTests) {
+ if (!excludeUrls.contains(testUrl)) {
+ tests.add(testUrl);
+ }
+ } else {
+ break;
+ }
+ }
+
+ return tests;
+ }
+
+ public static void extractCSS(final URI url, File targetdir)
+ throws Exception {
+ /*
+ * For each test URL: 1) extract <style> tag contents 2) extract from
+ * <link rel="stylesheet"> files 3) extract inline style attributes from
+ * all elements and wrap the result in .style {}
+ */
+
+ Document doc = Jsoup.connect(url.toString()).timeout(20000).get();
+
+ List<String> tests = new ArrayList<String>();
+
+ for (Element e : doc.select("style[type=text/css]")) {
+ tests.add(e.data());
+ }
+
+ for (Element e : doc
+ .select("link[rel=stylesheet][href][type=text/css]")) {
+ URI cssUri = new URI(e.attr("href"));
+ if (!cssUri.isAbsolute()) {
+ cssUri = url.resolve(cssUri);
+ }
+ String encoding = doc.outputSettings().charset().name();
+ tests.add(IOUtils.toString(cssUri, encoding));
+ }
+
+ for (Element e : doc.select("*[style]")) {
+ tests.add(String.format(".style { %s }", e.attr("style")));
+ }
+
+ for (final String test : tests) {
+ targetdir.mkdirs();
+ String logfile = String.format("%s.%d.scss",
+ FilenameUtils.getBaseName(url.toString()),
+ tests.indexOf(test));
+ PrintStream dataLogger = new PrintStream(new File(targetdir,
+ logfile));
+
+ dataLogger.println("/* Source: " + url + " */");
+ dataLogger.println(test);
+
+ }
+ }
+}
diff --git a/uitest/build.xml b/uitest/build.xml
index bd0f49ae1e..76b75e9203 100644
--- a/uitest/build.xml
+++ b/uitest/build.xml
@@ -9,6 +9,7 @@
<!-- global properties -->
<property name="module.name" value="vaadin-uitest" />
+ <property name="uitest.dir" location="${vaadin.basedir}/uitest" />
<property name="result.dir" value="result" />
<property name="result.war" location="${result.dir}/lib/${module.name}-${vaadin.version}.war" />
@@ -107,6 +108,11 @@
<path refid="classpath.runtime.dependencies" />
</copy>
+ <delete>
+ <!-- Avoid including some potentially conflicting jars in the war -->
+ <fileset dir="${deps.dir}" includes="jetty-*.jar" />
+ <fileset dir="${deps.dir}" includes="servlet-api-*.jar" />
+ </delete>
<!-- Ensure filtered webcontent files are available -->
<antcall target="common.filter.webcontent" />
@@ -148,4 +154,53 @@
<echo>WHAT? No JUnit tests for ${module.name}!</echo>
</target>
+ <target name="test-testbench" depends="clean-testbench-errors" description="Run all TestBench based tests, including server tests">
+ <parallel>
+ <daemons>
+ <!-- Start server -->
+ <ant antfile="${uitest.dir}/vaadin-server.xml" inheritall="true" inheritrefs="true" target="deploy-and-start" />
+ </daemons>
+ <sequential>
+ <!-- Server tests -->
+
+ <!-- Sleep before running integration tests so testbench 2
+ tests have time to compile and start -->
+ <sleep minutes="4" />
+ <ant antfile="${uitest.dir}/integration_tests.xml" target="integration-test-all" inheritall="false" inheritrefs="false">
+ <property name="demo.war" value="${war.file}" />
+ </ant>
+ </sequential>
+ <sequential>
+ <!-- Wait for server to start -->
+ <ant antfile="${uitest.dir}/vaadin-server.xml" target="wait-for-startup" />
+
+ <!-- Run all different kinds of TestBench tests in parallel -->
+ <parallel>
+
+ <!-- Legacy TestBench 2 tests -->
+ <sequential>
+ <ant antfile="${uitest.dir}/test.xml" target="tb2-tests" />
+ <echo message="TestBench 2 tests complete" />
+ </sequential>
+
+ <!-- TestBench 3 tests -->
+ <sequential>
+ <ant antfile="${uitest.dir}/tb3test.xml" target="run-all-tb3-tests" inheritall="true" />
+ <echo message="TestBench 3 tests complete" />
+ </sequential>
+ </parallel>
+ </sequential>
+ </parallel>
+ </target>
+
+ <target name="clean-testbench-errors">
+ <fail unless="com.vaadin.testbench.screenshot.directory" message="Define screenshot directory using -Dcom.vaadin.testbench.screenshot.directory" />
+ <mkdir dir="${com.vaadin.testbench.screenshot.directory}/errors" />
+ <delete>
+ <fileset dir="${com.vaadin.testbench.screenshot.directory}/errors">
+ <include name="*" />
+ </fileset>
+ </delete>
+ </target>
+
</project>
diff --git a/uitest/eclipse-run-selected-test.properties b/uitest/eclipse-run-selected-test.properties
index f6cb2551e9..cbd1ab1cef 100644
--- a/uitest/eclipse-run-selected-test.properties
+++ b/uitest/eclipse-run-selected-test.properties
@@ -1,14 +1,23 @@
-; Location where vaadin-testbench jar can be found
-com.vaadin.testbench.lib.dir=<enter location of testbench here>
-
-; Deployment url to use for testing. Context path must be /
-com.vaadin.testbench.deployment.url=http://<enter your ip here>:8888/
+;
+; For both TestBench 2 and 3
+;
; Location of the screenshot directory.
; This is the directory that contains the "references" directory
com.vaadin.testbench.screenshot.directory=<enter the full path to the screenshots directory, parent of "references" directory>
-; Run the whole test even if
+
+;
+; For only TestBench 2
+;
+
+; Location where TestBench 2 jar can be found
+com.vaadin.testbench.lib.dir=<enter location of testbench here>
+
+; Deployment url to use for testing. Context path must be /
+com.vaadin.testbench.deployment.url=http://<enter your ip here>:8888/
+
+; Run the whole test even if a screenshot comparison fails
com.vaadin.testbench.screenshot.softfail=true
; Screen capture at the end if the test fails
@@ -23,7 +32,8 @@ com.vaadin.testbench.screenshot.cursor=true
; Uncomment to limit to certain browsers or override in launch configuration
; browsers=winxp-opera10
-; Claim that the server has started succesfully. Needed for the tests to run
+; Claim that the server has started succesfully. Needed for TB2 tests to be executed
server.start.succeeded=1
-test-output-dir=../build/test-output \ No newline at end of file
+; Directory where temporary Java classes are created
+test-output-dir=../build/test-output
diff --git a/uitest/integration_tests.xml b/uitest/integration_tests.xml
index 78e053991e..73aac2405c 100644
--- a/uitest/integration_tests.xml
+++ b/uitest/integration_tests.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
-<project xmlns:antcontrib="antlib:net.sf.antcontrib" name="Vaadin Integration Tests" basedir="." default="integration-test-all">
+<project xmlns:antcontrib="antlib:net.sf.antcontrib" xmlns:ivy="antlib:org.apache.ivy.ant" name="Vaadin Integration Tests" basedir="." default="integration-test-all">
<!-- Import common targets -->
<import file="../common.xml" />
@@ -32,33 +32,22 @@
<property name="user" value="${test.integration.user}" />
<property name="passphrase" value="" />
+ <ivy:resolve file="ivy.xml" conf="build, build-provided" />
+ <ivy:cachepath pathid="classpath.tb3.lib" conf="build, build-provided" />
+ <path id="classpath.tb3">
+ <path refid="classpath.tb3.lib" />
+ <path location="result/classes" />
+ </path>
+
<!-- Upload war to deploy to ssh host -->
<target name="integration-test-upload-demo">
<scp file="${demo.war}" todir="${user}@${test.integration.server}:integration-tests/servers/demo.war" keyfile="${sshkey.file}" passphrase="${passphrase}" />
</target>
<!-- Run basic integration test test -->
- <target name="integration-test-servlet">
- <fileset dir="integration-testscripts" id="html-test-files" includes="integration-test-${server-name}-servlet.html" />
- <pathconvert pathsep=" " property="testfiles" refid="html-test-files" />
- <subant target="run-tests" failonerror="false" antfile="test.xml">
- <property name="com.vaadin.testbench.lib.dir" value="${com.vaadin.testbench.lib.dir}" />
- <property name="com.vaadin.testbench.tester.host" value="${com.vaadin.testbench.tester.host}" />
- <property name="com.vaadin.testbench.deployment.url" value="${deployment.url}" />
- <property name="server.start.succeeded" value="1" />
- <property name="browsers" value="${test_browsers}" />
- <property name="testfiles" value="${testfiles}" />
- <property name="test-output-dir" value="${integration_test.dir}/result/integration-test-output/${server-name}" />
- <property name="retries" value="0" />
-
- <fileset dir="." includes="test.xml" />
- </subant>
- </target>
-
- <target name="integration-test-push-servlet">
- <fileset dir="integration-testscripts" id="html-test-files" includes="integration-test-${server-name}-push-servlet.html" />
- <pathconvert pathsep=" " property="testfiles" refid="html-test-files" />
- <subant target="run-tests" failonerror="false" antfile="test.xml">
+ <target name="legacy-integration-test">
+ <fail unless="testfiles" message="You need to specify the files to run using the 'testfiles' property" />
+ <subant target="run-tb2-tests" failonerror="false" antfile="test.xml">
<property name="com.vaadin.testbench.lib.dir" value="${com.vaadin.testbench.lib.dir}" />
<property name="com.vaadin.testbench.tester.host" value="${com.vaadin.testbench.tester.host}" />
<property name="com.vaadin.testbench.deployment.url" value="${deployment.url}" />
@@ -73,7 +62,7 @@
</target>
<target name="integration-test-theme">
- <subant target="run-tests" failonerror="false" antfile="test.xml">
+ <subant target="run-tb2-tests" failonerror="false" antfile="test.xml">
<property name="com.vaadin.testbench.lib.dir" value="${com.vaadin.testbench.lib.dir}" />
<property name="com.vaadin.testbench.tester.host" value="${com.vaadin.testbench.tester.host}" />
<property name="com.vaadin.testbench.deployment.url" value="${deployment.url}" />
@@ -90,7 +79,7 @@
<fileset dir="integration-testscripts" id="html-test-files" includes="GoogleAppEngine/integration-test-GAE.html" />
<pathconvert pathsep=" " property="test-GAE" refid="html-test-files" />
- <subant target="run-tests" failonerror="false" antfile="test.xml">
+ <subant target="run-tb2-tests" failonerror="false" antfile="test.xml">
<property name="com.vaadin.testbench.lib.dir" value="${com.vaadin.testbench.lib.dir}" />
<property name="com.vaadin.testbench.tester.host" value="${com.vaadin.testbench.tester.host}" />
<property name="com.vaadin.testbench.deployment.url" value="http://vaadin-integration-test.appspot.com/" />
@@ -107,6 +96,27 @@
<sshexec host="${test.integration.server}" username="${user}" keyfile="${sshkey.file}" command="ant -f ${ant.hub} deploy-to-GAE" />
</target>
+ <target name="run-tb3-servlet-test">
+ <antcall target="run-tb3-test" inheritall="true">
+ <param name="junit.test.suite" value="com.vaadin.tests.tb3.ServletIntegrationTests" />
+ </antcall>
+ </target>
+ <target name="run-tb3-test">
+ <fail unless="server-name" message="Server name must be defined in server-name" />
+ <fail unless="deployment.url" message="Deplyoment url must be defined in deployment.url" />
+ <fail unless="com.vaadin.testbench.screenshot.directory" message="Screenshot directory must be defined in com.vaadin.testbench.screenshot.directory" />
+
+ <junit printsummary="withOutAndErr" fork="yes">
+ <formatter usefile="false" type="plain" />
+ <classpath refid="classpath.tb3" />
+
+ <jvmarg value="-Dcom.vaadin.testbench.screenshot.directory=${com.vaadin.testbench.screenshot.directory}" />
+ <jvmarg value="-Ddeployment.url=${deployment.url}" />
+ <jvmarg value="-Dserver-name=${server-name}" />
+ <jvmarg value="-Djava.awt.headless=true" />
+ <test name="${junit.test.suite}" />
+ </junit>
+ </target>
<target name="integration-test-tomcat7">
<antcall target="run-generic-integration-test">
@@ -114,6 +124,12 @@
<param name="target-server" value="tomcat7" />
</antcall>
</target>
+ <target name="integration-test-tomcat8">
+ <antcall target="run-generic-integration-test">
+ <param name="startDelay" value="10" />
+ <param name="target-server" value="tomcat8" />
+ </antcall>
+ </target>
<target name="integration-test-tomcat5">
<antcall target="run-generic-integration-test">
<param name="startDelay" value="10" />
@@ -188,6 +204,13 @@
</antcall>
</target>
+ <target name="integration-test-jboss-eap6">
+ <antcall target="run-generic-integration-test">
+ <param name="startDelay" value="10" />
+ <param name="target-server" value="jbosseap6" />
+ </antcall>
+ </target>
+
<target name="integration-test-glassfish2">
<antcall target="run-generic-integration-test">
<param name="startDelay" value="10" />
@@ -333,7 +356,7 @@
<!-- Upload demo, clean error screenshots and test deployment on all
servers -->
- <target name="integration-test-all">
+ <target name="integration-test-all" unless="tests.integration.skip">
<property name="passphrase" value="${passphrase}" />
<fail unless="sshkey.file" message="You must define an ssh.keyfile parameter" />
<fail unless="com.vaadin.testbench.screenshot.directory" message="You must define a com.vaadin.testbench.screenshot.directory parameter" />
@@ -341,7 +364,8 @@
<antcontrib:trycatch property="tried">
<try>
<!-- Still running GAE test from the old server which
- requires its own lock -->
+ requires its own lock -->
+
<echo message="Getting lock" />
<antcall target="integration-test-get-lock" />
<echo message="Got lock" />
@@ -378,6 +402,7 @@
<antcall target="integration-test-jboss5" />
<antcall target="integration-test-jboss6" />
<antcall target="integration-test-jboss7" />
+ <antcall target="integration-test-jboss-eap6" />
<antcall target="integration-test-jetty5" />
<antcall target="integration-test-jetty6" />
<antcall target="integration-test-jetty7" />
@@ -386,8 +411,8 @@
<antcall target="integration-test-tomcat5" />
<antcall target="integration-test-tomcat6" />
<antcall target="integration-test-tomcat7" />
+ <antcall target="integration-test-tomcat8" />
<antcall target="integration-test-websphere8" />
-
</parallel>
</target>
@@ -446,31 +471,24 @@
</condition>
</fail>
- <copy file="integration-testscripts/common/integration_test.tpl" tofile="integration-testscripts/integration-test-${target-server}-servlet.html" overwrite="true" />
- <antcall target="integration-test-servlet">
- <param name="server-name" value="${target-server}" />
- <param name="deployment.url" value="http://${target-host}:${target-port}" />
- </antcall>
-
- <!-- Run theme tests in all browsers if there's a property
- with the test files -->
<antcontrib:if>
- <isset property="testfiles-theme" />
+ <isset property="testfiles" />
<antcontrib:then>
- <antcall target="integration-test-theme">
+ <echo>Starting legacy (TB2) test for ${target-server}</echo>
+ <antcall target="legacy-integration-test">
<param name="server-name" value="${target-server}" />
<param name="deployment.url" value="http://${target-host}:${target-port}" />
</antcall>
</antcontrib:then>
+ <antcontrib:else>
+ <echo>Starting TB3 test for ${target-server}</echo>
+ <antcall target="run-tb3-servlet-test">
+ <param name="server-name" value="${target-server}" />
+ <param name="deployment.url" value="http://${target-host}:${target-port}" />
+ </antcall>
+ </antcontrib:else>
</antcontrib:if>
- <!-- Run integration tests with push -->
- <copy file="integration-testscripts/common/integration_push_test.tpl" tofile="integration-testscripts/integration-test-${target-server}-push-servlet.html" overwrite="true" />
- <antcall target="integration-test-push-servlet">
- <param name="server-name" value="${target-server}" />
- <param name="deployment.url" value="http://${target-host}:${target-port}" />
- </antcall>
-
<!-- Run theme tests in all browsers if there's a property
with the test files -->
<antcontrib:if>
diff --git a/uitest/ivy.xml b/uitest/ivy.xml
index 7ff83324ae..9c86b2b68c 100644
--- a/uitest/ivy.xml
+++ b/uitest/ivy.xml
@@ -1,4 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ivy-module [
+ <!ENTITY jetty.version "8.1.9.v20130131">
+]>
<ivy-module version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
@@ -11,7 +14,7 @@
<conf name="build" />
<conf name="build-provided" visibility="private" />
<conf name="ide" visibility="private" />
- <conf name="jetty-run" extends="build" visibility="private" />
+ <conf name="jetty-run" visibility="private" />
</configurations>
<publications>
<artifact type="war" ext="war" />
@@ -23,9 +26,6 @@
<dependency org="javax.validation" name="validation-api"
rev="1.0.0.GA" conf="build,ide -> default,sources" />
- <!-- Servlet API -->
- <dependency org="javax.servlet" name="servlet-api"
- rev="2.4" conf="build-provided,ide -> default" />
<!-- Google App Engine -->
<dependency org="com.google.appengine" name="appengine-api-1.0-sdk"
rev="1.2.1" conf="build-provided,ide -> default" />
@@ -33,7 +33,9 @@
<!-- LIBRARY DEPENDENCIES (compile time) -->
<!-- Project modules -->
<dependency org="com.vaadin" name="vaadin-server"
- rev="${vaadin.version}" conf="build->build"></dependency>
+ rev="${vaadin.version}" conf="build->build">
+ <exclude org="javax.servlet"></exclude>
+ </dependency>
<dependency org="com.vaadin" name="vaadin-client"
rev="${vaadin.version}" conf="build->build"></dependency>
<dependency org="com.vaadin" name="vaadin-client-compiled"
@@ -41,29 +43,38 @@
<dependency org="com.vaadin" name="vaadin-themes"
rev="${vaadin.version}" conf="build->build"></dependency>
<dependency org="com.vaadin" name="vaadin-push" rev="${vaadin.version}"
- conf="build->build"></dependency>
+ conf="build->build">
+ <exclude org="javax.servlet"></exclude>
+ </dependency>
<!-- For compiling TestingWidgetSet -->
<dependency org="com.vaadin" name="vaadin-client-compiler"
rev="${vaadin.version}" conf="build-provided-> build"></dependency>
- <!-- Newest Jetty does not work with Ivy currently (orbit -> jar
- mapping problem) -->
+ <!-- Servlet 3.0 API -->
+ <dependency org="javax.servlet" name="javax.servlet-api"
+ rev="3.0.1" conf="build-provided,ide -> default" />
+
<dependency org="org.eclipse.jetty" name="jetty-server"
- rev="7.5.0.v20110901" conf="ide, build-provided, jetty-run->default" />
+ rev="&jetty.version;" conf="ide, build-provided, jetty-run->default">
+ <exclude org="org.eclipse.jetty.orbit"></exclude>
+ </dependency>
<!-- jetty-servlets needed by ProxyTest, but not by jetty-runner -->
<dependency org="org.eclipse.jetty" name="jetty-servlets"
- rev="7.5.0.v20110901" conf="ide, build-provided, jetty-run->default" />
+ rev="&jetty.version;" conf="ide, build-provided, jetty-run->default" />
<dependency org="org.eclipse.jetty" name="jetty-websocket"
- rev="7.5.0.v20110901" conf="ide, jetty-run->default" />
+ rev="&jetty.version;" conf="ide, jetty-run->default" />
<dependency org="org.eclipse.jetty" name="jetty-webapp"
- rev="7.5.0.v20110901" conf="ide, build-provided, jetty-run->default" />
+ rev="&jetty.version;" conf="ide, build-provided, jetty-run->default" />
<dependency org="org.mortbay.jetty" name="jetty-runner"
- rev="7.5.0.v20110901" conf="jetty-run->default" />
+ rev="&jetty.version;" conf="ide, jetty-run->default">
+ <exclude org="org.eclipse.jetty.orbit"></exclude>
+ </dependency>
- <dependency org="junit" name="junit" rev="4.5"
+ <dependency org="junit" name="junit" rev="4.11"
conf="build,ide -> default" />
-
+ <dependency org="com.jcraft" name="jsch" rev="0.1.50"
+ conf="ide, build->default" />
<dependency org="commons-codec" name="commons-codec"
rev="1.5" conf="build,ide->default" />
<dependency org="commons-io" name="commons-io" rev="2.2"
@@ -71,6 +82,8 @@
<!-- Mainly for SQLContainer tests -->
<dependency org="org.hsqldb" name="hsqldb" rev="2.2.6"
conf="build,ide -> default" />
+ <dependency org="com.vaadin" name="vaadin-testbench"
+ rev="3.1.1" conf="build-provided,ide -> default" />
</dependencies>
</ivy-module>
diff --git a/uitest/src/com/vaadin/launcher/DevelopmentServerLauncher.java b/uitest/src/com/vaadin/launcher/DevelopmentServerLauncher.java
index 5ab2134cdb..a8d639cbc8 100644
--- a/uitest/src/com/vaadin/launcher/DevelopmentServerLauncher.java
+++ b/uitest/src/com/vaadin/launcher/DevelopmentServerLauncher.java
@@ -24,10 +24,12 @@ import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
+import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
+import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
@@ -181,7 +183,8 @@ public class DevelopmentServerLauncher {
String[] paths = serverArgs.get("slowdown").split(",");
for (String p : paths) {
System.out.println("Slowing down: " + p);
- webappcontext.addFilter(SlowFilter.class, p, 1);
+ webappcontext.addFilter(SlowFilter.class, p,
+ EnumSet.of(DispatcherType.REQUEST));
}
}
// --cache=/run/APP/PUBLISHED/*,/other/path/asd.jpg
@@ -190,7 +193,8 @@ public class DevelopmentServerLauncher {
String[] paths = serverArgs.get("cache").split(",");
for (String p : paths) {
System.out.println("Enabling cache for: " + p);
- webappcontext.addFilter(CacheFilter.class, p, 1);
+ webappcontext.addFilter(CacheFilter.class, p,
+ EnumSet.of(DispatcherType.REQUEST));
}
}
diff --git a/uitest/src/com/vaadin/tests/VerifyBrowserVersion.java b/uitest/src/com/vaadin/tests/VerifyBrowserVersion.java
index 022a343196..1b21f08aa7 100644
--- a/uitest/src/com/vaadin/tests/VerifyBrowserVersion.java
+++ b/uitest/src/com/vaadin/tests/VerifyBrowserVersion.java
@@ -9,9 +9,13 @@ public class VerifyBrowserVersion extends TestBase {
@Override
protected void setup() {
WebBrowser browser = getBrowser();
- addComponent(new Label(browser.getBrowserApplication()));
- addComponent(new Label("Touch device? "
- + (browser.isTouchDevice() ? "YES" : "No")));
+ Label userAgent = new Label(browser.getBrowserApplication());
+ userAgent.setId("userAgent");
+ addComponent(userAgent);
+ Label touchDevice = new Label("Touch device? "
+ + (browser.isTouchDevice() ? "YES" : "No"));
+ touchDevice.setId("touchDevice");
+ addComponent(touchDevice);
}
@Override
diff --git a/uitest/src/com/vaadin/tests/VerifyBrowserVersionTest.java b/uitest/src/com/vaadin/tests/VerifyBrowserVersionTest.java
new file mode 100644
index 0000000000..ae5806af56
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/VerifyBrowserVersionTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class VerifyBrowserVersionTest extends MultiBrowserTest {
+
+ private Map<DesiredCapabilities, String> expectedUserAgent = new HashMap<DesiredCapabilities, String>();
+
+ {
+ expectedUserAgent
+ .put(BrowserUtil
+ .firefox(MultiBrowserTest.TESTED_FIREFOX_VERSION),
+ "Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0");
+ expectedUserAgent
+ .put(BrowserUtil.ie(8),
+ "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
+ expectedUserAgent
+ .put(BrowserUtil.ie(9),
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");
+ expectedUserAgent
+ .put(BrowserUtil.ie(10),
+ "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)");
+ expectedUserAgent
+ .put(BrowserUtil.ie(11),
+ "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko");
+ expectedUserAgent
+ .put(BrowserUtil.chrome(MultiBrowserTest.TESTED_CHROME_VERSION),
+ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36");
+
+ }
+
+ @Test
+ public void verifyUserAgent() {
+ openTestURL();
+ Assert.assertEquals(expectedUserAgent.get(getDesiredCapabilities()),
+ vaadinElementById("userAgent").getText());
+ Assert.assertEquals("Touch device? No",
+ vaadinElementById("touchDevice").getText());
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/actions/ActionsOnInvisibleComponents.java b/uitest/src/com/vaadin/tests/actions/ActionsOnInvisibleComponents.java
new file mode 100644
index 0000000000..0f4c179cee
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/actions/ActionsOnInvisibleComponents.java
@@ -0,0 +1,76 @@
+package com.vaadin.tests.actions;
+
+import com.vaadin.event.ShortcutAction.KeyCode;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+
+public class ActionsOnInvisibleComponents extends AbstractTestUIWithLog {
+
+ private static final long serialVersionUID = -5993467736906948993L;
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ getContent().setId("test-root");
+ log("'A' triggers a click on an invisible button");
+ log("'B' triggers a click on a disabled button");
+ log("'C' triggers a click on a visible and enabled button");
+
+ Button invisibleButton = new Button("Invisible button with shortcut");
+ invisibleButton.setClickShortcut(KeyCode.A);
+ invisibleButton.addClickListener(new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ log("Click event for invisible button");
+ }
+ });
+
+ invisibleButton.setVisible(false);
+ addComponent(invisibleButton);
+
+ Button disabledButton = new Button("Disabled button with shortcut");
+ disabledButton.setClickShortcut(KeyCode.B);
+ disabledButton.addClickListener(new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ log("Click event for disabled button");
+ }
+ });
+
+ disabledButton.setEnabled(false);
+ addComponent(disabledButton);
+
+ Button enabledButton = new Button("Enabled button with shortcut");
+ enabledButton.setClickShortcut(KeyCode.C);
+ enabledButton.addClickListener(new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ log("Click event for enabled button");
+ }
+ });
+
+ addComponent(enabledButton);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Test to ensure actions are not performed on disabled/invisible components";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 12743;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/actions/ActionsOnInvisibleComponentsTest.java b/uitest/src/com/vaadin/tests/actions/ActionsOnInvisibleComponentsTest.java
new file mode 100644
index 0000000000..ca00c998a6
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/actions/ActionsOnInvisibleComponentsTest.java
@@ -0,0 +1,46 @@
+package com.vaadin.tests.actions;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class ActionsOnInvisibleComponentsTest extends MultiBrowserTest {
+
+ private static final String LAST_INIT_LOG = "3. 'C' triggers a click on a visible and enabled button";
+
+ // This method should be removed once #12785 is fixed
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ List<DesiredCapabilities> browsers = super.getBrowsersToTest();
+ // sendKeys does nothing on these browsers
+ browsers.remove(BrowserUtil.firefox(24));
+ browsers.remove(BrowserUtil.ie(8));
+ browsers.remove(BrowserUtil.opera(12));
+
+ // Causes 'cannot focus element'
+ browsers.remove(BrowserUtil.chrome(29));
+ return browsers;
+ }
+
+ @Test
+ public void testShortcutsOnInvisibleDisabledButtons() {
+ openTestURL();
+ Assert.assertEquals(LAST_INIT_LOG, getLogRow(0));
+ invokeShortcut("A");
+ Assert.assertEquals(LAST_INIT_LOG, getLogRow(0));
+ invokeShortcut("B");
+ Assert.assertEquals(LAST_INIT_LOG, getLogRow(0));
+ invokeShortcut("C");
+ Assert.assertEquals("4. Click event for enabled button", getLogRow(0));
+ }
+
+ private void invokeShortcut(CharSequence key) {
+ WebElement shortcutTarget = vaadinElementById("test-root");
+ shortcutTarget.sendKeys(key);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/application/DetachOldUIOnReload.html b/uitest/src/com/vaadin/tests/application/DetachOldUIOnReload.html
index 038283324d..33fc46f060 100644
--- a/uitest/src/com/vaadin/tests/application/DetachOldUIOnReload.html
+++ b/uitest/src/com/vaadin/tests/application/DetachOldUIOnReload.html
@@ -27,6 +27,11 @@
<td></td>
</tr>
<tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestsapplicationDetachOldUIOnReload::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
+ <td></td>
+</tr>
+<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsapplicationDetachOldUIOnReload::PID_SLog_row_0</td>
<td>1. UI 0 has been detached</td>
@@ -42,6 +47,11 @@
<td></td>
</tr>
<tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestsapplicationDetachOldUIOnReload::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
+ <td></td>
+</tr>
+<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsapplicationDetachOldUIOnReload::PID_SLog_row_0</td>
<td>2. UI 1 has been detached</td>
@@ -62,6 +72,11 @@
<td></td>
</tr>
<tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestsapplicationDetachOldUIOnReload::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
+ <td></td>
+</tr>
+<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsapplicationDetachOldUIOnReload::PID_SLog_row_0</td>
<td>3. UI 2 has been detached</td>
diff --git a/uitest/src/com/vaadin/tests/application/DetachOldUIOnReload.java b/uitest/src/com/vaadin/tests/application/DetachOldUIOnReload.java
index 7104146203..154c84b4f5 100644
--- a/uitest/src/com/vaadin/tests/application/DetachOldUIOnReload.java
+++ b/uitest/src/com/vaadin/tests/application/DetachOldUIOnReload.java
@@ -31,10 +31,6 @@ public class DetachOldUIOnReload extends AbstractTestUIWithLog {
@Override
protected void setup(VaadinRequest request) {
- for (String message : getSessionMessages(false)) {
- log(message);
- }
-
addComponent(new Label("This is UI " + getUIId()));
addComponent(new Button("Reload page", new Button.ClickListener() {
@Override
@@ -42,6 +38,15 @@ public class DetachOldUIOnReload extends AbstractTestUIWithLog {
getPage().reload();
}
}));
+ addComponent(new Button("Read log messages from session",
+ new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ for (String message : getSessionMessages(false)) {
+ log(message);
+ }
+ }
+ }));
}
private List<String> getSessionMessages(boolean storeIfNeeded) {
diff --git a/uitest/src/com/vaadin/tests/components/AbstractTestUI.java b/uitest/src/com/vaadin/tests/components/AbstractTestUI.java
index f567106d60..8f92ff3118 100644
--- a/uitest/src/com/vaadin/tests/components/AbstractTestUI.java
+++ b/uitest/src/com/vaadin/tests/components/AbstractTestUI.java
@@ -9,6 +9,7 @@ import com.vaadin.server.WebBrowser;
import com.vaadin.shared.communication.PushMode;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.shared.ui.ui.Transport;
+import com.vaadin.shared.ui.ui.UIState.PushConfigurationState;
import com.vaadin.ui.Component;
import com.vaadin.ui.Label;
import com.vaadin.ui.Notification;
@@ -100,6 +101,15 @@ public abstract class AbstractTestUI extends UI {
}
}
+ /**
+ * Sets the push transport according to the transport= URL parameter if such
+ * is given. Supports transport=xhr (disables push), transport=websocket
+ * (forces websocket into use), transport=streaming (forces streaming into
+ * use). Using ?transport=xyz disables the fallback transport.
+ *
+ * @param request
+ * The UI init request
+ */
protected void setTransport(VaadinRequest request) {
String transport = request.getParameter("transport");
PushConfiguration config = getPushConfiguration();
@@ -112,11 +122,17 @@ public abstract class AbstractTestUI extends UI {
config.setPushMode(PushMode.AUTOMATIC);
}
config.setTransport(Transport.WEBSOCKET);
+ // Ensure no fallback is used
+ getPushConfiguration().setParameter(
+ PushConfigurationState.FALLBACK_TRANSPORT_PARAM, "none");
} else if ("streaming".equals(transport)) {
if (!mode.isEnabled()) {
config.setPushMode(PushMode.AUTOMATIC);
}
config.setTransport(Transport.STREAMING);
+ // Ensure no fallback is used
+ getPushConfiguration().setParameter(
+ PushConfigurationState.FALLBACK_TRANSPORT_PARAM, "none");
}
}
diff --git a/uitest/src/com/vaadin/tests/components/browserframe/BrowserFrameDoubleScrollbars.java b/uitest/src/com/vaadin/tests/components/browserframe/BrowserFrameDoubleScrollbars.java
new file mode 100644
index 0000000000..5151ad5dd3
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/browserframe/BrowserFrameDoubleScrollbars.java
@@ -0,0 +1,40 @@
+package com.vaadin.tests.components.browserframe;
+
+import com.vaadin.server.ExternalResource;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.BrowserFrame;
+import com.vaadin.ui.TabSheet;
+
+public class BrowserFrameDoubleScrollbars extends AbstractTestUI {
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 11780;
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+
+ getLayout().setHeight("100%");
+ getLayout().setSizeFull();
+ getLayout().getParent().setSizeFull();
+
+ TabSheet tabs = new TabSheet();
+ tabs.setSizeFull();
+ getLayout().addComponent(tabs);
+
+ BrowserFrame help = new BrowserFrame();
+ help.setSizeFull();
+ help.setSource(new ExternalResource("/statictestfiles/long-html.htm"));
+
+ tabs.addComponent(help);
+
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Embedded browser causes second scrollbar";
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/browserframe/BrowserFrameDoubleScrollbarsTest.java b/uitest/src/com/vaadin/tests/components/browserframe/BrowserFrameDoubleScrollbarsTest.java
new file mode 100644
index 0000000000..ade43735a7
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/browserframe/BrowserFrameDoubleScrollbarsTest.java
@@ -0,0 +1,15 @@
+package com.vaadin.tests.components.browserframe;
+
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class BrowserFrameDoubleScrollbarsTest extends MultiBrowserTest {
+
+ @Test
+ public void testWindowRepositioning() throws Exception {
+ openTestURL();
+
+ compareScreen("BrowserFrameDoubleScrollbars");
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/button/ButtonsWaiAria.java b/uitest/src/com/vaadin/tests/components/button/ButtonsWaiAria.java
index cc75f87a71..24dc942171 100644
--- a/uitest/src/com/vaadin/tests/components/button/ButtonsWaiAria.java
+++ b/uitest/src/com/vaadin/tests/components/button/ButtonsWaiAria.java
@@ -32,6 +32,10 @@ public class ButtonsWaiAria extends ComponentTestCase<Button> {
l = createButton("Tooltip Button", nat);
l.setDescription("Tooltip");
addTestComponent(l);
+
+ l = createButton("Another tooltip", nat);
+ l.setDescription("Another");
+ addTestComponent(l);
}
private Button createButton(String text, boolean nativeButton) {
diff --git a/uitest/src/com/vaadin/tests/components/customfield/CustomFieldSize.java b/uitest/src/com/vaadin/tests/components/customfield/CustomFieldSize.java
new file mode 100644
index 0000000000..a3e19513b0
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/customfield/CustomFieldSize.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.customfield;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.CustomField;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class CustomFieldSize extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ VerticalLayout layout = new VerticalLayout();
+ setContent(layout);
+ layout.setWidth("50px");
+
+ layout.addComponent(new TextField());
+
+ layout.addComponent(new CustomField<String>() {
+
+ @Override
+ protected Component initContent() {
+ return new TextField();
+ }
+
+ @Override
+ public Class<? extends String> getType() {
+ return String.class;
+ }
+
+ });
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Any part of a TextField wrapped in a CustomField should not be cut off even when the dimensions of the TextField exceed those of the CustomField";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12482;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/customfield/CustomFieldSizeTest.java b/uitest/src/com/vaadin/tests/components/customfield/CustomFieldSizeTest.java
new file mode 100644
index 0000000000..c47ec0b792
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/customfield/CustomFieldSizeTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.customfield;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class CustomFieldSizeTest extends MultiBrowserTest {
+
+ @Test
+ public void checkScreenshot() throws IOException {
+ openTestURL();
+ compareScreen("size");
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/datefield/DateFieldTestTest.java b/uitest/src/com/vaadin/tests/components/datefield/DateFieldTestTest.java
new file mode 100644
index 0000000000..557201e803
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/datefield/DateFieldTestTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.datefield;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Dimension;
+import org.openqa.selenium.NoSuchElementException;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class DateFieldTestTest extends MultiBrowserTest {
+
+ @Test
+ public void testMakingRequired() throws InterruptedException {
+ setDebug(true);
+ openTestURL();
+ Thread.sleep(1000);
+ menu("Component");
+ menuSub("State");
+ menu("Required");
+ assertNoErrorNotification();
+ }
+
+ private void assertNoErrorNotification() {
+ try {
+ getDriver().findElement(
+ By.xpath("//div[contains(@class, 'v-Notification') ]"));
+ Assert.fail("Error notification shown!");
+ } catch (NoSuchElementException e) {
+ // As expected
+ }
+ }
+
+ @Test
+ public void testValueAfterOpeningPopupInRequiredField()
+ throws InterruptedException {
+ setDebug(true);
+ openTestURL();
+ Thread.sleep(1000);
+ menu("Component");
+ menuSub("State");
+ menu("Required");
+
+ menu("Component");
+ menuSub("Features");
+ menuSub("Resolution");
+ menu("Month");
+
+ menu("Component");
+ menuSub("Listeners");
+ menu("Value change listener");
+
+ String inputtedValue = "2/12";
+ getInput().sendKeys(inputtedValue);
+
+ openPopup();
+ closePopup();
+ String actual = getInput().getAttribute("value");
+ Assert.assertEquals(inputtedValue, actual);
+ assertNoErrorNotification();
+
+ }
+
+ private void openPopup() throws InterruptedException {
+ Dimension size = getInput().getSize();
+ new Actions(getDriver()).moveToElement(getInput(), 0, 0)
+ .moveByOffset(size.getWidth() + 5, size.getHeight() / 2)
+ .click();
+ // This fails in Opera for some weird reason
+ // getDriver().findElement(By.className("v-datefield-button")).click();
+ }
+
+ private WebElement getInput() {
+ return getDriver().findElement(By.xpath("//input"));
+ }
+
+ private void closePopup() {
+ getDriver().findElement(By.tagName("body")).click();
+ }
+
+ /**
+ * @since
+ * @param string
+ */
+ private void menuSub(String string) {
+ getDriver().findElement(
+ By.xpath("//span[text() = '" + string + "']")).click();
+ new Actions(getDriver()).moveByOffset(100, 0).build().perform();
+ }
+
+ /**
+ * @since
+ * @param string
+ */
+ private void menu(String string) {
+ getDriver().findElement(
+ By.xpath("//span[text() = '" + string + "']")).click();
+
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/datefield/DynamicallyChangeDateRange.html b/uitest/src/com/vaadin/tests/components/datefield/DynamicallyChangeDateRange.html
index 77c610f211..75c19945b0 100644
--- a/uitest/src/com/vaadin/tests/components/datefield/DynamicallyChangeDateRange.html
+++ b/uitest/src/com/vaadin/tests/components/datefield/DynamicallyChangeDateRange.html
@@ -52,6 +52,11 @@
<td></td>
</tr>
<tr>
+ <td>pause</td>
+ <td>300</td>
+ <td></td>
+</tr>
+<tr>
<td>mouseClick</td>
<td>vaadin=runcomvaadintestscomponentsdatefieldDynamicallyChangeDateRange::/VVerticalLayout[0]/Slot[0]/VPopupCalendar[0]#popupButton</td>
<td>14,16</td>
@@ -87,6 +92,11 @@
<td></td>
</tr>
<tr>
+ <td>pause</td>
+ <td>300</td>
+ <td></td>
+</tr>
+<tr>
<td>mouseClick</td>
<td>vaadin=runcomvaadintestscomponentsdatefieldDynamicallyChangeDateRange::/VVerticalLayout[0]/Slot[0]/VPopupCalendar[0]#popupButton</td>
<td>14,15</td>
diff --git a/uitest/src/com/vaadin/tests/components/label/LabelModesTest.java b/uitest/src/com/vaadin/tests/components/label/LabelModesTest.java
new file mode 100644
index 0000000000..efad615510
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/label/LabelModesTest.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.label;
+
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class LabelModesTest extends MultiBrowserTest {
+
+ @Test
+ public void testLabelModes() throws Exception {
+ openTestURL();
+ compareScreen("labelmodes");
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/nativebutton/NativeButtonIconAndText.java b/uitest/src/com/vaadin/tests/components/nativebutton/NativeButtonIconAndText.java
new file mode 100644
index 0000000000..fdeed316ba
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/nativebutton/NativeButtonIconAndText.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.nativebutton;
+
+import com.vaadin.server.ThemeResource;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.NativeButton;
+
+public class NativeButtonIconAndText extends AbstractTestUI implements
+ ClickListener {
+
+ static final String UPDATED_ALTERNATE_TEXT = "Now has alternate text";
+ static final String INITIAL_ALTERNATE_TEXT = "Initial alternate text";
+ static final String BUTTON_TEXT = "buttonText";
+ static final String BUTTON_TEXT_ICON = "buttonTextIcon";
+ static final String BUTTON_TEXT_ICON_ALT = "buttonTextIconAlt";
+ static final String NATIVE_BUTTON_TEXT = "nativeButtonText";
+ static final String NATIVE_BUTTON_TEXT_ICON = "nativeButtonTextIcon";
+ static final String NATIVE_BUTTON_TEXT_ICON_ALT = "nativeButtonTextIconAlt";
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ Button buttonText = new Button("Only text");
+
+ Button buttonTextIcon = new Button("Text icon");
+ buttonTextIcon.setIcon(new ThemeResource("../runo/icons/64/ok.png"));
+
+ Button buttonTextIconAlt = new Button("Text icon alt");
+ buttonTextIconAlt.setIcon(new ThemeResource(
+ "../runo/icons/64/cancel.png"));
+ buttonTextIconAlt.setIconAlternateText(INITIAL_ALTERNATE_TEXT);
+
+ buttonText.addClickListener(this);
+ buttonTextIcon.addClickListener(this);
+ buttonTextIconAlt.addClickListener(this);
+
+ buttonText.setId(BUTTON_TEXT);
+ buttonTextIcon.setId(BUTTON_TEXT_ICON);
+ buttonTextIconAlt.setId(BUTTON_TEXT_ICON_ALT);
+
+ addComponent(buttonText);
+ addComponent(buttonTextIcon);
+ addComponent(buttonTextIconAlt);
+
+ NativeButton nativeButtonText = new NativeButton("Only text");
+
+ NativeButton nativeButtonTextIcon = new NativeButton("Text icon");
+ nativeButtonTextIcon.setIcon(new ThemeResource(
+ "../runo/icons/64/ok.png"));
+
+ NativeButton nativeButtonTextIconAlt = new NativeButton("Text icon alt");
+ nativeButtonTextIconAlt.setIcon(new ThemeResource(
+ "../runo/icons/64/cancel.png"));
+ nativeButtonTextIconAlt.setIconAlternateText(INITIAL_ALTERNATE_TEXT);
+
+ nativeButtonText.addClickListener(this);
+ nativeButtonTextIcon.addClickListener(this);
+ nativeButtonTextIconAlt.addClickListener(this);
+
+ nativeButtonText.setId(NATIVE_BUTTON_TEXT);
+ nativeButtonTextIcon.setId(NATIVE_BUTTON_TEXT_ICON);
+ nativeButtonTextIconAlt.setId(NATIVE_BUTTON_TEXT_ICON_ALT);
+
+ addComponent(nativeButtonText);
+ addComponent(nativeButtonTextIcon);
+ addComponent(nativeButtonTextIconAlt);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Click the buttons to toggle icon alternate text";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 12780;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.ui.Button.ClickListener#buttonClick(com.vaadin.ui.Button.
+ * ClickEvent)
+ */
+ @Override
+ public void buttonClick(ClickEvent event) {
+ Button b = event.getButton();
+ String was = b.getIconAlternateText();
+ if (was == null || was.isEmpty()) {
+ b.setIconAlternateText(UPDATED_ALTERNATE_TEXT);
+ } else {
+ b.setIconAlternateText(null);
+ }
+
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/nativebutton/NativeButtonIconAndTextTest.java b/uitest/src/com/vaadin/tests/components/nativebutton/NativeButtonIconAndTextTest.java
new file mode 100644
index 0000000000..2cb294de77
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/nativebutton/NativeButtonIconAndTextTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.nativebutton;
+
+import static com.vaadin.tests.components.nativebutton.NativeButtonIconAndText.BUTTON_TEXT;
+import static com.vaadin.tests.components.nativebutton.NativeButtonIconAndText.BUTTON_TEXT_ICON;
+import static com.vaadin.tests.components.nativebutton.NativeButtonIconAndText.BUTTON_TEXT_ICON_ALT;
+import static com.vaadin.tests.components.nativebutton.NativeButtonIconAndText.INITIAL_ALTERNATE_TEXT;
+import static com.vaadin.tests.components.nativebutton.NativeButtonIconAndText.NATIVE_BUTTON_TEXT;
+import static com.vaadin.tests.components.nativebutton.NativeButtonIconAndText.NATIVE_BUTTON_TEXT_ICON;
+import static com.vaadin.tests.components.nativebutton.NativeButtonIconAndText.NATIVE_BUTTON_TEXT_ICON_ALT;
+import static com.vaadin.tests.components.nativebutton.NativeButtonIconAndText.UPDATED_ALTERNATE_TEXT;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class NativeButtonIconAndTextTest extends MultiBrowserTest {
+
+ @Test
+ public void testNativeButtonIconAltText() {
+ openTestURL();
+ assertAltText(BUTTON_TEXT, "");
+ assertAltText(BUTTON_TEXT_ICON, "");
+ assertAltText(BUTTON_TEXT_ICON_ALT, INITIAL_ALTERNATE_TEXT);
+ assertAltText(NATIVE_BUTTON_TEXT, "");
+ assertAltText(NATIVE_BUTTON_TEXT_ICON, "");
+ assertAltText(NATIVE_BUTTON_TEXT_ICON_ALT, INITIAL_ALTERNATE_TEXT);
+
+ clickElements(BUTTON_TEXT, BUTTON_TEXT_ICON, BUTTON_TEXT_ICON_ALT,
+ NATIVE_BUTTON_TEXT, NATIVE_BUTTON_TEXT_ICON,
+ NATIVE_BUTTON_TEXT_ICON_ALT);
+
+ // Button without icon - should not get alt text
+ assertAltText(BUTTON_TEXT, "");
+ assertAltText(BUTTON_TEXT_ICON, UPDATED_ALTERNATE_TEXT);
+ assertAltText(BUTTON_TEXT_ICON_ALT, "");
+ // Button without icon - should not get alt text
+ assertAltText(NATIVE_BUTTON_TEXT, "");
+ assertAltText(NATIVE_BUTTON_TEXT_ICON, UPDATED_ALTERNATE_TEXT);
+ assertAltText(NATIVE_BUTTON_TEXT_ICON_ALT, "");
+
+ }
+
+ private void clickElements(String... ids) {
+ for (String id : ids) {
+ vaadinElementById(id).click();
+ }
+ }
+
+ /**
+ * If the button identified by 'buttonId' has an icon, asserts that the
+ * alternate text of the icon matches 'expected'. "" and null are considered
+ * equivalent.
+ *
+ * @param buttonId
+ * the id of the button who possibly contains an icon
+ * @param expected
+ * the expected alternate text, cannot be null
+ */
+ private void assertAltText(String buttonId, String expected) {
+ WebElement button = vaadinElementById(buttonId);
+ List<WebElement> imgList = button.findElements(By.xpath(".//img"));
+ if (imgList.isEmpty()) {
+ return;
+ }
+ WebElement img = imgList.get(0);
+ String alt = img.getAttribute("alt");
+ if (alt == null) {
+ alt = "";
+ }
+
+ Assert.assertEquals(expected, alt);
+
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/optiongroup/OptionGroupRetainFocusKeyboardValueChange.html b/uitest/src/com/vaadin/tests/components/optiongroup/OptionGroupRetainFocusKeyboardValueChange.html
new file mode 100644
index 0000000000..046cac0e30
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/optiongroup/OptionGroupRetainFocusKeyboardValueChange.html
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="" />
+<title>OptionGroupRetainFocusKeyboardValueChange</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">OptionGroupRetainFocusKeyboardValueChange</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/OptionGroupRetainFocusKeyboardValueChange?restartApplication</td>
+ <td></td>
+</tr>
+<tr>
+ <td>pressSpecialKey</td>
+ <td>vaadin=runOptionGroupRetainFocusKeyboardValueChange::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VOptionGroup[0]/domChild[0]/domChild[0]</td>
+ <td>space</td>
+</tr>
+<!-- The element 'A' should be selected and focused -->
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>pressSpecialKey</td>
+ <td>vaadin=runOptionGroupRetainFocusKeyboardValueChange::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VOptionGroup[0]/domChild[0]/domChild[0]</td>
+ <td>down</td>
+</tr>
+<!-- The element 'B' should be selected and focused, the caption of first element is changed from 'A' to 'A+' -->
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>pressSpecialKey</td>
+ <td>vaadin=runOptionGroupRetainFocusKeyboardValueChange::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VOptionGroup[0]/domChild[1]/domChild[0]</td>
+ <td>down</td>
+</tr>
+<!-- Elements 'B' and 'C' should be swapped; 'C' selected but not focused -->
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+</tbody></table>
+</body>
+</html>
diff --git a/uitest/src/com/vaadin/tests/components/optiongroup/OptionGroupRetainFocusKeyboardValueChange.java b/uitest/src/com/vaadin/tests/components/optiongroup/OptionGroupRetainFocusKeyboardValueChange.java
new file mode 100644
index 0000000000..570a300cb3
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/optiongroup/OptionGroupRetainFocusKeyboardValueChange.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.optiongroup;
+
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.OptionGroup;
+
+/**
+ * Testcase for #10451
+ *
+ * @author Vaadin Ltd
+ */
+public class OptionGroupRetainFocusKeyboardValueChange extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final OptionGroup optiongroup = new OptionGroup();
+ optiongroup.addItem(1);
+ optiongroup.addItem(2);
+ optiongroup.addItem(3);
+ optiongroup.setItemCaption(1, "A");
+ optiongroup.setItemCaption(2, "B");
+ optiongroup.setItemCaption(3, "C");
+ optiongroup.setImmediate(true);
+
+ optiongroup.addValueChangeListener(new ValueChangeListener() {
+
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ if (optiongroup.isSelected(2)) {
+ optiongroup.setItemCaption(1, "A+");
+ } else if (optiongroup.isSelected(3)) {
+ optiongroup.removeItem(2);
+ optiongroup.addItem(2);
+ optiongroup.setItemCaption(2, "B");
+ }
+ }
+ });
+
+ addComponent(optiongroup);
+
+ optiongroup.focus();
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "OptionGroup should retain focus after it's value being changed with keyboard";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 10451;
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/orderedlayout/HorizontalLayoutFullsizeContentWithErrorMsg.java b/uitest/src/com/vaadin/tests/components/orderedlayout/HorizontalLayoutFullsizeContentWithErrorMsg.java
new file mode 100644
index 0000000000..030bfa693e
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/orderedlayout/HorizontalLayoutFullsizeContentWithErrorMsg.java
@@ -0,0 +1,66 @@
+package com.vaadin.tests.components.orderedlayout;
+
+import com.vaadin.server.UserError;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Alignment;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.TextField;
+
+public class HorizontalLayoutFullsizeContentWithErrorMsg extends AbstractTestUI {
+
+ static final String FIELD_ID = "f";
+ static final String BUTTON_ID = "b";
+ private TextField tf;
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12564;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+ HorizontalLayout hl = new HorizontalLayout();
+ hl.setWidth("500px");
+
+ tf = new TextField();
+ tf.setId(FIELD_ID);
+ tf.setWidth("100%");
+ hl.addComponent(tf);
+ hl.setExpandRatio(tf, 1);
+ hl.setComponentAlignment(tf, Alignment.MIDDLE_CENTER);
+
+ Button toggleError = new Button("Toggle error");
+ toggleError.setId(BUTTON_ID);
+ toggleError.addClickListener(new ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ tf.setComponentError(tf.getComponentError() == null ? new UserError(
+ "foo") : null);
+ }
+ });
+ hl.addComponent(toggleError);
+
+ addComponent(hl);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "TextField should remain at same level vertically, horizontally width should adjust to fit error indicator.";
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/orderedlayout/HorizontalLayoutFullsizeContentWithErrorMsgTest.java b/uitest/src/com/vaadin/tests/components/orderedlayout/HorizontalLayoutFullsizeContentWithErrorMsgTest.java
new file mode 100644
index 0000000000..24ebf24688
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/orderedlayout/HorizontalLayoutFullsizeContentWithErrorMsgTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.orderedlayout;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Point;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class HorizontalLayoutFullsizeContentWithErrorMsgTest extends
+ MultiBrowserTest {
+
+ @Test
+ public void test() {
+ openTestURL();
+ WebElement element = getDriver().findElement(
+ By.id(HorizontalLayoutFullsizeContentWithErrorMsg.FIELD_ID));
+ Point location = element.getLocation();
+
+ WebElement errorToggleButton = getDriver().findElement(
+ By.id(HorizontalLayoutFullsizeContentWithErrorMsg.BUTTON_ID));
+
+ errorToggleButton.click();
+
+ Assert.assertEquals(location, element.getLocation());
+
+ errorToggleButton.click();
+
+ Assert.assertEquals(location, element.getLocation());
+
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/panel/PanelChangeContentsTest.java b/uitest/src/com/vaadin/tests/components/panel/PanelChangeContentsTest.java
new file mode 100644
index 0000000000..5bc505dbc8
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/panel/PanelChangeContentsTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.panel;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class PanelChangeContentsTest extends MultiBrowserTest {
+
+ @Test
+ public void testReattachComponentUsingPush() {
+ setPush(true);
+ openTestURL();
+
+ Assert.assertEquals(
+ "stats",
+ vaadinElement(
+ "/VVerticalLayout[0]/Slot[1]/VPanel[0]/VVerticalLayout[0]/Slot[0]/VLabel[0]")
+ .getText());
+ vaadinElement(
+ "/VVerticalLayout[0]/Slot[0]/VHorizontalLayout[0]/Slot[1]/VButton[0]/domChild[0]/domChild[0]")
+ .click();
+ Assert.assertEquals(
+ "companies",
+ vaadinElement(
+ "/VVerticalLayout[0]/Slot[1]/VPanel[0]/VVerticalLayout[0]/Slot[0]/VLabel[0]")
+ .getText());
+ vaadinElement(
+ "/VVerticalLayout[0]/Slot[0]/VHorizontalLayout[0]/Slot[0]/VButton[0]/domChild[0]/domChild[0]")
+ .click();
+ Assert.assertEquals(
+ "stats",
+ vaadinElement(
+ "/VVerticalLayout[0]/Slot[1]/VPanel[0]/VVerticalLayout[0]/Slot[0]/VLabel[0]")
+ .getText());
+
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/label/LabelModes.html b/uitest/src/com/vaadin/tests/components/panel/WebkitScrollbarTest.html
index 356688b456..ee33ee2bf0 100644
--- a/uitest/src/com/vaadin/tests/components/label/LabelModes.html
+++ b/uitest/src/com/vaadin/tests/components/panel/WebkitScrollbarTest.html
@@ -12,14 +12,14 @@
<tr><td rowspan="1" colspan="3">New Test</td></tr>
</thead><tbody>
<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.label.LabelModes?restartApplication</td>
- <td></td>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.panel.WebkitScrollbarTest?restartApplication</td>
+ <td></td>
</tr>
<tr>
- <td>screenCapture</td>
- <td></td>
- <td>labelmodes</td>
+ <td>screenCapture</td>
+ <td></td>
+ <td>panelShouldNotHaveScrollbars</td>
</tr>
</tbody></table>
diff --git a/uitest/src/com/vaadin/tests/components/panel/WebkitScrollbarTest.java b/uitest/src/com/vaadin/tests/components/panel/WebkitScrollbarTest.java
new file mode 100644
index 0000000000..8981f52f12
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/panel/WebkitScrollbarTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.components.panel;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.ListSelect;
+import com.vaadin.ui.Panel;
+import com.vaadin.ui.VerticalLayout;
+
+@SuppressWarnings("serial")
+public class WebkitScrollbarTest extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ Panel panel = new Panel();
+
+ VerticalLayout content = new VerticalLayout();
+ panel.setContent(content);
+
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.setHeight(null);
+ gridLayout.setWidth(100, Unit.PERCENTAGE);
+ content.addComponent(gridLayout);
+
+ ListSelect listSelect = new ListSelect();
+
+ listSelect.setWidth(100, Unit.PERCENTAGE);
+ listSelect.setHeight(300, Unit.PIXELS);
+
+ gridLayout.addComponent(listSelect);
+
+ gridLayout.setMargin(true);
+
+ setContent(panel);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "When opening the window, it should NOT contain a horizontal";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12727;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/slider/SliderDisable.java b/uitest/src/com/vaadin/tests/components/slider/SliderDisable.java
new file mode 100644
index 0000000000..bd1d175119
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/slider/SliderDisable.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.slider;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Slider;
+import com.vaadin.ui.VerticalLayout;
+
+public class SliderDisable extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ VerticalLayout content = new VerticalLayout();
+ content.setMargin(true);
+ content.setSpacing(true);
+
+ final Slider slider = new Slider(0, 5);
+ slider.setWidth(200, Unit.PIXELS);
+ slider.setValue(1.0D);
+
+ Button disableButton = new Button("Disable slider");
+ disableButton.setId("disableButton");
+ disableButton.addClickListener(new ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ slider.setEnabled(false);
+ }
+ });
+
+ content.addComponent(slider);
+ content.addComponent(disableButton);
+ setContent(content);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "The apparent value of the slider should not change when the slider is disabled";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12676;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/slider/SliderDisableTest.java b/uitest/src/com/vaadin/tests/components/slider/SliderDisableTest.java
new file mode 100644
index 0000000000..f6ec3dac3b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/slider/SliderDisableTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.slider;
+
+import java.io.IOException;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class SliderDisableTest extends MultiBrowserTest {
+ @Test
+ public void disableSlider() throws IOException {
+ openTestURL();
+ WebElement element = vaadinElement("/VVerticalLayout[0]/Slot[0]/VSlider[0]/domChild[2]/domChild[0]");
+ new Actions(driver).dragAndDropBy(element, 112, 0).perform();
+ compareScreen("enabled");
+ vaadinElementById("disableButton").click();
+ compareScreen("disabled");
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/table/EmptyTable.java b/uitest/src/com/vaadin/tests/components/table/EmptyTable.java
new file mode 100644
index 0000000000..d6c30efa5a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/EmptyTable.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.table;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Table;
+
+public class EmptyTable extends AbstractTestUI {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+ Table table = new Table("Table");
+ table.addContainerProperty("testColumn", String.class, null);
+ table.setPageLength(0); // disable paging
+ addComponent(table);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Empty Table should not cause JS exception";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 11189;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/table/EmptyTableTest.java b/uitest/src/com/vaadin/tests/components/table/EmptyTableTest.java
new file mode 100644
index 0000000000..229dc23b9a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/EmptyTableTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.table;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.NoSuchElementException;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class EmptyTableTest extends MultiBrowserTest {
+
+ @Test
+ public void test() {
+ setDebug(true);
+ openTestURL();
+
+ ensureNoErrors();
+ }
+
+ private void ensureNoErrors() {
+ try {
+ getDriver().findElement(By.className("v-Notification"));
+ } catch (NoSuchElementException e) {
+ return;
+ }
+ Assert.fail("Error notification was shown!");
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/push/PushFromInit.html b/uitest/src/com/vaadin/tests/components/table/ShowLastItem.html
index d009eb3baf..c9c93198fa 100644
--- a/uitest/src/com/vaadin/tests/push/PushFromInit.html
+++ b/uitest/src/com/vaadin/tests/components/table/ShowLastItem.html
@@ -3,7 +3,6 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
<title>New Test</title>
</head>
<body>
@@ -12,19 +11,24 @@
<tr><td rowspan="1" colspan="3">New Test</td></tr>
</thead><tbody>
<tr>
- <td>open</td>
- <td>/run-push/com.vaadin.tests.push.PushFromInit?debug&amp;restartApplication</td>
- <td></td>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.table.ShowLastItem?restartApplication</td>
+ <td></td>
</tr>
<tr>
- <td>waitForText</td>
- <td>vaadin=runpushcomvaadintestspushPushFromInit::PID_SLog_row_1</td>
- <td>1. Logged in init</td>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestscomponentstableShowLastItem::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
+ <td></td>
</tr>
<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushPushFromInit::PID_SLog_row_0</td>
- <td>2. Logged from background thread started in init</td>
+ <td>pause</td>
+ <td>1000</td>
+ <td></td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td>row-20-fully-visible</td>
</tr>
</tbody></table>
diff --git a/uitest/src/com/vaadin/tests/components/table/ShowLastItem.java b/uitest/src/com/vaadin/tests/components/table/ShowLastItem.java
new file mode 100644
index 0000000000..6d6f744918
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/ShowLastItem.java
@@ -0,0 +1,66 @@
+package com.vaadin.tests.components.table;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Table;
+
+public class ShowLastItem extends AbstractTestUI {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+ final Table table = new Table();
+ table.setHeight("210px");
+
+ table.addContainerProperty("Col", String.class, "");
+
+ for (int i = 0; i < 20; i++) {
+ table.addItem(i).getItemProperty("Col")
+ .setValue("row " + String.valueOf(i));
+ }
+
+ Button addItemBtn = new Button("Add item", new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ Object itemId = "row " + table.getItemIds().size();
+
+ table.addItem(itemId).getItemProperty("Col")
+ .setValue(String.valueOf(itemId));
+
+ table.setCurrentPageFirstItemIndex(table.getItemIds().size() - 1);
+ }
+ });
+
+ addComponent(table);
+ addComponent(addItemBtn);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Show last item in Table by using setCurrentPageFirstItemId";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 12407;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/table/TableDragColumnFloatingElementStyles.html b/uitest/src/com/vaadin/tests/components/table/TableDragColumnFloatingElementStyles.html
new file mode 100644
index 0000000000..e225091b5f
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/TableDragColumnFloatingElementStyles.html
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="http://localhost:8888/" />
+<title>TableDragColumn</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">TableDragColumn</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.table.Tables?restartApplication</td>
+ <td></td>
+</tr>
+<tr>
+ <td>drag</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::PID_StestComponent/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[2]</td>
+ <td>51,6</td>
+</tr>
+<tr>
+ <td>mouseMoveAt</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::PID_StestComponent/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[3]</td>
+ <td>70,10</td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td>1 basic ghost element</td>
+</tr>
+<tr>
+ <td>drop</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::PID_StestComponent/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[2]</td>
+ <td>10,10</td>
+</tr>
+<!--Add style name "red-border-1px" to table-->
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::PID_Smenu#item0</td>
+ <td>24,7</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::Root/VOverlay[0]/VMenuBar[0]#item1</td>
+ <td>18,10</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::Root/VOverlay[1]/VMenuBar[0]#item4</td>
+ <td>19,8</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::Root/VOverlay[2]/VMenuBar[0]#item2</td>
+ <td>75,7</td>
+</tr>
+<!-- Drag and drop column 1 to the left of column 4 -->
+<tr>
+ <td>drag</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::PID_StestComponent/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]</td>
+ <td>51,6</td>
+</tr>
+<tr>
+ <td>mouseMoveAt</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::PID_StestComponent/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[3]</td>
+ <td>70,10</td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td>2 themed ghost element should have red borders</td>
+</tr>
+<tr>
+ <td>drop</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::PID_StestComponent/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[2]</td>
+ <td>10,10</td>
+</tr>
+<!--Add style name "red-border-1px" to table-->
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::PID_Smenu#item0</td>
+ <td>24,7</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::Root/VOverlay[0]/VMenuBar[0]#item1</td>
+ <td>18,10</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::Root/VOverlay[1]/VMenuBar[0]#item4</td>
+ <td>19,8</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::Root/VOverlay[2]/VMenuBar[0]#item3</td>
+ <td>164,10</td>
+</tr>
+<tr>
+ <td>drag</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::PID_StestComponent/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[2]</td>
+ <td>51,6</td>
+</tr>
+<tr>
+ <td>mouseMoveAt</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::PID_StestComponent/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[3]</td>
+ <td>70,10</td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td>3 themed ghost element should have 2px blue borders</td>
+</tr>
+<tr>
+ <td>drop</td>
+ <td>vaadin=runcomvaadintestscomponentstableTables::PID_StestComponent/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[2]</td>
+ <td>10,10</td>
+</tr>
+</tbody></table>
+</body>
+</html> \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/table/TableHorizontalScrollPositionOnItemSetChange.html b/uitest/src/com/vaadin/tests/components/table/TableHorizontalScrollPositionOnItemSetChange.html
new file mode 100644
index 0000000000..6fd54ba0ca
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/TableHorizontalScrollPositionOnItemSetChange.html
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="http://localhost:8888/" />
+<title>TableHorizontalScrollPositionOnItemSetChange</title>
+</head>
+<body>
+ <table cellpadding="1" cellspacing="1" border="1">
+ <thead>
+ <tr>
+ <td rowspan="1" colspan="3">TableHorizontalScrollPositionOnItemSetChange</td>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.table.TableHorizontalScrollPositionOnItemSetChange?restartApplication</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>scrollLeft</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableHorizontalScrollPositionOnItemSetChange::PID_Shorscrolltable/domChild[1]</td>
+ <td>326</td>
+ </tr>
+ <tr>
+ <td>pause</td>
+ <td>500</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableHorizontalScrollPositionOnItemSetChange::PID_Slessitems/domChild[0]/domChild[0]</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>pause</td>
+ <td>500</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td>left-scroll-position-stays-in-middle-with-fewer-items</td>
+ </tr>
+ <tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableHorizontalScrollPositionOnItemSetChange::PID_Smoreitems/domChild[0]/domChild[0]</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>pause</td>
+ <td>500</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td>left-scroll-position-stays-in-middle-with-more-items</td>
+ </tr>
+ <tr>
+ <td>scrollLeft</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableHorizontalScrollPositionOnItemSetChange::PID_Shorscrolltable/domChild[1]</td>
+ <td>653</td>
+ </tr>
+ <tr>
+ <td>pause</td>
+ <td>500</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableHorizontalScrollPositionOnItemSetChange::PID_Slessitems/domChild[0]/domChild[0]</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>pause</td>
+ <td>500</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td>left-scroll-position-stays-max-with-fewer-items</td>
+ </tr>
+ <tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableHorizontalScrollPositionOnItemSetChange::PID_Smoreitems/domChild[0]/domChild[0]</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>pause</td>
+ <td>500</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td>left-scroll-position-stays-max-with-more-items</td>
+ </tr>
+ <tr>
+ <td>scrollLeft</td>
+ <td>vaadin=runcomvaadintestscomponentstableTableHorizontalScrollPositionOnItemSetChange::PID_Shorscrolltable/domChild[1]</td>
+ <td>0</td>
+ </tr>
+ </tbody>
+ </table>
+</body>
+</html>
diff --git a/uitest/src/com/vaadin/tests/components/table/TableHorizontalScrollPositionOnItemSetChange.java b/uitest/src/com/vaadin/tests/components/table/TableHorizontalScrollPositionOnItemSetChange.java
new file mode 100644
index 0000000000..1f59a84428
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/TableHorizontalScrollPositionOnItemSetChange.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.table;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.VerticalLayout;
+
+public class TableHorizontalScrollPositionOnItemSetChange extends
+ AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ VerticalLayout layout = new VerticalLayout();
+ layout.setMargin(true);
+ layout.setSpacing(true);
+ setContent(layout);
+
+ final Table table = new Table();
+ table.setWidth("640px");
+ table.setHeight("243px");
+ table.setId("horscrolltable");
+ layout.addComponent(table);
+
+ for (int i = 0; i < 15; i++) {
+ table.addContainerProperty("Column " + i, String.class, null);
+ }
+
+ for (int i = 0; i < 60; i++) {
+ table.addItem();
+ }
+
+ Button lessItems = new Button("Less items", new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(Button.ClickEvent event) {
+ table.removeAllItems();
+ for (int i = 0; i < 5; i++) {
+ table.addItem();
+ }
+ }
+ });
+ lessItems.setId("lessitems");
+
+ Button moreItems = new Button("More items", new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(Button.ClickEvent event) {
+ table.removeAllItems();
+ for (int i = 0; i < 50; i++) {
+ table.addItem();
+ }
+ }
+ });
+ moreItems.setId("moreitems");
+
+ Button clearItems = new Button("Clear all", new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ table.removeAllItems();
+ }
+ });
+
+ HorizontalLayout buttonLayout = new HorizontalLayout();
+ buttonLayout.setSpacing(true);
+ layout.addComponent(buttonLayout);
+
+ buttonLayout.addComponent(lessItems);
+ buttonLayout.addComponent(moreItems);
+ buttonLayout.addComponent(clearItems);
+ clearItems.setId("clearitems");
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Horizontal scrolling position should not be lost if amount of items changes in Table.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12652;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/table/TableMoveFocusWithSelection.java b/uitest/src/com/vaadin/tests/components/table/TableMoveFocusWithSelection.java
new file mode 100644
index 0000000000..20170efa13
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/TableMoveFocusWithSelection.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.table;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import com.vaadin.event.LayoutEvents.LayoutClickEvent;
+import com.vaadin.event.LayoutEvents.LayoutClickListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.VerticalLayout;
+
+public class TableMoveFocusWithSelection extends AbstractTestUI {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+ final Table t = new Table();
+ t.setImmediate(true);
+ t.setId("test-table");
+ t.setSizeFull();
+ t.setSelectable(true);
+ t.addContainerProperty("layout", VerticalLayout.class, null);
+ t.addContainerProperty("string", String.class, null);
+
+ for (int i = 0; i < 100; i++) {
+ t.addItem(i);
+ final VerticalLayout l = new VerticalLayout();
+ l.setId("row-" + i);
+ l.setHeight(20, Unit.PIXELS);
+ l.setData(i);
+ l.addLayoutClickListener(new LayoutClickListener() {
+ @Override
+ public void layoutClick(LayoutClickEvent event) {
+ if (t.isMultiSelect()) {
+ Set<Object> values = new HashSet<Object>(
+ (Set<Object>) t.getValue());
+ values.add(l.getData());
+ t.setValue(values);
+ } else {
+ t.setValue(l.getData());
+ }
+ }
+ });
+ t.getContainerProperty(i, "layout").setValue(l);
+ t.getContainerProperty(i, "string").setValue("Item #" + i);
+ }
+ addComponent(t);
+
+ // Select mode
+ Button toggleSelectMode = new Button(
+ t.isMultiSelect() ? "Press to use single select"
+ : "Press to use multi select");
+ toggleSelectMode.setId("toggle-mode");
+ toggleSelectMode.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ t.setMultiSelect(!t.isMultiSelect());
+
+ event.getButton().setCaption(
+ t.isMultiSelect() ? "Press to use single select"
+ : "Press to use multi select");
+ }
+ });
+
+ addComponent(toggleSelectMode);
+
+ Button select5210 = new Button("Select row 5-10",
+ new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ t.setValue(Arrays.asList(5, 6, 7, 8, 9, 10));
+ }
+ });
+ select5210.setId("select-510");
+ addComponent(select5210);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Changing selection in single select mode should move focus";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 12540;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/table/TableMoveFocusWithSelectionTest.java b/uitest/src/com/vaadin/tests/components/table/TableMoveFocusWithSelectionTest.java
new file mode 100644
index 0000000000..5075e22f1b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/TableMoveFocusWithSelectionTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.table;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.By;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * Tests if table focus is moved correctly to the selected item
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class TableMoveFocusWithSelectionTest extends MultiBrowserTest {
+
+ @Test
+ public void selectUnfocusedTableAndAssumeSelectionGetsFocus() {
+
+ openTestURL();
+
+ // Click on row 5
+ getDriver().findElement(By.id("row-5")).click();
+
+ // Ensure row 5 gets focused
+ WebElement row5TableRow = getDriver().findElement(
+ By.xpath("//div[@id='row-5']/../../.."));
+ String row5StyleName = row5TableRow.getAttribute("class");
+ assertTrue(row5StyleName.contains("v-table-focus"));
+ }
+
+ @Test
+ public void focusShouldStayOnUserSelectedRowIfSelectionChangesServerSide() {
+
+ openTestURL();
+
+ // Select multiselect
+ getDriver().findElement(By.id("toggle-mode")).click();
+
+ // Click on row 7
+ getDriver().findElement(By.id("row-7")).click();
+
+ // Clicking a row should get the row focus
+ WebElement row7TableRow = getDriver().findElement(
+ By.xpath("//div[@id='row-7']/../../.."));
+ String row7StyleName = row7TableRow.getAttribute("class");
+ assertTrue(row7StyleName.contains("v-table-focus"));
+
+ // Select row 5-10 server side
+ getDriver().findElement(By.id("select-510")).click();
+
+ /*
+ * Focus the table again (some browsers steal focus when performing
+ * button click, other don't)
+ */
+ getDriver().findElement(By.id("test-table")).click();
+
+ // Ensure row 7 is still focused
+ row7TableRow = getDriver().findElement(
+ By.xpath("//div[@id='row-7']/../../.."));
+ row7StyleName = row7TableRow.getAttribute("class");
+ assertTrue(row7StyleName.contains("v-table-focus"));
+ }
+}
diff --git a/server/tests/src/com/vaadin/tests/server/component/table/TableRemovedQuicklySendsInvalidRpcCalls.java b/uitest/src/com/vaadin/tests/components/table/TableRemovedQuicklySendsInvalidRpcCalls.java
index b539e42efe..6e4b62e4f7 100644
--- a/server/tests/src/com/vaadin/tests/server/component/table/TableRemovedQuicklySendsInvalidRpcCalls.java
+++ b/uitest/src/com/vaadin/tests/components/table/TableRemovedQuicklySendsInvalidRpcCalls.java
@@ -14,7 +14,7 @@
* the License.
*/
-package com.vaadin.tests.server.component.table;
+package com.vaadin.tests.components.table;
import com.vaadin.annotations.Push;
import com.vaadin.event.ItemClickEvent;
diff --git a/uitest/src/com/vaadin/tests/components/table/TableSizeInTabsheet.java b/uitest/src/com/vaadin/tests/components/table/TableSizeInTabsheet.java
new file mode 100644
index 0000000000..f84f83718d
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/TableSizeInTabsheet.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.table;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.CustomComponent;
+import com.vaadin.ui.Layout;
+import com.vaadin.ui.TabSheet;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.VerticalLayout;
+
+@SuppressWarnings("serial")
+public class TableSizeInTabsheet extends AbstractTestUI {
+
+ static final String TABLE = "table";
+ static final String TABSHEET = "tabsheet";
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ VerticalLayout layout = new VerticalLayout();
+ layout.setMargin(true);
+ setContent(layout);
+
+ TabSheet tabSheet = new TabSheet();
+ tabSheet.setId(TABSHEET);
+ layout.addComponent(tabSheet);
+ tabSheet.addTab(new TabComposite(), "Tab");
+ }
+
+ public class TabComposite extends CustomComponent {
+
+ public TabComposite() {
+ Layout mainLayout = new VerticalLayout();
+ addComponent(mainLayout);
+ setCompositionRoot(mainLayout);
+
+ Component table = new Table();
+ table.setWidth("100%");
+ table.setId(TABLE);
+ mainLayout.addComponent(table);
+ }
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "The size calculations fails in IE8 when undefined size table is inside a tabsheet";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12687;
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/table/TableSizeInTabsheetTest.java b/uitest/src/com/vaadin/tests/components/table/TableSizeInTabsheetTest.java
new file mode 100644
index 0000000000..29fc5a2e52
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/TableSizeInTabsheetTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.table;
+
+import static com.vaadin.tests.components.table.TableSizeInTabsheet.TABLE;
+import static com.vaadin.tests.components.table.TableSizeInTabsheet.TABSHEET;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class TableSizeInTabsheetTest extends MultiBrowserTest {
+
+ private static final String TABSHEET_CONTENT_STYLENAME = "v-tabsheet-content";
+
+ @Test
+ public void testTabsheetContentHasTheSameHeightAsTable() {
+ openTestURL();
+ int tableHeight = getTableHeigth();
+ int tabSheetContentHeight = getTableSheetContentHeight();
+
+ Assert.assertEquals(tableHeight, tabSheetContentHeight);
+ }
+
+ private int getTableHeigth() {
+ return vaadinElementById(TABLE).getSize().getHeight();
+ }
+
+ private int getTableSheetContentHeight() {
+ WebElement tabsheetContent = vaadinElementById(TABSHEET).findElement(
+ By.className(TABSHEET_CONTENT_STYLENAME));
+ return tabsheetContent.getSize().getHeight();
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetErrorTooltip.java b/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetErrorTooltip.java
new file mode 100644
index 0000000000..02482b7049
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetErrorTooltip.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.tabsheet;
+
+import com.vaadin.server.UserError;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.TabSheet;
+import com.vaadin.ui.TabSheet.Tab;
+
+public class TabSheetErrorTooltip extends AbstractTestUI {
+
+ private TabSheet tabSheet = new TabSheet();
+ private int tabCount = 0;
+
+ @Override
+ protected void setup(VaadinRequest request) {
+
+ addTab();
+ addTab().setComponentError(new UserError("Error!"));
+ addTab().setDescription("This is a tab");
+
+ Tab t = addTab();
+ t.setComponentError(new UserError("Error!"));
+ t.setDescription("This tab has both an error and a description");
+
+ setContent(tabSheet);
+ }
+
+ private Tab addTab() {
+ tabCount++;
+ Label contents = new Label("Contents for tab " + tabCount);
+ return tabSheet.addTab(contents, "Tab " + tabCount);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "TabSheet Tabs should display component error tooltips when expected";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12802;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetErrorTooltipTest.java b/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetErrorTooltipTest.java
new file mode 100644
index 0000000000..88bc23d12b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetErrorTooltipTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.tabsheet;
+
+import java.io.IOException;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.NoSuchElementException;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class TabSheetErrorTooltipTest extends MultiBrowserTest {
+
+ @Test
+ public void checkTooltips() throws IOException {
+ openTestURL();
+
+ testBenchElement(getTab(0)).showTooltip();
+ assertNoTooltip();
+
+ testBenchElement(getTab(1)).showTooltip();
+ assertErrorMessage("Error!");
+ assertTooltip("");
+
+ testBenchElement(getTab(2)).showTooltip();
+ assertErrorMessage("");
+ assertTooltip("This is a tab");
+
+ testBenchElement(getTab(3)).showTooltip();
+ assertErrorMessage("Error!");
+ assertTooltip("This tab has both an error and a description");
+ }
+
+ private WebElement getTab(int index) {
+ return vaadinElement("/VTabsheet[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild["
+ + index + "]/domChild[0]");
+ }
+
+ private WebElement getTooltip() {
+ return getDriver().findElement(
+ By.xpath("//div[@class='v-tooltip-text']"));
+ }
+
+ private WebElement getErrorMessage() {
+ return getDriver().findElement(
+ By.xpath("//div[@class='v-errormessage']"));
+ }
+
+ private void assertTooltip(String tooltip) {
+ Assert.assertEquals(tooltip, getTooltip().getText());
+ }
+
+ private void assertErrorMessage(String message) {
+ Assert.assertEquals(message, getErrorMessage().getText());
+ }
+
+ private void assertNoTooltip() {
+ try {
+ getTooltip();
+ } catch (NoSuchElementException e) {
+ return;
+ }
+ Assert.fail("Tooltip exists");
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetHotKeysWithModifiers.java b/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetHotKeysWithModifiers.java
new file mode 100644
index 0000000000..c0b30ff68d
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetHotKeysWithModifiers.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+/**
+ *
+ */
+package com.vaadin.tests.components.tabsheet;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.TabSheet;
+
+public class TabSheetHotKeysWithModifiers extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ TabSheet tabSheet = new TabSheet();
+ tabSheet.setWidth("500px");
+ tabSheet.setHeight("500px");
+ tabSheet.addTab(new Label("Tab 1"), "Tab 1").setClosable(true);
+ tabSheet.addTab(new Label("Tab 2"), "Tab 2").setClosable(true);
+ tabSheet.addTab(new Label("Tab 3"), "Tab 3").setClosable(true);
+ setContent(tabSheet);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Hot keys (left and right arrow keys and the delete key) should be ignored when they are pressed simultaneously with modifier keys";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12178;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/push/TrackMessageSizeUnitTests.html b/uitest/src/com/vaadin/tests/components/ui/PollListenerTest.html
index 89dd7d4e78..ac39d1f03c 100644
--- a/uitest/src/com/vaadin/tests/push/TrackMessageSizeUnitTests.html
+++ b/uitest/src/com/vaadin/tests/components/ui/PollListenerTest.html
@@ -3,24 +3,30 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://192.168.2.162:8888/" />
-<title>New Test</title>
+<link rel="selenium.base" href="http://localhost:8888/" />
+<title>PollListenerTest</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
+<tr><td rowspan="1" colspan="3">PollListenerTest</td></tr>
</thead><tbody>
<tr>
<td>open</td>
- <td>/run/com.vaadin.tests.push.TrackMessageSizeUnitTests?restartApplication</td>
+ <td>/run/com.vaadin.tests.components.ui.PollListenerTest?restartApplication</td>
<td></td>
</tr>
<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestspushTrackMessageSizeUnitTests::PID_SLog_row_0</td>
- <td>1. All tests run</td>
+ <td>pause</td>
+ <td>5000</td>
+ <td></td>
+</tr>
+<tr>
+ <td>verifyTextPresent</td>
+ <td>PollEvent received</td>
+ <td></td>
</tr>
+
</tbody></table>
</body>
</html>
diff --git a/uitest/src/com/vaadin/tests/components/ui/PollListenerTest.java b/uitest/src/com/vaadin/tests/components/ui/PollListenerTest.java
new file mode 100644
index 0000000000..0e5ddaab87
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/ui/PollListenerTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.components.ui;
+
+import com.vaadin.event.UIEvents.PollEvent;
+import com.vaadin.event.UIEvents.PollListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Label;
+
+public class PollListenerTest extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final Label statusLabel = new Label("Default Label");
+ addComponent(statusLabel);
+
+ setPollInterval(2000);
+ addPollListener(new PollListener() {
+ @Override
+ public void poll(PollEvent event) {
+ setPollInterval(-1);
+ statusLabel.setValue(event.getClass().getSimpleName()
+ + " received");
+ removePollListener(this);
+ }
+ });
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Polling should fire a PollEvent on the server-side";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12466;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/ui/UiAccess.java b/uitest/src/com/vaadin/tests/components/ui/UIAccess.java
index 09f2fd8816..d036827159 100644
--- a/uitest/src/com/vaadin/tests/components/ui/UiAccess.java
+++ b/uitest/src/com/vaadin/tests/components/ui/UIAccess.java
@@ -31,7 +31,7 @@ import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.UI;
import com.vaadin.util.CurrentInstance;
-public class UiAccess extends AbstractTestUIWithLog {
+public class UIAccess extends AbstractTestUIWithLog {
private volatile boolean checkCurrentInstancesBeforeResponse = false;
diff --git a/uitest/src/com/vaadin/tests/components/ui/UIAccessExceptionHandling.html b/uitest/src/com/vaadin/tests/components/ui/UIAccessExceptionHandling.html
new file mode 100644
index 0000000000..94d8aa2777
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/ui/UIAccessExceptionHandling.html
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="http://localhost:8888/" />
+<title>New Test</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">New Test</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.ui.UIAccessExceptionHandling?restartApplication</td>
+ <td></td>
+</tr>
+<tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestscomponentsuiUIAccessExceptionHandling::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[0]/VButton[0]/domChild[0]/domChild[0]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>verifyText</td>
+ <td>vaadin=runcomvaadintestscomponentsuiUIAccessExceptionHandling::PID_SLog_row_0</td>
+ <td>1. Exception catched on get: java.util.concurrent.ExecutionException</td>
+</tr>
+<tr>
+ <td>verifyText</td>
+ <td>vaadin=runcomvaadintestscomponentsuiUIAccessExceptionHandling::PID_SLog_row_1</td>
+ <td>0. Exception catched on execution with ConnectorErrorEvent : java.util.concurrent.ExecutionException</td>
+</tr>
+<tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestscomponentsuiUIAccessExceptionHandling::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[1]/VButton[0]/domChild[0]/domChild[0]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>verifyText</td>
+ <td>vaadin=runcomvaadintestscomponentsuiUIAccessExceptionHandling::PID_SLog_row_0</td>
+ <td>1. Exception catched on get: java.util.concurrent.ExecutionException</td>
+</tr>
+<tr>
+ <td>verifyText</td>
+ <td>vaadin=runcomvaadintestscomponentsuiUIAccessExceptionHandling::PID_SLog_row_1</td>
+ <td>0. Exception catched on execution with ErrorEvent : java.util.concurrent.ExecutionException</td>
+</tr>
+<tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadintestscomponentsuiUIAccessExceptionHandling::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>verifyText</td>
+ <td>vaadin=runcomvaadintestscomponentsuiUIAccessExceptionHandling::PID_SLog_row_0</td>
+ <td>1. Exception catched on get: java.util.concurrent.ExecutionException</td>
+</tr>
+<tr>
+ <td>verifyText</td>
+ <td>vaadin=runcomvaadintestscomponentsuiUIAccessExceptionHandling::PID_SLog_row_1</td>
+ <td>0. Exception catched on execution with ConnectorErrorEvent : java.util.concurrent.ExecutionException</td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
diff --git a/uitest/src/com/vaadin/tests/components/ui/UIAccessExceptionHandling.java b/uitest/src/com/vaadin/tests/components/ui/UIAccessExceptionHandling.java
new file mode 100644
index 0000000000..1cd4be576b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/ui/UIAccessExceptionHandling.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.components.ui;
+
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import com.vaadin.server.DefaultErrorHandler;
+import com.vaadin.server.ErrorHandler;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.server.VaadinService;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.UI;
+import com.vaadin.util.CurrentInstance;
+
+public class UIAccessExceptionHandling extends AbstractTestUIWithLog implements
+ ErrorHandler {
+
+ private Future<Void> future;
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ getSession().setErrorHandler(this);
+
+ addComponent(new Button("Throw RuntimeException on UI.access",
+ new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ log.clear();
+
+ // Ensure beforeClientResponse is invoked
+ markAsDirty();
+
+ future = access(new Runnable() {
+ @Override
+ public void run() {
+ throw new RuntimeException();
+ }
+ });
+ }
+ }));
+
+ addComponent(new Button("Throw RuntimeException on Session.access",
+ new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ log.clear();
+
+ // Ensure beforeClientResponse is invoked
+ markAsDirty();
+
+ VaadinService service = VaadinService.getCurrent();
+
+ future = service.accessSession(getSession(),
+ new Runnable() {
+
+ @Override
+ public void run() {
+ throw new RuntimeException();
+ }
+ });
+ }
+ }));
+
+ addComponent(new Button(
+ "Throw RuntimeException after removing instances",
+ new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ log.clear();
+
+ // Ensure beforeClientResponse is invoked
+ markAsDirty();
+
+ assert UI.getCurrent() == UIAccessExceptionHandling.this;
+
+ Map<Class<?>, CurrentInstance> instances = CurrentInstance
+ .getInstances(false);
+ CurrentInstance.clearAll();
+
+ assert UI.getCurrent() == null;
+
+ future = access(new Runnable() {
+ @Override
+ public void run() {
+ throw new RuntimeException();
+ }
+ });
+
+ CurrentInstance.restoreInstances(instances);
+ }
+ }));
+
+ addComponent(new Button("Clear", new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ log.clear();
+ }
+ }));
+ }
+
+ @Override
+ public void beforeClientResponse(boolean initial) {
+ if (future != null) {
+ try {
+ future.get();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ log("Exception catched on get: " + e.getClass().getName());
+ } finally {
+ future = null;
+ }
+ }
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Test for handling exceptions in UI.access and Session.access";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return Integer.valueOf(12703);
+ }
+
+ @Override
+ public void error(com.vaadin.server.ErrorEvent event) {
+ log("Exception catched on execution with "
+ + event.getClass().getSimpleName() + " : "
+ + event.getThrowable().getClass().getName());
+
+ DefaultErrorHandler.doDefault(event);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/ui/UIAccessTest.java b/uitest/src/com/vaadin/tests/components/ui/UIAccessTest.java
new file mode 100644
index 0000000000..9db2c2f0d3
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/ui/UIAccessTest.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.ui;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import com.vaadin.testbench.By;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class UIAccessTest extends MultiBrowserTest {
+ @Test
+ public void testThreadLocals() {
+ setPush(true);
+ openTestURL();
+ getCurrentInstanceWhenPushingButton().click();
+ waitUntil(ExpectedConditions.textToBePresentInElement(
+ vaadinLocatorById("Log_row_0"), "1."));
+ Assert.assertEquals("0. Current UI matches in beforeResponse? true",
+ vaadinElementById("Log_row_1").getText());
+ Assert.assertEquals(
+ "1. Current session matches in beforeResponse? true",
+ vaadinElementById("Log_row_0").getText());
+
+ }
+
+ @Test
+ public void testAccessMethod() throws Exception {
+ openTestURL();
+
+ vaadinElement(
+ "/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[0]/VButton[0]/domChild[0]/domChild[0]")
+ .click();
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[0]/VButton[0]/domChild[0]/domChild[0]"))
+ .click();
+ assertTrue(driver
+ .findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_2"))
+ .getText()
+ .matches(
+ "^0\\. Access from UI thread future is done[\\s\\S] false$"));
+ assertEquals(
+ "1. Access from UI thread is run",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_1"))
+ .getText());
+ assertTrue(driver
+ .findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_0"))
+ .getText()
+ .matches(
+ "^2\\. beforeClientResponse future is done[\\s\\S] true$"));
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[1]/VButton[0]/domChild[0]/domChild[0]"))
+ .click();
+ assertEquals(
+ "0. Initial background message",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_1"))
+ .getText());
+ assertTrue(driver
+ .findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_0"))
+ .getText()
+ .matches("^1\\. Thread has current response[\\s\\S] false$"));
+ for (int second = 0;; second++) {
+ if (second >= 30) {
+ fail("timeout");
+ }
+ try {
+ if ("0. Initial background message"
+ .equals(driver
+ .findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_2"))
+ .getText())) {
+ break;
+ }
+ } catch (Exception e) {
+ }
+ Thread.sleep(1000);
+ }
+
+ assertTrue(driver
+ .findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_0"))
+ .getText()
+ .matches(
+ "^2\\. Thread got lock, inital future done[\\s\\S] true$"));
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]"))
+ .click();
+ assertEquals(
+ "0. Throwing exception in access",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_2"))
+ .getText());
+ assertTrue(driver
+ .findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_1"))
+ .getText().matches("^1\\. firstFuture is done[\\s\\S] true$"));
+ assertEquals(
+ "2. Got exception from firstFuture: java.lang.RuntimeException: Catch me if you can",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_0"))
+ .getText());
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[3]/VButton[0]/domChild[0]/domChild[0]"))
+ .click();
+ assertEquals(
+ "0. future was cancled, should not start",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_0"))
+ .getText());
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[4]/VButton[0]/domChild[0]/domChild[0]"))
+ .click();
+ assertEquals(
+ "0. Waiting for thread to start",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_2"))
+ .getText());
+ assertEquals(
+ "1. Thread started, waiting for interruption",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_1"))
+ .getText());
+ assertEquals(
+ "2. I was interrupted",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_0"))
+ .getText());
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[5]/VButton[0]/domChild[0]/domChild[0]"))
+ .click();
+ assertTrue(driver
+ .findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_3"))
+ .getText()
+ .matches("^0\\. accessSynchronously has request[\\s\\S] true$"));
+ assertEquals(
+ "1. Test value in accessSynchronously: Set before accessSynchronosly",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_2"))
+ .getText());
+ assertTrue(driver
+ .findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_1"))
+ .getText()
+ .matches(
+ "^2\\. has request after accessSynchronously[\\s\\S] true$"));
+ assertEquals(
+ "3. Test value after accessSynchornously: Set in accessSynchronosly",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_0"))
+ .getText());
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[6]/VButton[0]/domChild[0]/domChild[0]"))
+ .click();
+ assertTrue(driver
+ .findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_3"))
+ .getText().matches("^0\\. access has request[\\s\\S] false$"));
+ assertEquals(
+ "1. Test value in access: Set before access",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_2"))
+ .getText());
+ assertTrue(driver
+ .findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_1"))
+ .getText()
+ .matches("^2\\. has request after access[\\s\\S] true$"));
+ assertEquals(
+ "3. Test value after access: Set before run pending",
+ driver.findElement(
+ By.vaadin("runcomvaadintestscomponentsuiUIAccess::PID_SLog_row_0"))
+ .getText());
+
+ }
+
+ private WebElement getCurrentInstanceWhenPushingButton() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[7]/VButton[0]");
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/ui/UiAccess.html b/uitest/src/com/vaadin/tests/components/ui/UiAccess.html
deleted file mode 100644
index 613691623c..0000000000
--- a/uitest/src/com/vaadin/tests/components/ui/UiAccess.html
+++ /dev/null
@@ -1,166 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.ui.UiAccess?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_2</td>
- <td>exact:0. Access from UI thread future is done? false</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_1</td>
- <td>1. Access from UI thread is run</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_0</td>
- <td>exact:2. beforeClientResponse future is done? true</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_1</td>
- <td>0. Initial background message</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_0</td>
- <td>exact:1. Thread has current response? false</td>
-</tr>
-<tr>
- <td>waitForText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_2</td>
- <td>0. Initial background message</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_0</td>
- <td>exact:2. Thread got lock, inital future done? true</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_2</td>
- <td>0. Throwing exception in access</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_1</td>
- <td>exact:1. firstFuture is done? true</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_0</td>
- <td>2. Got exception from firstFuture: java.lang.RuntimeException: Catch me if you can</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_0</td>
- <td>0. future was cancled, should not start</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[4]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_2</td>
- <td>0. Waiting for thread to start</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_1</td>
- <td>1. Thread started, waiting for interruption</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_0</td>
- <td>2. I was interrupted</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[5]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_3</td>
- <td>0. accessSynchronously has request? true</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_2</td>
- <td>1. Test value in accessSynchronously: Set before accessSynchronosly</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_1</td>
- <td>2. has request after accessSynchronously? true</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_0</td>
- <td>3. Test value after accessSynchornously: Set in accessSynchronosly</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[6]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_3</td>
- <td>0. access has request? false</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_2</td>
- <td>1. Test value in access: Set before access</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_1</td>
- <td>2. has request after access? true</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_0</td>
- <td>3. Test value after access: Set before run pending</td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/components/ui/UiAccessPush.html b/uitest/src/com/vaadin/tests/components/ui/UiAccessPush.html
deleted file mode 100644
index bc29534ee4..0000000000
--- a/uitest/src/com/vaadin/tests/components/ui/UiAccessPush.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.ui.UiAccess?restartApplication&amp;transport=websocket</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot[7]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>waitForNotText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_0</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_0</td>
- <td>exact:1. Current session matches in beforeResponse? true</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiUiAccess::PID_SLog_row_1</td>
- <td>exact:0. Current UI matches in beforeResponse? true</td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/components/window/ComboboxScrollableWindow.java b/uitest/src/com/vaadin/tests/components/window/ComboboxScrollableWindow.java
new file mode 100644
index 0000000000..6347ff9a76
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/window/ComboboxScrollableWindow.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.window;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Alignment;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.Window;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class ComboboxScrollableWindow extends AbstractTestUI {
+
+ static final String WINDOW_ID = "window";
+ static final String COMBOBOX_ID = "combobox";
+
+ @Override
+ protected void setup(VaadinRequest request) {
+
+ Window w = new Window();
+ w.setId(WINDOW_ID);
+ w.setWidth("300px");
+ w.setHeight("300px");
+ w.center();
+
+ VerticalLayout content = new VerticalLayout();
+ w.setContent(content);
+ content.setHeight("1000px");
+ ComboBox cb = new ComboBox();
+ cb.setId(COMBOBOX_ID);
+ content.addComponent(cb);
+ content.setComponentAlignment(cb, Alignment.BOTTOM_CENTER);
+
+ addWindow(w);
+
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "The combo box in the bottom of the scrollable window should remain visible when it is clicked.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12736;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/window/ComboboxScrollableWindowTest.java b/uitest/src/com/vaadin/tests/components/window/ComboboxScrollableWindowTest.java
new file mode 100644
index 0000000000..665e175f2c
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/window/ComboboxScrollableWindowTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.window;
+
+import static com.vaadin.tests.components.window.ComboboxScrollableWindow.COMBOBOX_ID;
+import static com.vaadin.tests.components.window.ComboboxScrollableWindow.WINDOW_ID;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.commands.TestBenchElementCommands;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class ComboboxScrollableWindowTest extends MultiBrowserTest {
+
+ @Test
+ public void testWindowScrollbars() throws Exception {
+ openTestURL();
+ com.vaadin.testbench.Parameters
+ .setScreenshotComparisonCursorDetection(true);
+
+ WebElement window = driver.findElement(By.id(WINDOW_ID));
+ WebElement scrollableElement = window.findElement(By
+ .className("v-scrollable"));
+ TestBenchElementCommands scrollable = testBenchElement(scrollableElement);
+ scrollable.scroll(1000);
+ WebElement comboBox = driver.findElement(By.id(COMBOBOX_ID));
+ WebElement selectButton = driver.findElement(By
+ .className("v-filterselect-button"));
+ selectButton.click();
+
+ // Wait for the browser before taking a screenshot
+ Thread.sleep(1000);
+ compareScreen(getScreenshotBaseName());
+
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/window/WindowMoveListener.java b/uitest/src/com/vaadin/tests/components/window/WindowMoveListener.java
new file mode 100644
index 0000000000..e0bc0d9471
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/window/WindowMoveListener.java
@@ -0,0 +1,67 @@
+package com.vaadin.tests.components.window;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Window;
+
+@SuppressWarnings("serial")
+public class WindowMoveListener extends AbstractTestUI {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+
+ Window w = new Window("Caption");
+ w.setId("testwindow");
+ w.setHeight("100px");
+ w.setWidth("100px");
+ w.setPositionX(100);
+ w.setPositionY(100);
+ addWindow(w);
+
+ Button b = new Button();
+ b.setId("testbutton");
+ addComponent(b);
+ b.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ for (Window window : getWindows()) {
+ window.setPositionX(100);
+ window.setPositionY(100);
+ }
+ }
+ });
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Tests that windows send their updated position "
+ + "to server-side after being moved by user";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 12885;
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/window/WindowMoveListenerTest.java b/uitest/src/com/vaadin/tests/components/window/WindowMoveListenerTest.java
new file mode 100644
index 0000000000..3ea3b719c0
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/window/WindowMoveListenerTest.java
@@ -0,0 +1,50 @@
+package com.vaadin.tests.components.window;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Point;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Action;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class WindowMoveListenerTest extends MultiBrowserTest {
+
+ @Test
+ public void testWindowRepositioning() throws Exception {
+ openTestURL();
+
+ WebElement window = getDriver().findElement(By.id("testwindow"));
+ WebElement button = getDriver().findElement(By.id("testbutton"));
+
+ // I'd loved to use the header, but that doesn't work. Footer works
+ // fine, though :)
+ WebElement windowHeader = getDriver().findElement(
+ By.className("v-window-footer"));
+
+ Point winPos = window.getLocation();
+
+ // move window
+ Action a = new Actions(driver).clickAndHold(windowHeader)
+ .moveByOffset(100, 100).release().build();
+ a.perform();
+
+ assertNotEquals("Window was not dragged correctly.", winPos.x,
+ window.getLocation().x);
+ assertNotEquals("Window was not dragged correctly.", winPos.y,
+ window.getLocation().y);
+
+ // re-set window
+ button.click();
+
+ assertEquals("Window was not re-positioned correctly.", winPos.x,
+ window.getLocation().x);
+ assertEquals("Window was not re-positioned correctly.", winPos.y,
+ window.getLocation().y);
+
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/dd/DnDOnSubtree.html b/uitest/src/com/vaadin/tests/dd/DnDOnSubtree.html
new file mode 100644
index 0000000000..844636cb02
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/dd/DnDOnSubtree.html
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <link rel="selenium.base" href="http://localhost:8888/"/>
+ <title>DnDOnSubtree</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+ <thead>
+ <tr>
+ <td rowspan="1" colspan="3">New Test</td>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.dd.DDTest8?restartApplication</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>drag</td>
+ <td>vaadin=runcomvaadintestsddDDTest8::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VTree[0]#n[3]</td>
+ <td>11,8</td>
+ </tr>
+ <!-- Drop on Bar5, which is a subtree target -->
+ <tr>
+ <td>drop</td>
+ <td>vaadin=runcomvaadintestsddDDTest8::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VTree[0]#n[6]</td>
+ <td>34,9</td>
+ </tr>
+ <tr>
+ <td>mouseClick</td>
+ <td>
+ vaadin=runcomvaadintestsddDDTest8::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VTree[0]#n[5]/expand
+ </td>
+ <td>10,8</td>
+ </tr>
+ <!-- Assert that the dragged & dropped node is now a child of Bar5 -->
+ <tr>
+ <td>assertElementPresent</td>
+ <td>
+ vaadin=runcomvaadintestsddDDTest8::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VTree[0]#n[5]/n[0]
+ </td>
+ <td></td>
+ </tr>
+ </tbody>
+</table>
+</body>
+</html>
diff --git a/uitest/src/com/vaadin/tests/integration/AbstractIntegrationTest.java b/uitest/src/com/vaadin/tests/integration/AbstractIntegrationTest.java
new file mode 100644
index 0000000000..ddaf84b3e1
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/integration/AbstractIntegrationTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.integration;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized.Parameters;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import com.vaadin.tests.tb3.PrivateTB3Configuration;
+
+/**
+ * Base class for integration tests. Integration tests use the
+ * {@literal deployment.url} parameter to determine the base deployment url
+ * (http://hostname:123)
+ *
+ * @author Vaadin Ltd
+ */
+@RunWith(IntegrationTestRunner.class)
+public abstract class AbstractIntegrationTest extends PrivateTB3Configuration {
+ @Override
+ protected String getBaseURL() {
+ String deploymentUrl = System.getProperty("deployment.url");
+ if (deploymentUrl == null || deploymentUrl.equals("")) {
+ throw new RuntimeException(
+ "Deployment url must be given as deployment.url");
+ }
+
+ return deploymentUrl;
+ }
+
+ @Parameters
+ public static Collection<DesiredCapabilities> getBrowsersForTest() {
+ return Collections.singleton(BrowserUtil
+ .firefox(MultiBrowserTest.TESTED_FIREFOX_VERSION));
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/integration/AbstractServletIntegrationTest.java b/uitest/src/com/vaadin/tests/integration/AbstractServletIntegrationTest.java
new file mode 100644
index 0000000000..f736a126a5
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/integration/AbstractServletIntegrationTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.integration;
+
+import java.io.IOException;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+/**
+ * Base class for servlet integration tests. Automatically prepends "/demo" to
+ * the deployment path
+ *
+ * @author Vaadin Ltd
+ */
+public abstract class AbstractServletIntegrationTest extends
+ AbstractIntegrationTest {
+
+ @Test
+ public void runTest() throws IOException, AssertionError {
+ openTestURL();
+ compareScreen("initial");
+
+ WebElement cell = vaadinElement(getTableCell(getTable(), 0, 1));
+ testBenchElement(cell).click(51, 13);
+
+ compareScreen("finland");
+ }
+
+ private String getTableCell(String tableLocator, int row, int col) {
+ return tableLocator
+ + "/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild["
+ + row + "]/domChild[" + col + "]/domChild[0]";
+ }
+
+ protected String getTable() {
+ return "/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.tb3.AbstractTB3Test#getDeploymentPath()
+ */
+ @Override
+ protected String getDeploymentPath() {
+ return "/demo" + super.getDeploymentPath();
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/integration/IntegrationTestRunner.java b/uitest/src/com/vaadin/tests/integration/IntegrationTestRunner.java
new file mode 100644
index 0000000000..f5042b54b6
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/integration/IntegrationTestRunner.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.integration;
+
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+
+import com.vaadin.tests.tb3.TB3Runner;
+
+/**
+ * JUnit runner for integration tests. Replaces the actual method name with the
+ * server-name property when generating the test name.
+ *
+ * @author Vaadin Ltd
+ */
+public class IntegrationTestRunner extends TB3Runner {
+
+ private Class<?> testClass;
+
+ public IntegrationTestRunner(Class<?> klass) throws InitializationError {
+ super(klass);
+ testClass = klass;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.junit.runners.BlockJUnit4ClassRunner#testName(org.junit.runners.model
+ * .FrameworkMethod)
+ */
+ @Override
+ protected String testName(FrameworkMethod method) {
+ if (AbstractIntegrationTest.class.isAssignableFrom(testClass)) {
+ return System.getProperty("server-name");
+ } else {
+ return super.testName(method);
+ }
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/integration/ServletIntegrationStreamingUI.java b/uitest/src/com/vaadin/tests/integration/ServletIntegrationStreamingUI.java
new file mode 100644
index 0000000000..0d92fb1bb8
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/integration/ServletIntegrationStreamingUI.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.integration;
+
+import com.vaadin.annotations.Push;
+import com.vaadin.shared.ui.ui.Transport;
+
+/**
+ * Server test which uses streaming
+ *
+ * @since 7.1
+ * @author Vaadin Ltd
+ */
+@Push(transport = Transport.STREAMING)
+public class ServletIntegrationStreamingUI extends ServletIntegrationUI {
+
+}
diff --git a/uitest/src/com/vaadin/tests/integration/ServletIntegrationStreamingUITest.java b/uitest/src/com/vaadin/tests/integration/ServletIntegrationStreamingUITest.java
new file mode 100644
index 0000000000..36a946bfa3
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/integration/ServletIntegrationStreamingUITest.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.integration;
+
+public class ServletIntegrationStreamingUITest extends
+ AbstractServletIntegrationTest {
+ // Uses the test method declared in the super class
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/integration/IntegrationTestUI.java b/uitest/src/com/vaadin/tests/integration/ServletIntegrationUI.java
index 0e6cb19b30..6aec2c8e2a 100755
--- a/uitest/src/com/vaadin/tests/integration/IntegrationTestUI.java
+++ b/uitest/src/com/vaadin/tests/integration/ServletIntegrationUI.java
@@ -11,7 +11,8 @@ import com.vaadin.ui.Table;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
-public class IntegrationTestUI extends UI {
+public class ServletIntegrationUI extends UI {
+
@Override
protected void init(VaadinRequest request) {
VerticalLayout layout = new VerticalLayout();
diff --git a/uitest/src/com/vaadin/tests/integration/ServletIntegrationUITest.java b/uitest/src/com/vaadin/tests/integration/ServletIntegrationUITest.java
new file mode 100644
index 0000000000..25ffdac4a2
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/integration/ServletIntegrationUITest.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.integration;
+
+public class ServletIntegrationUITest extends AbstractServletIntegrationTest {
+ // Uses the test method declared in the super class
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/integration/ServletIntegrationWebsocketUI.java b/uitest/src/com/vaadin/tests/integration/ServletIntegrationWebsocketUI.java
new file mode 100644
index 0000000000..d7c525f202
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/integration/ServletIntegrationWebsocketUI.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.integration;
+
+import com.vaadin.annotations.Push;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.ui.Transport;
+import com.vaadin.shared.ui.ui.UIState.PushConfigurationState;
+
+/**
+ * Server test which uses websockets
+ *
+ * @since 7.1
+ * @author Vaadin Ltd
+ */
+@Push(transport = Transport.WEBSOCKET)
+public class ServletIntegrationWebsocketUI extends ServletIntegrationUI {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.vaadin.tests.integration.IntegrationTestUI#init(com.vaadin.server
+ * .VaadinRequest)
+ */
+ @Override
+ protected void init(VaadinRequest request) {
+ super.init(request);
+ // Ensure no fallback is used
+ getPushConfiguration().setParameter(
+ PushConfigurationState.FALLBACK_TRANSPORT_PARAM, "none");
+
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/integration/ServletIntegrationWebsocketUITest.java b/uitest/src/com/vaadin/tests/integration/ServletIntegrationWebsocketUITest.java
new file mode 100644
index 0000000000..f2e7a6f2d0
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/integration/ServletIntegrationWebsocketUITest.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.integration;
+
+public class ServletIntegrationWebsocketUITest extends
+ AbstractServletIntegrationTest {
+ // Uses the test method declared in the super class
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayoutTests.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayoutTests.java
index 221680be11..f55867c464 100644
--- a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayoutTests.java
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayoutTests.java
@@ -124,6 +124,13 @@ public class GridLayoutTests extends AbstractLayoutTests {
final Button button5 = new Button("Test remove row 0");
final Button button6 = new Button("Test remove comp row3");
+ button1.setId("testButton1");
+ button2.setId("testButton2");
+ button3.setId("testButton3");
+ button4.setId("testButton4");
+ button5.setId("testButton5");
+ button6.setId("testButton6");
+
baseLayout.addComponent(button1);
baseLayout.addComponent(button2);
baseLayout.addComponent(button3);
@@ -223,6 +230,10 @@ public class GridLayoutTests extends AbstractLayoutTests {
final Button button4 = new Button("undefined size+add, table");
glo.replaceComponent(x22, x22 = getTestTable());
+ button1.setId("testButton1");
+ button2.setId("testButton2");
+ button3.setId("testButton3");
+ button4.setId("testButton4");
baseLayout.addComponent(button1);
baseLayout.addComponent(button2);
@@ -287,6 +298,11 @@ public class GridLayoutTests extends AbstractLayoutTests {
final Button button2 = new Button("set all cols expand 0.25");
final Button button3 = new Button("set row 0 expand 0.5");
final Button button4 = new Button("set row 3 expand 0.2");
+ button1.setId("testButton1");
+ button2.setId("testButton2");
+ button3.setId("testButton3");
+ button4.setId("testButton4");
+
glo.setHeight("400px");
glo.replaceComponent(x22, x22 = getTestTable());
@@ -396,6 +412,11 @@ public class GridLayoutTests extends AbstractLayoutTests {
final Button button3 = new Button("Set fixed width and height 75%");
final Button button4 = new Button("Set size full");
+ button1.setId("testButton1");
+ button2.setId("testButton2");
+ button3.setId("testButton3");
+ button4.setId("testButton4");
+
glo.replaceComponent(x22, x22 = getTestTable());
baseLayout.addComponent(button1);
@@ -467,6 +488,11 @@ public class GridLayoutTests extends AbstractLayoutTests {
final Button button3 = new Button("Set margin off");
final Button button4 = new Button("Set spacing off");
+ button1.setId("testButton1");
+ button2.setId("testButton2");
+ button3.setId("testButton3");
+ button4.setId("testButton4");
+
baseLayout.addComponent(button1);
baseLayout.addComponent(button2);
baseLayout.addComponent(button3);
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java
index 7a53a6583e..971205ccbb 100644
--- a/uitest/src/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java
@@ -123,7 +123,10 @@ public class HorizontalLayoutTests extends AbstractLayoutTests {
final Button replaceButton = new Button("Test replace");
final Button moveButton = new Button("Test move");
final Button removeButton = new Button("Test remove");
-
+ addButton.setId("testButton1");
+ replaceButton.setId("testButton2");
+ moveButton.setId("testButton3");
+ removeButton.setId("testButton4");
replaceButton.setEnabled(false);
moveButton.setEnabled(false);
removeButton.setEnabled(false);
@@ -193,6 +196,10 @@ public class HorizontalLayoutTests extends AbstractLayoutTests {
final Button smallerButton = new Button("200 px width");
final Button originalButton = new Button("undefined size+add");
+ biggerButton.setId("testButton1");
+ smallerButton.setId("testButton2");
+ originalButton.setId("testButton3");
+
baseLayout.addComponent(biggerButton);
baseLayout.addComponent(smallerButton);
baseLayout.addComponent(originalButton);
@@ -257,6 +264,11 @@ public class HorizontalLayoutTests extends AbstractLayoutTests {
final Button button3 = new Button("Set fixed width and height 75%");
final Button button4 = new Button("Set size full");
+ button1.setId("testButton1");
+ button2.setId("testButton2");
+ button3.setId("testButton3");
+ button4.setId("testButton4");
+
baseLayout.addComponent(button1);
baseLayout.addComponent(button2);
baseLayout.addComponent(button3);
@@ -332,6 +344,9 @@ public class HorizontalLayoutTests extends AbstractLayoutTests {
final Button button1 = new Button("Expand to 1/undefined");
final Button button2 = new Button("Expand to 0.5/0.5");
final Button button3 = new Button("Expand to 0.75/0.25");
+ button1.setId("testButton1");
+ button2.setId("testButton2");
+ button3.setId("testButton3");
baseLayout.addComponent(button1);
baseLayout.addComponent(button2);
@@ -438,6 +453,10 @@ public class HorizontalLayoutTests extends AbstractLayoutTests {
final Button button2 = new Button("Set spacing on");
final Button button3 = new Button("Set margin off");
final Button button4 = new Button("Set spacing off");
+ button1.setId("testButton1");
+ button2.setId("testButton2");
+ button3.setId("testButton3");
+ button4.setId("testButton4");
baseLayout.addComponent(button1);
baseLayout.addComponent(button2);
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.html b/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.html
deleted file mode 100644
index 8408aba9fd..0000000000
--- a/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.html
+++ /dev/null
@@ -1,896 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>LayoutTesterApplication</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">LayoutTesterApplication</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.layouts.layouttester.LayoutTesterApplication?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>1</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>2</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>3</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>4</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>5</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>6</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>7</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>8</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>9</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>10</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>11</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>12</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>13</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>14</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>15</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>16</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>17</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>18</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>19</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>20</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>21</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>22</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>23</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>24</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>25</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>26</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>27</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>28</td>
-</tr>
-<tr>
- <td>select</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VNativeSelect[0]/domChild[0]</td>
- <td>label=class com.vaadin.ui.HorizontalLayout</td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>29</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>30</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>31</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>32</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>33</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>34</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>35</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>36</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>37</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>38</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>39</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>40</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>41</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>42</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>43</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>44</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>45</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>46</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>47</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>48</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>49</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>50</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>51</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>52</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>53</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>54</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>55</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>56</td>
-</tr>
-<tr>
- <td>select</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VNativeSelect[0]/domChild[0]</td>
- <td>label=class com.vaadin.ui.GridLayout</td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>57</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>58</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>59</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>60</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>61</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>62</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>63</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>64</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>65</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>66</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>67</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>68</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>69</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>70</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>71</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>72</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>73</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>74</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>75</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[4]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>76</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>77</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>78</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>79</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>80</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>81</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>82</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>83</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>84</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>85</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>86</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>87</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutslayouttesterLayoutTesterApplication::/VVerticalLayout[0]/ChildComponentContainer[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>88</td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.java b/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.java
index 72863895a1..5b68e04144 100644
--- a/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.java
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.java
@@ -20,18 +20,20 @@ public class LayoutTesterApplication extends AbstractTestCase {
Button nextButton = new Button("Next");
private int layoutIndex = -1;
- private static final String[] layoutGetters = new String[] {
- "getCaptionsTests", "getIconsTests",
- "getRequiredErrorIndicatorsTests", "getAlignmentTests",
- "getExpandRatiosTests", "getMarginSpacingTests",
- "getComponentAddReplaceMoveTests", "getComponentSizingTests",
- "getLayoutSizingTests" };
+ static final String[] layoutGetters = new String[] { "getCaptionsTests",
+ "getIconsTests", "getRequiredErrorIndicatorsTests",
+ "getAlignmentTests", "getExpandRatiosTests",
+ "getMarginSpacingTests", "getComponentAddReplaceMoveTests",
+ "getComponentSizingTests", "getLayoutSizingTests" };
+ public static final String NEXT_BUTTON_ID = "nextButton";
+ private static final String LAYOUT_SELECT_ID = "layoutSelect";
private LegacyWindow mainWindow;
private NativeSelect layoutSelector;
@Override
public void init() {
+ nextButton.setId(NEXT_BUTTON_ID);
mainWindow = new LegacyWindow("LayoutTesterApplication");
setMainWindow(mainWindow);
nextLayout();
@@ -112,6 +114,7 @@ public class LayoutTesterApplication extends AbstractTestCase {
private NativeSelect getLayoutTypeSelect() {
if (layoutSelector == null) {
layoutSelector = new NativeSelect();
+ layoutSelector.setId(LAYOUT_SELECT_ID);
layoutSelector.addItem(VerticalLayout.class);
layoutSelector.addItem(HorizontalLayout.class);
layoutSelector.addItem(GridLayout.class);
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplicationTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplicationTest.java
new file mode 100644
index 0000000000..33197613dc
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplicationTest.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.Select;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.VerticalLayout;
+
+public class LayoutTesterApplicationTest extends MultiBrowserTest {
+ Map<String, Integer> numberOfSubTests = new HashMap<String, Integer>();
+ private Set<String> tableOrIconsTests = new HashSet<String>();
+
+ {
+ numberOfSubTests.put("getExpandRatiosTests", 3);
+ numberOfSubTests.put("getLayoutSizingTests", 4);
+ numberOfSubTests.put("getComponentAddReplaceMoveTests", 4);
+ numberOfSubTests.put("getMarginSpacingTests", 4);
+ numberOfSubTests.put("getComponentSizingTests", 3);
+
+ tableOrIconsTests.add("getComponentSizingTests");
+ tableOrIconsTests.add("getExpandRatiosTests");
+ tableOrIconsTests.add("getLayoutSizingTests");
+ tableOrIconsTests.add("getMarginSpacingTests");
+ tableOrIconsTests.add("getIconsTests");
+
+ }
+
+ @Test
+ public void verticalLayout() throws Exception {
+ openTestURL();
+ runTest(VerticalLayout.class);
+ }
+
+ @Test
+ public void horizontalLayout() throws Exception {
+ openTestURL();
+ runTest(HorizontalLayout.class);
+ }
+
+ @Test
+ public void gridLayout() throws Exception {
+ numberOfSubTests.put("getComponentAddReplaceMoveTests", 6);
+ numberOfSubTests.put("getComponentSizingTests", 4);
+ numberOfSubTests.put("getExpandRatiosTests", 4);
+
+ openTestURL();
+ runTest(GridLayout.class);
+ }
+
+ private void runTest(Class<?> layoutClass) throws Exception {
+ new Select(vaadinElementById("layoutSelect").findElement(
+ By.xpath("select")))
+ .selectByVisibleText(layoutClass.toString());
+ focusElementWithId("nextButton");
+
+ for (String subTest : LayoutTesterApplication.layoutGetters) {
+ compareScreen(subTest);
+ Integer subTests = numberOfSubTests.get(subTest);
+ if (subTests != null) {
+ for (int i = 1; i <= subTests; i++) {
+ clickAndCompareScreen(subTest, "testButton" + i);
+ }
+ }
+ getNextButton().click();
+ }
+
+ }
+
+ /**
+ * @param elementId
+ * the id of the element to focus
+ */
+ private void focusElementWithId(String elementId) {
+ // This should really be in TestBench
+ ((JavascriptExecutor) getDriver())
+ .executeScript("document.getElementById('" + elementId
+ + "').focus()");
+ }
+
+ /**
+ * Clicks the button with the given id and compares the result to a
+ * screenshot named 'screenshotPrefix'-buttonCaption.
+ *
+ * @param screenshotPrefix
+ * @param buttonId
+ * @throws Exception
+ */
+ private void clickAndCompareScreen(String screenshotPrefix, String buttonId)
+ throws Exception {
+ WebElement button = vaadinElementById(buttonId);
+ button.click();
+ if (needsDelayToStabilize(screenshotPrefix)) {
+ // Table does some extra layout phase and TestBench does not always
+ // take this into account, grabbing screenshots before the layout
+ // phase is done (see #12866).
+ sleep(200);
+ }
+ compareScreen(screenshotPrefix + "-" + sanitize(button.getText()));
+ }
+
+ private boolean needsDelayToStabilize(String screenshotPrefix) {
+ return tableOrIconsTests.contains(screenshotPrefix);
+ }
+
+ private String sanitize(String text) {
+ return text.replace("%", "pct").replaceAll("[^a-zA-Z0-9]", "-");
+ }
+
+ private WebElement getNextButton() {
+ return vaadinElementById(LayoutTesterApplication.NEXT_BUTTON_ID);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java
index 7764589ff7..04cee2d68d 100644
--- a/uitest/src/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java
@@ -127,6 +127,10 @@ public class VerticalLayoutTests extends AbstractLayoutTests {
final Button replaceButton = new Button("Test replace");
final Button moveButton = new Button("Test move");
final Button removeButton = new Button("Test remove");
+ addButton.setId("testButton1");
+ replaceButton.setId("testButton2");
+ moveButton.setId("testButton3");
+ removeButton.setId("testButton4");
replaceButton.setEnabled(false);
moveButton.setEnabled(false);
@@ -196,7 +200,9 @@ public class VerticalLayoutTests extends AbstractLayoutTests {
final Button biggerButton = new Button("full size");
final Button smallerButton = new Button("200 px width");
final Button originalButton = new Button("undefined size and add");
-
+ biggerButton.setId("testButton1");
+ smallerButton.setId("testButton2");
+ originalButton.setId("testButton3");
vlo.addComponent(biggerButton);
vlo.addComponent(smallerButton);
vlo.addComponent(originalButton);
@@ -265,6 +271,11 @@ public class VerticalLayoutTests extends AbstractLayoutTests {
final Button button3 = new Button("Set fixed width and height 75%");
final Button button4 = new Button("Set size full");
+ button1.setId("testButton1");
+ button2.setId("testButton2");
+ button3.setId("testButton3");
+ button4.setId("testButton4");
+
vlo.addComponent(button1);
vlo.addComponent(button2);
vlo.addComponent(button3);
@@ -344,8 +355,11 @@ public class VerticalLayoutTests extends AbstractLayoutTests {
c2.setSizeFull();
final Button button1 = new Button("Expand to 1/undefined");
+ button1.setId("testButton1");
final Button button2 = new Button("Expand to 0.5/0.5");
+ button2.setId("testButton2");
final Button button3 = new Button("Expand to 0.75/0.25");
+ button3.setId("testButton3");
vlo.addComponent(button1);
vlo.addComponent(button2);
@@ -460,6 +474,10 @@ public class VerticalLayoutTests extends AbstractLayoutTests {
final Button button2 = new Button("Set spacing on");
final Button button3 = new Button("Set margin off");
final Button button4 = new Button("Set spacing off");
+ button1.setId("testButton1");
+ button2.setId("testButton2");
+ button3.setId("testButton3");
+ button4.setId("testButton4");
vlo.addComponent(button1);
vlo.addComponent(button2);
diff --git a/uitest/src/com/vaadin/tests/push/BarInUIDL.html b/uitest/src/com/vaadin/tests/push/BarInUIDL.html
deleted file mode 100644
index 66f03158b6..0000000000
--- a/uitest/src/com/vaadin/tests/push/BarInUIDL.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://localhost:8888/" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run-push/com.vaadin.tests.push.BarInUIDL?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBarInUIDL::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBarInUIDL::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VLabel[0]</td>
- <td>Thank you for clicking | bar</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBarInUIDL::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VButton[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBarInUIDL::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VLabel[0]</td>
- <td>Thank you for clicking | bar</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/push/BarInUIDL.java b/uitest/src/com/vaadin/tests/push/BarInUIDL.java
index 7e414cc89d..bc05f7c306 100644
--- a/uitest/src/com/vaadin/tests/push/BarInUIDL.java
+++ b/uitest/src/com/vaadin/tests/push/BarInUIDL.java
@@ -16,12 +16,15 @@
package com.vaadin.tests.push;
+import com.vaadin.annotations.Push;
import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.ui.Transport;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Label;
+@Push(transport = Transport.STREAMING)
public class BarInUIDL extends AbstractTestUI {
/*
diff --git a/uitest/src/com/vaadin/tests/push/BarInUIDLTest.java b/uitest/src/com/vaadin/tests/push/BarInUIDLTest.java
new file mode 100644
index 0000000000..840d653e1e
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/BarInUIDLTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class BarInUIDLTest extends MultiBrowserTest {
+ @Test
+ public void sendBarInUIDL() {
+ openTestURL();
+ getButton().click();
+ Assert.assertEquals(
+ "Thank you for clicking | bar",
+ vaadinElement(
+ "/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VLabel[0]")
+ .getText());
+ getButton().click();
+ Assert.assertEquals(
+ "Thank you for clicking | bar",
+ vaadinElement(
+ "/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VLabel[0]")
+ .getText());
+ }
+
+ private WebElement getButton() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VButton[0]");
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/push/BasicPush.html b/uitest/src/com/vaadin/tests/push/BasicPush.html
deleted file mode 100644
index 173ec90674..0000000000
--- a/uitest/src/com/vaadin/tests/push/BasicPush.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://localhost:8888/" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run-push/com.vaadin.tests.push.BasicPush?restartApplication&amp;debug</td>
- <td></td>
-</tr>
-<!--Test client initiated push -->
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VLabel[0]</td>
- <td>0</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VLabel[0]</td>
- <td>1</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VLabel[0]</td>
- <td>4</td>
-</tr>
-<!--Test server initiated push-->
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[4]/VLabel[0]</td>
- <td>0</td>
-</tr>
-<tr>
- <td>pause</td>
- <td>3000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[4]/VLabel[0]</td>
- <td>1</td>
-</tr>
-<tr>
- <td>pause</td>
- <td>3000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[4]/VLabel[0]</td>
- <td>2</td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/push/BasicPush.java b/uitest/src/com/vaadin/tests/push/BasicPush.java
index b80d287a1d..8e8f418c5f 100644
--- a/uitest/src/com/vaadin/tests/push/BasicPush.java
+++ b/uitest/src/com/vaadin/tests/push/BasicPush.java
@@ -1,40 +1,52 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
package com.vaadin.tests.push;
-import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
-import com.vaadin.annotations.Widgetset;
+import com.vaadin.annotations.Push;
import com.vaadin.data.util.ObjectProperty;
import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.tests.components.AbstractTestUI;
-import com.vaadin.tests.widgetset.TestingWidgetSet;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Label;
-@Widgetset(TestingWidgetSet.NAME)
+@Push
public class BasicPush extends AbstractTestUI {
+ public static final String CLIENT_COUNTER_ID = "clientCounter";
+
+ public static final String STOP_TIMER_ID = "stopTimer";
+
+ public static final String START_TIMER_ID = "startTimer";
+
+ public static final String SERVER_COUNTER_ID = "serverCounter";
+
+ public static final String INCREMENT_BUTTON_ID = "incrementCounter";
+
private ObjectProperty<Integer> counter = new ObjectProperty<Integer>(0);
private ObjectProperty<Integer> counter2 = new ObjectProperty<Integer>(0);
private final Timer timer = new Timer(true);
- private final TimerTask task = new TimerTask() {
-
- @Override
- public void run() {
- access(new Runnable() {
- @Override
- public void run() {
- counter2.setValue(counter2.getValue() + 1);
- }
- });
- }
- };
+ private TimerTask task;
@Override
protected void setup(VaadinRequest request) {
@@ -46,15 +58,19 @@ public class BasicPush extends AbstractTestUI {
*/
Label lbl = new Label(counter);
lbl.setCaption("Client counter (click 'increment' to update):");
+ lbl.setId(CLIENT_COUNTER_ID);
addComponent(lbl);
- addComponent(new Button("Increment", new Button.ClickListener() {
+ Button incrementButton = new Button("Increment",
+ new Button.ClickListener() {
- @Override
- public void buttonClick(ClickEvent event) {
- counter.setValue(counter.getValue() + 1);
- }
- }));
+ @Override
+ public void buttonClick(ClickEvent event) {
+ counter.setValue(counter.getValue() + 1);
+ }
+ });
+ incrementButton.setId(INCREMENT_BUTTON_ID);
+ addComponent(incrementButton);
spacer();
@@ -63,15 +79,47 @@ public class BasicPush extends AbstractTestUI {
*/
lbl = new Label(counter2);
lbl.setCaption("Server counter (updates each 3s by server thread) :");
+ lbl.setId(SERVER_COUNTER_ID);
addComponent(lbl);
- addComponent(new Button("Reset", new Button.ClickListener() {
-
+ Button startTimer = new Button("Start timer",
+ new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ counter2.setValue(0);
+ if (task != null) {
+ task.cancel();
+ }
+ task = new TimerTask() {
+
+ @Override
+ public void run() {
+ access(new Runnable() {
+ @Override
+ public void run() {
+ counter2.setValue(counter2.getValue() + 1);
+ }
+ });
+ }
+ };
+ timer.scheduleAtFixedRate(task, 3000, 3000);
+ }
+ });
+ startTimer.setId(START_TIMER_ID);
+ addComponent(startTimer);
+
+ Button stopTimer = new Button("Stop timer", new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
- counter2.setValue(0);
+ if (task != null) {
+ task.cancel();
+ task = null;
+ }
}
- }));
+ });
+ stopTimer.setId(STOP_TIMER_ID);
+ addComponent(stopTimer);
}
@Override
@@ -94,7 +142,6 @@ public class BasicPush extends AbstractTestUI {
@Override
public void attach() {
super.attach();
- timer.scheduleAtFixedRate(task, new Date(), 3000);
}
@Override
diff --git a/uitest/src/com/vaadin/tests/push/BasicPushStreaming.java b/uitest/src/com/vaadin/tests/push/BasicPushStreaming.java
index 37a8afd819..f9dc78dd43 100644
--- a/uitest/src/com/vaadin/tests/push/BasicPushStreaming.java
+++ b/uitest/src/com/vaadin/tests/push/BasicPushStreaming.java
@@ -1,12 +1,31 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
package com.vaadin.tests.push;
import com.vaadin.annotations.Push;
+import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.ui.Transport;
@Push(transport = Transport.STREAMING)
public class BasicPushStreaming extends BasicPush {
@Override
- protected void setup(com.vaadin.server.VaadinRequest request) {
- addComponent(new PushConfigurator(this));
+ public void init(VaadinRequest request) {
+ super.init(request);
+ // Don't use fallback so we can easier detect if streaming fails
+ getPushConfiguration().setFallbackTransport(Transport.STREAMING);
+
}
}
diff --git a/uitest/src/com/vaadin/tests/push/BasicPushStreamingTest.java b/uitest/src/com/vaadin/tests/push/BasicPushStreamingTest.java
new file mode 100644
index 0000000000..67730f72c8
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/BasicPushStreamingTest.java
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+public class BasicPushStreamingTest extends BasicPushTest {
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/push/BasicPushTest.java b/uitest/src/com/vaadin/tests/push/BasicPushTest.java
new file mode 100644
index 0000000000..ef40ae09dc
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/BasicPushTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.AbstractTB3Test;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public abstract class BasicPushTest extends MultiBrowserTest {
+
+ @Test
+ public void testPush() {
+ openTestURL();
+
+ // Test client initiated push
+ Assert.assertEquals(0, getClientCounter());
+ getIncrementButton().click();
+ Assert.assertEquals("Client counter not incremented by button click",
+ 1, getClientCounter());
+ getIncrementButton().click();
+ getIncrementButton().click();
+ getIncrementButton().click();
+ Assert.assertEquals("Four clicks should have incremented counter to 4",
+ 4, getClientCounter());
+
+ // Test server initiated push
+ getServerCounterStartButton().click();
+ try {
+ Assert.assertEquals(0, getServerCounter());
+ sleep(3000);
+ int serverCounter = getServerCounter();
+ if (serverCounter < 1) {
+ // No push has happened
+ Assert.fail("No push has occured within 3s");
+ }
+ sleep(3000);
+ if (getServerCounter() <= serverCounter) {
+ // No push has happened
+ Assert.fail("Only one push took place within 6s");
+
+ }
+ } finally {
+ // Avoid triggering push assertions
+ getServerCounterStopButton().click();
+ }
+ }
+
+ private int getServerCounter() {
+ return getServerCounter(this);
+ }
+
+ private int getClientCounter() {
+ return getClientCounter(this);
+ }
+
+ public static int getClientCounter(AbstractTB3Test t) {
+ WebElement clientCounterElem = t
+ .vaadinElementById(BasicPush.CLIENT_COUNTER_ID);
+ return Integer.parseInt(clientCounterElem.getText());
+ }
+
+ private WebElement getIncrementButton() {
+ return getIncrementButton(this);
+ }
+
+ private WebElement getServerCounterStopButton() {
+ return getServerCounterStopButton(this);
+ }
+
+ private WebElement getServerCounterStartButton() {
+ return getServerCounterStartButton(this);
+ }
+
+ public static int getServerCounter(AbstractTB3Test t) {
+ WebElement serverCounterElem = t
+ .vaadinElementById(BasicPush.SERVER_COUNTER_ID);
+ return Integer.parseInt(serverCounterElem.getText());
+ }
+
+ public static WebElement getServerCounterStartButton(AbstractTB3Test t) {
+ return t.vaadinElementById(BasicPush.START_TIMER_ID);
+ }
+
+ public static WebElement getServerCounterStopButton(AbstractTB3Test t) {
+ return t.vaadinElementById(BasicPush.STOP_TIMER_ID);
+ }
+
+ public static WebElement getIncrementButton(AbstractTB3Test t) {
+ return t.vaadinElementById(BasicPush.INCREMENT_BUTTON_ID);
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/push/BasicPushWebsocket.java b/uitest/src/com/vaadin/tests/push/BasicPushWebsocket.java
index 6fc27e8974..465caf0165 100644
--- a/uitest/src/com/vaadin/tests/push/BasicPushWebsocket.java
+++ b/uitest/src/com/vaadin/tests/push/BasicPushWebsocket.java
@@ -1,8 +1,34 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
package com.vaadin.tests.push;
import com.vaadin.annotations.Push;
+import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.ui.Transport;
+import com.vaadin.shared.ui.ui.UIState.PushConfigurationState;
@Push(transport = Transport.WEBSOCKET)
public class BasicPushWebsocket extends BasicPush {
+
+ @Override
+ public void init(VaadinRequest request) {
+ super.init(request);
+ // Don't use fallback so we can easier detect if websocket fails
+ getPushConfiguration().setParameter(
+ PushConfigurationState.FALLBACK_TRANSPORT_PARAM, "none");
+ }
+
}
diff --git a/uitest/src/com/vaadin/tests/push/BasicPushWebsocketTest.java b/uitest/src/com/vaadin/tests/push/BasicPushWebsocketTest.java
new file mode 100644
index 0000000000..dd0a147d99
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/BasicPushWebsocketTest.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import java.util.List;
+
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.tests.tb3.WebsocketTest;
+
+public class BasicPushWebsocketTest extends BasicPushTest {
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ return WebsocketTest.getWebsocketBrowsers();
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/push/EnableDisablePush.html b/uitest/src/com/vaadin/tests/push/EnableDisablePush.html
deleted file mode 100644
index 87dfa8428f..0000000000
--- a/uitest/src/com/vaadin/tests/push/EnableDisablePush.html
+++ /dev/null
@@ -1,97 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>EnableDisablePush</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">EnableDisablePush</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/EnableDisablePush?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runEnableDisablePush::PID_SLog_row_0</td>
- <td>1. Push enabled</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runEnableDisablePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runEnableDisablePush::PID_SLog_row_0</td>
- <td>3. Push disabled</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runEnableDisablePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runEnableDisablePush::PID_SLog_row_0</td>
- <td>5. Poll enabled</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runEnableDisablePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runEnableDisablePush::PID_SLog_row_0</td>
- <td>7. Push enabled</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runEnableDisablePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runEnableDisablePush::PID_SLog_row_0</td>
- <td>9. Poll disabled</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runEnableDisablePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[4]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runEnableDisablePush::PID_SLog_row_0</td>
- <td>11. Push disabled, polling enabled</td>
-</tr>
-<tr>
- <td>pause</td>
- <td>3500</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runEnableDisablePush::PID_SLog_row_0</td>
- <td>16. Polling disabled, push enabled</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runEnableDisablePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runEnableDisablePush::PID_SLog_row_0</td>
- <td>18. Push disabled</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/push/EnableDisablePush.java b/uitest/src/com/vaadin/tests/push/EnableDisablePush.java
index 1911c66c2d..ac37e75fea 100644
--- a/uitest/src/com/vaadin/tests/push/EnableDisablePush.java
+++ b/uitest/src/com/vaadin/tests/push/EnableDisablePush.java
@@ -27,7 +27,7 @@ public class EnableDisablePush extends AbstractTestUI {
try {
while (true) {
- TimeUnit.MILLISECONDS.sleep(1000);
+ TimeUnit.MILLISECONDS.sleep(500);
access(new Runnable() {
@Override
@@ -42,6 +42,9 @@ public class EnableDisablePush extends AbstractTestUI {
}
}
});
+ if (c == 3) {
+ return;
+ }
}
} catch (InterruptedException e) {
} catch (UIDetachedException e) {
diff --git a/uitest/src/com/vaadin/tests/push/EnableDisablePushTest.java b/uitest/src/com/vaadin/tests/push/EnableDisablePushTest.java
new file mode 100644
index 0000000000..275b6d5b53
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/EnableDisablePushTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class EnableDisablePushTest extends MultiBrowserTest {
+ @Test
+ public void testEnablePushWhenUsingPolling() throws Exception {
+ openTestURL();
+
+ assertEquals("1. Push enabled", getLogRow(0));
+
+ getDisablePushButton().click();
+ assertEquals("3. Push disabled", getLogRow(0));
+
+ getEnablePollButton().click();
+ assertEquals("5. Poll enabled", getLogRow(0));
+
+ getEnablePushButton().click();
+ assertEquals("7. Push enabled", getLogRow(0));
+
+ getDisablePollButton().click();
+ assertEquals("9. Poll disabled", getLogRow(0));
+
+ getDisablePushButtonAndReenableFromBackground().click();
+ Thread.sleep(2500);
+ assertEquals("16. Polling disabled, push enabled", getLogRow(0));
+
+ getDisablePushButton().click();
+ assertEquals("18. Push disabled", getLogRow(0));
+ }
+
+ private WebElement getDisablePushButton() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VButton[0]");
+ }
+
+ private WebElement getEnablePushButton() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VButton[0]");
+ }
+
+ private WebElement getDisablePollButton() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]");
+ }
+
+ private WebElement getEnablePollButton() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[3]/VButton[0]");
+ }
+
+ private WebElement getDisablePushButtonAndReenableFromBackground() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[4]/VButton[0]");
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/push/PushConfiguration.html b/uitest/src/com/vaadin/tests/push/PushConfiguration.html
deleted file mode 100644
index c3786b1cc1..0000000000
--- a/uitest/src/com/vaadin/tests/push/PushConfiguration.html
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://localhost:8888/" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<!--Websocket-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.push.PushConfigurationTest?debug&amp;restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>assertNotText</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VLabel[0]</td>
- <td>4</td>
-</tr>
-<tr>
- <td>select</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[1]/VNativeSelect[0]/domChild[0]</td>
- <td>label=WEBSOCKET</td>
-</tr>
-<tr>
- <td>assertNotText</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VLabel[0]</td>
- <td>4</td>
-</tr>
-<tr>
- <td>select</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VNativeSelect[0]/domChild[0]</td>
- <td>label=AUTOMATIC</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[5]/VLabel[0]/domChild[0]</td>
- <td>*fallbackTransport: streaming*transport: websocket*</td>
-</tr>
-<tr>
- <td>assertNotText</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VLabel[0]</td>
- <td>4</td>
-</tr>
-<tr>
- <td>waitForText</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VLabel[0]</td>
- <td>4</td>
-</tr>
-<!--Use debug console to verify we used the correct transport type-->
-<tr>
- <td>assertTextPresent</td>
- <td>Push connection established using websocket</td>
- <td></td>
-</tr>
-<tr>
- <td>assertTextNotPresent</td>
- <td>Push connection established using streaming</td>
- <td>Push connection established using streaming</td>
-</tr>
-<tr>
- <td>select</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VNativeSelect[0]/domChild[0]</td>
- <td>label=DISABLED</td>
-</tr>
-<!--Streaming-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.push.PushConfigurationTest?debug&amp;restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>assertNotText</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VLabel[0]</td>
- <td>4</td>
-</tr>
-<tr>
- <td>select</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[1]/VNativeSelect[0]/domChild[0]</td>
- <td>label=STREAMING</td>
-</tr>
-<tr>
- <td>assertNotText</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VLabel[0]</td>
- <td>4</td>
-</tr>
-<tr>
- <td>select</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VNativeSelect[0]/domChild[0]</td>
- <td>label=AUTOMATIC</td>
-</tr>
-<tr>
- <td>assertNotText</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VLabel[0]</td>
- <td>4</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[5]/VLabel[0]/domChild[0]</td>
- <td>*fallbackTransport: streaming*transport: streaming*</td>
-</tr>
-<tr>
- <td>waitForText</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VLabel[0]</td>
- <td>4</td>
-</tr>
-<!--Use debug console to verify we used the correct transport type-->
-<tr>
- <td>assertTextNotPresent</td>
- <td>Push connection established using websocket</td>
- <td></td>
-</tr>
-<tr>
- <td>assertTextPresent</td>
- <td>Push connection established using streaming</td>
- <td></td>
-</tr>
-<tr>
- <td>select</td>
- <td>vaadin=runcomvaadintestspushPushConfigurationTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VNativeSelect[0]/domChild[0]</td>
- <td>label=DISABLED</td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/push/PushConfiguration.java b/uitest/src/com/vaadin/tests/push/PushConfiguration.java
new file mode 100644
index 0000000000..a7ba4e43ba
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushConfiguration.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import com.vaadin.data.util.ObjectProperty;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Label;
+
+public class PushConfiguration extends AbstractTestUI {
+
+ private ObjectProperty<Integer> counter = new ObjectProperty<Integer>(0);
+
+ private ObjectProperty<Integer> counter2 = new ObjectProperty<Integer>(0);
+
+ private final Timer timer = new Timer(true);
+
+ private final TimerTask task = new TimerTask() {
+
+ @Override
+ public void run() {
+ access(new Runnable() {
+ @Override
+ public void run() {
+ counter2.setValue(counter2.getValue() + 1);
+ }
+ });
+ }
+ };
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ addComponent(new PushConfigurator(this));
+ spacer();
+
+ /*
+ * Client initiated push.
+ */
+ Label lbl = new Label(counter);
+ lbl.setCaption("Client counter (click 'increment' to update):");
+ addComponent(lbl);
+
+ addComponent(new Button("Increment", new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ counter.setValue(counter.getValue() + 1);
+ }
+ }));
+
+ spacer();
+
+ /*
+ * Server initiated push.
+ */
+ lbl = new Label(counter2);
+ lbl.setCaption("Server counter (updates each 1s by server thread) :");
+ addComponent(lbl);
+
+ addComponent(new Button("Reset", new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ counter2.setValue(0);
+ }
+ }));
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "This test tests the very basic operations of push. "
+ + "It tests that client initiated changes are "
+ + "recieved back to the client as well as server "
+ + "initiated changes are correctly updated to the client.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 11494;
+ }
+
+ private void spacer() {
+ addComponent(new Label("<hr/>", ContentMode.HTML));
+ }
+
+ @Override
+ public void attach() {
+ super.attach();
+ timer.scheduleAtFixedRate(task, new Date(), 1000);
+ }
+
+ @Override
+ public void detach() {
+ super.detach();
+ timer.cancel();
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushConfigurationTest.java b/uitest/src/com/vaadin/tests/push/PushConfigurationTest.java
index b57e9732cc..1f8c4c0e38 100644
--- a/uitest/src/com/vaadin/tests/push/PushConfigurationTest.java
+++ b/uitest/src/com/vaadin/tests/push/PushConfigurationTest.java
@@ -1,102 +1,111 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
package com.vaadin.tests.push;
-import java.util.Date;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import com.vaadin.data.util.ObjectProperty;
-import com.vaadin.server.VaadinRequest;
-import com.vaadin.shared.ui.label.ContentMode;
-import com.vaadin.tests.components.AbstractTestUI;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Label;
-
-public class PushConfigurationTest extends AbstractTestUI {
-
- private ObjectProperty<Integer> counter = new ObjectProperty<Integer>(0);
-
- private ObjectProperty<Integer> counter2 = new ObjectProperty<Integer>(0);
-
- private final Timer timer = new Timer(true);
-
- private final TimerTask task = new TimerTask() {
-
- @Override
- public void run() {
- access(new Runnable() {
- @Override
- public void run() {
- counter2.setValue(counter2.getValue() + 1);
- }
- });
- }
- };
-
- @Override
- protected void setup(VaadinRequest request) {
- addComponent(new PushConfigurator(this));
- spacer();
-
- /*
- * Client initiated push.
- */
- Label lbl = new Label(counter);
- lbl.setCaption("Client counter (click 'increment' to update):");
- addComponent(lbl);
-
- addComponent(new Button("Increment", new Button.ClickListener() {
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+import org.openqa.selenium.support.ui.Select;
+
+import com.vaadin.tests.tb3.WebsocketTest;
+
+public class PushConfigurationTest extends WebsocketTest {
+
+ @Test
+ public void testWebsocketAndStreaming() {
+ setDebug(true);
+ openTestURL();
+ // Websocket
+ int counter = getServerCounter();
+ assertGreaterOrEqual("Counter should be >= 1. Was: " + counter,
+ counter, 1);
+ new Select(getTransportSelect()).selectByVisibleText("WEBSOCKET");
+ new Select(getPushModeSelect()).selectByVisibleText("AUTOMATIC");
+ Assert.assertTrue(vaadinElement(
+ "/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[5]/VLabel[0]/domChild[0]")
+ .getText()
+ .matches(
+ "^[\\s\\S]*fallbackTransport: streaming[\\s\\S]*transport: websocket[\\s\\S]*$"));
+ counter = getServerCounter();
+ final int waitCounter = counter + 2;
+ waitUntil(new ExpectedCondition<Boolean>() {
@Override
- public void buttonClick(ClickEvent event) {
- counter.setValue(counter.getValue() + 1);
+ public Boolean apply(WebDriver input) {
+ return (getServerCounter() >= waitCounter);
}
- }));
-
- spacer();
-
- /*
- * Server initiated push.
- */
- lbl = new Label(counter2);
- lbl.setCaption("Server counter (updates each 1s by server thread) :");
- addComponent(lbl);
-
- addComponent(new Button("Reset", new Button.ClickListener() {
-
- @Override
- public void buttonClick(ClickEvent event) {
- counter2.setValue(0);
+ });
+
+ // Use debug console to verify we used the correct transport type
+ Assert.assertTrue(driver.getPageSource().contains(
+ "Push connection established using websocket"));
+ Assert.assertFalse(driver.getPageSource().contains(
+ "Push connection established using streaming"));
+
+ new Select(getPushModeSelect()).selectByVisibleText("DISABLED");
+
+ // Streaming
+ driver.get(getTestUrl());
+ Assert.assertEquals(1, getServerCounter());
+
+ new Select(getTransportSelect()).selectByVisibleText("STREAMING");
+ new Select(getPushModeSelect()).selectByVisibleText("AUTOMATIC");
+ Assert.assertTrue(vaadinElement(
+ "/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[5]/VLabel[0]/domChild[0]")
+ .getText()
+ .matches(
+ "^[\\s\\S]*fallbackTransport: streaming[\\s\\S]*transport: streaming[\\s\\S]*$"));
+
+ counter = getServerCounter();
+ for (int second = 0;; second++) {
+ if (second >= 5) {
+ Assert.fail("timeout");
}
- }));
- }
+ if (getServerCounter() >= (counter + 2)) {
+ break;
+ }
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ }
+ }
+
+ // Use debug console to verify we used the correct transport type
+ Assert.assertFalse(driver.getPageSource().contains(
+ "Push connection established using websocket"));
+ Assert.assertTrue(driver.getPageSource().contains(
+ "Push connection established using streaming"));
- @Override
- protected String getTestDescription() {
- return "This test tests the very basic operations of push. "
- + "It tests that client initiated changes are "
- + "recieved back to the client as well as server "
- + "initiated changes are correctly updated to the client.";
}
- @Override
- protected Integer getTicketNumber() {
- return 11494;
+ private WebElement getPushModeSelect() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VNativeSelect[0]/domChild[0]");
}
- private void spacer() {
- addComponent(new Label("<hr/>", ContentMode.HTML));
+ private WebElement getTransportSelect() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[0]/VVerticalLayout[0]/Slot[1]/VNativeSelect[0]/domChild[0]");
}
- @Override
- public void attach() {
- super.attach();
- timer.scheduleAtFixedRate(task, new Date(), 1000);
+ private int getServerCounter() {
+ return Integer.parseInt(getServerCounterElement().getText());
}
- @Override
- public void detach() {
- super.detach();
- timer.cancel();
+ private WebElement getServerCounterElement() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VLabel[0]");
}
-}
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/push/PushErrorHandling.java b/uitest/src/com/vaadin/tests/push/PushErrorHandling.java
new file mode 100644
index 0000000000..a1182c0daf
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushErrorHandling.java
@@ -0,0 +1,95 @@
+package com.vaadin.tests.push;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import com.vaadin.data.util.AbstractInMemoryContainer;
+import com.vaadin.data.util.BeanContainer;
+import com.vaadin.event.ItemClickEvent;
+import com.vaadin.event.ItemClickEvent.ItemClickListener;
+import com.vaadin.server.ErrorHandler;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.server.VaadinSession;
+import com.vaadin.shared.communication.PushMode;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Table;
+
+public class PushErrorHandling extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ getPushConfiguration().setPushMode(PushMode.AUTOMATIC);
+
+ VaadinSession.getCurrent().setErrorHandler(new ErrorHandler() {
+
+ @Override
+ public void error(com.vaadin.server.ErrorEvent event) {
+ addComponent(new Label("An error! "
+ + event.getThrowable().getMessage()));
+ System.err.println("An error! "
+ + event.getThrowable().getMessage());
+ }
+ });
+
+ final Button button = new Button("Click for NPE!",
+ new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ ((String) null).length(); // Null-pointer exception
+ }
+ });
+ button.setId("npeButton");
+ addComponent(button);
+
+ final Table view = new Table("testtable");
+ view.setId("testtable");
+ view.setSelectable(true);
+ view.setMultiSelect(false);
+ view.setImmediate(true);
+ view.setSizeFull();
+
+ view.addItemClickListener(new ItemClickListener() {
+
+ @Override
+ public void itemClick(ItemClickEvent event) {
+ BeanContainer<String, AbstractInMemoryContainer> metaContainer = new BeanContainer<String, AbstractInMemoryContainer>(
+ AbstractInMemoryContainer.class) {
+ @Override
+ public Collection<String> getContainerPropertyIds() {
+ List<String> cpropIds = new ArrayList<String>(super
+ .getContainerPropertyIds());
+ cpropIds.add("testid");
+ return cpropIds;
+ }
+
+ @Override
+ public Class<?> getType(Object propertyId) {
+ ((Object) null).hashCode();
+ return super.getType(propertyId);
+ }
+ };
+ view.setContainerDataSource(metaContainer);
+
+ }
+ });
+ view.addContainerProperty("Column", String.class, "Click for NPE");
+ view.addItem(new Object());
+
+ addComponent(view);
+
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Error handling should still work w/ push enabled. (Button can be handled properly, table causes internal error)";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 11882;
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushErrorHandlingTest.java b/uitest/src/com/vaadin/tests/push/PushErrorHandlingTest.java
new file mode 100644
index 0000000000..a4b94b0573
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushErrorHandlingTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class PushErrorHandlingTest extends MultiBrowserTest {
+
+ @Test
+ public void testErrorHandling() {
+ setPush(true);
+ openTestURL();
+ vaadinElementById("npeButton").click();
+ Assert.assertEquals(
+ "An error! Unable to invoke method click in com.vaadin.shared.ui.button.ButtonServerRpc",
+ vaadinElement(
+ "/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VLabel[0]")
+ .getText());
+
+ WebElement table = vaadinElementById("testtable");
+ WebElement row = table.findElement(By
+ .xpath("//div[text()='Click for NPE']"));
+ row.click();
+
+ Assert.assertEquals("Internal error",
+ vaadinElement("Root/VNotification[0]/HTML[0]/domChild[0]")
+ .getText());
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushFromInit.java b/uitest/src/com/vaadin/tests/push/PushFromInit.java
index 4b442de499..cb084f1232 100644
--- a/uitest/src/com/vaadin/tests/push/PushFromInit.java
+++ b/uitest/src/com/vaadin/tests/push/PushFromInit.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
package com.vaadin.tests.push;
import com.vaadin.server.VaadinRequest;
diff --git a/uitest/src/com/vaadin/tests/push/PushFromInitTest.java b/uitest/src/com/vaadin/tests/push/PushFromInitTest.java
new file mode 100644
index 0000000000..3c1bc1b610
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushFromInitTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class PushFromInitTest extends MultiBrowserTest {
+ @Test
+ public void testPushFromInit() {
+ openTestURL();
+
+ for (int second = 0;; second++) {
+ if (second >= 30) {
+ Assert.fail("timeout");
+ }
+ try {
+ if ("1. Logged in init".equals(vaadinElementById(
+ "Log_row_1").getText())) {
+ break;
+ }
+ } catch (Exception e) {
+ }
+ try {
+ Thread.sleep(200);
+ } catch (InterruptedException e) {
+ }
+ }
+
+ Assert.assertEquals(
+ "2. Logged from background thread started in init",
+ vaadinElementById("Log_row_0").getText());
+
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/push/PushLargeData.java b/uitest/src/com/vaadin/tests/push/PushLargeData.java
new file mode 100644
index 0000000000..3b72424b32
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushLargeData.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+/**
+ *
+ */
+package com.vaadin.tests.push;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.tests.util.LoremIpsum;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.UI;
+
+public abstract class PushLargeData extends AbstractTestUIWithLog {
+
+ // 1MB
+ static final int DEFAULT_SIZE_BYTES = 1000 * 1000;
+
+ // Every other second
+ static final int DEFAULT_DELAY_MS = 2000;
+
+ // 20 MB is enough for streaming to reconnect
+ static final int DEFAULT_DATA_TO_PUSH = 20 * 1000 * 1000;
+
+ static final int DEFAULT_DURATION_MS = DEFAULT_DATA_TO_PUSH
+ / DEFAULT_SIZE_BYTES * DEFAULT_DELAY_MS;
+
+ private Label dataLabel = new Label();
+
+ private final ExecutorService executor = Executors
+ .newSingleThreadExecutor();
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ dataLabel.setSizeUndefined();
+ final TextField dataSize = new TextField("Data size");
+ dataSize.setConverter(Integer.class);
+ final TextField interval = new TextField("Interval (ms)");
+ interval.setConverter(Integer.class);
+ final TextField duration = new TextField("Duration (ms)");
+ duration.setConverter(Integer.class);
+
+ dataSize.setValue(DEFAULT_SIZE_BYTES + "");
+ interval.setValue(DEFAULT_DELAY_MS + "");
+ duration.setValue(DEFAULT_DURATION_MS + "");
+
+ addComponent(dataSize);
+ addComponent(interval);
+ addComponent(duration);
+
+ Button b = new Button("Start pushing");
+ b.setId("startButton");
+ b.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ Integer pushSize = (Integer) dataSize.getConvertedValue();
+ Integer pushInterval = (Integer) interval.getConvertedValue();
+ Integer pushDuration = (Integer) duration.getConvertedValue();
+ PushRunnable r = new PushRunnable(pushSize, pushInterval,
+ pushDuration);
+ executor.execute(r);
+ log.log("Starting push, size: " + pushSize + ", interval: "
+ + pushInterval + "ms, duration: " + pushDuration + "ms");
+ }
+ });
+ addComponent(b);
+ addComponent(dataLabel);
+ }
+
+ public Label getDataLabel() {
+ return dataLabel;
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Tests that pushing large amounts of data do not cause problems";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12567;
+ }
+
+ public static class PushRunnable implements Runnable {
+
+ private Integer size;
+ private Integer interval;
+ private Integer duration;
+
+ public PushRunnable(Integer size, Integer interval, Integer duration) {
+ this.size = size;
+ this.interval = interval;
+ this.duration = duration;
+ }
+
+ @Override
+ public void run() {
+ final long endTime = System.currentTimeMillis() + duration;
+ final String data = LoremIpsum.get(size);
+ int packageIndex = 1;
+ while (System.currentTimeMillis() < endTime) {
+ final int idx = packageIndex++;
+ UI.getCurrent().access(new Runnable() {
+ @Override
+ public void run() {
+ PushLargeData ui = (PushLargeData) UI.getCurrent();
+ // Using description as it is not rendered to the DOM
+ // immediately
+ ui.getDataLabel().setDescription(
+ System.currentTimeMillis() + ": " + data);
+ ui.log("Package " + idx + " pushed");
+ }
+ });
+ try {
+ Thread.sleep(interval);
+ } catch (InterruptedException e) {
+ return;
+ }
+ }
+ UI.getCurrent().access(new Runnable() {
+ @Override
+ public void run() {
+ PushLargeData ui = (PushLargeData) UI.getCurrent();
+ ui.log("Push complete");
+ }
+ });
+
+ }
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushLargeDataStreaming.java b/uitest/src/com/vaadin/tests/push/PushLargeDataStreaming.java
new file mode 100644
index 0000000000..7706aa90c6
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushLargeDataStreaming.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import com.vaadin.annotations.Push;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.ui.Transport;
+import com.vaadin.shared.ui.ui.UIState.PushConfigurationState;
+
+@Push(transport = Transport.STREAMING)
+public class PushLargeDataStreaming extends PushLargeData {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ super.setup(request);
+ getPushConfiguration().setTransport(Transport.STREAMING);
+ getPushConfiguration().setParameter(
+ PushConfigurationState.FALLBACK_TRANSPORT_PARAM, "none");
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushLargeDataStreamingTest.java b/uitest/src/com/vaadin/tests/push/PushLargeDataStreamingTest.java
new file mode 100644
index 0000000000..8f10f0fbba
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushLargeDataStreamingTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class PushLargeDataStreamingTest extends MultiBrowserTest {
+
+ @Test
+ public void testStreamingLargeData() {
+ openTestURL();
+
+ // Without this there is a large chance that we will wait for all pushes
+ // to complete before moving on
+ testBench(driver).disableWaitForVaadin();
+
+ push();
+ // Push complete. Browser will reconnect now as > 10MB has been sent
+ // Push again to ensure push still works
+ push();
+
+ }
+
+ private void push() {
+ // Wait for startButton to be present
+ waitForElementToBePresent(vaadinLocatorById("startButton"));
+
+ String logRow0Id = "Log_row_0";
+ By logRow0 = vaadinLocatorById(logRow0Id);
+
+ vaadinElementById("startButton").click();
+ // Wait for push to start
+ waitUntil(ExpectedConditions.textToBePresentInElement(logRow0,
+ "Package "));
+
+ // Wait for until push should be done
+ sleep(PushLargeData.DEFAULT_DURATION_MS);
+
+ // Wait until push is actually done
+ waitUntil(ExpectedConditions.textToBePresentInElement(logRow0,
+ "Push complete"));
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushLargeDataWebsocket.java b/uitest/src/com/vaadin/tests/push/PushLargeDataWebsocket.java
new file mode 100644
index 0000000000..4115a825d1
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushLargeDataWebsocket.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.push;
+
+import com.vaadin.annotations.Push;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.ui.Transport;
+import com.vaadin.shared.ui.ui.UIState.PushConfigurationState;
+
+@Push(transport = Transport.WEBSOCKET)
+public class PushLargeDataWebsocket extends PushLargeData {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ super.setup(request);
+ getPushConfiguration().setParameter(
+ PushConfigurationState.FALLBACK_TRANSPORT_PARAM, "none");
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushLargeDataWebsocketTest.java b/uitest/src/com/vaadin/tests/push/PushLargeDataWebsocketTest.java
new file mode 100644
index 0000000000..70a94f743e
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushLargeDataWebsocketTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import com.vaadin.tests.tb3.WebsocketTest;
+
+public class PushLargeDataWebsocketTest extends WebsocketTest {
+
+ @Test
+ public void testWebsocketLargeData() {
+ openTestURL();
+
+ // Without this timing will be completly off as pushing "start" can
+ // remain waiting for all pushes to complete
+ testBench(driver).disableWaitForVaadin();
+
+ push();
+ // Push complete. Browser will reconnect now as > 10MB has been sent
+ // Push again to ensure push still works
+ push();
+
+ }
+
+ private void push() {
+ // Wait for startButton to be present
+ waitForElementToBePresent(vaadinLocatorById("startButton"));
+
+ String logRow0Id = "Log_row_0";
+ By logRow0 = vaadinLocatorById(logRow0Id);
+
+ vaadinElementById("startButton").click();
+ // Wait for push to start
+ waitUntil(ExpectedConditions.textToBePresentInElement(logRow0,
+ "Package"));
+
+ // Wait for until push should be done
+ sleep(PushLargeData.DEFAULT_DURATION_MS);
+
+ // Wait until push is actually done
+ waitUntil(ExpectedConditions.textToBePresentInElement(logRow0,
+ "Push complete"));
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushReattachedComponent.html b/uitest/src/com/vaadin/tests/push/PushReattachedComponent.html
deleted file mode 100644
index e1f6a5f048..0000000000
--- a/uitest/src/com/vaadin/tests/push/PushReattachedComponent.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://192.168.2.162:8888/" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run-push/com.vaadin.tests.components.panel.PanelChangeContents?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestscomponentspanelPanelChangeContents::/VVerticalLayout[0]/Slot[1]/VPanel[0]/VVerticalLayout[0]/Slot[0]/VLabel[0]</td>
- <td>stats</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestscomponentspanelPanelChangeContents::/VVerticalLayout[0]/Slot[0]/VHorizontalLayout[0]/Slot[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestscomponentspanelPanelChangeContents::/VVerticalLayout[0]/Slot[1]/VPanel[0]/VVerticalLayout[0]/Slot[0]/VLabel[0]</td>
- <td>companies</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestscomponentspanelPanelChangeContents::/VVerticalLayout[0]/Slot[0]/VHorizontalLayout[0]/Slot[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestscomponentspanelPanelChangeContents::/VVerticalLayout[0]/Slot[1]/VPanel[0]/VVerticalLayout[0]/Slot[0]/VLabel[0]</td>
- <td>stats</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/push/PushReconnectTest.java b/uitest/src/com/vaadin/tests/push/PushReconnectTest.java
new file mode 100644
index 0000000000..76a0b547da
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushReconnectTest.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+
+import com.vaadin.tests.tb3.MultiBrowserTestWithProxy;
+
+public abstract class PushReconnectTest extends MultiBrowserTestWithProxy {
+
+ @Test
+ public void testShortDisconnect() throws Exception {
+ setDebug(true);
+ openTestURL();
+ startTimer();
+ waitUntilServerCounterChanges();
+ disconnectProxy();
+ Thread.sleep(1000);
+ connectProxy();
+ waitUntilServerCounterChanges();
+ }
+
+ @Test
+ public void testUserActionWhileDisconnectedWithDelay() throws Exception {
+ setDebug(true);
+ openTestURL();
+ startTimer();
+ waitUntilServerCounterChanges();
+ disconnectProxy();
+ Assert.assertEquals(0, getClientCounter());
+ getIncrementClientCounterButton().click();
+ // No change while disconnected
+ Assert.assertEquals(0, getClientCounter());
+ // Firefox sends extra onopen calls after a while, which breaks
+ // everything
+ Thread.sleep(10000);
+ connectProxy();
+ waitUntilServerCounterChanges();
+ // The change should have appeared when reconnected
+ Assert.assertEquals(1, getClientCounter());
+ }
+
+ @Test
+ public void testUserActionWhileDisconnected() throws Exception {
+ setDebug(true);
+ openTestURL();
+ startTimer();
+ waitUntilServerCounterChanges();
+ disconnectProxy();
+ Assert.assertEquals(0, getClientCounter());
+ getIncrementClientCounterButton().click();
+ // No change while disconnected
+ Assert.assertEquals(0, getClientCounter());
+ Thread.sleep(1000);
+ connectProxy();
+ waitUntilServerCounterChanges();
+ // The change should have appeared when reconnected
+ Assert.assertEquals(1, getClientCounter());
+
+ // IE has problems with another reconnect
+ disconnectProxy();
+ getIncrementClientCounterButton().click();
+ Assert.assertEquals(1, getClientCounter());
+ Thread.sleep(1000);
+ connectProxy();
+ waitUntilServerCounterChanges();
+ Assert.assertEquals(2, getClientCounter());
+ }
+
+ @Test
+ public void testLongDisconnect() throws Exception {
+ setDebug(true);
+ openTestURL();
+ startTimer();
+ waitUntilServerCounterChanges();
+ disconnectProxy();
+ Thread.sleep(12000);
+ connectProxy();
+ waitUntilServerCounterChanges();
+ }
+
+ @Test
+ public void testReallyLongDisconnect() throws Exception {
+ setDebug(true);
+ openTestURL();
+ startTimer();
+ waitUntilServerCounterChanges();
+ disconnectProxy();
+ Thread.sleep(120000);
+ connectProxy();
+ waitUntilServerCounterChanges();
+ }
+
+ @Test
+ public void testMultipleDisconnects() throws Exception {
+ setDebug(true);
+ openTestURL();
+ startTimer();
+ waitUntilServerCounterChanges();
+ for (int i = 0; i < 5; i++) {
+ disconnectProxy();
+ Thread.sleep(1000);
+ connectProxy();
+ waitUntilServerCounterChanges();
+ }
+ }
+
+ @Test
+ public void testMultipleQuickReconnects() throws Exception {
+ setDebug(true);
+ openTestURL();
+ startTimer();
+ waitUntilServerCounterChanges();
+ for (int i = 0; i < 50; i++) {
+ disconnectProxy();
+ Thread.sleep(100);
+ connectProxy();
+ Thread.sleep(100);
+ }
+ waitUntilServerCounterChanges();
+ waitUntilServerCounterChanges();
+ }
+
+ private int getClientCounter() {
+ return BasicPushTest.getClientCounter(this);
+ }
+
+ private WebElement getIncrementClientCounterButton() {
+ return BasicPushTest.getIncrementButton(this);
+ }
+
+ private void waitUntilServerCounterChanges() {
+ final int counter = BasicPushTest.getServerCounter(this);
+ waitUntil(new ExpectedCondition<Boolean>() {
+
+ @Override
+ public Boolean apply(WebDriver input) {
+ return BasicPushTest.getServerCounter(PushReconnectTest.this) > counter;
+ }
+ }, 30);
+ }
+
+ private void startTimer() {
+ BasicPushTest.getServerCounterStartButton(this).click();
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushTransportAnnotation.html b/uitest/src/com/vaadin/tests/push/PushTransportAnnotation.html
deleted file mode 100644
index 854dd458bb..0000000000
--- a/uitest/src/com/vaadin/tests/push/PushTransportAnnotation.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://localhost:8888/" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.push.BasicPushStreaming?debug&amp;restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>waitForTextPresent</td>
- <td>Push connection established using streaming</td>
- <td></td>
-</tr>
-<tr>
- <td>assertTextNotPresent</td>
- <td>Push connection established using websocket</td>
- <td></td>
-</tr>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.push.BasicPushWebsocket?debug&amp;restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>assertTextNotPresent</td>
- <td>Push connection established using streaming</td>
- <td></td>
-</tr>
-<tr>
- <td>waitForTextPresent</td>
- <td>Push connection established using websocket</td>
- <td></td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/push/StreamingPush.html b/uitest/src/com/vaadin/tests/push/StreamingPush.html
deleted file mode 100644
index cf94a09c63..0000000000
--- a/uitest/src/com/vaadin/tests/push/StreamingPush.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://localhost:8888/" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run-push/com.vaadin.tests.push.BasicPush?restartApplication&amp;debug&amp;transport=streaming</td>
- <td></td>
-</tr>
-<!--Test client initiated push -->
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VLabel[0]</td>
- <td>0</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VLabel[0]</td>
- <td>1</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VLabel[0]</td>
- <td>4</td>
-</tr>
-<!--Test server initiated push-->
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[4]/VLabel[0]</td>
- <td>0</td>
-</tr>
-<tr>
- <td>pause</td>
- <td>3000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[4]/VLabel[0]</td>
- <td>1</td>
-</tr>
-<tr>
- <td>pause</td>
- <td>3000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushBasicPush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[4]/VLabel[0]</td>
- <td>2</td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/push/StreamingReconnectTest.java b/uitest/src/com/vaadin/tests/push/StreamingReconnectTest.java
new file mode 100755
index 0000000000..24dfdd8ba1
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/StreamingReconnectTest.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+public class StreamingReconnectTest extends PushReconnectTest {
+
+ @Override
+ protected Class<?> getUIClass() {
+ return BasicPushStreaming.class;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/push/TogglePush.html b/uitest/src/com/vaadin/tests/push/TogglePush.html
deleted file mode 100644
index b752d2120c..0000000000
--- a/uitest/src/com/vaadin/tests/push/TogglePush.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run-push/com.vaadin.tests.push.TogglePush?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>2000</td>
- <td></td>
-</tr>
-<!--Push is enabled, so text gets updated-->
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VLabel[0]</td>
- <td>Counter has been updated 1 times</td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VCheckBox[0]/domChild[0]</td>
- <td>61,6</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>2000</td>
- <td></td>
-</tr>
-<!--Push is disabled, so text is not updated-->
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VLabel[0]</td>
- <td>Counter has been updated 1 times</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<!--Direct update is visible, and includes previous update-->
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VLabel[0]</td>
- <td>Counter has been updated 3 times</td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VCheckBox[0]/domChild[0]</td>
- <td>61,3</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>2000</td>
- <td></td>
-</tr>
-<!--Push is enabled again, so text gets updated-->
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VLabel[0]</td>
- <td>Counter has been updated 4 times</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/push/TogglePush.java b/uitest/src/com/vaadin/tests/push/TogglePush.java
index c0bdc54ee0..6ec8903d65 100644
--- a/uitest/src/com/vaadin/tests/push/TogglePush.java
+++ b/uitest/src/com/vaadin/tests/push/TogglePush.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
package com.vaadin.tests.push;
import java.util.Timer;
diff --git a/uitest/src/com/vaadin/tests/push/TogglePushInInit.html b/uitest/src/com/vaadin/tests/push/TogglePushInInit.html
deleted file mode 100644
index c735f225e1..0000000000
--- a/uitest/src/com/vaadin/tests/push/TogglePushInInit.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://localhost:8071/" />
-<title>TogglePushInInit</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">TogglePushInInit</td></tr>
-</thead><tbody>
-<!--Open with push disabled-->
-<tr>
- <td>open</td>
- <td>/run-push/com.vaadin.tests.push.TogglePush?restartApplication&push=disabled</td>
- <td></td>
-</tr>
-<tr>
- <td>assertValue</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VCheckBox[0]/domChild[0]</td>
- <td>off</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>2000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VLabel[0]</td>
- <td>Counter has been updated 0 times</td>
-</tr>
-<!--Open with push enabled-->
-<tr>
- <td>open</td>
- <td>/run-push/com.vaadin.tests.push.TogglePush?restartApplication&amp;push=enabled</td>
- <td></td>
-</tr>
-<tr>
- <td>assertValue</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VCheckBox[0]/domChild[0]</td>
- <td>on</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>2000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runpushcomvaadintestspushTogglePush::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VLabel[0]</td>
- <td>Counter has been updated 1 times</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/push/TogglePushTest.java b/uitest/src/com/vaadin/tests/push/TogglePushTest.java
new file mode 100644
index 0000000000..68d6f52b9f
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/TogglePushTest.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class TogglePushTest extends MultiBrowserTest {
+
+ @Test
+ public void togglePushInInit() {
+ setPush(true);
+ String url = getTestUrl();
+
+ // Open with push disabled
+ driver.get(addParameter(url, "push=disabled"));
+
+ Assert.assertFalse(getPushToggle().isSelected());
+
+ getDelayedCounterUpdateButton().click();
+ sleep(2000);
+ Assert.assertEquals("Counter has been updated 0 times",
+ getCounterText());
+
+ // Open with push enabled
+ driver.get(addParameter(url, "push=enabled"));
+ Assert.assertTrue(getPushToggle().isSelected());
+
+ getDelayedCounterUpdateButton().click();
+ sleep(2000);
+ Assert.assertEquals("Counter has been updated 1 times",
+ getCounterText());
+
+ }
+
+ private String addParameter(String url, String queryParameter) {
+ if (url.contains("?")) {
+ return url + "&" + queryParameter;
+ } else {
+ return url + "?" + queryParameter;
+ }
+ }
+
+ @Test
+ public void togglePush() {
+ setPush(true);
+ openTestURL();
+ getDelayedCounterUpdateButton().click();
+ sleep(2000);
+
+ // Push is enabled, so text gets updated
+ Assert.assertEquals("Counter has been updated 1 times",
+ getCounterText());
+
+ // Disable push
+ getPushToggle().click();
+ getDelayedCounterUpdateButton().click();
+ sleep(2000);
+ // Push is disabled, so text is not updated
+ Assert.assertEquals("Counter has been updated 1 times",
+ getCounterText());
+
+ getDirectCounterUpdateButton().click();
+ // Direct update is visible, and includes previous update
+ Assert.assertEquals("Counter has been updated 3 times",
+ getCounterText());
+
+ // Re-enable push
+ getPushToggle().click();
+ getDelayedCounterUpdateButton().click();
+ sleep(2000);
+
+ // Push is enabled again, so text gets updated
+ Assert.assertEquals("Counter has been updated 4 times",
+ getCounterText());
+ }
+
+ private WebElement getDirectCounterUpdateButton() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[2]/VButton[0]/domChild[0]/domChild[0]");
+ }
+
+ private WebElement getPushToggle() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VCheckBox[0]/domChild[0]");
+ }
+
+ private WebElement getDelayedCounterUpdateButton() {
+ return vaadinElement("/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[3]/VButton[0]/domChild[0]/domChild[0]");
+ }
+
+ private String getCounterText() {
+ return vaadinElement(
+ "/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VLabel[0]")
+ .getText();
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/push/TrackMessageSizeUnitTests.java b/uitest/src/com/vaadin/tests/push/TrackMessageSizeUI.java
index 062698edf5..23702564f9 100644
--- a/uitest/src/com/vaadin/tests/push/TrackMessageSizeUnitTests.java
+++ b/uitest/src/com/vaadin/tests/push/TrackMessageSizeUI.java
@@ -34,11 +34,13 @@ import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.ui.JavaScriptFunction;
// Load vaadinPush.js so that jQueryVaadin is defined
-@JavaScript("vaadin://vaadinPush.js")
-public class TrackMessageSizeUnitTests extends AbstractTestUIWithLog {
+@JavaScript("vaadin://vaadinPush.debug.js")
+public class TrackMessageSizeUI extends AbstractTestUIWithLog {
private String testMethod = "function testSequence(expected, data) {\n"
+ " var request = {trackMessageLength: true, messageDelimiter: '|'};\n"
+ + " _request = {trackMessageLength: true, messageDelimiter: '|'};\n"
+ + " _handleProtocol = function(a,b) {return true;};"
+ " var response = {partialMessage: ''};\n"
+ " var messages = [];\n"
+ " for(var i = 0; i < data.length; i++) {\n"
@@ -85,7 +87,7 @@ public class TrackMessageSizeUnitTests extends AbstractTestUIWithLog {
}
private String findMethodImplementation() {
- String filename = "/VAADIN/jquery.atmosphere.js";
+ String filename = "/VAADIN/vaadinPush.debug.js";
URL resourceURL = findResourceURL(filename,
(VaadinServletService) VaadinService.getCurrent());
if (resourceURL == null) {
@@ -141,7 +143,7 @@ public class TrackMessageSizeUnitTests extends AbstractTestUIWithLog {
@Override
protected String getTestDescription() {
- return "Unit tests for _trackMessageSize in jquery.atmosphere.js. Implemented with testbench and a full Vaadin server side since the testing requires some file mangling.";
+ return "Unit tests for _trackMessageSize in vaadinPush.debug.js. Implemented with testbench and a full Vaadin server side since the testing requires some file mangling.";
}
@Override
diff --git a/uitest/src/com/vaadin/tests/push/TrackMessageSizeUITest.java b/uitest/src/com/vaadin/tests/push/TrackMessageSizeUITest.java
new file mode 100644
index 0000000000..f904675b5e
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/TrackMessageSizeUITest.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class TrackMessageSizeUITest extends MultiBrowserTest {
+ @Test
+ public void runTests() {
+ openTestURL();
+ Assert.assertEquals("1. All tests run",
+ vaadinElementById("Log_row_0").getText());
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/push/WebsocketReconnectTest.java b/uitest/src/com/vaadin/tests/push/WebsocketReconnectTest.java
new file mode 100644
index 0000000000..075a18c0e7
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/WebsocketReconnectTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import java.util.List;
+
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.tests.tb3.WebsocketTest;
+
+public class WebsocketReconnectTest extends PushReconnectTest {
+
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ return WebsocketTest.getWebsocketBrowsers();
+ }
+
+ @Override
+ protected Class<?> getUIClass() {
+ return BasicPushWebsocket.class;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java b/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java
new file mode 100644
index 0000000000..d4eed99f19
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java
@@ -0,0 +1,838 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.tb3;
+
+import java.net.URL;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Platform;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.remote.BrowserType;
+import org.openqa.selenium.remote.DesiredCapabilities;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import com.vaadin.server.LegacyApplication;
+import com.vaadin.server.UIProvider;
+import com.vaadin.testbench.TestBench;
+import com.vaadin.testbench.TestBenchTestCase;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.ui.UI;
+
+/**
+ * Base class for TestBench 3+ tests. All TB3+ tests in the project should
+ * extend this class.
+ *
+ * Provides:
+ * <ul>
+ * <li>Helpers for browser selection</li>
+ * <li>Hub connection setup and teardown</li>
+ * <li>Automatic generation of URL for a given test on the development server
+ * using {@link #getUIClass()} or by automatically finding an enclosing UI class
+ * and based on requested features, e.g. {@link #isDebug()}, {@link #isPush()}</li>
+ * <li>Generic helpers for creating TB3+ tests</li>
+ * </ul>
+ *
+ * @author Vaadin Ltd
+ */
+@RunWith(value = TB3Runner.class)
+public abstract class AbstractTB3Test extends TestBenchTestCase {
+ /**
+ * Height of the screenshots we want to capture
+ */
+ private static final int SCREENSHOT_HEIGHT = 850;
+
+ /**
+ * Width of the screenshots we want to capture
+ */
+ private static final int SCREENSHOT_WIDTH = 1500;
+
+ private DesiredCapabilities desiredCapabilities;
+
+ private boolean debug = false;
+
+ private boolean push = false;
+ {
+ // Default browser to run on unless setDesiredCapabilities is called
+ desiredCapabilities = BrowserUtil
+ .firefox(MultiBrowserTest.TESTED_FIREFOX_VERSION);
+ }
+
+ /**
+ * Connect to the hub using a remote web driver, set the canvas size and
+ * opens the initial URL as specified by {@link #getTestUrl()}
+ *
+ * @throws Exception
+ */
+ @Before
+ public void setup() throws Exception {
+ setupDriver();
+ }
+
+ /**
+ * Creates and configure the web driver to be used for the test. By default
+ * creates a remote web driver which connects to {@link #getHubURL()} and
+ * selects a browser based on {@link #getDesiredCapabilities()}.
+ *
+ * This method MUST call {@link #setDriver(WebDriver)} with the newly
+ * generated driver.
+ *
+ * @throws Exception
+ * If something goes wrong
+ */
+ protected void setupDriver() throws Exception {
+ if (runLocally()) {
+ setupLocalDriver();
+ return;
+ }
+ DesiredCapabilities capabilities = getDesiredCapabilities();
+
+ WebDriver dr = TestBench.createDriver(new RemoteWebDriver(new URL(
+ getHubURL()), capabilities));
+ setDriver(dr);
+
+ int w = SCREENSHOT_WIDTH;
+ int h = SCREENSHOT_HEIGHT;
+
+ if (BrowserUtil.isIE8(capabilities)) {
+ // IE8 gets size wrong, who would have guessed...
+ w += 4;
+ h += 4;
+ }
+ try {
+ testBench().resizeViewPortTo(w, h);
+ } catch (UnsupportedOperationException e) {
+ // Opera does not support this...
+ }
+
+ }
+
+ /**
+ * Override and return true to run the test locally. This method is only to
+ * be used for developing tests.
+ *
+ * @return true to run the test on a local browser, false to use the hub
+ */
+ public boolean runLocally() {
+ return false;
+ }
+
+ /**
+ * Creates a {@link WebDriver} instance used for running the test locally
+ * for debug purposes. Used only when {@link #runLocally()} is overridden to
+ * return true;
+ */
+ protected abstract void setupLocalDriver();
+
+ /**
+ * Opens the given test (defined by {@link #getTestUrl()}, optionally with
+ * debug window and/or push (depending on {@link #isDebug()} and
+ * {@link #isPush()}.
+ */
+ protected void openTestURL() {
+ driver.get(getTestUrl());
+ }
+
+ /**
+ * Returns the full URL to be used for the test
+ *
+ * @return the full URL for the test
+ */
+ protected String getTestUrl() {
+ String baseUrl = getBaseURL();
+ if (baseUrl.endsWith("/")) {
+ baseUrl = baseUrl.substring(0, baseUrl.length() - 1);
+ }
+
+ return baseUrl + getDeploymentPath();
+ }
+
+ /**
+ *
+ * @return the location (URL) of the TB hub
+ */
+ protected String getHubURL() {
+ return "http://" + getHubHostname() + ":4444/wd/hub";
+ }
+
+ /**
+ * Used for building the hub URL to use for the test
+ *
+ * @return the host name of the TestBench hub
+ */
+ protected abstract String getHubHostname();
+
+ /**
+ * Used to determine what URL to initially open for the test
+ *
+ * @return the host name of development server
+ */
+ protected abstract String getDeploymentHostname();
+
+ /**
+ * Used to determine what port the test is running on
+ *
+ * @return The port teh test is running on, by default 8888
+ */
+ protected abstract int getDeploymentPort();
+
+ /**
+ * Produces a collection of browsers to run the test on. This method is
+ * executed by the test runner when determining how many test methods to
+ * invoke and with what parameters. For each returned value a test method is
+ * ran and before running that,
+ * {@link #setDesiredCapabilities(DesiredCapabilities)} is invoked with the
+ * value returned by this method.
+ *
+ * This method is not static to allow overriding it in sub classes. By
+ * default runs the test only on Firefox
+ *
+ * @return The browsers to run the test on
+ */
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ return Collections.singletonList(BrowserUtil
+ .firefox(MultiBrowserTest.TESTED_FIREFOX_VERSION));
+
+ }
+
+ /**
+ * Used to determine which capabilities should be used when setting up a
+ * {@link WebDriver} for this test. Typically set by a test runner or left
+ * at its default (Firefox 24). If you want to run a test on a single
+ * browser other than Firefox 24 you can override this method.
+ *
+ * @return the requested browser capabilities
+ */
+ protected DesiredCapabilities getDesiredCapabilities() {
+ return desiredCapabilities;
+ }
+
+ /**
+ * Sets the requested browser capabilities (typically browser name and
+ * version)
+ *
+ * @param desiredCapabilities
+ */
+ public void setDesiredCapabilities(DesiredCapabilities desiredCapabilities) {
+ this.desiredCapabilities = desiredCapabilities;
+ }
+
+ /**
+ * Shuts down the driver after the test has been completed
+ *
+ * @throws Exception
+ */
+ @After
+ public void tearDown() throws Exception {
+ if (driver != null) {
+ driver.quit();
+ }
+ driver = null;
+ }
+
+ /**
+ * Finds an element based on the part of a TB2 style locator following the
+ * :: (e.g. vaadin=runLabelModes::PID_Scheckboxaction-Enabled/domChild[0] ->
+ * PID_Scheckboxaction-Enabled/domChild[0]).
+ *
+ * @param vaadinLocator
+ * The part following :: of the vaadin locator string
+ * @return
+ */
+ protected WebElement vaadinElement(String vaadinLocator) {
+ return driver.findElement(vaadinLocator(vaadinLocator));
+ }
+
+ /**
+ * Find a Vaadin element based on its id given using Component.setId
+ *
+ * @param id
+ * The id to locate
+ * @return
+ */
+ public WebElement vaadinElementById(String id) {
+ return driver.findElement(vaadinLocatorById(id));
+ }
+
+ /**
+ * Finds a {@link By} locator based on the part of a TB2 style locator
+ * following the :: (e.g.
+ * vaadin=runLabelModes::PID_Scheckboxaction-Enabled/domChild[0] ->
+ * PID_Scheckboxaction-Enabled/domChild[0]).
+ *
+ * @param vaadinLocator
+ * The part following :: of the vaadin locator string
+ * @return
+ */
+ public org.openqa.selenium.By vaadinLocator(String vaadinLocator) {
+ String base = getApplicationId(getDeploymentPath());
+
+ base += "::";
+ return com.vaadin.testbench.By.vaadin(base + vaadinLocator);
+ }
+
+ /**
+ * Constructs a {@link By} locator for the id given using Component.setId
+ *
+ * @param id
+ * The id to locate
+ * @return a locator for the given id
+ */
+ public By vaadinLocatorById(String id) {
+ return vaadinLocator("PID_S" + id);
+ }
+
+ /**
+ * Waits up to 10s for the given condition to become true. Use e.g. as
+ * {@link #waitUntil(ExpectedConditions.textToBePresentInElement(by, text))}
+ *
+ * @param condition
+ * the condition to wait for to become true
+ */
+ protected void waitUntil(ExpectedCondition<Boolean> condition) {
+ waitUntil(condition, 10);
+ }
+
+ /**
+ * Waits the given number of seconds for the given condition to become true.
+ * Use e.g. as {@link
+ * #waitUntil(ExpectedConditions.textToBePresentInElement(by, text))}
+ *
+ * @param condition
+ * the condition to wait for to become true
+ */
+ protected void waitUntil(ExpectedCondition<Boolean> condition,
+ long timeoutInSeconds) {
+ new WebDriverWait(driver, timeoutInSeconds).until(condition);
+ }
+
+ /**
+ * Waits up to 10s for the given condition to become false. Use e.g. as
+ * {@link #waitUntilNot(ExpectedConditions.textToBePresentInElement(by,
+ * text))}
+ *
+ * @param condition
+ * the condition to wait for to become false
+ */
+ protected void waitUntilNot(ExpectedCondition<Boolean> condition) {
+ waitUntilNot(condition, 10);
+ }
+
+ /**
+ * Waits the given number of seconds for the given condition to become
+ * false. Use e.g. as {@link
+ * #waitUntilNot(ExpectedConditions.textToBePresentInElement(by, text))}
+ *
+ * @param condition
+ * the condition to wait for to become false
+ */
+ protected void waitUntilNot(ExpectedCondition<Boolean> condition,
+ long timeoutInSeconds) {
+ waitUntil(ExpectedConditions.not(condition), timeoutInSeconds);
+ }
+
+ protected void waitForElementToBePresent(By by) {
+ waitUntil(ExpectedConditions.not(ExpectedConditions
+ .invisibilityOfElementLocated(by)));
+ }
+
+ /**
+ * For tests extending {@link AbstractTestUIWithLog}, returns the element
+ * for the Nth log row
+ *
+ * @param rowNr
+ * The log row to retrieve
+ * @return the Nth log row
+ */
+ protected WebElement getLogRowElement(int rowNr) {
+ return vaadinElementById("Log_row_" + rowNr);
+ }
+
+ /**
+ * For tests extending {@link AbstractTestUIWithLog}, returns the text in
+ * the Nth log row
+ *
+ * @param rowNr
+ * The log row to retrieve text for
+ * @return the text in the log row
+ */
+ protected String getLogRow(int rowNr) {
+ return getLogRowElement(rowNr).getText();
+ }
+
+ /**
+ * Asserts that {@literal a} is &gt;= {@literal b}
+ *
+ * @param message
+ * The message to include in the {@link AssertionError}
+ * @param a
+ * @param b
+ * @throws AssertionError
+ * If comparison fails
+ */
+ public static final <T> void assertGreaterOrEqual(String message,
+ Comparable<T> a, T b) throws AssertionError {
+ if (a.compareTo(b) >= 0) {
+ return;
+ }
+
+ throw new AssertionError(decorate(message, a, b));
+ }
+
+ /**
+ * Asserts that {@literal a} is &gt; {@literal b}
+ *
+ * @param message
+ * The message to include in the {@link AssertionError}
+ * @param a
+ * @param b
+ * @throws AssertionError
+ * If comparison fails
+ */
+ public static final <T> void assertGreater(String message, Comparable<T> a,
+ T b) throws AssertionError {
+ if (a.compareTo(b) > 0) {
+ return;
+ }
+ throw new AssertionError(decorate(message, a, b));
+ }
+
+ /**
+ * Asserts that {@literal a} is &lt;= {@literal b}
+ *
+ * @param message
+ * The message to include in the {@link AssertionError}
+ * @param a
+ * @param b
+ * @throws AssertionError
+ * If comparison fails
+ */
+ public static final <T> void assertLessThanOrEqual(String message,
+ Comparable<T> a, T b) throws AssertionError {
+ if (a.compareTo(b) <= 0) {
+ return;
+ }
+
+ throw new AssertionError(decorate(message, a, b));
+ }
+
+ /**
+ * Asserts that {@literal a} is &lt; {@literal b}
+ *
+ * @param message
+ * The message to include in the {@link AssertionError}
+ * @param a
+ * @param b
+ * @throws AssertionError
+ * If comparison fails
+ */
+ public static final <T> void assertLessThan(String message,
+ Comparable<T> a, T b) throws AssertionError {
+ if (a.compareTo(b) < 0) {
+ return;
+ }
+ throw new AssertionError(decorate(message, a, b));
+ }
+
+ private static <T> String decorate(String message, Comparable<T> a, T b) {
+ message = message.replace("{0}", a.toString());
+ message = message.replace("{1}", b.toString());
+ return message;
+ }
+
+ /**
+ * Returns the path that should be used for the test. The path contains the
+ * full path (appended to hostname+port) and must start with a slash.
+ *
+ * @param push
+ * true if "?debug" should be added
+ * @param debug
+ * true if /run-push should be used instead of /run
+ *
+ * @return The URL path to the UI class to test
+ */
+ protected String getDeploymentPath() {
+ Class<?> uiClass = getUIClass();
+ if (uiClass != null) {
+ return getDeploymentPath(uiClass);
+ }
+ throw new IllegalArgumentException("Unable to determine path for "
+ + getClass().getCanonicalName());
+
+ }
+
+ /**
+ * Returns the UI class the current test is connected to (or in special
+ * cases UIProvider or LegacyApplication). Uses the enclosing class if the
+ * test class is a static inner class to a UI class.
+ *
+ * Test which are not enclosed by a UI class must implement this method and
+ * return the UI class they want to test.
+ *
+ * Note that this method will update the test name to the enclosing class to
+ * be compatible with TB2 screenshot naming
+ *
+ * @return the UI class the current test is connected to
+ */
+ protected Class<?> getUIClass() {
+ try {
+ // Convention: SomeUITest uses the SomeUI UI class
+ String uiClassName = getClass().getName().replaceFirst("Test$", "");
+ Class<?> cls = Class.forName(uiClassName);
+ if (isSupportedRunnerClass(cls)) {
+ return cls;
+ }
+ } catch (Exception e) {
+ }
+ throw new RuntimeException(
+ "Could not determine UI class. Ensure the test is named UIClassTest and is in the same package as the UIClass");
+ }
+
+ /**
+ * @return true if the given class is supported by ApplicationServletRunner
+ */
+ @SuppressWarnings("deprecation")
+ private boolean isSupportedRunnerClass(Class<?> cls) {
+ if (UI.class.isAssignableFrom(cls)) {
+ return true;
+ }
+ if (UIProvider.class.isAssignableFrom(cls)) {
+ return true;
+ }
+ if (LegacyApplication.class.isAssignableFrom(cls)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns whether to run the test in debug mode (with the debug console
+ * open) or not
+ *
+ * @return true to run with the debug window open, false by default
+ */
+ protected final boolean isDebug() {
+ return debug;
+ }
+
+ /**
+ * Sets whether to run the test in debug mode (with the debug console open)
+ * or not.
+ *
+ * @param debug
+ * true to open debug window, false otherwise
+ */
+ protected final void setDebug(boolean debug) {
+ this.debug = debug;
+ }
+
+ /**
+ * Returns whether to run the test with push enabled (using /run-push) or
+ * not. Note that push tests can and should typically be created using @Push
+ * on the UI instead of overriding this method
+ *
+ * @return true if /run-push is used, false otherwise
+ */
+ protected final boolean isPush() {
+ return push;
+ }
+
+ /**
+ * Sets whether to run the test with push enabled (using /run-push) or not.
+ * Note that push tests can and should typically be created using @Push on
+ * the UI instead of overriding this method
+ *
+ * @param push
+ * true to use /run-push in the test, false otherwise
+ */
+ protected final void setPush(boolean push) {
+ this.push = push;
+ }
+
+ /**
+ * Returns the path for the given UI class when deployed on the test server.
+ * The path contains the full path (appended to hostname+port) and must
+ * start with a slash.
+ *
+ * This method takes into account {@link #isPush()} and {@link #isDebug()}
+ * when the path is generated.
+ *
+ * @param uiClass
+ * @param push
+ * true if "?debug" should be added
+ * @param debug
+ * true if /run-push should be used instead of /run
+ * @return The path to the given UI class
+ */
+ private String getDeploymentPath(Class<?> uiClass) {
+ String runPath = "/run";
+ if (isPush()) {
+ runPath = "/run-push";
+ }
+
+ if (UI.class.isAssignableFrom(uiClass)) {
+ return runPath + "/" + uiClass.getCanonicalName()
+ + (isDebug() ? "?debug" : "");
+ } else if (LegacyApplication.class.isAssignableFrom(uiClass)) {
+ return runPath + "/" + uiClass.getCanonicalName()
+ + "?restartApplication" + (isDebug() ? "&debug" : "");
+ } else {
+ throw new IllegalArgumentException(
+ "Unable to determine path for enclosing class "
+ + uiClass.getCanonicalName());
+ }
+ }
+
+ /**
+ * Used to determine what URL to initially open for the test
+ *
+ * @return The base URL for the test. Does not include a trailing slash.
+ */
+ protected String getBaseURL() {
+ return "http://" + getDeploymentHostname() + ":" + getDeploymentPort();
+ }
+
+ /**
+ * Generates the application id based on the URL in a way compatible with
+ * VaadinServletService.
+ *
+ * @param pathWithQueryParameters
+ * The path part of the URL, possibly still containing query
+ * parameters
+ * @return The application ID string used in Vaadin locators
+ */
+ private String getApplicationId(String pathWithQueryParameters) {
+ // Remove any possible URL parameters
+ String pathWithoutQueryParameters = pathWithQueryParameters.replaceAll(
+ "\\?.*", "");
+ if ("".equals(pathWithoutQueryParameters)) {
+ return "ROOT";
+ }
+
+ // Retain only a-z and numbers
+ return pathWithoutQueryParameters.replaceAll("[^a-zA-Z0-9]", "");
+ }
+
+ /**
+ * Helper method for sleeping X ms in a test. Catches and ignores
+ * InterruptedExceptions
+ *
+ * @param timeoutMillis
+ * Number of ms to wait
+ */
+ protected void sleep(int timeoutMillis) {
+ try {
+ Thread.sleep(timeoutMillis);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Provides helper method for selecting the browser to run on
+ *
+ * @author Vaadin Ltd
+ */
+ public static class BrowserUtil {
+ /**
+ * Gets the capabilities for Safari of the given version
+ *
+ * @param version
+ * the major version
+ * @return an object describing the capabilities required for running a
+ * test on the given Safari version
+ */
+ public static DesiredCapabilities safari(int version) {
+ DesiredCapabilities c = DesiredCapabilities.safari();
+ c.setPlatform(Platform.MAC);
+ c.setVersion("" + version);
+ return c;
+ }
+
+ /**
+ * Gets the capabilities for Chrome of the given version
+ *
+ * @param version
+ * the major version
+ * @return an object describing the capabilities required for running a
+ * test on the given Chrome version
+ */
+ public static DesiredCapabilities chrome(int version) {
+ DesiredCapabilities c = DesiredCapabilities.chrome();
+ c.setVersion("" + version);
+ c.setPlatform(Platform.XP);
+ return c;
+ }
+
+ /**
+ * Gets the capabilities for Opera of the given version
+ *
+ * @param version
+ * the major version
+ * @return an object describing the capabilities required for running a
+ * test on the given Opera version
+ */
+ public static DesiredCapabilities opera(int version) {
+ DesiredCapabilities c = DesiredCapabilities.opera();
+ c.setVersion("" + version);
+ c.setPlatform(Platform.XP);
+ return c;
+ }
+
+ /**
+ * Gets the capabilities for Firefox of the given version
+ *
+ * @param version
+ * the major version
+ * @return an object describing the capabilities required for running a
+ * test on the given Firefox version
+ */
+ public static DesiredCapabilities firefox(int version) {
+ DesiredCapabilities c = DesiredCapabilities.firefox();
+ c.setVersion("" + version);
+ c.setPlatform(Platform.XP);
+ return c;
+ }
+
+ /**
+ * Gets the capabilities for Internet Explorer of the given version
+ *
+ * @param version
+ * the major version
+ * @return an object describing the capabilities required for running a
+ * test on the given Internet Explorer version
+ */
+ public static DesiredCapabilities ie(int version) {
+ DesiredCapabilities c = DesiredCapabilities.internetExplorer();
+ c.setVersion("" + version);
+ return c;
+ }
+
+ /**
+ * Checks if the given capabilities refer to Internet Explorer 8
+ *
+ * @param capabilities
+ * @return true if the capabilities refer to IE8, false otherwise
+ */
+ public static boolean isIE8(DesiredCapabilities capabilities) {
+ return BrowserType.IE.equals(capabilities.getBrowserName())
+ && "8".equals(capabilities.getVersion());
+ }
+
+ /**
+ * Returns a human readable identifier of the given browser. Used for
+ * test naming and screenshots
+ *
+ * @param capabilities
+ * @return a human readable string describing the capabilities
+ */
+ public static String getBrowserIdentifier(
+ DesiredCapabilities capabilities) {
+ String browserName = capabilities.getBrowserName();
+
+ if (BrowserType.IE.equals(browserName)) {
+ return "InternetExplorer";
+ } else if (BrowserType.FIREFOX.equals(browserName)) {
+ return "Firefox";
+ } else if (BrowserType.CHROME.equals(browserName)) {
+ return "Chrome";
+ } else if (BrowserType.SAFARI.equals(browserName)) {
+ return "Safari";
+ } else if (BrowserType.OPERA.equals(browserName)) {
+ return "Opera";
+ }
+
+ return browserName;
+ }
+
+ /**
+ * Returns a human readable identifier of the platform described by the
+ * given capabilities. Used mainly for screenshots
+ *
+ * @param capabilities
+ * @return a human readable string describing the platform
+ */
+ public static String getPlatform(DesiredCapabilities capabilities) {
+ if (capabilities.getPlatform() == Platform.WIN8
+ || capabilities.getPlatform() == Platform.WINDOWS
+ || capabilities.getPlatform() == Platform.VISTA
+ || capabilities.getPlatform() == Platform.XP) {
+ return "Windows";
+ } else if (capabilities.getPlatform() == Platform.MAC) {
+ return "Mac";
+ }
+ return capabilities.getPlatform().toString();
+ }
+
+ /**
+ * Returns a string which uniquely (enough) identifies this browser.
+ * Used mainly in screenshot names.
+ *
+ * @param capabilities
+ *
+ * @return a unique string for each browser
+ */
+ public static String getUniqueIdentifier(
+ DesiredCapabilities capabilities) {
+ return getUniqueIdentifier(getPlatform(capabilities),
+ getBrowserIdentifier(capabilities),
+ capabilities.getVersion());
+ }
+
+ /**
+ * Returns a string which uniquely (enough) identifies this browser.
+ * Used mainly in screenshot names.
+ *
+ * @param capabilities
+ *
+ * @return a unique string for each browser
+ */
+ public static String getUniqueIdentifier(
+ DesiredCapabilities capabilities, String versionOverride) {
+ return getUniqueIdentifier(getPlatform(capabilities),
+ getBrowserIdentifier(capabilities), versionOverride);
+ }
+
+ private static String getUniqueIdentifier(String platform,
+ String browser, String version) {
+ return platform + "_" + browser + "_" + version;
+ }
+
+ }
+
+ /**
+ * Called by the test runner whenever there is an exception in the test that
+ * will cause termination of the test
+ *
+ * @param t
+ * the throwable which caused the termination
+ */
+ public void onUncaughtException(Throwable t) {
+ // Do nothing by default
+
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/tb3/AllTB3Tests.java b/uitest/src/com/vaadin/tests/tb3/AllTB3Tests.java
new file mode 100644
index 0000000000..bd9027bec2
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/AllTB3Tests.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.tb3;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.model.InitializationError;
+
+import com.vaadin.tests.tb3.AllTB3Tests.AllTB3TestsSuite;
+
+/**
+ * Test consisting of all TB3 tests except integration tests (classes extending
+ * AbstractTB3Test, excludes package com.vaadin.test.integration).
+ *
+ * @author Vaadin Ltd
+ */
+@RunWith(AllTB3TestsSuite.class)
+public class AllTB3Tests {
+
+ public static class AllTB3TestsSuite extends TB3TestSuite {
+
+ public AllTB3TestsSuite(Class<?> klass) throws InitializationError {
+ super(klass, AbstractTB3Test.class, "com.vaadin.tests",
+ new String[] { "com.vaadin.tests.integration" });
+ }
+
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java b/uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java
new file mode 100644
index 0000000000..e8a974343b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.tb3;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+/**
+ * Base class for tests which should be run on all supported browsers. The test
+ * is automatically launched for multiple browsers in parallel by the test
+ * runner.
+ *
+ * Sub classes can, but typically should not, restrict the browsers used by
+ * implementing a
+ *
+ * <pre>
+ * &#064;Parameters
+ * public static Collection&lt;DesiredCapabilities&gt; getBrowsersForTest() {
+ * }
+ * </pre>
+ *
+ * @author Vaadin Ltd
+ */
+public abstract class MultiBrowserTest extends PrivateTB3Configuration {
+
+ public static final int TESTED_SAFARI_VERSION = 7;
+ public static final int TESTED_CHROME_VERSION = 29;
+ public static final int TESTED_FIREFOX_VERSION = 24;
+
+ static List<DesiredCapabilities> allBrowsers = new ArrayList<DesiredCapabilities>();
+ static {
+ allBrowsers.add(BrowserUtil.ie(8));
+ allBrowsers.add(BrowserUtil.ie(9));
+ allBrowsers.add(BrowserUtil.ie(10));
+ allBrowsers.add(BrowserUtil.ie(11));
+ allBrowsers.add(BrowserUtil.firefox(TESTED_FIREFOX_VERSION));
+ // Uncomment once we have the capability to run on Safari 6
+ // allBrowsers.add(BrowserUtil.safari(TESTED_SAFARI_VERSION));
+ allBrowsers.add(BrowserUtil.chrome(TESTED_CHROME_VERSION));
+ // Re-enable this when it is possible to run on a modern Opera version
+ // (15+)
+ // allBrowsers.add(BrowserUtil.opera(15));
+ }
+
+ /**
+ * @return all supported browsers which are actively tested
+ */
+ public static List<DesiredCapabilities> getAllBrowsers() {
+ return Collections.unmodifiableList(allBrowsers);
+ }
+
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ // Return a copy so sub classes can do
+ // super.getBrowseresToTest().remove(something)
+ return new ArrayList<DesiredCapabilities>(getAllBrowsers());
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/tb3/MultiBrowserTestWithProxy.java b/uitest/src/com/vaadin/tests/tb3/MultiBrowserTestWithProxy.java
new file mode 100755
index 0000000000..0bb76889a0
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/MultiBrowserTestWithProxy.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tb3;
+
+import java.io.File;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.junit.After;
+import org.junit.Before;
+
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.Session;
+
+public abstract class MultiBrowserTestWithProxy extends MultiBrowserTest {
+
+ private static AtomicInteger availablePort = new AtomicInteger(2000);
+ private Session proxySession;
+ private Integer proxyPort = null;
+ private JSch jsch;
+ private static String sshDir = System.getProperty("user.home") + "/.ssh/";
+ private String[] publicKeys = new String[] {
+ System.getProperty("sshkey.file"), sshDir + "id_rsa",
+ sshDir + "id_dsa", sshDir + "id_rsa2" };
+
+ @Before
+ public void setupInitialProxy() throws JSchException {
+ connectProxy();
+ }
+
+ @After
+ public void teardownProxy() {
+ disconnectProxy();
+ }
+
+ protected Integer getProxyPort() {
+ if (proxyPort == null) {
+ // Assumes we can use any port >= 2000
+ proxyPort = availablePort.addAndGet(1);
+ }
+ return proxyPort;
+ }
+
+ /**
+ * Disconnects the proxy if active
+ */
+ protected void disconnectProxy() {
+ if (proxySession == null) {
+ return;
+ }
+ proxySession.disconnect();
+ proxySession = null;
+ }
+
+ /**
+ * Ensure the proxy is active. Does nothing if the proxy is already active.
+ */
+ protected void connectProxy() throws JSchException {
+ if (proxySession != null) {
+ return;
+ }
+
+ createProxy(getProxyPort());
+ }
+
+ private void createProxy(int proxyPort) throws JSchException {
+ if (jsch == null) {
+ jsch = new JSch();
+
+ String keyFile = null;
+ for (String publicKey : publicKeys) {
+ if (publicKey != null) {
+ if (new File(publicKey).exists()) {
+ keyFile = publicKey;
+ break;
+ }
+ }
+ }
+ jsch.addIdentity(keyFile);
+ }
+ proxySession = jsch.getSession("localhost");
+ proxySession.setConfig("StrictHostKeyChecking", "no");
+ proxySession.setPortForwardingL("0.0.0.0", proxyPort,
+ super.getDeploymentHostname(), super.getDeploymentPort());
+ proxySession.connect();
+ }
+
+ @Override
+ protected String getBaseURL() {
+ return "http://" + getDeploymentHostname() + ":" + getProxyPort();
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/tb3/ParallelScheduler.java b/uitest/src/com/vaadin/tests/tb3/ParallelScheduler.java
new file mode 100644
index 0000000000..912d7d010e
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/ParallelScheduler.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.tb3;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+
+import org.junit.runners.model.RunnerScheduler;
+
+/**
+ * JUnit scheduler capable of running multiple tets in parallel. Each test is
+ * run in its own thread. Uses an {@link ExecutorService} to manage the threads.
+ *
+ * @author Vaadin Ltd
+ */
+public class ParallelScheduler implements RunnerScheduler {
+ private final List<Future<Object>> fResults = new ArrayList<Future<Object>>();
+ private ExecutorService fService;
+
+ /**
+ * Creates a parallel scheduler which will use the given executor service
+ * when submitting test jobs.
+ *
+ * @param service
+ * The service to use for tests
+ */
+ public ParallelScheduler(ExecutorService service) {
+ fService = service;
+ }
+
+ @Override
+ public void schedule(final Runnable childStatement) {
+ fResults.add(fService.submit(new Callable<Object>() {
+ @Override
+ public Object call() throws Exception {
+ childStatement.run();
+ return null;
+ }
+ }));
+ }
+
+ @Override
+ public void finished() {
+ for (Future<Object> each : fResults) {
+ try {
+ each.get();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/tb3/PrivateTB3Configuration.java b/uitest/src/com/vaadin/tests/tb3/PrivateTB3Configuration.java
new file mode 100644
index 0000000000..caa35732d6
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/PrivateTB3Configuration.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2000-2013 Vaadind Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.tb3;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.firefox.FirefoxBinary;
+import org.openqa.selenium.firefox.FirefoxDriver;
+
+import com.vaadin.testbench.TestBench;
+
+/**
+ * Provides values for parameters which depend on where the test is run.
+ * Parameters should be configured in work/eclipse-run-selected-test.properties.
+ * A template is available in uitest/.
+ *
+ * @author Vaadin Ltd
+ */
+public abstract class PrivateTB3Configuration extends ScreenshotTB3Test {
+ private static final String HOSTNAME_PROPERTY = "com.vaadin.testbench.deployment.hostname";
+ private static final String PORT_PROPERTY = "com.vaadin.testbench.deployment.port";
+ private final Properties properties = new Properties();
+
+ public PrivateTB3Configuration() {
+ File file = new File("work", "eclipse-run-selected-test.properties");
+ if (file.exists()) {
+ try {
+ properties.load(new FileInputStream(file));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ private String getProperty(String name) {
+ String property = properties.getProperty(name);
+ if (property == null) {
+ property = System.getProperty(name);
+ }
+
+ return property;
+ }
+
+ @Override
+ protected String getScreenshotDirectory() {
+ String screenshotDirectory = getProperty("com.vaadin.testbench.screenshot.directory");
+ if (screenshotDirectory == null) {
+ throw new RuntimeException(
+ "No screenshot directory defined. Use -Dcom.vaadin.testbench.screenshot.directory=<path>");
+ }
+ return screenshotDirectory;
+ }
+
+ @Override
+ protected String getHubHostname() {
+ return "tb3-hub.intra.itmill.com";
+ }
+
+ @Override
+ protected String getDeploymentHostname() {
+ String hostName = getProperty(HOSTNAME_PROPERTY);
+
+ if (hostName == null || "".equals(hostName)) {
+ hostName = findAutoHostname();
+ }
+
+ return hostName;
+ }
+
+ @Override
+ protected int getDeploymentPort() {
+ String portString = getProperty(PORT_PROPERTY);
+
+ int port = 8888;
+ if (portString != null && !"".equals(portString)) {
+ port = Integer.parseInt(portString);
+ }
+
+ return port;
+ }
+
+ /**
+ * Tries to automatically determine the IP address of the machine the test
+ * is running on.
+ *
+ * @return An IP address of one of the network interfaces in the machine.
+ * @throws RuntimeException
+ * if there was an error or no IP was found
+ */
+ private String findAutoHostname() {
+ try {
+ Enumeration<NetworkInterface> interfaces = NetworkInterface
+ .getNetworkInterfaces();
+ while (interfaces.hasMoreElements()) {
+ NetworkInterface current = interfaces.nextElement();
+ if (!current.isUp() || current.isLoopback()
+ || current.isVirtual()) {
+ continue;
+ }
+ Enumeration<InetAddress> addresses = current.getInetAddresses();
+ while (addresses.hasMoreElements()) {
+ InetAddress current_addr = addresses.nextElement();
+ if (current_addr.isLoopbackAddress()) {
+ continue;
+ }
+ String hostAddress = current_addr.getHostAddress();
+ if (hostAddress.startsWith("192.168.")) {
+ return hostAddress;
+ }
+ }
+ }
+ } catch (SocketException e) {
+ throw new RuntimeException("Could not enumerate ");
+ }
+
+ throw new RuntimeException(
+ "No compatible (192.168.*) ip address found.");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.tb3.AbstractTB3Test#setupLocalDriver()
+ */
+ @Override
+ protected void setupLocalDriver() {
+ String firefoxPath = getProperty("firefox.path");
+ WebDriver driver;
+ if (firefoxPath != null) {
+ driver = new FirefoxDriver(
+ new FirefoxBinary(new File(firefoxPath)), null);
+ } else {
+ driver = new FirefoxDriver();
+ }
+ setDriver(TestBench.createDriver(driver));
+ setDesiredCapabilities(BrowserUtil
+ .firefox(MultiBrowserTest.TESTED_FIREFOX_VERSION));
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/tb3/ScreenshotTB3Test.java b/uitest/src/com/vaadin/tests/tb3/ScreenshotTB3Test.java
new file mode 100644
index 0000000000..a51421d3d5
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/ScreenshotTB3Test.java
@@ -0,0 +1,416 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.tb3;
+
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.rules.TestRule;
+import org.junit.rules.TestWatcher;
+import org.openqa.selenium.OutputType;
+import org.openqa.selenium.TakesScreenshot;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.testbench.Parameters;
+import com.vaadin.testbench.commands.TestBenchCommands;
+
+/**
+ * Base class which provides functionality for tests which use the automatic
+ * screenshot comparison function.
+ *
+ * @author Vaadin Ltd
+ */
+public abstract class ScreenshotTB3Test extends AbstractTB3Test {
+
+ private String screenshotBaseName;
+
+ @Rule
+ public TestRule watcher = new TestWatcher() {
+
+ @Override
+ protected void starting(org.junit.runner.Description description) {
+ Class<?> testClass = description.getTestClass();
+ // Runner adds [BrowserName] which we do not want to use in the
+ // screenshot name
+ String testMethod = description.getMethodName();
+ testMethod = testMethod.replaceAll("\\[.*\\]", "");
+
+ String className = testClass.getSimpleName();
+ screenshotBaseName = className + "-" + testMethod;
+ };
+ };
+
+ /**
+ * Contains a list of screenshot identifiers for which
+ * {@link #compareScreen(String)} has failed during the test
+ */
+ private List<String> screenshotFailures = new ArrayList<String>();
+
+ /**
+ * Defines TestBench screen comparison parameters before each test run
+ */
+ @Before
+ public void setupScreenComparisonParameters() {
+ Parameters.setScreenshotErrorDirectory(getScreenshotErrorDirectory());
+ Parameters
+ .setScreenshotReferenceDirectory(getScreenshotReferenceDirectory());
+ }
+
+ /**
+ * Grabs a screenshot and compares with the reference image with the given
+ * identifier. Supports alternative references and will succeed if the
+ * screenshot matches at least one of the references.
+ *
+ * In case of a failed comparison this method stores the grabbed screenshots
+ * in the error directory as defined by
+ * {@link #getScreenshotErrorDirectory()}. It will also generate a html file
+ * in the same directory, comparing the screenshot with the first found
+ * reference.
+ *
+ * @param identifier
+ * @throws IOException
+ */
+ protected void compareScreen(String identifier) throws IOException {
+ if (identifier == null || identifier.isEmpty()) {
+ throw new IllegalArgumentException("Empty identifier not supported");
+ }
+
+ File mainReference = getScreenshotReferenceFile(identifier);
+
+ List<File> alternativeFiles = findReferenceAlternatives(mainReference);
+ List<File> failedReferenceAlternatives = new ArrayList<File>();
+
+ for (File file : alternativeFiles) {
+ if (testBench(driver).compareScreen(file)) {
+ break;
+ } else {
+ failedReferenceAlternatives.add(file);
+ }
+ }
+
+ File referenceToKeep = null;
+ if (failedReferenceAlternatives.size() != alternativeFiles.size()) {
+ // Matched one comparison but not all, remove all error images +
+ // HTML files
+ } else {
+ // Ensure we use the correct browser version (e.g. if running IE11
+ // and only an IE 10 reference was available, then mainReference
+ // will be for IE 10, not 11)
+ String originalName = getScreenshotReferenceName(identifier);
+ File exactVersionFile = new File(originalName);
+
+ if (!exactVersionFile.equals(mainReference)) {
+ // Rename png+html to have the correct version
+ File correctPng = getErrorFileFromReference(exactVersionFile);
+ File producedPng = getErrorFileFromReference(mainReference);
+ File correctHtml = htmlFromPng(correctPng);
+ File producedHtml = htmlFromPng(producedPng);
+
+ producedPng.renameTo(correctPng);
+ producedHtml.renameTo(correctHtml);
+ referenceToKeep = exactVersionFile;
+ screenshotFailures.add(exactVersionFile.getName());
+ } else {
+ // All comparisons failed, keep the main error image + HTML
+ screenshotFailures.add(mainReference.getName());
+ referenceToKeep = mainReference;
+ }
+ }
+
+ // Remove all PNG/HTML files we no longer need (failed alternative
+ // references or all error files (PNG/HTML) if comparison succeeded)
+ for (File failedAlternative : failedReferenceAlternatives) {
+ File failurePng = getErrorFileFromReference(failedAlternative);
+ if (failedAlternative != referenceToKeep) {
+ // Delete png + HTML
+ File failureHtml = htmlFromPng(failurePng);
+
+ failurePng.delete();
+ failureHtml.delete();
+ }
+ }
+ }
+
+ /**
+ * Returns a new File which points to a .html file instead of the given .png
+ * file
+ *
+ * @param png
+ * @return
+ */
+ private static File htmlFromPng(File png) {
+ return new File(png.getParentFile(), png.getName().replaceAll(
+ "\\.png$", ".png.html"));
+ }
+
+ /**
+ *
+ * @param referenceFile
+ * The reference image file (in the directory defined by
+ * {@link #getScreenshotReferenceDirectory()})
+ * @return the file name of the file generated in the directory defined by
+ * {@link #getScreenshotErrorDirectory()} if comparison with the
+ * given reference image fails.
+ */
+ private File getErrorFileFromReference(File referenceFile) {
+ return new File(referenceFile.getAbsolutePath().replace(
+ getScreenshotReferenceDirectory(),
+ getScreenshotErrorDirectory()));
+ }
+
+ /**
+ * Finds alternative references for the given files
+ *
+ * @param reference
+ * @return all references which should be considered when comparing with the
+ * given files, including the given reference
+ */
+ private List<File> findReferenceAlternatives(File reference) {
+ List<File> files = new ArrayList<File>();
+ files.add(reference);
+
+ File screenshotDir = reference.getParentFile();
+ String name = reference.getName();
+ // Remove ".png"
+ String nameBase = name.substring(0, name.length() - 4);
+ for (int i = 1;; i++) {
+ File file = new File(screenshotDir, nameBase + "_" + i + ".png");
+ if (file.exists()) {
+ files.add(file);
+ } else {
+ break;
+ }
+ }
+
+ return files;
+ }
+
+ /**
+ * @param testName
+ * @return the reference file name to use for the given browser, as
+ * described by {@literal capabilities}, and identifier
+ */
+ private File getScreenshotReferenceFile(String identifier) {
+ DesiredCapabilities capabilities = getDesiredCapabilities();
+
+ String originalName = getScreenshotReferenceName(identifier);
+ File exactVersionFile = new File(originalName);
+ if (exactVersionFile.exists()) {
+ return exactVersionFile;
+ }
+
+ String browserVersion = capabilities.getVersion();
+
+ if (browserVersion.matches("\\d+")) {
+ for (int version = Integer.parseInt(browserVersion); version > 0; version--) {
+ String fileName = getScreenshotReferenceName(identifier,
+ version);
+ File oldVersionFile = new File(fileName);
+ if (oldVersionFile.exists()) {
+ return oldVersionFile;
+ }
+ }
+ }
+
+ return exactVersionFile;
+ }
+
+ /**
+ * @return the base directory of 'reference' and 'errors' screenshots
+ */
+ protected abstract String getScreenshotDirectory();
+
+ /**
+ * @return the directory where reference images are stored (the 'reference'
+ * folder inside the screenshot directory)
+ */
+ private String getScreenshotReferenceDirectory() {
+ return getScreenshotDirectory() + "/reference";
+ }
+
+ /**
+ * @return the directory where comparison error images should be created
+ * (the 'errors' folder inside the screenshot directory)
+ */
+ private String getScreenshotErrorDirectory() {
+ return getScreenshotDirectory() + "/errors";
+ }
+
+ /**
+ * Checks if any screenshot comparisons failures occurred during the test
+ * and combines all comparison errors into one exception
+ *
+ * @throws IOException
+ * If there were failures during the test
+ */
+ @After
+ public void checkCompareFailures() throws IOException {
+ if (!screenshotFailures.isEmpty()) {
+ throw new IOException(
+ "The following screenshots did not match the reference: "
+ + screenshotFailures.toString());
+ }
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.vaadin.tests.tb3.AbstractTB3Test#onUncaughtException(java.lang.Throwable
+ * )
+ */
+ @Override
+ public void onUncaughtException(Throwable cause) {
+ super.onUncaughtException(cause);
+ // Grab a "failure" screenshot and store in the errors folder for later
+ // analysis
+ try {
+ TestBenchCommands testBench = testBench();
+ if (testBench != null) {
+ testBench.disableWaitForVaadin();
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ try {
+ if (driver != null) {
+ BufferedImage screenshotImage = ImageIO
+ .read(new ByteArrayInputStream(
+ ((TakesScreenshot) driver)
+ .getScreenshotAs(OutputType.BYTES)));
+ ImageIO.write(screenshotImage, "png", new File(
+ getScreenshotFailureName()));
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+
+ }
+
+ /**
+ * @return the name of a "failure" image which is stored in the folder
+ * defined by {@link #getScreenshotErrorDirectory()} when the test
+ * fails
+ */
+ private String getScreenshotFailureName() {
+ return getScreenshotErrorBaseName() + "-failure.png";
+ }
+
+ /**
+ * @return the base name used for screenshots. This is the first part of the
+ * screenshot file name, typically created as "testclass-testmethod"
+ */
+ public String getScreenshotBaseName() {
+ return screenshotBaseName;
+ }
+
+ /**
+ * Returns the name of the reference file based on the given parameters.
+ *
+ * @param testName
+ * @param capabilities
+ * @param identifier
+ * @return the full path of the reference
+ */
+ private String getScreenshotReferenceName(String identifier) {
+ return getScreenshotReferenceName(identifier, null);
+ }
+
+ /**
+ * Returns the name of the reference file based on the given parameters. The
+ * version given in {@literal capabilities} is used unless it is overridden
+ * by the {@literal versionOverride} parameter.
+ *
+ * @param testName
+ * @param capabilities
+ * @param identifier
+ * @return the full path of the reference
+ */
+ private String getScreenshotReferenceName(String identifier,
+ Integer versionOverride) {
+ String uniqueBrowserIdentifier;
+ if (versionOverride == null) {
+ uniqueBrowserIdentifier = BrowserUtil
+ .getUniqueIdentifier(getDesiredCapabilities());
+ } else {
+ uniqueBrowserIdentifier = BrowserUtil.getUniqueIdentifier(
+ getDesiredCapabilities(), "" + versionOverride);
+ }
+
+ // WindowMaximizeRestoreTest_Windows_InternetExplorer_8_window-1-moved-maximized-restored.png
+ return getScreenshotReferenceDirectory() + "/"
+ + getScreenshotBaseName() + "_" + uniqueBrowserIdentifier + "_"
+ + identifier + ".png";
+ }
+
+ /**
+ * Returns the base name of the screenshot in the error directory. This is a
+ * name so that all files matching {@link #getScreenshotErrorBaseName()}*
+ * are owned by this test instance (taking into account
+ * {@link #getDesiredCapabilities()}) and can safely be removed before
+ * running this test.
+ */
+ private String getScreenshotErrorBaseName() {
+ return getScreenshotReferenceName("dummy", null).replace(
+ getScreenshotReferenceDirectory(),
+ getScreenshotErrorDirectory()).replace("_dummy.png", "");
+ }
+
+ /**
+ * Removes any old screenshots related to this test from the errors
+ * directory before running the test
+ */
+ @Before
+ public void cleanErrorDirectory() {
+ // Remove any screenshots for this test from the error directory
+ // before running it. Leave unrelated files as-is
+ File errorDirectory = new File(getScreenshotErrorDirectory());
+
+ // Create errors directory if it does not exist
+ if (!errorDirectory.exists()) {
+ errorDirectory.mkdirs();
+ }
+
+ final String errorBase = getScreenshotErrorBaseName()
+ .replace("\\", "/");
+ File[] files = errorDirectory.listFiles(new FileFilter() {
+
+ @Override
+ public boolean accept(File pathname) {
+ String thisFile = pathname.getAbsolutePath().replace("\\", "/");
+ if (thisFile.startsWith(errorBase)) {
+ return true;
+ }
+ return false;
+ }
+ });
+ for (File f : files) {
+ f.delete();
+ }
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/tb3/ServletIntegrationTests.java b/uitest/src/com/vaadin/tests/tb3/ServletIntegrationTests.java
new file mode 100644
index 0000000000..c511b99e6e
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/ServletIntegrationTests.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.tb3;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.model.InitializationError;
+
+import com.vaadin.tests.integration.AbstractServletIntegrationTest;
+import com.vaadin.tests.tb3.ServletIntegrationTests.ServletIntegrationTestSuite;
+
+@RunWith(ServletIntegrationTestSuite.class)
+public class ServletIntegrationTests {
+
+ public static class ServletIntegrationTestSuite extends TB3TestSuite {
+ public ServletIntegrationTestSuite(Class<?> klass)
+ throws InitializationError {
+ super(klass, AbstractServletIntegrationTest.class,
+ "com.vaadin.tests.integration", new String[] {});
+ }
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/tb3/TB3Runner.java b/uitest/src/com/vaadin/tests/tb3/TB3Runner.java
new file mode 100644
index 0000000000..4e084ab0ed
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/TB3Runner.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.tb3;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.junit.Test;
+import org.junit.runners.BlockJUnit4ClassRunner;
+import org.junit.runners.Parameterized;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.Statement;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.tests.tb3.AbstractTB3Test.BrowserUtil;
+
+/**
+ * This runner is loosely based on FactoryTestRunner by Ted Young
+ * (http://tedyoung.me/2011/01/23/junit-runtime-tests-custom-runners/). The
+ * generated test names give information about the parameters used (unlike
+ * {@link Parameterized}).
+ *
+ * @since 7.1
+ */
+public class TB3Runner extends BlockJUnit4ClassRunner {
+
+ /**
+ * This is the total limit of actual JUnit test instances run in parallel
+ */
+ private static final int MAX_CONCURRENT_TESTS = 50;
+
+ /**
+ * This is static so it is shared by all tests running concurrently on the
+ * same machine and thus can limit the number of threads in use.
+ */
+ private static final ExecutorService service = Executors
+ .newFixedThreadPool(MAX_CONCURRENT_TESTS);
+
+ public TB3Runner(Class<?> klass) throws InitializationError {
+ super(klass);
+ setScheduler(new ParallelScheduler(service));
+ }
+
+ @Override
+ protected List<FrameworkMethod> computeTestMethods() {
+ List<FrameworkMethod> tests = new LinkedList<FrameworkMethod>();
+
+ if (!AbstractTB3Test.class.isAssignableFrom(getTestClass()
+ .getJavaClass())) {
+ throw new RuntimeException(getClass().getName() + " only supports "
+ + AbstractTB3Test.class.getName());
+ }
+
+ try {
+ AbstractTB3Test testClassInstance = (AbstractTB3Test) getTestClass()
+ .getOnlyConstructor().newInstance();
+ Collection<DesiredCapabilities> desiredCapabilites = testClassInstance
+ .getBrowsersToTest();
+ if (testClassInstance.runLocally()) {
+ desiredCapabilites = new ArrayList<DesiredCapabilities>();
+ desiredCapabilites.add(BrowserUtil
+ .firefox(MultiBrowserTest.TESTED_FIREFOX_VERSION));
+ }
+ for (DesiredCapabilities capabilities : desiredCapabilites) {
+
+ // Find any methods marked with @Test.
+ for (FrameworkMethod m : getTestClass().getAnnotatedMethods(
+ Test.class)) {
+ tests.add(new TB3Method(m.getMethod(), capabilities));
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("Error retrieving browsers to run on", e);
+ }
+
+ return tests;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.junit.runners.BlockJUnit4ClassRunner#withBefores(org.junit.runners
+ * .model.FrameworkMethod, java.lang.Object,
+ * org.junit.runners.model.Statement)
+ */
+ @Override
+ protected Statement withBefores(final FrameworkMethod method,
+ final Object target, Statement statement) {
+ if (!(method instanceof TB3Method)) {
+ throw new RuntimeException("Unexpected method type "
+ + method.getClass().getName() + ", expected TB3Method");
+ }
+ final TB3Method tb3method = (TB3Method) method;
+
+ // setDesiredCapabilities before running the real @Befores (which use
+ // capabilities)
+
+ final Statement realBefores = super.withBefores(method, target,
+ statement);
+ return new Statement() {
+
+ @Override
+ public void evaluate() throws Throwable {
+ ((AbstractTB3Test) target)
+ .setDesiredCapabilities(tb3method.capabilities);
+ try {
+ realBefores.evaluate();
+ } catch (Throwable t) {
+ // Give the test a chance to e.g. produce an error
+ // screenshot before failing the test by re-throwing the
+ // exception
+ ((AbstractTB3Test) target).onUncaughtException(t);
+ throw t;
+ }
+ }
+ };
+ }
+
+ private static class TB3Method extends FrameworkMethod {
+ private DesiredCapabilities capabilities;
+
+ public TB3Method(Method method, DesiredCapabilities capabilities) {
+ super(method);
+ this.capabilities = capabilities;
+ }
+
+ @Override
+ public Object invokeExplosively(final Object target, Object... params)
+ throws Throwable {
+ // Executes the test method with the supplied parameters
+ return super.invokeExplosively(target);
+ }
+
+ @Override
+ public String getName() {
+ return String.format("%s[%s]", getMethod().getName(),
+ BrowserUtil.getUniqueIdentifier(capabilities));
+ }
+
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/tb3/TB3TestSuite.java b/uitest/src/com/vaadin/tests/tb3/TB3TestSuite.java
new file mode 100644
index 0000000000..e1c8edfd60
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/TB3TestSuite.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.tb3;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Modifier;
+import java.net.JarURLConnection;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.jar.JarEntry;
+
+import org.junit.runners.Suite;
+import org.junit.runners.model.InitializationError;
+
+/**
+ * Test suite which consists of all the TB3 tests passed in the constructor.
+ * Runs the tests in parallel using a {@link ParallelScheduler}
+ *
+ * @author Vaadin Ltd
+ */
+public class TB3TestSuite extends Suite {
+
+ /**
+ * This only restricts the number of test suites running concurrently. The
+ * number of tests to run concurrently are configured in {@link TB3Runner}.
+ */
+ private static final int MAX_CONCURRENT_TEST_SUITES = 20;
+
+ /**
+ * This is static so it is shared by all test suites running concurrently on
+ * the same machine and thus can limit the number of threads in use.
+ */
+ private final ExecutorService service = Executors
+ .newFixedThreadPool(MAX_CONCURRENT_TEST_SUITES);
+
+ public TB3TestSuite(Class<?> klass,
+ Class<? extends AbstractTB3Test> baseClass, String basePackage,
+ String[] ignorePackages) throws InitializationError {
+ super(klass, findTests(baseClass, basePackage, ignorePackages));
+ setScheduler(new ParallelScheduler(service));
+ }
+
+ /**
+ * Traverses the directory on the classpath (inside or outside a Jar file)
+ * specified by 'basePackage'. Collects all classes inside the location
+ * which can be assigned to 'baseClass' except for classes inside packages
+ * listed in 'ignoredPackages'.
+ *
+ * @param baseClass
+ * @param basePackage
+ * @param ignorePackages
+ * @return
+ */
+ private static Class<?>[] findTests(
+ Class<? extends AbstractTB3Test> baseClass, String basePackage,
+ String[] ignorePackages) {
+ try {
+ List<?> l = findClasses(baseClass, basePackage, ignorePackages);
+ return l.toArray(new Class[] {});
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * Traverses the directory on the classpath (inside or outside a Jar file)
+ * specified by 'basePackage'. Collects all classes inside the location
+ * which can be assigned to 'baseClass' except for classes inside packages
+ * listed in 'ignoredPackages'.
+ *
+ * @param baseClass
+ * @param basePackage
+ * @param ignoredPackages
+ * @return
+ * @throws IOException
+ */
+ private static <T> List<Class<? extends T>> findClasses(Class<T> baseClass,
+ String basePackage, String[] ignoredPackages) throws IOException {
+ List<Class<? extends T>> classes = new ArrayList<Class<? extends T>>();
+ String basePackageDirName = "/" + basePackage.replace('.', '/');
+ URL location = baseClass.getResource(basePackageDirName);
+ if (location.getProtocol().equals("file")) {
+ try {
+ File f = new File(location.toURI());
+ if (!f.exists()) {
+ throw new IOException("Directory " + f.toString()
+ + " does not exist");
+ }
+ findPackages(f, basePackage, baseClass, classes,
+ ignoredPackages);
+ } catch (URISyntaxException e) {
+ throw new IOException(e.getMessage());
+ }
+ } else if (location.getProtocol().equals("jar")) {
+ JarURLConnection juc = (JarURLConnection) location.openConnection();
+ findClassesInJar(juc, basePackage, baseClass, classes);
+ }
+
+ Collections.sort(classes, new Comparator<Class<? extends T>>() {
+
+ @Override
+ public int compare(Class<? extends T> o1, Class<? extends T> o2) {
+ return o1.getName().compareTo(o2.getName());
+ }
+
+ });
+ return classes;
+ }
+
+ /**
+ * Traverses the given directory and collects all classes which are inside
+ * the given 'javaPackage' and can be assigned to the given 'baseClass'. The
+ * found classes are added to 'result'.
+ *
+ * @param parent
+ * The directory to traverse
+ * @param javaPackage
+ * The java package which 'parent' contains
+ * @param baseClass
+ * The class which the target classes extend
+ * @param result
+ * The collection to which found classes are added
+ * @param ignoredPackages
+ * A collection of packages (including sub packages) to ignore
+ */
+ private static <T> void findPackages(File parent, String javaPackage,
+ Class<T> baseClass, Collection<Class<? extends T>> result,
+ String[] ignoredPackages) {
+ for (String ignoredPackage : ignoredPackages) {
+ if (javaPackage.equals(ignoredPackage)) {
+ return;
+ }
+ }
+
+ for (File file : parent.listFiles()) {
+ if (file.isDirectory()) {
+ findPackages(file, javaPackage + "." + file.getName(),
+ baseClass, result, ignoredPackages);
+ } else if (file.getName().endsWith(".class")) {
+ String fullyQualifiedClassName = javaPackage + "."
+ + file.getName().replace(".class", "");
+ addClassIfMatches(result, fullyQualifiedClassName, baseClass);
+ }
+ }
+
+ }
+
+ /**
+ * Traverses a Jar file using the given connection and collects all classes
+ * which are inside the given 'javaPackage' and can be assigned to the given
+ * 'baseClass'. The found classes are added to 'result'.
+ *
+ * @param javaPackage
+ * The java package containing the classes (classes may be in a
+ * sub package)
+ * @param baseClass
+ * The class which the target classes extend
+ * @param result
+ * The collection to which found classes are added
+ * @throws IOException
+ */
+ private static <T> void findClassesInJar(JarURLConnection juc,
+ String javaPackage, Class<T> baseClass,
+ Collection<Class<? extends T>> result) throws IOException {
+ String javaPackageDir = javaPackage.replace('.', '/');
+ Enumeration<JarEntry> ent = juc.getJarFile().entries();
+ while (ent.hasMoreElements()) {
+ JarEntry e = ent.nextElement();
+ if (e.getName().endsWith(".class")
+ && e.getName().startsWith(javaPackageDir)) {
+ String fullyQualifiedClassName = e.getName().replace('/', '.')
+ .replace(".class", "");
+ addClassIfMatches(result, fullyQualifiedClassName, baseClass);
+ }
+ }
+ }
+
+ /**
+ * Verifies that the class represented by 'fullyQualifiedClassName' can be
+ * loaded, assigned to 'baseClass' and is not an abstract or anonymous
+ * class.
+ *
+ * @param result
+ * The collection to add to
+ * @param fullyQualifiedClassName
+ * The candidate class
+ * @param baseClass
+ * The class 'fullyQualifiedClassName' should be assignable to
+ */
+ @SuppressWarnings("unchecked")
+ private static <T> void addClassIfMatches(
+ Collection<Class<? extends T>> result,
+ String fullyQualifiedClassName, Class<T> baseClass) {
+ try {
+ // Try to load the class
+
+ Class<?> c = Class.forName(fullyQualifiedClassName);
+ if (!baseClass.isAssignableFrom(c)) {
+ return;
+ }
+ if (!Modifier.isAbstract(c.getModifiers()) && !c.isAnonymousClass()) {
+ result.add((Class<? extends T>) c);
+ }
+ } catch (Exception e) {
+ // Could ignore that class cannot be loaded
+ e.printStackTrace();
+ } catch (LinkageError e) {
+ // Ignore. Client side classes will at least throw LinkageErrors
+ }
+
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/tb3/WebsocketTest.java b/uitest/src/com/vaadin/tests/tb3/WebsocketTest.java
new file mode 100644
index 0000000000..26fef667cd
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/WebsocketTest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+/**
+ *
+ */
+package com.vaadin.tests.tb3;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+/**
+ * A {@link MultiBrowserTest} which restricts the tests to the browsers which
+ * support websocket
+ *
+ * @author Vaadin Ltd
+ */
+public abstract class WebsocketTest extends PrivateTB3Configuration {
+ private static List<DesiredCapabilities> websocketBrowsers = new ArrayList<DesiredCapabilities>();
+ static {
+ websocketBrowsers.addAll(MultiBrowserTest.getAllBrowsers());
+ websocketBrowsers.remove(BrowserUtil.ie(8));
+ websocketBrowsers.remove(BrowserUtil.ie(9));
+ }
+
+ /**
+ * @return All supported browsers which are actively tested and support
+ * websockets
+ */
+ public static List<DesiredCapabilities> getWebsocketBrowsers() {
+ return Collections.unmodifiableList(websocketBrowsers);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.tb3.AbstractTB3Test#getBrowserToRunOn()
+ */
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ return new ArrayList<DesiredCapabilities>(getWebsocketBrowsers());
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/tickets/Ticket12727.java b/uitest/src/com/vaadin/tests/tickets/Ticket12727.java
new file mode 100644
index 0000000000..40711c6b7f
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tickets/Ticket12727.java
@@ -0,0 +1,51 @@
+package com.vaadin.tests.tickets;
+
+import java.util.ArrayList;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.ListSelect;
+import com.vaadin.ui.Panel;
+import com.vaadin.ui.UI;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ * Test for #12727: Panels get unnecessary scroll bars in WebKit when content is
+ * 100% wide.
+ */
+@SuppressWarnings("serial")
+public class Ticket12727 extends UI {
+
+ @Override
+ protected void init(VaadinRequest request) {
+ Panel panel = new Panel();
+
+ VerticalLayout content = new VerticalLayout();
+ panel.setContent(content);
+
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.setHeight(null);
+ gridLayout.setWidth(100, Unit.PERCENTAGE);
+ content.addComponent(gridLayout);
+
+ ListSelect listSelect = new ListSelect();
+
+ listSelect.setWidth(100, Unit.PERCENTAGE);
+ listSelect.setHeight(500, Unit.PIXELS);
+
+ gridLayout.addComponent(listSelect);
+
+ ArrayList<String> values = new ArrayList<String>();
+ values.add("Value 1");
+ values.add("Value 2");
+ values.add("Value 3");
+
+ ComboBox comboBox = new ComboBox(null, values);
+ gridLayout.addComponent(comboBox);
+
+ gridLayout.setMargin(true);
+
+ setContent(panel);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/util/LoremIpsum.java b/uitest/src/com/vaadin/tests/util/LoremIpsum.java
index 3dc775badf..c3eec32fd5 100644
--- a/uitest/src/com/vaadin/tests/util/LoremIpsum.java
+++ b/uitest/src/com/vaadin/tests/util/LoremIpsum.java
@@ -4,6 +4,15 @@ public class LoremIpsum {
private static final String LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lacinia sollicitudin neque, vitae cursus eros scelerisque sit amet. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin sollicitudin tempus lorem, sed consectetur nibh ultrices nec. Ut tempus laoreet dolor non molestie. Quisque consectetur tellus ut tortor imperdiet semper. In tempor odio eu metus hendrerit pharetra. Aliquam erat volutpat. Aliquam erat volutpat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec sit amet turpis facilisis ipsum cursus viverra ut vitae turpis. Integer tincidunt sem id sem tristique a laoreet eros euismod. Ut quis leo vel neque pellentesque ullamcorper. Aliquam at fermentum justo. Sed eget laoreet elit. Pellentesque commodo dui quis metus ornare bibendum. Ut tempus, ipsum in euismod scelerisque, augue ante lacinia sem, scelerisque imperdiet felis lectus rhoncus felis.Fusce vitae nisl lorem, id ultricies massa. Phasellus augue eros, dapibus vel fermentum non, sodales id mi. Nulla tincidunt diam a justo ultricies vestibulum nec sed tellus. Morbi faucibus leo et odio condimentum at porttitor diam auctor. Aenean volutpat lacinia mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean malesuada ullamcorper elit ut eleifend. Etiam tempor, mauris id aliquet tempor, erat felis rutrum eros, a aliquam dolor nunc nec enim. Sed enim dolor, tristique ut tempus vitae, elementum at velit. Duis vulputate ultricies risus, ac gravida erat tincidunt posuere. Pellentesque dapibus tincidunt rhoncus. Phasellus eleifend molestie eros. Praesent id imperdiet urna. Etiam fermentum interdum quam, in tempus quam condimentum at.Curabitur eget ultrices augue. Suspendisse potenti. Nam hendrerit, dolor eget adipiscing lobortis, enim risus dignissim orci, a imperdiet tellus nulla id nibh. Praesent eu dui sit amet nulla interdum dignissim vel quis ante. Sed a lectus metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus eget ultrices neque. Cras adipiscing condimentum justo adipiscing consequat. In accumsan mollis sapien ut euismod. Nulla sodales pulvinar leo, nec condimentum leo vestibulum ut. Phasellus risus metus, aliquet quis porta at, imperdiet vitae metus. Proin nec odio odio. Quisque nec elit id lacus iaculis ullamcorper sit amet vel ipsum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In non lacus sed libero euismod rhoncus. Suspendisse augue massa, ullamcorper at accumsan at, porttitor ac odio.Morbi imperdiet, lectus vehicula eleifend ornare, lectus arcu ullamcorper augue, a imperdiet eros augue id justo. Integer eget pretium lorem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vehicula leo eget metus consectetur viverra. Nullam a mi nisl, in lacinia metus. Curabitur mollis eleifend augue, consectetur imperdiet velit sagittis aliquet. In tempor tempor orci eu faucibus. Mauris nisi neque, vulputate eu dignissim eget, aliquet sed nibh. Mauris rhoncus elit eget lectus dignissim bibendum. Phasellus sed nunc lacus, nec aliquet elit. Fusce blandit, sem vitae gravida elementum, sem orci porttitor eros, id porta tortor massa ut velit. Nulla pretium mi at tortor porttitor sollicitudin.Ut gravida est at lectus eleifend non ultrices ligula blandit. Sed purus lectus, adipiscing ut mollis vel, interdum quis diam. Phasellus eget nibh augue. Fusce justo felis, facilisis in auctor ut, cursus et enim. Praesent hendrerit venenatis elit, iaculis cursus ligula auctor in. Proin mollis malesuada dolor at elementum. Maecenas sit amet leo odio. Integer ac enim in justo eleifend dapibus. Pellentesque consequat, libero congue sagittis pulvinar, odio eros porta quam, et aliquet dolor turpis non lacus. Sed eu risus nunc. Aliquam tempus nulla a purus auctor mattis. Nullam adipiscing nisl nec purus porttitor rutrum. Sed pellentesque tincidunt posuere. Nulla varius cursus eros. Phasellus vel neque at metus tempus placerat laoreet ac dolor. Nulla faucibus leo nisi, vel placerat lectus.Donec non leo lacinia metus euismod dignissim suscipit ut neque. Donec iaculis, lacus ut luctus bibendum, mi libero tristique sem, vel consectetur risus ligula in turpis. Nulla lorem justo, porttitor non sollicitudin at, pharetra non ante. Phasellus tristique, purus at luctus auctor, nisl neque congue lacus, eget convallis mauris libero sit amet arcu. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tellus quam, lobortis vitae commodo id, ultrices a augue. Nam tellus erat, varius vel iaculis et, fermentum ut tellus. Donec id urna orci. Curabitur eleifend hendrerit libero, id tempor dolor faucibus eu. Quisque aliquam sapien a tortor mollis sollicitudin. Duis augue erat, sagittis eget consequat vel, volutpat et augue. Sed vehicula mattis nisi, non porta elit imperdiet vitae. Curabitur scelerisque mollis lectus, consequat suscipit est ultricies sit amet. Aenean in sem libero, id adipiscing urna. Aenean eleifend posuere lorem in aliquet. Praesent arcu est, tristique quis adipiscing ac, tincidunt nec dui. Nunc sed leo quis justo posuere suscipit. Fusce vitae lectus vitae urna sodales aliquam.Sed velit purus, ullamcorper non interdum quis, facilisis eget tortor. Etiam vestibulum venenatis aliquet. Fusce felis felis, venenatis id tincidunt at, vehicula et erat. Curabitur eu sagittis nisl. Curabitur nisi sapien, venenatis nec pulvinar ut, tempor id diam. Suspendisse metus libero, placerat in fermentum a, aliquam id arcu. Nulla quis accumsan massa. Curabitur consectetur pulvinar sapien non consequat. Etiam sem dolor, posuere id laoreet a, tempor vel nisl. Fusce eu lacus orci. Pellentesque tellus dui, pulvinar nec egestas vitae, adipiscing euismod nunc. Mauris consequat felis sit amet justo pellentesque venenatis. Donec dignissim porta dolor, eget pellentesque lorem porta eu. Donec eget enim eu leo mattis ornare in ut libero. Maecenas sit amet ante mauris.Praesent ultrices diam id lectus viverra sed lobortis risus adipiscing. Nulla in risus est. Proin vitae dolor ligula, a placerat enim. Integer hendrerit erat tincidunt leo malesuada sit amet tincidunt justo mattis. Morbi ut neque urna, ut blandit erat. Donec eleifend justo ac augue ultrices consectetur. In rutrum, leo ac porttitor volutpat, neque mi lacinia diam, id fermentum risus neque vitae risus. Suspendisse in justo libero, eget ultrices nisl. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sollicitudin, arcu et convallis fermentum, est tellus pellentesque neque, ac faucibus tellus orci non purus. Ut aliquet facilisis ullamcorper. Cras justo ipsum, mollis vel ultricies non, consectetur a libero.Aliquam erat volutpat. Nunc ut mauris eu lorem consequat placerat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse sapien nisi, pellentesque ut porttitor eget, auctor vitae massa. Fusce et euismod massa. In dolor enim, commodo vitae scelerisque sit amet, vulputate quis nibh. Donec ut mollis elit. Nullam placerat sem at urna euismod tempus vitae a mi. Curabitur ac sem non tortor dapibus euismod in et augue. Phasellus elit nisi, ornare eget aliquam et, convallis vitae eros. Vivamus vitae facilisis quam. Nullam a dolor sit amet ante sodales vulputate. Sed vel elit libero. Vestibulum vestibulum porttitor orci, a elementum risus congue in. Mauris ut justo sed dolor rhoncus viverra nec non eros. Phasellus dignissim, mi id laoreet venenatis, enim lacus pharetra arcu, sit amet consectetur velit elit hendrerit arcu. Integer hendrerit suscipit pretium. Proin orci quam, vehicula vel accumsan tempor, facilisis tempus tortor.Etiam et nunc id odio lobortis ornare ac eget lorem. Proin tristique iaculis felis, ut gravida lacus congue ut. Etiam nibh turpis, congue vel ornare ut, feugiat ut mi. Etiam id ante eget turpis laoreet dapibus. Vivamus accumsan sem at est lacinia sagittis vitae a erat. Etiam mollis justo et felis faucibus sodales. Etiam placerat felis sed ante sollicitudin dignissim. Nunc fringilla nunc in lacus ultricies rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed venenatis porta turpis dignissim tempor. Etiam consequat vulputate elementum. Sed augue lacus, aliquam eu ornare vel, aliquam at turpis.Ut lacinia velit odio. Nulla sapien tellus, fringilla dignissim porta sed, elementum eget diam. Quisque pulvinar commodo massa, vitae lobortis velit iaculis id. Vestibulum id dolor vel mauris auctor commodo id at odio. Suspendisse consectetur consequat erat. Aliquam in purus at sem pretium ultricies. In urna elit, porttitor vel gravida at, varius non nisi. Nullam id eros at lorem posuere ullamcorper eget in dui. Sed sit amet mi vel quam vestibulum imperdiet. Ut ullamcorper purus nibh, a commodo tortor. Phasellus pretium, nulla ut venenatis euismod, augue arcu volutpat nulla, id semper est purus eget urna. Vivamus pharetra diam ac ante cursus tempus.Cras in rhoncus felis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In semper leo sit amet nisi rutrum et interdum odio fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras sollicitudin dui non risus iaculis a lobortis odio consequat. Sed consectetur nisl eu nisi pulvinar fermentum. Etiam placerat tincidunt pellentesque. Etiam luctus auctor nulla ac pulvinar. Pellentesque sit amet eros est. Sed hendrerit sem rhoncus purus rhoncus ullamcorper. Integer vitae commodo sem. Donec orci lectus, gravida sit amet viverra ut, suscipit eu odio. Vivamus ac dolor sit amet augue porttitor imperdiet nec quis mauris. Etiam luctus pharetra lectus sed mattis. Proin tincidunt ultricies dolor, at sagittis ante tincidunt ac.Morbi sit amet sem ut leo ornare luctus at sed odio. Donec vestibulum consequat consectetur. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Integer sit amet leo eget ipsum eleifend commodo et vel sapien. Donec vulputate facilisis nisi in bibendum. Vestibulum justo magna, mollis in varius a, malesuada id nisl. Vestibulum fermentum leo at ipsum euismod scelerisque. Donec id diam eget sapien varius ultricies. Quisque mollis vehicula lorem, vitae suscipit lorem gravida vel. Cras ipsum odio, pellentesque vitae molestie at, facilisis eget felis. Morbi gravida velit eget ante posuere id pharetra dolor vehicula. Praesent lectus sem, pretium sit amet eleifend non, ultricies vitae eros.Etiam consequat felis quis elit semper sed lobortis risus faucibus. Quisque diam ante, gravida ut mollis tristique, auctor ac mauris. Phasellus vestibulum sapien et justo sagittis sed dignissim dui sollicitudin. Maecenas egestas quam et odio mattis eu posuere est sagittis. Nulla nec posuere turpis. In mauris sapien, pharetra et placerat eu, dictum quis justo. Curabitur sit amet varius nulla. Cras feugiat erat quis ante aliquam blandit. In ac libero id massa dapibus ultrices. Donec non massa orci.In gravida justo vitae eros ultrices fringilla. Sed mi quam, lobortis eu pharetra nec, pulvinar eu justo. Sed ornare diam sed nulla pellentesque at tincidunt lacus cursus. Donec vel neque et urna euismod suscipit. Proin in tortor eget felis euismod ultrices. Nunc ut orci elit, vitae pellentesque ligula. Vivamus in mi felis, at congue nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi mattis, ligula id sollicitudin posuere, eros odio pellentesque felis, in auctor libero mi nec massa. Praesent fringilla pretium tempus. Sed quis leo nulla, a pretium mi. Sed malesuada quam eget lorem tristique eget accumsan libero auctor. Vestibulum metus nisl, rutrum vel ullamcorper scelerisque, ultrices cursus purus. Aliquam convallis sollicitudin elit at mattis. Phasellus vitae magna id quam laoreet gravida quis ac metus.Duis lobortis arcu a elit porta laoreet. Pellentesque at condimentum sapien. Maecenas rutrum eleifend quam, eu pellentesque quam tincidunt ac. Vivamus fermentum justo ac dui dapibus ut tempus massa congue. Phasellus fermentum placerat enim, et dignissim mi feugiat in. Etiam odio diam, mollis vitae viverra a, egestas eget arcu. Curabitur purus lectus, accumsan quis lobortis ut, faucibus ac magna. Vivamus consectetur, ligula sit amet convallis rhoncus, risus lorem scelerisque arcu, eu fermentum felis leo sit amet eros. In hac habitasse platea dictumst. Sed congue pretium erat, vel hendrerit velit dapibus ut. Aliquam porta porttitor nunc facilisis pretium. Aliquam tincidunt porttitor tincidunt. Sed at erat a arcu elementum dignissim nec et ipsum. In et magna erat. In hac habitasse platea dictumst. Nulla sit amet enim vitae magna ullamcorper auctor ac id lectus. Fusce id sapien massa.Fusce porta nisl non leo iaculis sed elementum purus viverra. Aenean vitae erat elit. Proin id tincidunt nibh. Fusce faucibus dignissim laoreet. Etiam volutpat ultricies magna in euismod. Quisque luctus malesuada massa, ac ullamcorper dui luctus quis. Mauris a felis ut urna blandit semper egestas vel dui. Nulla facilisi. Ut dapibus bibendum bibendum. Curabitur id facilisis tellus. Vestibulum arcu orci, pretium vestibulum accumsan ut, feugiat eget eros. Mauris dapibus sem a massa ornare id posuere purus ornare. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Phasellus mollis, orci ac eleifend pharetra, risus turpis euismod urna, ut congue neque nunc ut felis. Aliquam a nisi leo. Nulla consequat faucibus ligula consectetur tristique. Duis at lacus orci, eget pulvinar tortor.Aenean nisi justo, dictum ac sagittis a, mollis ut orci. Donec faucibus congue neque ut gravida. Nam interdum nunc vel ipsum molestie elementum. Aliquam a eros non mi accumsan lacinia ut eu justo. Donec id ipsum purus, sed congue nunc. Donec euismod ante quis metus interdum feugiat. Sed nec dictum neque. Vivamus sed felis non lorem placerat facilisis eu sit amet nisi. Morbi dolor dolor, malesuada eu congue at, sollicitudin ut metus. In sit amet ipsum purus, ut dignissim dolor. Pellentesque quis velit velit. Aenean dapibus ipsum eu felis placerat volutpat. Donec auctor dictum ligula ut facilisis. Aliquam vulputate nunc nec diam ultricies auctor dictum dui fringilla. Cras urna metus, porttitor et sodales eu, tempus non mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.Etiam tempor, mi ut tempor adipiscing, nunc lorem gravida odio, scelerisque aliquet ante massa id nibh. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Phasellus eu nisl urna. Quisque vel leo in lorem bibendum bibendum ut eget massa. Morbi dictum, metus eu pellentesque lobortis, augue nisi facilisis velit, sit amet feugiat risus nunc vitae elit. Fusce blandit mi a augue gravida eu tristique sem consequat. Suspendisse non malesuada nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque commodo lorem id ipsum cursus posuere. Proin euismod facilisis est, vel imperdiet lectus commodo blandit. Proin luctus dapibus purus, id vulputate mauris tincidunt vel. Vestibulum volutpat molestie nulla faucibus malesuada. Aenean ut ornare lectus.Maecenas vel mauris in dolor imperdiet gravida eu nec mi. Vestibulum varius sem et nibh aliquet eu posuere tellus luctus. Fusce blandit, odio ut gravida semper, tellus lorem porta felis, vitae posuere mi lorem eget magna. Sed tristique nisi ut ipsum adipiscing molestie. Donec volutpat nunc eget neque posuere aliquam. Vivamus vel sem lectus. In volutpat dictum eros. Curabitur mollis pretium arcu ut rhoncus. Vivamus eros risus, sagittis posuere suscipit sit amet, consectetur eget elit. Mauris porttitor feugiat magna, sed lobortis ante porttitor at. Etiam non enim quam, nec tempus erat. Ut porta pharetra nibh vel laoreet. Sed euismod elit eget sem tempus non sodales massa cursus. Aliquam erat volutpat. Nulla a tortor ornare nibh feugiat venenatis. Mauris interdum mattis odio eget porta. Maecenas ac ullamcorper velit. Nulla id sagittis ligula. Aliquam pharetra, diam ut euismod pellentesque, sapien ligula sagittis nisi, sed dictum dolor purus sit amet elit.Aenean quis metus velit. In at fermentum nunc. Cras in magna sapien, sed vestibulum lacus. Sed pellentesque, massa sed malesuada tincidunt, erat tortor consectetur lacus, vel congue arcu enim id libero. Donec elit neque, egestas a faucibus ut, tempor nec diam. Donec turpis est, vulputate id venenatis vitae, vulputate sit amet elit. Ut semper nibh orci. Fusce nibh nisi, tristique eu dapibus id, faucibus nec augue. Sed sagittis malesuada leo, pretium porttitor ante lacinia in. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.Sed quis libero ante, ac consequat nisl. Cras nisl urna, ultrices eu dapibus sed, pretium quis diam. Curabitur aliquam, dolor et convallis viverra, purus orci commodo neque, a sagittis felis tellus quis mi. In mi orci, tempus ut sodales imperdiet, condimentum ac tortor. Phasellus ornare, tortor eget egestas ultricies, est risus ultricies lorem, ac tempus nibh ligula ac ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fermentum nibh vitae tortor laoreet sed rutrum arcu suscipit. Fusce iaculis nisl in justo pretium a interdum ipsum dignissim. Sed sed semper metus. Aenean ante turpis, fermentum vestibulum dapibus eget, dictum id leo. Nam nec lorem erat.Cras dolor nulla, suscipit nec viverra ac, egestas vitae enim. Quisque vel laoreet sem. Sed non felis at nisl ultricies pharetra vitae a lorem. Suspendisse tempor arcu id massa laoreet congue. Nam eu turpis justo, nec adipiscing tortor. Etiam mattis lorem tincidunt diam molestie semper. Vivamus rutrum est in tortor egestas consequat. Sed vitae ultrices leo. Aenean pulvinar malesuada enim, eget elementum purus bibendum a. Vivamus sit amet mauris mauris, placerat varius lorem. Sed diam tortor, posuere non convallis molestie, dictum quis libero. Nulla quis tellus a nunc semper elementum vel sed odio. Cras ac mattis lectus. Proin placerat imperdiet sodales. Fusce quis magna dolor, eget porttitor lectus. Mauris elementum lorem vitae lectus porta scelerisque nec a sapien. Vivamus dapibus volutpat leo nec vehicula. Praesent ac diam ipsum.Pellentesque nec ullamcorper nulla. Nam lectus dolor, porttitor vitae varius sed, egestas a arcu. Suspendisse malesuada venenatis erat nec consequat. Morbi consequat magna a neque ultrices eget aliquet sapien ultrices. Aenean vel diam ipsum, ac scelerisque dui. Morbi quis arcu neque, eget auctor enim. Etiam pretium est sit amet nunc porta ornare vel quis sapien. Aliquam pulvinar pharetra risus, vel mollis mauris cursus sed. In sagittis nisl ac nunc placerat bibendum. Proin in risus lorem, sed fringilla eros.Proin luctus aliquam metus vitae euismod. Maecenas hendrerit sollicitudin hendrerit. Etiam magna elit, fringilla ut suscipit at, viverra eget ante. Morbi consequat, dui non tristique varius, eros ipsum vulputate sem, eu tristique nibh lacus vel felis. Maecenas eget eros a urna consectetur interdum. Integer est nibh, semper sed feugiat quis, lacinia eget diam. In ultricies mollis lectus sed imperdiet. Proin sed magna nec tortor blandit lacinia in sit amet nibh. Nullam ultrices tempor lacus, vel tincidunt eros vulputate euismod. Praesent justo nibh, convallis ut vehicula consequat, molestie posuere nulla. Mauris sollicitudin egestas vestibulum. Suspendisse auctor imperdiet eros, sit amet dignissim magna dapibus in. Praesent ultrices sem et risus interdum vel pharetra dolor tristique. Proin eleifend nunc eget risus venenatis posuere. Sed est nisi, interdum porta dapibus a, laoreet ac mi. Praesent sit amet varius lectus. Phasellus suscipit lacinia velit, sed tempus odio varius at. Fusce eleifend elementum aliquet. Proin ultricies libero at ipsum condimentum rhoncus.Quisque convallis, arcu at vehicula imperdiet, velit eros posuere sem, sit amet pulvinar purus massa a tellus. Maecenas cursus neque in dolor facilisis ac aliquam ligula eleifend. Fusce quis faucibus nisl. Fusce pulvinar magna vel enim scelerisque id cursus tortor faucibus. Nunc est turpis, iaculis ac sodales non, euismod vitae nunc. Fusce felis purus, iaculis dapibus mollis quis, condimentum consequat eros. Ut a lectus nec mi lacinia fringilla. Donec eget metus lectus, et rhoncus enim. Donec pharetra malesuada enim at rutrum. Vestibulum tincidunt gravida viverra. Vestibulum commodo sem nisl.Vivamus iaculis mollis arcu, quis dapibus risus semper quis. Quisque consectetur ullamcorper arcu id lacinia. Proin non tellus tellus. Nunc vehicula, arcu in pharetra feugiat, ante ante viverra urna, at convallis ligula odio id purus. Morbi quis orci non ante imperdiet luctus. Maecenas et ipsum est, at viverra sem. Morbi placerat ultrices imperdiet. Nullam id arcu at quam mollis hendrerit eu ac lectus. Etiam a neque sed turpis vestibulum posuere. Ut elementum tincidunt nulla at pellentesque. Integer nisl nunc, faucibus non sollicitudin eu, vestibulum ut nulla. In auctor est blandit purus rhoncus et sagittis eros convallis. Mauris sodales ultricies varius. Nulla facilisi. Donec ut nisl nunc, id accumsan erat. Praesent gravida molestie lobortis. In suscipit nisi sed elit sagittis tristique. Pellentesque vitae ante elit. Nullam diam est, ultrices vitae molestie at, tempus et magna. In hac habitasse platea dictumst.Vestibulum id tristique quam. Vivamus dui nulla, pretium eget elementum et, pulvinar a diam. Sed sed arcu sapien, et pharetra nisl. Nunc dignissim, lectus ac fringilla cursus, risus ante pretium justo, nec molestie sem urna id velit. Aenean tincidunt felis sed risus vestibulum ultricies. Aliquam lacinia scelerisque hendrerit. Morbi tincidunt molestie sapien sed faucibus. Vivamus et nisl velit, in semper libero. Duis elementum, dolor eget euismod porttitor, tortor eros tristique risus, eget posuere purus leo venenatis leo. Quisque in elit hendrerit felis accumsan gravida id sed sem.Sed massa turpis, interdum eget adipiscing a, tempor non enim. Vivamus sit amet purus tortor, quis tincidunt nunc. Nam vehicula dolor vitae est bibendum sed condimentum nisl pretium. Aenean pellentesque egestas lacinia. Vestibulum id felis sapien, vestibulum pharetra mauris. Donec quis ligula quis risus ultrices pharetra ac et quam. Nunc aliquam adipiscing mauris id euismod. Suspendisse potenti. Ut pharetra tristique pellentesque. Fusce tristique nisl vitae eros adipiscing lobortis. Ut porttitor porttitor est, vel euismod mi feugiat quis. Sed bibendum lacus vel sem hendrerit a ultricies sapien mattis.Vestibulum a tempus urna. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean tincidunt interdum dui, in accumsan ante placerat non. Aliquam suscipit eros eget quam ullamcorper consequat. Nulla facilisi. Phasellus porttitor interdum quam nec mattis. Etiam vitae diam vel est tempus aliquam eu et tellus. Phasellus lobortis porttitor mi, eu mollis augue tempus eu. Morbi a urna id nibh faucibus dictum. Sed hendrerit fringilla nunc vel elementum. Donec vel massa vitae nibh imperdiet vestibulum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum in velit lorem, eu posuere felis. Maecenas ornare posuere faucibus. Donec dignissim ante eu neque suscipit interdum. Pellentesque ultrices dictum quam, tempor tempus leo posuere eget. Vestibulum dictum interdum urna, at feugiat neque venenatis ac. Donec tempus dictum enim, nec tempor neque rhoncus vel.Sed mollis luctus leo sed mattis. Vestibulum tempor mattis vehicula. Duis id elementum libero. Integer condimentum tincidunt molestie. Aenean quam tortor, rutrum sit amet placerat sed, sollicitudin eget turpis. In hac habitasse platea dictumst. Mauris lacinia mollis rhoncus. Fusce nec tellus elementum magna congue ultricies. Nulla consequat, dui nec facilisis hendrerit, ligula sapien viverra velit, at tempor risus leo vestibulum risus. Cras volutpat molestie orci ullamcorper gravida. Nullam est nisi, tempus et tincidunt ut, dapibus vitae nibh. Nam scelerisque purus sit amet odio imperdiet mattis. Integer ut ultrices odio.Cras placerat turpis nisl. Quisque consectetur urna vel nunc faucibus dictum. Nunc ac varius mauris. In ut egestas purus. Sed arcu nibh, mollis vitae dapibus eget, consectetur sit amet eros. Curabitur tincidunt purus sagittis neque adipiscing pretium. Aliquam tempor ullamcorper lectus. Cras quis elit et sapien euismod dapibus vitae in urna. Aliquam adipiscing urna non elit suscipit hendrerit. Mauris euismod tincidunt tortor eu vestibulum. Praesent ac quam massa. Fusce vitae viverra justo. Phasellus vel posuere augue. Praesent sagittis auctor odio in cursus. Sed vel lacus velit, vitae eleifend leo. Donec dapibus ornare mauris ut imperdiet. Nullam a sem felis, in commodo ligula. Nunc sed justo id metus bibendum pretium. Fusce lacinia lorem at leo ultricies porta.Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi non ipsum nisi, at porta ipsum. Nulla dolor lacus, auctor eget tincidunt et, tempor in velit. Cras vel diam facilisis dolor sagittis sodales. In hac habitasse platea dictumst. Donec dignissim vulputate tempor. Fusce tristique vestibulum vehicula. Integer nec erat a risus semper ultrices nec ac eros. Phasellus egestas, risus eget suscipit iaculis, mi magna posuere urna, in sollicitudin odio leo nec lorem. Ut at enim nunc, eget pellentesque ipsum. Nam at ipsum et magna tempor gravida vestibulum ut diam. Aenean aliquam scelerisque blandit. Cras sapien sem, consectetur a laoreet at, mattis vel lorem. Maecenas enim mauris, hendrerit ac imperdiet in, hendrerit a justo. Vestibulum justo metus, adipiscing at pulvinar at, scelerisque at velit. Aliquam sodales feugiat tortor ullamcorper cursus. Quisque tortor felis, sodales eu bibendum in, pellentesque eget urna.Nullam ultricies congue nisi nec blandit. Nulla nisl mi, aliquet vel dictum in, pellentesque fringilla arcu. Nam vulputate iaculis pellentesque. Morbi faucibus, augue vitae aliquam fringilla, ipsum tellus lacinia ligula, a luctus mauris orci id nulla. Vestibulum commodo, diam eget tincidunt iaculis, leo ante suscipit ligula, convallis scelerisque quam augue quis libero. Pellentesque vulputate ultricies eros a porta. In hac habitasse platea dictumst. Quisque at sem vel nisl pellentesque pellentesque at imperdiet turpis. Sed quis sem non nulla pellentesque placerat. Etiam sed ultricies nisl. Nunc vel leo augue, vitae fringilla urna. Suspendisse eget dolor enim, sed interdum lorem. Etiam imperdiet, nunc a tempor elementum, ipsum ante sodales tortor, id dignissim arcu diam vitae metus.Sed tincidunt fringilla mauris a lobortis. Morbi mollis elementum purus ac auctor. Etiam malesuada sapien vehicula magna fringilla sit amet porta sem scelerisque. Vestibulum malesuada ante nunc. Curabitur laoreet commodo mauris eu tempor. Sed hendrerit, lorem vel scelerisque aliquam, metus ligula ultricies ante, at luctus neque risus ut nisi. Suspendisse lectus sapien, tempor eget volutpat non, tempor at orci. Aenean eu est metus, vel convallis augue. Integer aliquam turpis id neque posuere tincidunt. Morbi at ante felis, ac semper diam. Etiam iaculis sapien a mauris tempus semper. Nunc ut leo nec massa tincidunt sodales id sed justo. Fusce sed blandit turpis. Pellentesque scelerisque laoreet luctus.Integer lobortis sollicitudin sapien, vel consequat augue hendrerit ut. Quisque pretium, enim condimentum ornare viverra, est nisl convallis lacus, vel varius turpis mi a eros. Curabitur eget enim non quam condimentum lobortis id sit amet dolor. Aliquam in ligula ut nisi accumsan consectetur. Pellentesque blandit ultrices magna, eget posuere dui eleifend ut. Quisque ornare, ante eget iaculis rutrum, nisi dolor tincidunt diam, eget volutpat nibh sapien vel massa. Sed viverra pulvinar lectus et commodo. Sed lacus mauris, aliquet ut tristique at, feugiat sit amet lectus. Duis lacinia purus a lacus accumsan tristique. Donec felis nunc, egestas ut porttitor ac, vulputate at purus. Quisque euismod nibh sit amet metus ullamcorper a consequat ipsum luctus. Mauris vitae sapien tristique lorem mollis porta auctor vitae leo.Donec mauris nibh, elementum a tincidunt nec, volutpat vitae enim. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque at purus quis massa vulputate mollis ut eu risus. Cras libero diam, pharetra quis ultrices facilisis, tincidunt id arcu. Praesent at volutpat quam. Phasellus quis malesuada sapien. Nullam eu leo quam, bibendum sagittis turpis. Vestibulum sagittis accumsan enim ut tristique. Donec eu enim nisi. Curabitur mauris orci, fringilla et suscipit placerat, ullamcorper vel turpis. Mauris est arcu, gravida ac accumsan ac, tincidunt vel nibh. Mauris pulvinar massa tempor dui hendrerit vel elementum diam pulvinar. Sed felis leo, laoreet at laoreet nec, venenatis eu risus. Nunc a massa lacus. Vestibulum ut pellentesque sem. Donec consectetur, turpis consequat aliquam consectetur, leo nunc lobortis elit, at sagittis ipsum risus sed turpis. Vivamus at sollicitudin purus. Nulla facilisi.Morbi congue dignissim nibh ut commodo. Integer sed urna fermentum neque hendrerit aliquam ac et tortor. Phasellus massa sem, egestas sed tincidunt id, malesuada vel odio. Nulla arcu nisl, elementum at pretium interdum, pharetra at nulla. Vestibulum lectus ante, ultricies ac lacinia euismod, adipiscing at metus. Aliquam velit orci, posuere a dapibus dapibus, consectetur vitae est. Pellentesque suscipit pulvinar varius. Morbi sagittis blandit nulla, eu posuere arcu blandit eu. Nulla cursus nunc volutpat orci commodo aliquet. Quisque condimentum dui a mi facilisis tincidunt.Quisque ac nisi vitae ipsum condimentum luctus non quis erat. Pellentesque eget nunc sit amet ipsum pharetra vulputate ac in mi. Etiam consectetur nulla vitae risus pharetra a ornare ligula sagittis. Proin euismod mauris id lectus tincidunt luctus at sed ligula. Aenean porttitor hendrerit quam quis interdum. Suspendisse eu metus turpis, ut venenatis ipsum. Nulla ipsum orci, lacinia ac vestibulum ut, mattis quis eros. Pellentesque a velit et erat sodales ornare. Pellentesque pellentesque tortor eget magna facilisis accumsan. Praesent tincidunt posuere lacus sed sollicitudin. Praesent consectetur diam vel turpis elementum vehicula. Integer rutrum dignissim justo, ac dapibus quam fringilla non. Suspendisse porta elementum bibendum. Praesent at lorem at quam dignissim commodo. Etiam placerat euismod ipsum eu interdum. Aliquam in mi molestie justo varius venenatis eu aliquam quam. Integer feugiat, neque hendrerit egestas hendrerit, lectus ligula placerat enim, a faucibus ante ligula vitae mi. Praesent urna nunc, volutpat vitae scelerisque non, porta vel dolor. Aenean quam sem, dignissim at faucibus non, auctor sodales libero.Morbi justo elit, tempus ac cursus porta, eleifend nec odio. Ut nec quam velit. Duis elit nulla, placerat et rutrum quis, tempor non nisi. Quisque massa erat, pretium ut elementum sit amet, sodales vel metus. Phasellus sollicitudin sapien vel nisl faucibus ornare. Duis ut dolor arcu, vel semper felis. In quis orci mauris, id porttitor diam. Fusce ornare, dolor in posuere blandit, neque est mollis lacus, eu venenatis nisi orci vel diam. Etiam ornare sapien eu sapien tristique vitae consequat arcu consequat. Fusce a felis at dui sollicitudin pellentesque sit amet vel mi. Curabitur congue porttitor orci, eu auctor nibh mollis at. Nulla facilisi. Nam aliquet ullamcorper metus ac vulputate. Aenean feugiat purus vitae dui congue egestas. Curabitur sollicitudin leo eget nibh facilisis fermentum fermentum non nisi. Ut at libero eget est bibendum laoreet non eu ante. Proin pellentesque quam ut augue condimentum id suscipit risus tristique. Nunc laoreet risus elit.Suspendisse vel ante elit, eu feugiat diam. Etiam ultrices condimentum tempor. Donec eget porta lacus. Nunc in velit lacus, ut ultricies felis. Nulla id cursus metus. Praesent suscipit, orci a facilisis imperdiet, eros lectus eleifend nibh, sit amet auctor magna arcu ac enim. In malesuada volutpat felis a posuere. Aliquam mattis ipsum ut quam semper aliquet. Maecenas convallis consequat magna, blandit viverra nulla consectetur sit amet. Pellentesque id velit nec risus iaculis imperdiet ac accumsan metus. Suspendisse et sem massa. Vestibulum ac enim hendrerit est tincidunt ullamcorper.Curabitur placerat, libero id molestie vehicula, neque tortor vulputate sapien, ut blandit orci metus et nibh. Cras convallis justo a nibh iaculis ut convallis neque vestibulum. Duis gravida purus metus, nec viverra leo. In tincidunt elit sit amet orci lacinia non eleifend orci tincidunt. Praesent est metus, molestie a ullamcorper ultricies, cursus imperdiet augue. Sed vitae quam eu dui pellentesque dignissim. Curabitur convallis volutpat accumsan. Donec egestas malesuada est, vitae faucibus sem fermentum id. Donec porttitor rutrum vehicula. Nulla placerat risus in est egestas nec ultrices ligula auctor. Quisque erat lorem, ullamcorper vitae interdum sit amet, laoreet vel elit. Proin eu porta neque. Pellentesque eleifend, ipsum a sollicitudin ultrices, ligula nisl aliquet dui, eget fermentum quam mi vel.";
public static String get(int len) {
+ if (len > LOREM.length()) {
+ StringBuilder builder = new StringBuilder();
+ while (len > LOREM.length()) {
+ builder.append(LOREM);
+ len -= LOREM.length();
+ }
+ builder.append(LOREM.substring(0, len));
+ return builder.toString();
+ }
return LOREM.substring(0, len);
}
diff --git a/uitest/tb3test.xml b/uitest/tb3test.xml
new file mode 100644
index 0000000000..dd0c12db91
--- /dev/null
+++ b/uitest/tb3test.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<project name="tb3test" xmlns:antcontrib="antlib:net.sf.antcontrib" xmlns:ivy="antlib:org.apache.ivy.ant" basedir=".">
+
+ <dirname property="tb3test.dir" file="${ant.file.tb3test}" />
+
+ <ivy:resolve file="${tb3test.dir}/ivy.xml" conf="build, build-provided" />
+ <ivy:cachepath pathid="classpath.tb3.lib" conf="build, build-provided" />
+ <path id="classpath.tb3">
+ <path refid="classpath.tb3.lib" />
+ <path location="${tb3test.dir}/result/classes" />
+ </path>
+
+ <target name="run-all-tb3-tests" unless="tests.tb3.skip" description="Run all the TB3 tests (except server tests) in the project">
+ <antcall target="run-tb3-suite">
+ <param name="junit.test.suite" value="com.vaadin.tests.tb3.AllTB3Tests" />
+ </antcall>
+ </target>
+
+ <target name="run-tb3-suite">
+ <fail unless="junit.test.suite" message="Define suite to run using junit.test.suite" />
+ <fail unless="com.vaadin.testbench.screenshot.directory" message="Define screenshot directory using -Dcom.vaadin.testbench.screenshot.directory" />
+ <junit printsummary="withOutAndErr" fork="yes">
+ <formatter usefile="false" type="plain" />
+ <classpath refid="classpath.tb3" />
+
+ <jvmarg value="-Dcom.vaadin.testbench.screenshot.directory=${com.vaadin.testbench.screenshot.directory}" />
+ <jvmarg value="-Djava.awt.headless=true" />
+ <test name="${junit.test.suite}" />
+ </junit>
+
+ </target>
+
+</project>
diff --git a/uitest/test.xml b/uitest/test.xml
index 3baccb4117..b0db8d47f4 100644
--- a/uitest/test.xml
+++ b/uitest/test.xml
@@ -83,7 +83,7 @@
<fail unless="com.vaadin.testbench.deployment.url" message="The 'com.vaadin.testbench.deployment.url' property must be defined." />
</target>
- <target name="run-tests" depends="compile-tests">
+ <target name="run-tb2-tests" depends="check-parameters,compile-tests">
<fileset dir="${test-output-dir}" id="tests-fileset">
<include name="**/**.java" />
</fileset>
@@ -161,12 +161,10 @@
<!-- ================================================================== -->
<!-- The default target. -->
- <target name="run-and-clean-up" depends="check-parameters,remove-error-screens,run-tests" />
+ <target name="run-and-clean-up" depends="check-parameters,remove-error-screens,run-tb2-tests" />
-
- <!-- Starts the server and runs all TestBench tests -->
- <target name="test-package">
- <fail unless="war.file" message="No 'war.file' parameter given." />
+ <!-- Runs all TestBench 2 tests -->
+ <target name="tb2-tests" unless="tests.tb2.skip">
<property name="test-output-dir" location="${test.xml.dir}/result/testbench-junit-classes" />
<property name="retries" value="2" />
@@ -177,15 +175,6 @@
<property name="com.vaadin.testbench.screenshot.block.error" value="0.025" />
<property name="com.vaadin.testbench.debug" value="false" />
- <parallel>
- <daemons>
- <ant antfile="${test.xml.dir}/vaadin-server.xml" inheritall="true" inheritrefs="true" target="deploy-and-start" />
- </daemons>
- <sequential>
- <ant antfile="${test.xml.dir}/vaadin-server.xml" target="wait-for-startup" />
- <antcall inheritall="true" inheritrefs="true" target="run-and-clean-up" />
- <echo message="All TestBench tests have been run" />
- </sequential>
- </parallel>
+ <antcall inheritall="true" inheritrefs="true" target="run-tb2-tests" />
</target>
</project>
diff --git a/uitest/vaadin-server.xml b/uitest/vaadin-server.xml
index 4e84a6f238..5e9090a536 100644
--- a/uitest/vaadin-server.xml
+++ b/uitest/vaadin-server.xml
@@ -8,7 +8,7 @@
<ivy:resolve log="download-only" file="${dir}/ivy.xml" />
<ivy:cachepath pathid="classpath.jetty" conf="jetty-run" />
- <java classname="org.mortbay.jetty.runner.Runner" fork="yes" output="${vaadin.basedir}/result/jetty.java.out" resultproperty="resultCode">
+ <java classname="org.mortbay.jetty.runner.Runner" fork="yes" output="${vaadin.basedir}/result/jetty.java.out" resultproperty="resultCode" maxmemory="1024m">
<arg value="--port" />
<arg value="8888" />
<arg value="--out" />