Also, what's the difference between DOMImplMozilla & DOMImplMozillaOld
in terms of Firefox versions?

And what versions of each browser are supported?  Are all versions of
Safari, FF, & Opera supported as much as possible?  Is there a minimum
version for any of them?

On Sat, Apr 18, 2009 at 4:05 AM, Vitali Lovich <[email protected]> wrote:
> If I put the check in a static block, then the check is only done once
> on startup, right?  Is this acceptable, or is it frowned upon because
> it adds a slight penalty to the startup even if the developer never
> uses the function.
>
> Something like,
>
> static {
>  ensureGetElementsByClassNameRegistered();
> }
>
> private static native void ensureGetElementsByClassNameRegistered() {
>   if (!document.getElementsByClassName) {
>      document.getElementsByClassName = function(element, class) {
>             // etc
>      }
>   }
> }
>
> On Sat, Apr 18, 2009 at 3:54 AM, Ray Cromwell <[email protected]> wrote:
>>
>> You don't want to create a separate property just for native
>> getElementsByClassName() as that would almost double the number of
>> permutations (except IE where is it known not to exist)  What you
>> could provide is 3 implementations. IE gets raw DOM version,
>> Safari/Firefox/Opera get a version that checks
>> if(document.getElementsByClassName) exists, and if not, falls back to
>> document.evaluate.
>>
>> -Ray
>>
>>
>> On Fri, Apr 17, 2009 at 11:03 PM, Vitali Lovich <[email protected]> wrote:
>>>
>>> Do you have any suggestions regarding how to do the proper deferred
>>> binding for the various versions?  Should I just put the typical JS
>>> check that regular libraries use? (i.e. if
>>> (!document.getElementsByClassName) { // provide fallback }.  I thought
>>> the whole point of deferred binding was to get around that.
>>>
>>> What is the list of officially supported browsers?  In particular the
>>> specific minimum version for each?
>>>
>>> I guess I'm going to have to install a virtual machine for this
>>> because Safari refuses to work in wine 1.0.19 - chrome is useable
>>> although no HTTPS sites.
>>>
>>> Is there a guide somewhere on writing & integrating the tests into
>>> GWT, or just look at existing ones in the source.
>>>
>>> On Sat, Apr 18, 2009 at 1:49 AM, Miroslav Pokorny
>>> <[email protected]> wrote:
>>>>
>>>> Provide some tests and make sure it works on all officially supported
>>>> browsers even if the implementation is suboptimal. There are many js
>>>> libs out there so it's not hard to find the best way to do it fir the
>>>> various browsers...
>>>>
>>>> On 18/04/2009, at 12:39 PM, Vitali Lovich <[email protected]> wrote:
>>>>
>>>>> Just my first attempt at adding some initial support for
>>>>> getElementsByClassName.  This is by no means tested or
>>>>>
>>>>> Newer browsers support getElementsByClassName.  This is my attempt
>>>>> at a patch.
>>>>>
>>>>> Caveats:
>>>>> There's a "bug" in that quirks mode doesn't behave properly (I don't
>>>>> know how to detect it in the deferred binding) for IE & Firefox2 &
>>>>> earlier.  According to the HTML5 spec, it's supposed to be case
>>>>> insensitive in quirks mode.  However, this "bug" behaves the exact
>>>>> same way as all the javascript wrappers do (since I based the XPath &
>>>>> RegExp code paths roughly around the implementations floating out
>>>>> there).
>>>>>
>>>>> I'm also not sure if I added the support correctly for Firefox.
>>>>> getElementsByClassName only came in with FF3 & requires the xpath
>>>>> workaround for FF2 & earlier (I believe I read xpath was introduced
>>>>> with FF 1.5).  I placed the xpath code in DOMImplMozillaOld for now
>>>>> (not sure whether or not gecko1_8 represents FF2).
>>>>>
>>>>> There's also no mention of the versions of Safari & Opera that are
>>>>> supported by GWT, so they're defaulting to using the native version
>>>>> (which will not work if they don't provide it).
>>>>>
>>>>> Safari in particular got it with version 3.1.  if earlier versions are
>>>>> supported, it's not too much work.  Simply grab the expression built
>>>>> in the FF xpath  & pass it to document._getElementsByXPath(query,
>>>>> parent) for Safari versions that have xpath (not sure which those
>>>>> are).  Not sure how to distinguish Safari pre3.1 & post3.1 in deferred
>>>>> binding.
>>>>>
>>>>> Opera got it with 9.5.  Not sure when xPath support got into Opera
>>>>> (should be a straightfoward copy of the mozilla code).  Not sure how
>>>>> to distinguish the two in the deferred binding.
>>>>>
>>>>> Feedback would be appreciated.
>>>>>
>>>>> Should this go as an enhancement request in the issue tracker?
>>>>>
>>>>> >
>>>>> diff --git a/user/src/com/google/gwt/dom/client/DOMImpl.java b/user/
>>>>> src/com/google/gwt/dom/client/DOMImpl.java index 1d7e39b..581764b
>>>>> 100644 --- a/user/src/com/google/gwt/dom/client/DOMImpl.java +++ b/
>>>>> user/src/com/google/gwt/dom/client/DOMImpl.java @@ -176,6 +176,8 @@
>>>>> abstract class DOMImpl { return 0; }-*/; + public abstract NodeList
>>>>> getElementsByClassName(Element parent, String className); + public
>>>>> native Element getFirstChildElement(Element elem) /*-{ var child =
>>>>> elem.firstChild; while (child && child.nodeType != 1) diff --git a/
>>>>> user/src/com/google/gwt/dom/client/DOMImplIE6.java b/user/src/com/
>>>>> google/gwt/dom/client/DOMImplIE6.java index 04c205a..8c24a6c 100644
>>>>> --- a/user/src/com/google/gwt/dom/client/DOMImplIE6.java +++ b/user/
>>>>> src/com/google/gwt/dom/client/DOMImplIE6.java @@ -15,6 +15,8 @@ */
>>>>> package com.google.gwt.dom.client; +import
>>>>> com.google.gwt.core.client.JsArray; +  /** * Internet Explorer 6
>>>>> implementation of * {...@link com.google.gwt.user.client.impl.DOMImpl}.
>>>>> @@ -184,6 +186,31 @@ class DOMImplIE6 extends DOMImpl { } @Override
>>>>> + public NodeList getElementsByClassName(Element parent, String
>>>>> className) { + // TODO: detect quirks mode so that the regexps do a
>>>>> case insensitive match as per the + // spec. when quirks mode
>>>>> detected, pass "i" as the flags parameter + return
>>>>> getElementsByClassName(parent, className.split(" "), "").cast(); + }
>>>>> + +  private native JsArray getElementsByClassName(Element parent,
>>>>> String [] classes, String flags) /*-{ + var i, j, e, c, elements =
>>>>> parent.all || parent.getElementsByTagName("*"); + var regexps = [],
>>>>> result = []; + for (i = classes.length - 1; i >= 0; i--) { + c =
>>>>> classes[i].replace(/^\s+|\s+$/g, ""); + if (c.length) +
>>>>> regexps.push(new RegExp(new Array("(?:^|\\s)", c, "(?:\\s|
>>>>> $)").join(""), flags); + } + if (regexps.length) { + for (i = 0, c =
>>>>> elements.length; i < c; i++) { + e = elements[i]; + for (j =
>>>>> regexps.length - 1; j >= 0 && regexps[j].test(e); j--) {} + j == -1
>>>>> && result.push(e); + } + } + return result; + }-*/; + + @Override
>>>>> public native String getInnerText(Element elem) /*-{ return
>>>>> elem.innerText; }-*/; diff --git a/user/src/com/google/gwt/dom/
>>>>> client/DOMImplMozillaOld.java b/user/src/com/google/gwt/dom/client/
>>>>> DOMImplMozillaOld.java index ecf52fb..5fd7312 100644 --- a/user/src/
>>>>> com/google/gwt/dom/client/DOMImplMozillaOld.java +++ b/user/src/com/
>>>>> google/gwt/dom/client/DOMImplMozillaOld.java @@ -15,6 +15,8 @@ */
>>>>> package com.google.gwt.dom.client; +import
>>>>> com.google.gwt.core.client.JsArray; +  /** * DOM implementation
>>>>> differences for older version of Mozilla (mostly the * hosted mode
>>>>> browser on linux). The main difference is due to changes in @@
>>>>> -114,4 +116,23 @@ package com.google.gwt.dom.client; return top +
>>>>> viewport.scrollTop; }-*/; + + @Override + public NodeList
>>>>> getElementsByClassName(Element parent, String className) { + // the
>>>>> cast should be safe since both it & JsArray access the underlying
>>>>> object the same way + // and NodeList is immutable (constraints
>>>>> added, not removed) + return getElementsByClassName(parent,
>>>>> className.split(" ")).cast(); + } + + private native JsArray
>>>>> getElementsByClassName(Element parent, String [] classes) /*-{ + var
>>>>> result, i, xpathResult, classExpr = ".//*"; + for (i =
>>>>> classes.length - 1; i >= 0; i--) { + classExpr +=
>>>>> "[contains(concat(' ', @class, ' '), ' " + classes[i] + " ')]"; + }
>>>>> + xpathResult = document.evaluate(classExpr, parent, null, 0, null);
>>>>> + while ((i = xpathResult.iterateNext())) { + result.push(i); + } +
>>>>> return result; + }-*/; } diff --git a/user/src/com/google/gwt/dom/
>>>>> client/DOMImplStandard.java b/user/src/com/google/gwt/dom/client/
>>>>> DOMImplStandard.java index 90d2e89..be29fe1 100644 --- a/user/src/
>>>>> com/google/gwt/dom/client/DOMImplStandard.java +++ b/user/src/com/
>>>>> google/gwt/dom/client/DOMImplStandard.java @@ -114,6 +114,11 @@
>>>>> abstract class DOMImplStandard extends DOMImpl { }-*/; @Override +
>>>>> public native NodeList getElementsByClassName(Element parent, String
>>>>> className) /*-{ + return parent.getElementsByClassName(className);
>>>>> + }-*/; + + @Override public native boolean isOrHasChild(Element
>>>>> parent, Element child) /*-{ return parent.contains(child); }-*/;
>>>>> diff --git a/user/src/com/google/gwt/dom/client/Document.java b/user/
>>>>> src/com/google/gwt/dom/client/Document.java index 209b1b9..23d6daf
>>>>> 100644 --- a/user/src/com/google/gwt/dom/client/Document.java +++ b/
>>>>> user/src/com/google/gwt/dom/client/Document.java @@ -1125,6 +1125,18
>>>>> @@ public class Document extends Node { }-*/; /** + * Returns a
>>>>> {...@link NodeList} of all the {...@link Element Elements} with a given +
>>>>> * class name in the order in which they are encountered in a
>>>>> preorder traversal + * of the document tree. + * + * @param
>>>>> className the space-separated name of the classes to match on + *
>>>>> @return a list containing all the matched elements. + */ + public
>>>>> final NodeList getElementsByClassName(String className) { + return
>>>>> DOMImpl.impl.getElementsByClassName(this.cast(), className); + } +
>>>>> + /** * Returns the {...@link Element} whose id is given by elementId.
>>>>> If no such * element exists, returns null. Behavior is not defined
>>>>> if more than one * element has this id. diff --git a/user/src/com/
>>>>> google/gwt/dom/client/Element.java b/user/src/com/google/gwt/dom/
>>>>> client/Element.java index a0bf9f2..d64b83e 100644 --- a/user/src/com/
>>>>> google/gwt/dom/client/Element.java +++ b/user/src/com/google/gwt/dom/
>>>>> client/Element.java @@ -149,6 +149,18 @@ public class Element
>>>>> extends Node { }-*/; /** + * Returns a {...@link NodeList} of all the
>>>>> {...@link Element Elements} with a given + * class name in the order in
>>>>> which they are encountered in a preorder traversal + * of this
>>>>> elements children. + * + * @param className the space-separated
>>>>> names of the classes to match on + * @return a list containing all
>>>>> the matched elements. + */ + public final NodeList
>>>>> getElementsByClassName(String className) { + return
>>>>> DOMImpl.impl.getElementsByClassName(this, className); + } + + /** *
>>>>> Returns a NodeList of all descendant Elements with a given tag name,
>>>>> in the * order in which they are encountered in a preorder traversal
>>>>> of this Element * tree.
>>>>
>>>> >
>>>>
>>>
>>> >
>>>
>>
>> >>
>>
>

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to