line-height: normal; | line-height: normal; | ||||
} | } | ||||
.v-ie6 .v-table-header-wrap, | |||||
.v-ie6 .v-table-footer-wrap, | |||||
.v-ie6 .v-table-column-selector{ | |||||
/* Fixes IE6 overflow bug #7314 which causes Table headers to overflow and cover the column selector. */ | |||||
position:relative; | |||||
} | |||||
.v-ie6 .v-table.v-disabled, | |||||
.v-ie7 .v-table.v-disabled{ | |||||
/* Fixes ie issue #7324 where disabled shim does not cover table body */ | |||||
position:relative; | |||||
} | |||||
.v-table-footer-wrap, | .v-table-footer-wrap, | ||||
.white .v-table-footer-wrap { | .white .v-table-footer-wrap { | ||||
text-transform: none; | text-transform: none; | ||||
padding-right: 7px; | padding-right: 7px; | ||||
} | } | ||||
.v-table-header, | .v-table-header, | ||||
.v-table-footer, | .v-table-footer, | ||||
.v-table-footer table { | .v-table-footer table { |
<target name="package-test" depends="clean-result, nightly-init, package-init, init, build, docs, internal-package-zip, nightly-publish"> | <target name="package-test" depends="clean-result, nightly-init, package-init, init, build, docs, internal-package-zip, nightly-publish"> | ||||
</target> | </target> | ||||
<!-- Locations of Ant task JARs - build properties not yet read at this point --> | |||||
<property name="ant.task.jar.antcontrib" value="build/lib/ant-contrib-1.0b3.jar" /> | |||||
<property name="ant.task.jar.maven" value="build/lib/maven-ant-tasks-2.0.10.jar" /> | |||||
<!-- ant contrib required for flow control (for loop, if, property override) --> | <!-- ant contrib required for flow control (for loop, if, property override) --> | ||||
<!-- Note that we have to use a namespace to avoid clash when running sub-ant. --> | <!-- Note that we have to use a namespace to avoid clash when running sub-ant. --> | ||||
<taskdef uri="antlib:net.sf.antcontrib" resource="net/sf/antcontrib/antlib.xml"> | <taskdef uri="antlib:net.sf.antcontrib" resource="net/sf/antcontrib/antlib.xml"> | ||||
<classpath> | <classpath> | ||||
<pathelement location="build/lib/ant-contrib-1.0b3.jar" /> | |||||
<pathelement location="${ant.task.jar.antcontrib}" /> | |||||
</classpath> | </classpath> | ||||
</taskdef> | </taskdef> | ||||
<!-- ant contrib for Maven integration --> | <!-- ant contrib for Maven integration --> | ||||
<path id="maven-ant-tasks.classpath" path="build/lib/maven-ant-tasks-2.0.10.jar" /> | |||||
<path id="maven-ant-tasks.classpath" path="${ant.task.jar.maven}" /> | |||||
<typedef resource="org/apache/maven/artifact/ant/antlib.xml" | <typedef resource="org/apache/maven/artifact/ant/antlib.xml" | ||||
uri="antlib:org.apache.maven.artifact.ant" | uri="antlib:org.apache.maven.artifact.ant" | ||||
classpathref="maven-ant-tasks.classpath" /> | classpathref="maven-ant-tasks.classpath" /> | ||||
<target name="remove-widgetset-gwt-tmp"> | <target name="remove-widgetset-gwt-tmp"> | ||||
<echo>Removing widgetset temp files</echo> | <echo>Removing widgetset temp files</echo> | ||||
<delete dir="${output-dir}/WebContent/VAADIN/widgetsets/.gwt-tmp" includeemptydirs="true"/> | |||||
<delete dir="${widgetsets-output-dir}/.gwt-tmp" includeemptydirs="true"/> | |||||
<!-- This is generated by GWT 2.3+ for rpcPolicyManifest and symbolMaps, cannot disable --> | |||||
<delete dir="${widgetsets-output-dir}/WEB-INF" includeemptydirs="true" failonerror="false" /> | |||||
</target> | </target> | ||||
<!-- Note: Probably not needed any longer as all sources need to be compiled. --> | <!-- Note: Probably not needed any longer as all sources need to be compiled. --> | ||||
<!-- ================================================================== --> | <!-- ================================================================== --> | ||||
<!-- Main target for the custom build. --> | <!-- Main target for the custom build. --> | ||||
<target name="custom-build" depends="clean-result, custom-build-init, nightly-init, package-init, init, compile-server-side, compile-client-side, vaadin.jar, vaadin-sources.jar"> | |||||
<target name="custom-build" depends="clean-result, custom-build-init, nightly-init, package-init, init, build"> | |||||
</target> | </target> | ||||
<property file="${build.properties.file}" /> | <property file="${build.properties.file}" /> | ||||
<property name="version" value="${vaadin.version}"/> | <property name="version" value="${vaadin.version}"/> | ||||
<property name="version.full" value="${version}.custom-${build.date.compact}"/> | <property name="version.full" value="${version}.custom-${build.date.compact}"/> | ||||
<property name="compile.only.default-widgetset" value="1"/> | |||||
<!-- <property name="compile.only.default-widgetset" value="1"/> --> | |||||
</then> | </then> | ||||
<!-- Otherwise version and snapshot.repository.url come from target "init" --> | <!-- Otherwise version and snapshot.repository.url come from target "init" --> | ||||
</antcontrib:if> | </antcontrib:if> | ||||
<fail unless="com.vaadin.testbench.deployment.url" message="The 'com.vaadin.testbench.deployment.url' property must be defined."/> | <fail unless="com.vaadin.testbench.deployment.url" message="The 'com.vaadin.testbench.deployment.url' property must be defined."/> | ||||
<fail unless="com.vaadin.testbench.lib.dir" message="The 'com.vaadin.testbench.lib.dir' property must be defined."/> | <fail unless="com.vaadin.testbench.lib.dir" message="The 'com.vaadin.testbench.lib.dir' property must be defined."/> | ||||
<property name="com.vaadin.testbench.screenshot.block.error" value="0.025"/> | |||||
<property name="com.vaadin.testbench.debug" value="false"/> | |||||
<property name="package.name" value="${base-name}"/> | <property name="package.name" value="${base-name}"/> | ||||
<!-- Only Linux tests allowed. TODO: Generalize this. --> | <!-- Only Linux tests allowed. TODO: Generalize this. --> | ||||
<!-- "tests" classes after unpacking the package. --> | <!-- "tests" classes after unpacking the package. --> | ||||
<property name="output-dir" value="${output-dir}"/> | <property name="output-dir" value="${output-dir}"/> | ||||
<!-- Convert some tests to run multiple times if failed. --> | |||||
<property name="create.retry.tests" value="1"/> | |||||
<property name="retries" value="3"/> | |||||
<!-- Convert tests to run multiple times if failed. --> | |||||
<property name="retries" value="2"/> | |||||
<property name="package.filename" value="${package.filename}"/> | <property name="package.filename" value="${package.filename}"/> | ||||
<property name="testing.testarea" value="/tmp/testarea"/> | <property name="testing.testarea" value="/tmp/testarea"/> | ||||
<property name="com.vaadin.testbench.tester.host" value="${com.vaadin.testbench.tester.host}"/> | <property name="com.vaadin.testbench.tester.host" value="${com.vaadin.testbench.tester.host}"/> | ||||
<property name="com.vaadin.testbench.deployment.url" value="${com.vaadin.testbench.deployment.url}"/> | <property name="com.vaadin.testbench.deployment.url" value="${com.vaadin.testbench.deployment.url}"/> | ||||
<property name="com.vaadin.testbench.lib.dir" value="${com.vaadin.testbench.lib.dir}"/> | <property name="com.vaadin.testbench.lib.dir" value="${com.vaadin.testbench.lib.dir}"/> | ||||
<property name="com.vaadin.testbench.debug" value="${com.vaadin.testbench.debug}"/> | |||||
<property name="com.vaadin.testbench.screenshot.block.error" value="${com.vaadin.testbench.screenshot.block.error}"/> | |||||
</ant> | </ant> | ||||
</target> | </target> | ||||
} | } | ||||
} | } | ||||
deferredWidgetLoadLoop.scheduleRepeating(100); | |||||
} | } | ||||
/** | /** | ||||
runningApplications.add(a); | runningApplications.add(a); | ||||
return true; | return true; | ||||
} else { | } else { | ||||
deferredWidgetLoader = new DeferredWidgetLoader(); | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
cmd.execute(); | cmd.execute(); | ||||
} | } | ||||
callbacks.clear(); | callbacks.clear(); | ||||
} else if(widgetsLoading == 0 && deferredWidgetLoader != null) { | |||||
deferredWidgetLoader.trigger(); | |||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* This loop loads widget implementation that should be loaded deferred. | * This loop loads widget implementation that should be loaded deferred. | ||||
*/ | */ | ||||
private static final Timer deferredWidgetLoadLoop = new Timer() { | |||||
static class DeferredWidgetLoader extends Timer { | |||||
private static final int FREE_LIMIT = 4; | private static final int FREE_LIMIT = 4; | ||||
private static final int FREE_CHECK_TIMEOUT = 100; | |||||
int communicationFree = 0; | int communicationFree = 0; | ||||
int nextWidgetIndex = 0; | int nextWidgetIndex = 0; | ||||
private boolean pending; | |||||
public DeferredWidgetLoader() { | |||||
schedule(5000); | |||||
} | |||||
public void trigger() { | |||||
if(!pending) { | |||||
schedule(FREE_CHECK_TIMEOUT); | |||||
} | |||||
} | |||||
@Override | |||||
public void schedule(int delayMillis) { | |||||
super.schedule(delayMillis); | |||||
pending = true; | |||||
} | |||||
@Override | @Override | ||||
public void run() { | public void run() { | ||||
pending = false; | |||||
if (!isBusy()) { | if (!isBusy()) { | ||||
Class<? extends Paintable> nextType = getNextType(); | Class<? extends Paintable> nextType = getNextType(); | ||||
if (nextType == null) { | if (nextType == null) { | ||||
// ensured that all widgets are loaded | // ensured that all widgets are loaded | ||||
cancel(); | |||||
deferredWidgetLoader = null; | |||||
} else { | } else { | ||||
communicationFree = 0; | |||||
widgetSet.loadImplementation(nextType); | widgetSet.loadImplementation(nextType); | ||||
} | } | ||||
} else { | |||||
schedule(FREE_CHECK_TIMEOUT); | |||||
} | } | ||||
} | } | ||||
private boolean isBusy() { | private boolean isBusy() { | ||||
if (widgetsLoading > 0) { | if (widgetsLoading > 0) { | ||||
communicationFree = 0; | communicationFree = 0; | ||||
return false; | |||||
return true; | |||||
} | } | ||||
for (ApplicationConnection app : runningApplications) { | for (ApplicationConnection app : runningApplications) { | ||||
if (app.hasActiveRequest()) { | if (app.hasActiveRequest()) { | ||||
// if an UIDL request or widget loading is active, mark as | // if an UIDL request or widget loading is active, mark as | ||||
// busy | // busy | ||||
communicationFree = 0; | communicationFree = 0; | ||||
return false; | |||||
return true; | |||||
} | } | ||||
} | } | ||||
communicationFree++; | communicationFree++; | ||||
return communicationFree < FREE_LIMIT; | return communicationFree < FREE_LIMIT; | ||||
} | } | ||||
}; | |||||
} | |||||
private static DeferredWidgetLoader deferredWidgetLoader; | |||||
public void onModuleLoad() { | public void onModuleLoad() { | ||||
// Enable IE6 Background image caching | // Enable IE6 Background image caching |
var j = theRules.length; | var j = theRules.length; | ||||
for(var i=0; i<j; i++) { | for(var i=0; i<j; i++) { | ||||
var r = theRules[i]; | var r = theRules[i]; | ||||
if(r.type == 1 || sheet.imports) { | |||||
if(r.type == 1 || sheet.imports) { | |||||
var selectors = r.selectorText.toLowerCase().split(","); | var selectors = r.selectorText.toLowerCase().split(","); | ||||
var n = selectors.length; | var n = selectors.length; | ||||
for(var m=0; m<n; m++) { | for(var m=0; m<n; m++) { |
* This implementation can be overridden with GWT deferred binding. | * This implementation can be overridden with GWT deferred binding. | ||||
* | * | ||||
*/ | */ | ||||
public final class VDebugConsole extends VOverlay implements Console { | |||||
public class VDebugConsole extends VOverlay implements Console { | |||||
private static final String POS_COOKIE_NAME = "VDebugConsolePos"; | private static final String POS_COOKIE_NAME = "VDebugConsolePos"; | ||||
protected void remoteLog(String msg) { | protected void remoteLog(String msg) { | ||||
msgQueue.add(msg); | msgQueue.add(msg); | ||||
if (msg.length() > 4) { | |||||
doSend.execute(); | |||||
} else { | |||||
sendToRemoteLog.trigger(); | |||||
} | |||||
sendToRemoteLog.trigger(); | |||||
} | } | ||||
/** | /** |
enabled = !uidl.hasAttribute("disabled"); | enabled = !uidl.hasAttribute("disabled"); | ||||
if (BrowserInfo.get().isIE8() && !enabled) { | |||||
/* | |||||
* The disabled shim will not cover the table body if it is | |||||
* relative in IE8. See #7324 | |||||
*/ | |||||
scrollBodyPanel.getElement().getStyle() | |||||
.setPosition(Position.STATIC); | |||||
} else if (BrowserInfo.get().isIE8()) { | |||||
scrollBodyPanel.getElement().getStyle() | |||||
.setPosition(Position.RELATIVE); | |||||
} | |||||
this.client = client; | this.client = client; | ||||
paintableId = uidl.getStringAttribute("id"); | paintableId = uidl.getStringAttribute("id"); | ||||
immediate = uidl.getBooleanAttribute("immediate"); | immediate = uidl.getBooleanAttribute("immediate"); |
* Sends the selection to the server | * Sends the selection to the server | ||||
*/ | */ | ||||
private void sendSelectionToServer() { | private void sendSelectionToServer() { | ||||
client.updateVariable(paintableId, "selected", selectedIds | |||||
.toArray(new String[selectedIds.size()]), immediate); | |||||
selectionHasChanged = false; | |||||
Command command = new Command() { | |||||
public void execute() { | |||||
client.updateVariable(paintableId, "selected", | |||||
selectedIds.toArray(new String[selectedIds.size()]), | |||||
immediate); | |||||
selectionHasChanged = false; | |||||
} | |||||
}; | |||||
/* | |||||
* Delaying the sending of the selection in webkit to ensure the | |||||
* selection is always sent when the tree has focus and after click | |||||
* events have been processed. This is due to the focusing | |||||
* implementation in FocusImplSafari which uses timeouts when focusing | |||||
* and blurring. | |||||
*/ | |||||
if (BrowserInfo.get().isWebkit()) { | |||||
Scheduler.get().scheduleDeferred(command); | |||||
} else { | |||||
command.execute(); | |||||
} | |||||
} | } | ||||
/** | /** |
import java.util.Collection; | import java.util.Collection; | ||||
import java.util.Date; | import java.util.Date; | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.HashSet; | |||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.LinkedList; | import java.util.LinkedList; | ||||
import java.util.TreeSet; | import java.util.TreeSet; | ||||
boolean first = true; | boolean first = true; | ||||
ArrayList<Class<? extends Paintable>> lazyLoadedWidgets = new ArrayList<Class<? extends Paintable>>(); | ArrayList<Class<? extends Paintable>> lazyLoadedWidgets = new ArrayList<Class<? extends Paintable>>(); | ||||
HashSet<Class<? extends com.vaadin.terminal.gwt.client.Paintable>> widgetsWithInstantiator = new HashSet<Class<? extends com.vaadin.terminal.gwt.client.Paintable>>(); | |||||
for (Class<? extends Paintable> class1 : paintablesHavingWidgetAnnotation) { | for (Class<? extends Paintable> class1 : paintablesHavingWidgetAnnotation) { | ||||
ClientWidget annotation = class1.getAnnotation(ClientWidget.class); | ClientWidget annotation = class1.getAnnotation(ClientWidget.class); | ||||
Class<? extends com.vaadin.terminal.gwt.client.Paintable> clientClass = annotation | Class<? extends com.vaadin.terminal.gwt.client.Paintable> clientClass = annotation | ||||
.value(); | .value(); | ||||
if(widgetsWithInstantiator.contains(clientClass)) { | |||||
continue; | |||||
} | |||||
if (clientClass == VView.class) { | if (clientClass == VView.class) { | ||||
// VView's are not instantiated by widgetset | // VView's are not instantiated by widgetset | ||||
continue; | continue; | ||||
sourceWriter.print(");"); | sourceWriter.print(");"); | ||||
} | } | ||||
sourceWriter.print("}"); | sourceWriter.print("}"); | ||||
widgetsWithInstantiator.add(clientClass); | |||||
} | } | ||||
sourceWriter.println("}"); | sourceWriter.println("}"); |
/* | |||||
/* | |||||
@ITMillApache2LicenseForJavaFiles@ | @ITMillApache2LicenseForJavaFiles@ | ||||
*/ | */ | ||||
throw new IllegalStateException( | throw new IllegalStateException( | ||||
"Null values are not allowed if the null-representation is null"); | "Null values are not allowed if the null-representation is null"); | ||||
} | } | ||||
if (requestRepaintInTextChangeEvent && !valueChangeInTextChangeEvent) { | |||||
/* | |||||
* If the repaint occurred in a text change event then we do not | |||||
* want to send back the old value since it will just overwrite the | |||||
* typed value so we send the last known value instead which is | |||||
* updated by the text change event. | |||||
*/ | |||||
target.addVariable(this, "text", lastKnownTextContent); | |||||
} else { | |||||
target.addVariable(this, "text", value); | |||||
} | |||||
requestRepaintInTextChangeEvent = false; | |||||
valueChangeInTextChangeEvent = false; | |||||
target.addVariable(this, "text", value); | |||||
if (selectionPosition != -1) { | if (selectionPosition != -1) { | ||||
target.addAttribute("selpos", selectionPosition); | target.addAttribute("selpos", selectionPosition); | ||||
} | } | ||||
} | } | ||||
/** | |||||
* Flag for monitoring if a repaint gets requested in a text change event | |||||
*/ | |||||
private boolean requestRepaintInTextChangeEvent = false; | |||||
@Override | |||||
public void requestRepaint() { | |||||
if (textChangeEventPending) { | |||||
/* | |||||
* Textchange event listener triggered this repaint | |||||
*/ | |||||
requestRepaintInTextChangeEvent = true; | |||||
} | |||||
super.requestRepaint(); | |||||
} | |||||
@Override | @Override | ||||
public void changeVariables(Object source, Map<String, Object> variables) { | public void changeVariables(Object source, Map<String, Object> variables) { | ||||
changingVariables = true; | changingVariables = true; | ||||
private void firePendingTextChangeEvent() { | private void firePendingTextChangeEvent() { | ||||
if (textChangeEventPending) { | if (textChangeEventPending) { | ||||
fireEvent(new TextChangeEventImpl(this)); | |||||
textChangeEventPending = false; | textChangeEventPending = false; | ||||
fireEvent(new TextChangeEventImpl(this)); | |||||
} | } | ||||
} | } | ||||
/** | |||||
* Flag for monitoring if the value got changed in a TextChangeEvent | |||||
* listener | |||||
*/ | |||||
protected boolean valueChangeInTextChangeEvent = false; | |||||
@Override | @Override | ||||
protected void setInternalValue(Object newValue) { | protected void setInternalValue(Object newValue) { | ||||
if (textChangeEventPending) { | |||||
/* | |||||
* Value changed in a TextChangeEvent listener | |||||
*/ | |||||
valueChangeInTextChangeEvent = true; | |||||
} | |||||
if (changingVariables && !textChangeEventPending) { | if (changingVariables && !textChangeEventPending) { | ||||
/* | /* | ||||
* Fire a "simulated" text change event before value change event if | * Fire a "simulated" text change event before value change event if |
<property name="browsers" value="${test_browsers}" /> | <property name="browsers" value="${test_browsers}" /> | ||||
<property name="testfiles" value="${testfiles}" /> | <property name="testfiles" value="${testfiles}" /> | ||||
<property name="test-output-dir" value="../build/integration-test-output" /> | <property name="test-output-dir" value="../build/integration-test-output" /> | ||||
<property name="retries" value="0" /> | |||||
<fileset dir="." includes="test.xml" /> | <fileset dir="." includes="test.xml" /> | ||||
</subant> | </subant> |
<?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.formlayout.TableInFormLayoutCausesScrolling?restartApplication</td> | |||||
<td></td> | |||||
</tr> | |||||
<tr> | |||||
<td>mouseClick</td> | |||||
<td>vaadin=runcomvaadintestscomponentsformlayoutTableInFormLayoutCausesScrolling::/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VScrollTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[2]/domChild[0]/domChild[0]</td> | |||||
<td>12,13</td> | |||||
</tr> | |||||
<tr> | |||||
<td>screenCapture</td> | |||||
<td></td> | |||||
<td>should-be-scrolled-up</td> | |||||
</tr> | |||||
</tbody></table> | |||||
</body> | |||||
</html> |
package com.vaadin.tests.components.formlayout; | |||||
import com.vaadin.tests.components.AbstractTestCase; | |||||
import com.vaadin.ui.FormLayout; | |||||
import com.vaadin.ui.Table; | |||||
import com.vaadin.ui.TextField; | |||||
import com.vaadin.ui.Window; | |||||
public class TableInFormLayoutCausesScrolling extends AbstractTestCase { | |||||
@Override | |||||
public void init() { | |||||
// Window Initialization. | |||||
final Window window = new Window("Main Window"); | |||||
setMainWindow(window); | |||||
// FormLayout creation | |||||
final FormLayout fl = new FormLayout(); | |||||
window.setContent(fl); | |||||
// Add 20 TextField | |||||
for (int i = 20; i-- > 0;) { | |||||
fl.addComponent(new TextField()); | |||||
} | |||||
// Add 1 selectable table with some items | |||||
final Table table = new Table(); | |||||
table.setSelectable(true); | |||||
table.addContainerProperty("item", String.class, ""); | |||||
for (int i = 50; i-- > 0;) { | |||||
table.addItem(new String[] { "item" + i }, i); | |||||
} | |||||
window.addComponent(table); | |||||
} | |||||
@Override | |||||
protected String getDescription() { | |||||
return "Clicking in the Table should not cause the page to scroll"; | |||||
} | |||||
@Override | |||||
protected Integer getTicketNumber() { | |||||
return 7309; | |||||
} | |||||
} |
<?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://artur.virtuallypreinstalled.com/" /> | |||||
<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.orderedlayout.VerticalLayoutWidthCalculation?restartApplication</td> | |||||
<td></td> | |||||
</tr> | |||||
<tr> | |||||
<td>click</td> | |||||
<td>vaadin=runcomvaadintestscomponentsorderedlayoutVerticalLayoutWidthCalculation::/VWindow[0]/FocusableScrollPanel[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td> | |||||
<td></td> | |||||
</tr> | |||||
<tr> | |||||
<td>click</td> | |||||
<td>vaadin=runcomvaadintestscomponentsorderedlayoutVerticalLayoutWidthCalculation::/VWindow[0]/FocusableScrollPanel[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td> | |||||
<td></td> | |||||
</tr> | |||||
<tr> | |||||
<td>screenCapture</td> | |||||
<td></td> | |||||
<td>window-sized-to-one-textfield</td> | |||||
</tr> | |||||
</tbody></table> | |||||
</body> | |||||
</html> |
package com.vaadin.tests.components.orderedlayout; | |||||
import com.vaadin.tests.components.AbstractTestCase; | |||||
import com.vaadin.ui.Button; | |||||
import com.vaadin.ui.Button.ClickEvent; | |||||
import com.vaadin.ui.HorizontalLayout; | |||||
import com.vaadin.ui.TextField; | |||||
import com.vaadin.ui.VerticalLayout; | |||||
import com.vaadin.ui.Window; | |||||
public class VerticalLayoutWidthCalculation extends AbstractTestCase { | |||||
@Override | |||||
public void init() { | |||||
final Window mainWindow = new Window("Vaadintest Application"); | |||||
mainWindow.addWindow(createSubWindow()); | |||||
setMainWindow(mainWindow); | |||||
} | |||||
private Window createSubWindow() { | |||||
HorizontalLayout hl = new HorizontalLayout(); | |||||
VerticalLayout vlTF1 = new VerticalLayout(); | |||||
vlTF1.setSizeUndefined(); | |||||
final TextField tf1 = new TextField("Text1"); | |||||
tf1.setSizeUndefined(); | |||||
vlTF1.addComponent(tf1); | |||||
hl.addComponent(vlTF1); | |||||
VerticalLayout vlTF2 = new VerticalLayout(); | |||||
vlTF2.setSizeUndefined(); | |||||
final TextField tf2 = new TextField("Text2"); | |||||
tf2.setVisible(false); | |||||
tf2.setSizeUndefined(); | |||||
vlTF2.addComponent(tf2); | |||||
hl.addComponent(vlTF2); | |||||
Window wnd = new Window("Test"); | |||||
wnd.getContent().setSizeUndefined(); | |||||
wnd.addComponent(hl); | |||||
Button btn = new Button("Show/hide"); | |||||
btn.addListener(new Button.ClickListener() { | |||||
public void buttonClick(ClickEvent event) { | |||||
tf2.setVisible(!tf2.isVisible()); | |||||
} | |||||
}); | |||||
wnd.addComponent(btn); | |||||
return wnd; | |||||
} | |||||
@Override | |||||
protected String getDescription() { | |||||
return "The second TextField is initially invisible. Make it visible and then hide it again. You should end up with the same result as initially."; | |||||
} | |||||
@Override | |||||
protected Integer getTicketNumber() { | |||||
return 7260; | |||||
} | |||||
} |
<!-- Configuration --> | <!-- Configuration --> | ||||
<!-- ================================================================== --> | <!-- ================================================================== --> | ||||
<!-- Browsers to use for testing --> | <!-- Browsers to use for testing --> | ||||
<property name="browsers-windows" value="winxp-ie6,winxp-ie7,winxp-ie8,win7-ie9,winxp-firefox36,winxp-firefox4,winxp-safari4,winxp-safari5,winxp-googlechrome-stable,winxp-opera1060,winxp-opera11" /> | |||||
<property name="browsers-windows" value="winxp-ie6,winxp-ie7,winxp-ie8,win7-ie9,winxp-firefox36,winxp-firefox4,winxp-firefox5,winxp-safari4,winxp-safari5,winxp-googlechrome-stable,winxp-opera1060,winxp-opera11" /> | |||||
<property name="browsers-linux" value="linux-firefox3,linux-opera10,linux-googlechrome8" /> | <property name="browsers-linux" value="linux-firefox3,linux-opera10,linux-googlechrome8" /> | ||||
<property name="browsers-mac" value="osx-firefox3,osx-opera10,osx-googlechrome8,osx-safari4,osx-safari5" /> | <property name="browsers-mac" value="osx-firefox3,osx-opera10,osx-googlechrome8,osx-safari4,osx-safari5" /> | ||||
<property name="browsers" value="${browsers-windows}" /> | <property name="browsers" value="${browsers-windows}" /> | ||||
<!-- Number of times to retry a test if it fails --> | |||||
<property name="retries" value="2" /> | |||||
<!-- Screen shot base directory --> | <!-- Screen shot base directory --> | ||||
<fail unless="com.vaadin.testbench.screenshot.directory" message="The 'com.vaadin.testbench.screenshot.directory' property must be defined." /> | <fail unless="com.vaadin.testbench.screenshot.directory" message="The 'com.vaadin.testbench.screenshot.directory' property must be defined." /> | ||||
<!-- Host running Testbench Hub --> | <!-- Host running Testbench Hub --> | ||||
<property name="com.vaadin.testbench.tester.host" value="testbench-hub.intra.itmill.com" /> | <property name="com.vaadin.testbench.tester.host" value="testbench-hub.intra.itmill.com" /> | ||||
<property name="com.vaadin.testbench.screenshot.block.error" value="0.025"/> | |||||
<property name="com.vaadin.testbench.debug" value="false"/> | |||||
<!-- Temporary output directory, created and removed by this script --> | <!-- Temporary output directory, created and removed by this script --> | ||||
<!-- <property name="test-output-dir" value="../build/test-output" /> --> | <!-- <property name="test-output-dir" value="../build/test-output" /> --> | ||||
<fail unless="test-output-dir" message="The 'test-output-dir' property must be defined." /> | <fail unless="test-output-dir" message="The 'test-output-dir' property must be defined." /> | ||||
<exclude name="tests/integration-testscripts/**" /> | <exclude name="tests/integration-testscripts/**" /> | ||||
</fileset> | </fileset> | ||||
<!-- fileset containing tests to retry --> | |||||
<fileset dir=".." id="html-retry-files-ie6"> | |||||
<include name="tests/**/SubWindows**.html" /> | |||||
</fileset> | |||||
<!-- This target converts HTML tests files to java junit tests. One test file for each browser is created. --> | <!-- This target converts HTML tests files to java junit tests. One test file for each browser is created. --> | ||||
<target name="create-tests" depends="remove-temp-testclasses" if="server.start.succeeded"> | <target name="create-tests" depends="remove-temp-testclasses" if="server.start.succeeded"> | ||||
<pathconvert pathsep=" " property="testfiles" refid="html-test-files" /> | <pathconvert pathsep=" " property="testfiles" refid="html-test-files" /> | ||||
<java classname="com.vaadin.testbench.util.TestConverter" classpathref="classpath" fork="true"> | <java classname="com.vaadin.testbench.util.TestConverter" classpathref="classpath" fork="true"> | ||||
<sysproperty key="com.vaadin.testbench.test.retries" value="${retries}" /> | |||||
<jvmarg value="-Duser.language=en"/> | <jvmarg value="-Duser.language=en"/> | ||||
<jvmarg value="-Duser.country=US"/> | <jvmarg value="-Duser.country=US"/> | ||||
<arg value="${test-output-dir}" /> | <arg value="${test-output-dir}" /> | ||||
</target> | </target> | ||||
<target name="create-retry-tests" if="create.retry.tests"> | |||||
<antcall target="convert-retry-test"> | |||||
<param name="browser" value="winxp-ie6" /> | |||||
<param name="testfile-name" value="html-retry-files-ie6" /> | |||||
</antcall> | |||||
</target> | |||||
<!-- Target converts test files so that the whole test can be re run 'retries' times --> | |||||
<target name="convert-retry-test" if="retries"> | |||||
<pathconvert pathsep=" " property="testfile" refid="${testfile-name}" /> | |||||
<java classname="com.vaadin.testbench.util.TestConverter" classpathref="classpath"> | |||||
<sysproperty key="com.vaadin.testbench.test.retries" value="${retries}" /> | |||||
<jvmarg value="-Duser.language=en"/> | |||||
<jvmarg value="-Duser.country=US"/> | |||||
<arg value="${test-output-dir}" /> | |||||
<arg value="${browser}" /> | |||||
<arg line="${testfile}" /> | |||||
</java> | |||||
</target> | |||||
<!-- This target complies the generated java junit tests. --> | <!-- This target complies the generated java junit tests. --> | ||||
<target name="compile-tests" depends="create-tests, create-retry-tests"> | |||||
<target name="compile-tests" depends="create-tests"> | |||||
<mkdir dir="${class-dir}" /> | <mkdir dir="${class-dir}" /> | ||||
<javac srcdir="${test-output-dir}" destdir="${class-dir}" debug="on" fork="yes" failonerror="false" encoding="UTF8"> | <javac srcdir="${test-output-dir}" destdir="${class-dir}" debug="on" fork="yes" failonerror="false" encoding="UTF8"> | ||||
<classpath> | <classpath> | ||||
<jvmarg value="-Dcom.vaadin.testbench.screenshot.directory=${com.vaadin.testbench.screenshot.directory}" /> | <jvmarg value="-Dcom.vaadin.testbench.screenshot.directory=${com.vaadin.testbench.screenshot.directory}" /> | ||||
<!-- Resolution for screenshots --> | <!-- Resolution for screenshots --> | ||||
<jvmarg value="-Dcom.vaadin.testbench.screenshot.resolution=${com.vaadin.testbench.screenshot.resolution}" /> | <jvmarg value="-Dcom.vaadin.testbench.screenshot.resolution=${com.vaadin.testbench.screenshot.resolution}" /> | ||||
<jvmarg value="-Dcom.vaadin.testbench.debug=${com.vaadin.testbench.debug}" /> | |||||
<jvmarg value="-Dcom.vaadin.testbench.screenshot.block.error=${com.vaadin.testbench.screenshot.block.error}" /> | |||||
<jvmarg value="-Djava.awt.headless=true" /> | <jvmarg value="-Djava.awt.headless=true" /> | ||||