| /* |
| * 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"); |
| } |
| } |
| } |
| |
| } |