/** * Copyright 2010 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 org.waveprotocol.wave.client.common.webdriver; import com.google.common.base.Preconditions; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.ui.UIObject; import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * Helper methods for adding debugclasses to the DOM Elements. * */ public class DebugClassHelper { /** The name of the debug-class attribute. */ private static final String DEBUG_CLASS_ATTRIBUTE = "dc"; /** Whether debug class should be set (e.g. for testing purposes). */ private static boolean debugClassEnabled = false; /** Disallow construction. */ private DebugClassHelper() {} /** * Adds a debug class to a UIObject. * * @param uiObject the object to modify * @param debugClass to be added */ public static final void addDebugClass(UIObject uiObject, String debugClass) { Preconditions.checkNotNull(uiObject, "uiObject cannot be null"); addDebugClass(uiObject.getElement(), debugClass); } /** * Adds a debug class to an Element. * * @param elem the object to modify * @param debugClass to be added */ public static final void addDebugClass(Element elem, String debugClass) { Preconditions.checkNotNull(elem, "addDebugClass: Element must not be null"); if (debugClassEnabled) { Set<String> debugClasses = getDebugClasses(elem); if (debugClasses.add(debugClass)) { elem.setAttribute(DEBUG_CLASS_ATTRIBUTE, joinDebugClasses(debugClasses)); } } } /** * Replaces a debug class name from an Element with another one. * * @param elem the object to modify * @param oldClassName previous class name to be removed * @param newClassName new class name to be added */ public static final void replaceDebugClass( Element elem, String oldClassName, String newClassName) { Preconditions.checkNotNull(elem, "replaceDebugClass: Element must not be null"); if (debugClassEnabled) { Set<String> debugClasses = getDebugClasses(elem); boolean removed = debugClasses.remove(oldClassName); // if no change happened in the debugClasses, do nothing if (debugClasses.add(newClassName) || removed) { elem.setAttribute(DEBUG_CLASS_ATTRIBUTE, joinDebugClasses(debugClasses)); } } } /** * Removes a debug class from a UIObject. * * @param uiObject the object to modify * @param debugClass to be removed */ public static final void removeDebugClass(UIObject uiObject, String debugClass) { Preconditions.checkNotNull(uiObject, "uiObject cannot be null"); removeDebugClass(uiObject.getElement(), debugClass); } /** * Remove a debug class from an Element. * * @param elem the object to modify * @param debugClass to be removed */ public static final void removeDebugClass(Element elem, String debugClass) { if (debugClassEnabled && null != elem) { Set<String> debugClasses = getDebugClasses(elem); if (debugClasses.remove(debugClass)) { elem.setAttribute(DEBUG_CLASS_ATTRIBUTE, joinDebugClasses(debugClasses)); } } } /** * Removes all debug classes from a UIObject. * @param uiObject The UIObject to remove debug classes from. */ public static void clearDebugClasses(UIObject uiObject) { clearDebugClasses(uiObject.getElement()); } /** * Removes all debug classes from an Element. * @param elem The element to remove debug classes from. */ public static void clearDebugClasses(Element elem) { elem.removeAttribute(DEBUG_CLASS_ATTRIBUTE); } /** * Join a set of Strings into a space-separated String. * @param debugClasses to be joined * @return a String of debug classes */ private static final String joinDebugClasses(Set<String> debugClasses) { StringBuilder result = new StringBuilder(); for (String debugClass : debugClasses) { result.append(debugClass); result.append(" "); } return result.toString().trim(); } /** * Get a set of debug classes present in an element. * @param elem from which debug classes will be read from * @return the set of debug classes */ private static final Set<String> getDebugClasses(Element elem) { Set<String> result = new HashSet<String>(); String debugClasses = elem.getAttribute(DEBUG_CLASS_ATTRIBUTE); result.addAll(Arrays.asList(debugClasses.split(" "))); return result; } /** * Set whether to enable debug classes (for testing purposes). * * @param enableDebugClass the new value */ public static void setDebugClassEnabled(boolean enableDebugClass) { debugClassEnabled = enableDebugClass; } }