blob: 5e1f4cf9427b49af6e2a951be3781754c3d6a21c [file] [log] [blame]
/*
* Copyright 2009 Google Inc.
*
* 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.google.gwt.museum.client.defaultmuseum;
import com.google.gwt.core.client.Duration;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.museum.client.common.AbstractIssue;
import com.google.gwt.museum.client.common.ControlInputPanel;
import com.google.gwt.museum.client.common.SimpleLogger;
import com.google.gwt.museum.client.common.ControlInputPanel.IntegerInput;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import java.util.ArrayList;
import java.util.List;
/*
* Originally, on IE, about three seconds to distroy
*/
/**
* Tests bad behavior for clear.
*
* <pre>
* ff -- 1000 flow panels, aprox 500 millis
* ie -- 1000 flow panels, aprox 3000 millis
*
* in new version
* ie -- 1000 flow panels, aprox 30-80 millis
* ff -- 1000 flow panels, aprox 13-50 millis
* </pre>
* <p>
* <img class='gallery' src='FlowPanel.png'/>
* </p>
*/
public class SpeedForClear extends AbstractIssue {
private Panel target;
private List<Widget> children = new ArrayList<Widget>();
private SimpleLogger log = new SimpleLogger();
@Override
public Widget createIssue() {
VerticalPanel v = new VerticalPanel();
ControlInputPanel p = new ControlInputPanel();
v.add(p);
v.add(log);
final IntegerInput size = new IntegerInput("flowpanel", 10, p);
Button create = new Button("create widget", new ClickHandler() {
public void onClick(ClickEvent event) {
createLargeFlowPanel(size.getValue());
}
});
Button distroy = new Button("time the removal", new ClickHandler() {
public void onClick(ClickEvent event) {
Duration d = new Duration();
target.clear();
log.report("Took " + d.elapsedMillis() + " milliseconds to clear "
+ size.getValue() + " widgets from a flow panel");
for (Widget child : children) {
if (child.getElement().getPropertyString("__listener") != null) {
throw new IllegalStateException(
"each child should no longer have a listener");
}
}
}
});
v.add(create);
v.add(distroy);
return v;
}
@Override
public String getInstructions() {
return "check the speed of clear methods";
}
@Override
public String getSummary() {
return "clear() speed check";
}
@Override
public boolean hasCSS() {
return false;
}
private void createLargeFlowPanel(int size) {
if (target != null) {
target.removeFromParent();
}
target = new FlowPanel();
for (int i = 0; i < size; i++) {
Widget w = new Label("widget-" + i);
target.add(w);
children.add(w);
}
RootPanel.get().add(target);
for (Widget child : target) {
if (child.getElement().getPropertyString("__listener") == null) {
throw new IllegalStateException("each child should now have a listener");
}
}
}
}