summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeif Åstrand <legioth@gmail.com>2017-03-07 11:13:57 +0200
committerTeemu Suo-Anttila <tsuoanttila@users.noreply.github.com>2017-03-16 16:21:24 +0200
commit2f414a06ac87a8907509aecc277a857b7838a02c (patch)
treefa94efb569c7789ac0c903873640349b0510fe14
parent4454b63a66d77811cde73f8b4690375ba896fc38 (diff)
downloadvaadin-framework-2f414a06ac87a8907509aecc277a857b7838a02c.tar.gz
vaadin-framework-2f414a06ac87a8907509aecc277a857b7838a02c.zip
Always load the deferred connector bundle (#8713)
endDependencyLoading that was used for starting to load the deferred connector bundle is only called during regular application init if the theme wasn't yet loaded when the initial UIDL request finished. With this patch, the bundle is instead set to be loaded after the initial UIDL message has been completely processed. Fixes #4763
-rw-r--r--client/src/main/java/com/vaadin/client/ApplicationConfiguration.java18
-rw-r--r--client/src/main/java/com/vaadin/client/communication/MessageHandler.java3
-rw-r--r--client/src/main/java/com/vaadin/client/metadata/ConnectorBundleLoader.java48
-rw-r--r--uitest/src/main/java/com/vaadin/tests/application/ConnectorBundleStatus.java45
-rw-r--r--uitest/src/main/java/com/vaadin/tests/application/InitiallyDeferredLoading.java40
-rw-r--r--uitest/src/main/java/com/vaadin/tests/widgetset/client/ConnectorBundleStatusDisplayConnector.java51
-rw-r--r--uitest/src/main/java/com/vaadin/tests/widgetset/client/ConnectorBundleStatusRpc.java22
-rw-r--r--uitest/src/main/java/com/vaadin/tests/widgetset/client/DeferredConnector.java37
-rw-r--r--uitest/src/main/java/com/vaadin/tests/widgetset/server/ConnectorBundleStatusDisplay.java30
-rw-r--r--uitest/src/main/java/com/vaadin/tests/widgetset/server/DeferredComponent.java22
-rw-r--r--uitest/src/test/java/com/vaadin/tests/application/ConnectorBundleStatusTest.java51
-rw-r--r--uitest/src/test/java/com/vaadin/tests/application/InitiallyDeferredLoadingTest.java34
12 files changed, 383 insertions, 18 deletions
diff --git a/client/src/main/java/com/vaadin/client/ApplicationConfiguration.java b/client/src/main/java/com/vaadin/client/ApplicationConfiguration.java
index cde31cbd40..9a8fce9b56 100644
--- a/client/src/main/java/com/vaadin/client/ApplicationConfiguration.java
+++ b/client/src/main/java/com/vaadin/client/ApplicationConfiguration.java
@@ -48,8 +48,6 @@ import com.vaadin.client.debug.internal.TestBenchSection;
import com.vaadin.client.debug.internal.VDebugWindow;
import com.vaadin.client.debug.internal.theme.DebugWindowStyles;
import com.vaadin.client.event.PointerEventSupport;
-import com.vaadin.client.metadata.BundleLoadCallback;
-import com.vaadin.client.metadata.ConnectorBundleLoader;
import com.vaadin.client.metadata.NoDataException;
import com.vaadin.client.metadata.TypeData;
import com.vaadin.client.ui.UnknownComponentConnector;
@@ -662,22 +660,6 @@ public class ApplicationConfiguration implements EntryPoint {
cmd.execute();
}
callbacks.clear();
- } else if (dependenciesLoading == 0 && !ConnectorBundleLoader.get()
- .isBundleLoaded(ConnectorBundleLoader.DEFERRED_BUNDLE_NAME)) {
- ConnectorBundleLoader.get().loadBundle(
- ConnectorBundleLoader.DEFERRED_BUNDLE_NAME,
- new BundleLoadCallback() {
- @Override
- public void loaded() {
- // Nothing to do
- }
-
- @Override
- public void failed(Throwable reason) {
- getLogger().log(Level.SEVERE,
- "Error loading deferred bundle", reason);
- }
- });
}
}
diff --git a/client/src/main/java/com/vaadin/client/communication/MessageHandler.java b/client/src/main/java/com/vaadin/client/communication/MessageHandler.java
index 382f6c8fed..dcc3810a2d 100644
--- a/client/src/main/java/com/vaadin/client/communication/MessageHandler.java
+++ b/client/src/main/java/com/vaadin/client/communication/MessageHandler.java
@@ -58,6 +58,7 @@ import com.vaadin.client.VConsole;
import com.vaadin.client.ValueMap;
import com.vaadin.client.WidgetUtil;
import com.vaadin.client.extensions.AbstractExtensionConnector;
+import com.vaadin.client.metadata.ConnectorBundleLoader;
import com.vaadin.client.metadata.NoDataException;
import com.vaadin.client.metadata.Property;
import com.vaadin.client.metadata.Type;
@@ -561,6 +562,8 @@ public class MessageHandler {
endRequestIfResponse(json);
resumeResponseHandling(lock);
+ ConnectorBundleLoader.get().ensureDeferredBundleLoaded();
+
if (Profiler.isEnabled()) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
diff --git a/client/src/main/java/com/vaadin/client/metadata/ConnectorBundleLoader.java b/client/src/main/java/com/vaadin/client/metadata/ConnectorBundleLoader.java
index 6a0bd3c030..8b3e53aea0 100644
--- a/client/src/main/java/com/vaadin/client/metadata/ConnectorBundleLoader.java
+++ b/client/src/main/java/com/vaadin/client/metadata/ConnectorBundleLoader.java
@@ -17,7 +17,10 @@ package com.vaadin.client.metadata;
import java.util.ArrayList;
import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Display;
@@ -208,4 +211,49 @@ public abstract class ConnectorBundleLoader {
s.setVisibility(Visibility.VISIBLE);
s.setMargin(0, Unit.PX);
}
+
+ /**
+ * Starts loading the deferred bundle if it hasn't already been started.
+ */
+ public void ensureDeferredBundleLoaded() {
+ if (!isBundleLoaded(DEFERRED_BUNDLE_NAME)) {
+ loadBundle(DEFERRED_BUNDLE_NAME, new BundleLoadCallback() {
+ @Override
+ public void loaded() {
+ // Nothing to do
+ }
+
+ @Override
+ public void failed(Throwable reason) {
+ getLogger().log(Level.SEVERE,
+ "Error loading deferred bundle", reason);
+ }
+ });
+ }
+ }
+
+ private static Logger getLogger() {
+ return Logger.getLogger(ConnectorBundleLoader.class.getName());
+ }
+
+ /**
+ * Gets a list of all currently loaded bundle names.
+ * <p>
+ * This method is intended for testing the loading mechanism.
+ *
+ * @return a list of bundles, not <code>null</code>
+ */
+ public List<String> getLoadedBundles() {
+ ArrayList<String> bundles = new ArrayList<>();
+
+ JsArrayString keys = asyncBlockLoaders.getKeys();
+ for (int i = 0; i < keys.length(); i++) {
+ String bundleName = keys.get(i);
+ if (isBundleLoaded(bundleName)) {
+ bundles.add(bundleName);
+ }
+ }
+
+ return bundles;
+ }
}
diff --git a/uitest/src/main/java/com/vaadin/tests/application/ConnectorBundleStatus.java b/uitest/src/main/java/com/vaadin/tests/application/ConnectorBundleStatus.java
new file mode 100644
index 0000000000..70378da630
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/application/ConnectorBundleStatus.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2000-2016 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.application;
+
+import com.vaadin.annotations.Widgetset;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.tests.widgetset.TestingWidgetSet;
+import com.vaadin.tests.widgetset.server.ConnectorBundleStatusDisplay;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.RichTextArea;
+
+@Widgetset(TestingWidgetSet.NAME)
+public class ConnectorBundleStatus extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ ConnectorBundleStatusDisplay statusDisplay = new ConnectorBundleStatusDisplay();
+ statusDisplay.setId("bundleStatus");
+
+ Button refreshButton = new Button("Refresh status",
+ e -> statusDisplay.updateStatus());
+ refreshButton.setId("refresh");
+
+ Button rtaButton = new Button("Add RichTextArea (in the lazy bundle)",
+ e -> addComponent(new RichTextArea()));
+ rtaButton.setId("rta");
+
+ addComponents(statusDisplay, refreshButton, rtaButton);
+ }
+
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/application/InitiallyDeferredLoading.java b/uitest/src/main/java/com/vaadin/tests/application/InitiallyDeferredLoading.java
new file mode 100644
index 0000000000..5722f57106
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/application/InitiallyDeferredLoading.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2000-2016 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.application;
+
+import com.vaadin.annotations.Widgetset;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.tests.widgetset.TestingWidgetSet;
+import com.vaadin.tests.widgetset.server.DeferredComponent;
+
+@Widgetset(TestingWidgetSet.NAME)
+public class InitiallyDeferredLoading extends AbstractTestUI {
+ @Override
+ protected void setup(VaadinRequest request) {
+ DeferredComponent deferredComponent = new DeferredComponent();
+ deferredComponent.setId("deferred");
+
+ addComponent(deferredComponent);
+ }
+
+ @Override
+ public String getTestDescription() {
+ return "This UI contains a component from the deferred bundle. "
+ + "It should still be visible as soon as the UI is loaded.";
+ }
+
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/widgetset/client/ConnectorBundleStatusDisplayConnector.java b/uitest/src/main/java/com/vaadin/tests/widgetset/client/ConnectorBundleStatusDisplayConnector.java
new file mode 100644
index 0000000000..7af1a56237
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/widgetset/client/ConnectorBundleStatusDisplayConnector.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2000-2016 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.widgetset.client;
+
+import java.util.List;
+
+import com.google.gwt.user.client.ui.Label;
+import com.vaadin.client.metadata.ConnectorBundleLoader;
+import com.vaadin.client.ui.AbstractComponentConnector;
+import com.vaadin.shared.ui.Connect;
+import com.vaadin.tests.widgetset.server.ConnectorBundleStatusDisplay;
+
+@Connect(ConnectorBundleStatusDisplay.class)
+public class ConnectorBundleStatusDisplayConnector extends AbstractComponentConnector {
+ @Override
+ public Label getWidget() {
+ return (Label) super.getWidget();
+ }
+
+ @Override
+ protected void init() {
+ super.init();
+ registerRpc(ConnectorBundleStatusRpc.class,
+ new ConnectorBundleStatusRpc() {
+ @Override
+ public void updateStatus() {
+ ConnectorBundleStatusDisplayConnector.this.updateStatus();
+ }
+ });
+
+ updateStatus();
+ }
+
+ private void updateStatus() {
+ List<String> bundles = ConnectorBundleLoader.get().getLoadedBundles();
+ getWidget().setText(bundles.toString());
+ }
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/widgetset/client/ConnectorBundleStatusRpc.java b/uitest/src/main/java/com/vaadin/tests/widgetset/client/ConnectorBundleStatusRpc.java
new file mode 100644
index 0000000000..0507d2a92b
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/widgetset/client/ConnectorBundleStatusRpc.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2016 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.widgetset.client;
+
+import com.vaadin.shared.communication.ClientRpc;
+
+public interface ConnectorBundleStatusRpc extends ClientRpc {
+ public void updateStatus();
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/widgetset/client/DeferredConnector.java b/uitest/src/main/java/com/vaadin/tests/widgetset/client/DeferredConnector.java
new file mode 100644
index 0000000000..bcf7e960af
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/widgetset/client/DeferredConnector.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2016 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.widgetset.client;
+
+import com.google.gwt.user.client.ui.Label;
+import com.vaadin.client.ui.AbstractComponentConnector;
+import com.vaadin.shared.ui.Connect;
+import com.vaadin.shared.ui.Connect.LoadStyle;
+import com.vaadin.tests.widgetset.server.DeferredComponent;
+
+@Connect(value = DeferredComponent.class, loadStyle = LoadStyle.DEFERRED)
+public class DeferredConnector extends AbstractComponentConnector {
+ @Override
+ protected void init() {
+ super.init();
+
+ getWidget().setText("DeferredConnector");
+ }
+
+ @Override
+ public Label getWidget() {
+ return (Label) super.getWidget();
+ }
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/widgetset/server/ConnectorBundleStatusDisplay.java b/uitest/src/main/java/com/vaadin/tests/widgetset/server/ConnectorBundleStatusDisplay.java
new file mode 100644
index 0000000000..ca817c8382
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/widgetset/server/ConnectorBundleStatusDisplay.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2000-2016 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.widgetset.server;
+
+import com.vaadin.tests.widgetset.client.ConnectorBundleStatusRpc;
+import com.vaadin.ui.AbstractComponent;
+
+public class ConnectorBundleStatusDisplay extends AbstractComponent {
+
+ public ConnectorBundleStatusDisplay() {
+ setCaption("Loaded bundles");
+ }
+
+ public void updateStatus() {
+ getRpcProxy(ConnectorBundleStatusRpc.class).updateStatus();
+ }
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/widgetset/server/DeferredComponent.java b/uitest/src/main/java/com/vaadin/tests/widgetset/server/DeferredComponent.java
new file mode 100644
index 0000000000..36d70f7e7e
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/widgetset/server/DeferredComponent.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2016 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.widgetset.server;
+
+import com.vaadin.ui.AbstractComponent;
+
+public class DeferredComponent extends AbstractComponent {
+
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/application/ConnectorBundleStatusTest.java b/uitest/src/test/java/com/vaadin/tests/application/ConnectorBundleStatusTest.java
new file mode 100644
index 0000000000..58419bf43f
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/application/ConnectorBundleStatusTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2000-2016 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.application;
+
+import java.util.Arrays;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class ConnectorBundleStatusTest extends SingleBrowserTest {
+
+ @Test
+ public void testConnectorBundleLoading() {
+ openTestURL();
+
+ assertLoaded("__eager");
+
+ $(ButtonElement.class).id("refresh").click();
+
+ assertLoaded("__eager", "__deferred");
+
+ $(ButtonElement.class).id("rta").click();
+ $(ButtonElement.class).id("refresh").click();
+
+ assertLoaded("__eager", "__deferred",
+ "com.vaadin.client.ui.richtextarea.RichTextAreaConnector");
+ }
+
+ private void assertLoaded(String... expectedNames) {
+ String bundleStatus = findElement(By.id("bundleStatus")).getText();
+ Assert.assertEquals(Arrays.asList(expectedNames).toString(),
+ bundleStatus);
+ }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/application/InitiallyDeferredLoadingTest.java b/uitest/src/test/java/com/vaadin/tests/application/InitiallyDeferredLoadingTest.java
new file mode 100644
index 0000000000..c61b12fbb1
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/application/InitiallyDeferredLoadingTest.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2000-2016 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.application;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class InitiallyDeferredLoadingTest extends SingleBrowserTest {
+ @Test
+ public void testInitiallyDeferredComponent() {
+ openTestURL();
+
+ WebElement deferredComponent = findElement(By.id("deferred"));
+
+ Assert.assertEquals("DeferredConnector", deferredComponent.getText());
+ }
+}