Author: [email protected]
Date: Tue Apr 28 20:35:28 2009
New Revision: 5303
Modified:
trunk/user/src/com/google/gwt/core/client/JavaScriptObject.java
Log:
Fixing JavaScriptObject.toString to optimize away better, and to be verbose
only in assertive states (hosted mode or assertions on).
Review by: scottb
Modified: trunk/user/src/com/google/gwt/core/client/JavaScriptObject.java
==============================================================================
--- trunk/user/src/com/google/gwt/core/client/JavaScriptObject.java
(original)
+++ trunk/user/src/com/google/gwt/core/client/JavaScriptObject.java Tue Apr
28 20:35:28 2009
@@ -50,6 +50,55 @@
}-*/;
/**
+ * Helper for {...@link #toString()}, when hosted mode or assertions are on.
+ */
+ private final native static String toStringVerbose(JavaScriptObject obj)
/*-{
+ var defined = function(m) { return typeof m != 'undefined'; };
+ var strip = function(s) { return s.replace(/\r\n/g, ""); };
+ // Output nodes that have outerHTML
+ if (defined(obj.outerHTML))
+ return strip(obj.outerHTML);
+ // Output nodes that have innerHTML
+ if (defined(obj.innerHTML) && obj.cloneNode) {
+ $doc.createElement('div').appendChild(obj.cloneNode(true)).innerHTML;
+ }
+ // Output text nodes
+ if (defined(obj.nodeType) && obj.nodeType == 3) {
+ return "'" +
+ obj.data.replace(/ /g, "\u25ab").replace(/\u00A0/, "\u25aa") +
+ "'";
+ }
+ // Output IE's TextRange (this code specific to IE7)
+ if (typeof defined(obj.htmlText) && obj.collapse) {
+ var html = obj.htmlText;
+ if (html) {
+ return 'IETextRange [' + strip(html) + ']';
+ } else {
+ // NOTE: using pasteHTML to place a | where the range is collapsed
+ // if *very* useful when debugging. It also, however, in certain
very
+ // subtle circumstances change the range being toStringed! If you
+ // see different behaviour in debug vs. release builds (or if
logging
+ // ranges changes the behaviour, comment out the 4 of the 6 lines
+ // below containing dup.
+ var dup = obj.duplicate();
+ dup.pasteHTML('|');
+ var out = 'IETextRange ' + strip(obj.parentElement().outerHTML);
+ dup.moveStart('character', -1);
+ dup.pasteHTML('');
+ return out;
+ }
+ }
+ return obj.toString ? obj.toString() : '[JavaScriptObject]';
+ }-*/;
+
+ /**
+ * Helper for {...@link #toString()}, for lighter "more production" code.
+ */
+ private final static native String toStringSimple(JavaScriptObject obj)
/*-{
+ return obj.toString ? obj.toString() : '[JavaScriptObject]';
+ }-*/;
+
+ /**
* Not directly instantiable. All subclasses must also define a
protected,
* empty, no-arg constructor.
*/
@@ -99,46 +148,16 @@
}-*/;
/**
- * catch-all toString in lieu of a better mechanism.
- * Basic assumption here is that this code is for debugging only!
+ * Makes a best-effort attempt to get a useful debugging string
describing
+ * the given JavaScriptObject. In web mode with assertions disabled,
this
+ * will either call and return the JSO's toString() if one exists, or
just
+ * return "[JavaScriptObject]". In hosted mode, or with assertions
enabled,
+ * some stronger effort is made to represent other types of JSOs,
including
+ * inspecting for document nodes' outerHTML and innerHTML, etc.
*/
@Override
- public final native String toString() /*-{
- var defined = function(m) { return typeof m != 'undefined'; };
- var strip = function(s) { return s.replace(/\r\n/g, ""); };
- // Output nodes that have outerHTML
- if (defined(this.outerHTML))
- return strip(this.outerHTML);
- // Output nodes that have innerHTML
- if (defined(this.innerHTML) && this.cloneNode) {
-
$doc.createElement('div').appendChild(this.cloneNode(true)).innerHTML;
- }
- // Output text nodes
- if (defined(this.nodeType) && this.nodeType == 3) {
- return "'" +
- this.data.replace(/ /g, "\u25ab").replace(/\u00A0/, "\u25aa") +
- "'";
- }
- // Output IE's TextRange (this code specific to IE7)
- if (typeof defined(this.htmlText) && this.collapse) {
- var html = this.htmlText;
- if (html) {
- return 'IETextRange [' + strip(html) + ']';
- } else {
- // NOTE(lars): using pasteHTML to place a | where the range is
collapsed
- // if *very* useful when debugging. It also, however, in certain
very subtle
- // circumstances change the range being toStringed! If you see
different
- // behaviour in debug vs. release builds (or if logging ranges
changes the
- // behaviour, comment out the 4 of the 6 lines below containing
dup.
- var dup = this.duplicate();
- dup.pasteHTML('|');
- var out = 'IETextRange ' + strip(this.parentElement().outerHTML);
- dup.moveStart('character', -1);
- dup.pasteHTML('');
- return out;
- }
- }
- return this.toString ? this.toString() : '[JavaScriptObject]';
- }-*/;
-
+ public final String toString() {
+ return JavaScriptObject.class.desiredAssertionStatus() ?
+ toStringVerbose(this) : toStringSimple(this);
+ }
}
--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---