From b0b8f1a21b01089d0ddef954518dfc7ec02bddc1 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Thu, 24 Sep 2015 22:29:19 +0300 Subject: [PATCH] Skip checking unknown properties for @NoLayout on client side (#18334) Change-Id: Ic03b419b8c10d5d7010c3d10479883149445fe40 --- .../vaadin/client/metadata/TypeDataStore.java | 3 +- .../JavaScriptNoLayoutHandlingUI.java | 68 +++++++++++++++++++ .../JavaScriptNoLayoutHandlingUITest.java | 37 ++++++++++ .../components/javascriptcomponent/MyJS.js | 7 ++ 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptNoLayoutHandlingUI.java create mode 100644 uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptNoLayoutHandlingUITest.java create mode 100644 uitest/src/com/vaadin/tests/components/javascriptcomponent/MyJS.js diff --git a/client/src/com/vaadin/client/metadata/TypeDataStore.java b/client/src/com/vaadin/client/metadata/TypeDataStore.java index 46f26f1b25..e3c1c8392a 100644 --- a/client/src/com/vaadin/client/metadata/TypeDataStore.java +++ b/client/src/com/vaadin/client/metadata/TypeDataStore.java @@ -366,7 +366,8 @@ public class TypeDataStore { private static native boolean hasNoLayout(JavaScriptObject typeData, String beanName, String propertyName) /*-{ - return typeData[beanName][propertyName].noLayout !== undefined; + // Data is not available for Javascript state object properties as GWT knows nothing about them + return typeData[beanName][propertyName] && typeData[beanName][propertyName].noLayout !== undefined; }-*/; private static native Object getJsPropertyValue(JavaScriptObject typeData, diff --git a/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptNoLayoutHandlingUI.java b/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptNoLayoutHandlingUI.java new file mode 100644 index 0000000000..0181f17aba --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptNoLayoutHandlingUI.java @@ -0,0 +1,68 @@ +/* + * Copyright 2000-2014 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.javascriptcomponent; + +import com.vaadin.annotations.JavaScript; +import com.vaadin.server.VaadinRequest; +import com.vaadin.shared.ui.JavaScriptComponentState; +import com.vaadin.tests.components.AbstractTestUIWithLog; +import com.vaadin.ui.AbstractJavaScriptComponent; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; + +public class JavaScriptNoLayoutHandlingUI extends AbstractTestUIWithLog { + + public static class MyJSComponentState extends JavaScriptComponentState { + // Using public methods as these are handled before public fields in the + // parent + private int aaa = 1; + + public int getAaa() { + return aaa; + } + + public void setAaa(int aaa) { + this.aaa = aaa; + } + } + + @JavaScript("MyJS.js") + public static class MyJsComponent extends AbstractJavaScriptComponent { + + @Override + protected MyJSComponentState getState() { + return (MyJSComponentState) super.getState(); + } + } + + @Override + protected void setup(VaadinRequest request) { + final MyJsComponent myComponent = new MyJsComponent(); + myComponent.setId("js"); + addComponent(myComponent); + addComponent(new Button("Send update", new ClickListener() { + + @Override + public void buttonClick(ClickEvent event) { + myComponent.getState().aaa++; + } + + })); + + } + +} diff --git a/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptNoLayoutHandlingUITest.java b/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptNoLayoutHandlingUITest.java new file mode 100644 index 0000000000..3530eb1e16 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptNoLayoutHandlingUITest.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2014 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.javascriptcomponent; + +import org.junit.Assert; +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.vaadin.testbench.elements.ButtonElement; +import com.vaadin.tests.tb3.MultiBrowserTest; + +public class JavaScriptNoLayoutHandlingUITest extends MultiBrowserTest { + + @Test + public void stateUpdate() { + openTestURL("debug"); + WebElement js = findElement(By.id("js")); + Assert.assertEquals("state: 1", js.getText()); + $(ButtonElement.class).first().click(); + + Assert.assertEquals("state: 2", js.getText()); + } +} diff --git a/uitest/src/com/vaadin/tests/components/javascriptcomponent/MyJS.js b/uitest/src/com/vaadin/tests/components/javascriptcomponent/MyJS.js new file mode 100644 index 0000000000..9876448311 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/javascriptcomponent/MyJS.js @@ -0,0 +1,7 @@ +window.com_vaadin_tests_components_javascriptcomponent_JavaScriptNoLayoutHandlingUI_MyJsComponent = function() { + var e = this.getElement(); + + this.onStateChange = function() { + e.innerHTML = "state: "+this.getState().aaa; + } +} \ No newline at end of file -- 2.39.5