/** We should remove enclosing "Cell" element if it has no attributes. */
 public void test_propertyCell_removeElement() throws Exception {
   XmlObjectInfo panel =
       parse(
           "// filler filler filler filler filler",
           "<ui:UiBinder>",
           "  <g:HorizontalPanel>",
           "    <g:Cell width='100px'>",
           "      <g:Button/>",
           "    </g:Cell>",
           "  </g:HorizontalPanel>",
           "</ui:UiBinder>");
   refresh();
   WidgetInfo button = (WidgetInfo) panel.getChildren().get(0);
   // "width"
   {
     Property property = PropertyUtils.getByPath(button, "Cell/width");
     // remove value
     property.setValue(Property.UNKNOWN_VALUE);
     assertXML(
         "// filler filler filler filler filler",
         "<ui:UiBinder>",
         "  <g:HorizontalPanel>",
         "    <g:Button/>",
         "  </g:HorizontalPanel>",
         "</ui:UiBinder>");
     // no value
     assertFalse(property.isModified());
     assertEquals(Property.UNKNOWN_VALUE, property.getValue());
   }
 }
 ////////////////////////////////////////////////////////////////////////////
 //
 // Constructor
 //
 ////////////////////////////////////////////////////////////////////////////
 public UiBinderTagResolver(XmlObjectInfo rootObject) {
   super(rootObject.getCreationSupport().getElement().getRoot());
   rootObject.addBroadcastListener(
       new XmlObjectResolveTag() {
         public void invoke(XmlObjectInfo object, Class<?> clazz, String[] namespace, String[] tag)
             throws Exception {
           resolveTag(object, clazz, namespace, tag);
         }
       });
 }
 /** @return <code>true</code> if given {@link XmlObjectInfo} is Android. */
 public static boolean isAndroid(XmlObjectInfo object) {
   EditorContext context = object.getContext();
   return isAndroid(context);
 }