Change-Id: Ifeb36e6c0acd156b7714f96f32ad7d4ff8416100tags/7.3.0.beta1
@@ -99,7 +99,7 @@ | |||
<!-- In vaadin-shared-deps --> | |||
<tr> | |||
<td>JSON</td> | |||
<td><a href="licenses/apache-license-version-2-0.txt">Apache License, Version 2.0</a></td> | |||
<td><a href="licenses/the-json-license.txt">The JSON License</a></td> | |||
</tr> | |||
<!-- Used by vaadin-server --> |
@@ -6,5 +6,5 @@ vaadin.url=http://vaadin.com | |||
vaadin.java.version=1.6 | |||
vaadin.version=0.0.0.unversioned-development-build | |||
vaadin.sass.version=0.9.7 | |||
gwt.version=2.6.0.vaadin2 | |||
gwt.version=2.6.0.vaadin3 | |||
commons-io.version=2.4 |
@@ -66,6 +66,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; | |||
@@ -471,6 +472,8 @@ public class ApplicationConnection implements HasHandlers { | |||
private Heartbeat heartbeat = GWT.create(Heartbeat.class); | |||
private boolean tooltipInitialized = false; | |||
public static class MultiStepDuration extends Duration { | |||
private int previousStep = elapsedMillis(); | |||
@@ -580,10 +583,19 @@ public class ApplicationConnection implements HasHandlers { | |||
// initial UIDL provided in DOM, continue as if returned by request | |||
handleJSONText(jsonText, -1); | |||
} | |||
// Tooltip can't be created earlier because the necessary fields are | |||
// not setup to add it in the correct place in the DOM | |||
getVTooltip().showAssistive(new TooltipInfo(" ")); | |||
// Tooltip can't be created earlier because the | |||
// necessary fields are not setup to add it in the | |||
// correct place in the DOM | |||
if (!tooltipInitialized) { | |||
tooltipInitialized = true; | |||
ApplicationConfiguration.runWhenDependenciesLoaded(new Command() { | |||
@Override | |||
public void execute() { | |||
getVTooltip().initializeAssistiveTooltips(); | |||
} | |||
}); | |||
} | |||
} | |||
@@ -108,6 +108,20 @@ public class VTooltip extends VWindowOverlay { | |||
showTooltip(); | |||
} | |||
/** | |||
* Initialize the tooltip overlay for assistive devices. | |||
* | |||
* @param info | |||
* with the content of the tooltip | |||
*/ | |||
public void initializeAssistiveTooltips() { | |||
updatePosition(null, true); | |||
setTooltipText(new TooltipInfo(" ")); | |||
showTooltip(); | |||
hideTooltip(); | |||
description.getParentElement().getStyle().clearWidth(); | |||
} | |||
private void setTooltipText(TooltipInfo info) { | |||
if (info.getErrorMessage() != null && !info.getErrorMessage().isEmpty()) { | |||
em.setVisible(true); |
@@ -547,42 +547,6 @@ public class VaadinServlet extends HttpServlet implements Constants { | |||
return DEFAULT_THEME_NAME; | |||
} | |||
private void handleServiceSecurityException(VaadinServletRequest request, | |||
VaadinServletResponse response) throws IOException, | |||
ServletException { | |||
try { | |||
/* | |||
* We might have a UI, but we don't want to leak any information in | |||
* this case so just use the info provided in the request. | |||
*/ | |||
SystemMessages ci = getService().getSystemMessages( | |||
request.getLocale(), request); | |||
if (ServletPortletHelper.isUIDLRequest(request)) { | |||
// send uidl redirect | |||
getService().writeStringResponse( | |||
response, | |||
JsonConstants.JSON_CONTENT_TYPE, | |||
VaadinService.createCriticalNotificationJSON( | |||
ci.getCommunicationErrorCaption(), | |||
ci.getCommunicationErrorMessage(), | |||
INVALID_SECURITY_KEY_MSG, | |||
ci.getCommunicationErrorURL())); | |||
} else if (ServletPortletHelper.isHeartbeatRequest(request)) { | |||
response.sendError(HttpServletResponse.SC_FORBIDDEN, | |||
"Forbidden"); | |||
} else { | |||
// 'plain' http req - e.g. browser reload; | |||
// just go ahead redirect the browser | |||
response.sendRedirect(ci.getCommunicationErrorURL()); | |||
} | |||
} catch (SystemMessageException ee) { | |||
throw new ServletException(ee); | |||
} | |||
log("Invalid security key received from " + request.getRemoteHost()); | |||
} | |||
/** | |||
* Check if this is a request for a static resource and, if it is, serve the | |||
* resource to the client. |
@@ -27,8 +27,8 @@ | |||
conf="build,ide,test->default" /> | |||
<dependency org="com.vaadin.external.google" name="guava" | |||
rev="16.0.1.vaadin1" conf="build,ide,test->default" /> | |||
<dependency org="com.vaadin.external.google" name="android-json" | |||
rev="0.0.20131108.vaadin1" conf="build,ide,test->default" /> | |||
<dependency org="com.vaadin.external.json" name="json" | |||
rev="0.0.20080701" conf="build,ide,test->default" /> | |||
<dependency org="junit" name="junit" rev="4.11" | |||
conf="test,ide -> default" /> | |||
@@ -27,33 +27,19 @@ import org.openqa.selenium.support.ui.Select; | |||
public class PushConfigurationStreamingTest extends PushConfigurationTest { | |||
@Override | |||
public List<DesiredCapabilities> getBrowsersToTest() { | |||
List<DesiredCapabilities> browsers = super.getBrowsersToTest(); | |||
browsers.remove(Browser.IE8.getDesiredCapabilities()); | |||
return browsers; | |||
} | |||
@Test | |||
public void testStreaming() throws InterruptedException { | |||
openDebugLogTab(); | |||
new Select(getTransportSelect()).selectByVisibleText("STREAMING"); | |||
new Select(getPushModeSelect()).selectByVisibleText("AUTOMATIC"); | |||
assertThat(getStatusText(), | |||
containsString("fallbackTransport: long-polling")); | |||
assertThat(getStatusText(), containsString("transport: streaming")); | |||
waitForServerCounterToUpdate(); | |||
clearDebugMessages(); | |||
new Select(getPushModeSelect()).selectByVisibleText("AUTOMATIC"); | |||
// Use debug console to verify we used the correct transport type | |||
assertThat( | |||
driver.getPageSource(), | |||
not(containsString("Push connection established using websocket"))); | |||
assertThat(driver.getPageSource(), | |||
containsString("Push connection established using streaming")); | |||
waitForDebugMessage("Push connection established using streaming", 10); | |||
waitForServerCounterToUpdate(); | |||
} | |||
} |
@@ -83,32 +83,6 @@ public abstract class ReconnectTest extends MultiBrowserTestWithProxy { | |||
waitForDebugMessage("Reopening push connection"); | |||
} | |||
private void clearDebugMessages() { | |||
driver.findElement( | |||
By.xpath("//button[@class='v-debugwindow-button' and @title='Clear log']")) | |||
.click(); | |||
} | |||
private boolean hasDebugMessage(String message) { | |||
return getDebugMessage(message) != null; | |||
} | |||
private WebElement getDebugMessage(String message) { | |||
return driver.findElement(By.xpath(String.format( | |||
"//span[@class='v-debugwindow-message' and text()='%s']", | |||
message))); | |||
} | |||
private void waitForDebugMessage(final String expectedMessage) { | |||
waitUntil(new ExpectedCondition<Boolean>() { | |||
@Override | |||
public Boolean apply(WebDriver input) { | |||
return hasDebugMessage(expectedMessage); | |||
} | |||
}, 30); | |||
} | |||
private void connectAndVerifyConnectionEstablished() throws JSchException { | |||
connectProxy(); | |||
waitUntilServerCounterChanges(); |
@@ -165,6 +165,36 @@ public abstract class AbstractTB3Test extends TestBenchTestCase { | |||
return ((Locatable) element.getWrappedElement()).getCoordinates(); | |||
} | |||
private boolean hasDebugMessage(String message) { | |||
return getDebugMessage(message) != null; | |||
} | |||
private WebElement getDebugMessage(String message) { | |||
return driver.findElement(By.xpath(String.format( | |||
"//span[@class='v-debugwindow-message' and text()='%s']", | |||
message))); | |||
} | |||
protected void waitForDebugMessage(final String expectedMessage) { | |||
waitForDebugMessage(expectedMessage, 30); | |||
} | |||
protected void waitForDebugMessage(final String expectedMessage, int timeout) { | |||
waitUntil(new ExpectedCondition<Boolean>() { | |||
@Override | |||
public Boolean apply(WebDriver input) { | |||
return hasDebugMessage(expectedMessage); | |||
} | |||
}, timeout); | |||
} | |||
protected void clearDebugMessages() { | |||
driver.findElement( | |||
By.xpath("//button[@class='v-debugwindow-button' and @title='Clear log']")) | |||
.click(); | |||
} | |||
@Retention(RetentionPolicy.RUNTIME) | |||
@Target(ElementType.TYPE) | |||
public @interface RunLocally { |
@@ -0,0 +1,48 @@ | |||
/* | |||
* 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.tooltip; | |||
import com.vaadin.annotations.JavaScript; | |||
import com.vaadin.server.VaadinRequest; | |||
import com.vaadin.tests.components.AbstractTestUI; | |||
import com.vaadin.ui.Button; | |||
public class TooltipAndJavascript extends AbstractTestUI { | |||
@JavaScript("tooltipandjavascript.js") | |||
public static class MyButton extends Button { | |||
} | |||
@Override | |||
protected void setup(VaadinRequest request) { | |||
MyButton b = new MyButton(); | |||
b.setCaption("Hover for tooltip"); | |||
b.setDescription("Tooltip for the button"); | |||
addComponent(b); | |||
} | |||
@Override | |||
protected String getTestDescription() { | |||
return "Hover the button for a tooltip. It should be styled correctly"; | |||
} | |||
@Override | |||
protected Integer getTicketNumber() { | |||
return 14028; | |||
} | |||
} |
@@ -0,0 +1,54 @@ | |||
/* | |||
* 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.tooltip; | |||
import org.junit.Assert; | |||
import org.junit.Test; | |||
import org.openqa.selenium.By; | |||
import org.openqa.selenium.JavascriptExecutor; | |||
import org.openqa.selenium.WebElement; | |||
import com.vaadin.testbench.elements.ButtonElement; | |||
import com.vaadin.tests.tb3.MultiBrowserTest; | |||
public class TooltipAndJavascriptTest extends MultiBrowserTest { | |||
@Test | |||
public void ensureTooltipInOverlay() throws InterruptedException { | |||
openTestURL(); | |||
$(ButtonElement.class).first().showTooltip(); | |||
WebElement tooltip = findElement(By | |||
.cssSelector(".v-overlay-container .v-tooltip")); | |||
WebElement overlayContainer = getParent(tooltip); | |||
Assert.assertTrue("v-overlay-container did not receive theme", | |||
hasClass(overlayContainer, "reindeer")); | |||
} | |||
private boolean hasClass(WebElement element, String classname) { | |||
String[] classes = element.getAttribute("class").split(" "); | |||
for (String classString : classes) { | |||
if (classname.equals(classString)) { | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
private WebElement getParent(WebElement element) { | |||
return (WebElement) ((JavascriptExecutor) getDriver()).executeScript( | |||
"return arguments[0].parentNode;", element); | |||
} | |||
} |
@@ -0,0 +1 @@ | |||
window.console.log("tooltipandjavascript.js executing") |