Merge branch 'issue/35' of github.com:pmuellr/weinre into issue/35
diff --git a/weinre.build/build.properties b/weinre.build/build.properties
index 319717e..2b833f7 100644
--- a/weinre.build/build.properties
+++ b/weinre.build/build.properties
@@ -8,7 +8,7 @@
#-----------------------------------------------------------
# weinre version
#-----------------------------------------------------------
-WEINRE_VERSION: 1.1.0
+WEINRE_VERSION: 1.2.0
#-----------------------------------------------------------
# some common locations used in the ant scripts
diff --git a/weinre.build/debug.sh b/weinre.build/debug.sh
index c63b146..4abc85c 100755
--- a/weinre.build/debug.sh
+++ b/weinre.build/debug.sh
@@ -9,4 +9,5 @@
-agentlib:$DEBUG \
-Dfile.encoding=UTF-8 \
-classpath $CP \
- weinre.server.Main
\ No newline at end of file
+ weinre.server.Main \
+ --verbose true
\ No newline at end of file
diff --git a/weinre.doc/ChangeLog.body.html b/weinre.doc/ChangeLog.body.html
index 037a9f7..e1760e1 100644
--- a/weinre.doc/ChangeLog.body.html
+++ b/weinre.doc/ChangeLog.body.html
@@ -5,6 +5,20 @@
* Copyright (c) 2011 IBM Corporation
-->
+<!-- ======================================================================= -->
+<h2>2011/03/12 - version 1.2.0</h2>
+<ul>
+<li> DOM elements are now updated live as they change in the target
+<li> more console support; sprintf formatting and expandable object logging
+</ul>
+
+<p>issues closed:
+<ul>
+<li><a href="https://github.com/pmuellr/weinre/issues/27">issue 27</a> - edge case where programmatically created DOM is only picked up partially
+<li><a href="https://github.com/pmuellr/weinre/issues/37">issue 37</a> - console.log output doesn't do sprintf-style string interpolations
+</ul>
+
+<!-- ======================================================================= -->
<h2>2011/03/02 - version 1.1.0</h2>
<ul>
<li>added Timeline panel; tracks timers, intervals, XHRs, some other events, and
@@ -18,19 +32,20 @@
<p>issues closed:
<ul>
-<li><a href='https://github.com/pmuellr/weinre/issues/10'>issue 10</a> enable Timeline panel, and provide some events
-<li><a href='https://github.com/pmuellr/weinre/issues/20'>issue 20</a> catch up to latest Web Inspector code base
-<li><a href='https://github.com/pmuellr/weinre/issues/23'>issue 23</a> mac app's web pages can't connect to server
-<li><a href='https://github.com/pmuellr/weinre/issues/24'>issue 24</a> weinre server runs slowly on windows
-<li><a href='https://github.com/pmuellr/weinre/issues/25'>issue 25</a> pay down technical debt
-<li><a href='https://github.com/pmuellr/weinre/issues/28'>issue 28</a> create a standalone Java launch
-<li><a href='https://github.com/pmuellr/weinre/issues/29'>issue 29</a> autoconnect does not always work
-<li><a href='https://github.com/pmuellr/weinre/issues/30'>issue 30</a> all-json-idls.js is a pig
-<li><a href='https://github.com/pmuellr/weinre/issues/31'>issue 31</a> redirect error/warn/info/debug messages from client and target to server
-<li><a href='https://github.com/pmuellr/weinre/issues/32'>issue 32</a> monospace font too small everywhere
-<li><a href='https://github.com/pmuellr/weinre/issues/33'>issue 33</a> update doc
+<li><a href='https://github.com/pmuellr/weinre/issues/10'>issue 10</a> - enable Timeline panel, and provide some events
+<li><a href='https://github.com/pmuellr/weinre/issues/20'>issue 20</a> - catch up to latest Web Inspector code base
+<li><a href='https://github.com/pmuellr/weinre/issues/23'>issue 23</a> - mac app's web pages can't connect to server
+<li><a href='https://github.com/pmuellr/weinre/issues/24'>issue 24</a> - weinre server runs slowly on windows
+<li><a href='https://github.com/pmuellr/weinre/issues/25'>issue 25</a> - pay down technical debt
+<li><a href='https://github.com/pmuellr/weinre/issues/28'>issue 28</a> - create a standalone Java launch
+<li><a href='https://github.com/pmuellr/weinre/issues/29'>issue 29</a> - autoconnect does not always work
+<li><a href='https://github.com/pmuellr/weinre/issues/30'>issue 30</a> - all-json-idls.js is a pig
+<li><a href='https://github.com/pmuellr/weinre/issues/31'>issue 31</a> - redirect error/warn/info/debug messages from client and target to server
+<li><a href='https://github.com/pmuellr/weinre/issues/32'>issue 32</a> - monospace font too small everywhere
+<li><a href='https://github.com/pmuellr/weinre/issues/33'>issue 33</a> - update doc
</ul>
+<!-- ======================================================================= -->
<h2>2011/01/25 - version 1.0.0</h2>
<ul>
<li> Don't display "not implemented" messages. Closes <a href="https://github.com/pmuellr/weinre/issues/1">issue 19</a>.
@@ -45,6 +60,7 @@
<li> Get metrics working in Elements panel. Closes <a href="https://github.com/pmuellr/weinre/issues/1">issue 1</a>.
</ul>
+<!-- ======================================================================= -->
<h2>2010/12/16 - version 0.9.9</h2>
<ul>
diff --git a/weinre.doc/Home.body.html b/weinre.doc/Home.body.html
index 1660429..79c0896 100644
--- a/weinre.doc/Home.body.html
+++ b/weinre.doc/Home.body.html
@@ -97,32 +97,37 @@
how to use it, visit the <a href="TestDrive.html">Test Drive</a>.
<!-- ======================================================== -->
-<h2>Supported Platforms</h2>
+<h2>Supported Libraries and Platforms</h2>
+
+<p>Generally version numbers listed here are the earliest
+versions of the relevant thing that have been tested.
+Later versions of those things are also hopefully supported,
+but let us know.
+
+<h3>Libraries not supported</h3>
+
+<ul>
+<li>versions of Prototype.js before version 1.7 are not supported,
+as they do not support the <tt>JSON.stringify()</tt> API correctly. You
+will get an <tt>alert()</tt> in the web page you are debugging if you
+attempt to debug it with weinre and you are using an unsupported
+version of Prototype.js.
+</ul>
<h3>Debug client - the browser where the debugger user interface runs</h3>
<ul>
<li>weinre Mac application - Mac OS X 10.6 64-bit
-<li>Google Chrome 8.x beta
+<li>Google Chrome 8.x
<li>Apple Safari 5.x
-<li>others? please set us know
</ul>
<h3>Debug target - the browser with the page you are debugging</h3>
<ul>
-<li>Android 2.3 Browser application
-<li>Android 2.3 w/PhoneGap 0.9.2
<li>Android 2.2 Browser application
<li>Android 2.2 w/PhoneGap 0.9.2
<li>iOS 4.2.x Mobile Safari application
<li>BlackBerry v6.x simulator
-<li>others? please set us know
-</ul>
-
-<h3>Platforms that do not work</h3>
-
-<ul>
-<li>others? please set us know
</ul>
diff --git a/weinre.web/demo/weinre-demo-min.html b/weinre.web/demo/weinre-demo-min.html
index 978b170..9adcc3b 100644
--- a/weinre.web/demo/weinre-demo-min.html
+++ b/weinre.web/demo/weinre-demo-min.html
@@ -14,14 +14,13 @@
<script type="text/javascript">
require("weinre/common/Weinre").showNotImplemented()
- require("weinre/target/Target").main()
</script>
<script src="weinre-demo.js"></script>
</head>
<body onload="onLoad()">
-<input id="button" type="button" value="start stuff">
+<input id="button-start-stuff" type="button" value="start stuff">
<h1>this is a green h1</h1>
<h1 class="blue">this is a blue h1</h1>
@@ -29,6 +28,9 @@
<p>Some text, <i>some italic text</i>, and <b>some bold text</b>.
<div id="metrics">a div</div>
+
+<input id="button-clear-output" type="button" value="clear output">
+<div id="output"></div>
</body>
</html>
diff --git a/weinre.web/demo/weinre-demo-pieces.html b/weinre.web/demo/weinre-demo-pieces.html
index e88f0c5..fa4ca1a 100644
--- a/weinre.web/demo/weinre-demo-pieces.html
+++ b/weinre.web/demo/weinre-demo-pieces.html
@@ -26,6 +26,7 @@
<script src="/weinre/common/IDGenerator.transportd.js"></script>
<script src="/weinre/target/Console.transportd.js"></script>
<script src="/add-css-properties.js"></script>
+<script src="/weinre/target/CheckForProblems.transportd.js"></script>
<script src="/weinre/target/WiConsoleImpl.transportd.js"></script>
<script src="/weinre/target/WiCSSImpl.transportd.js"></script>
<script src="/weinre/target/WiDatabaseImpl.transportd.js"></script>
@@ -45,14 +46,13 @@
<script type="text/javascript">
require("weinre/common/Weinre").showNotImplemented()
- require("weinre/target/Target").main()
</script>
<script src="weinre-demo.js"></script>
</head>
<body onload="onLoad()">
-<input id="button" type="button" value="start stuff">
+<input id="button-start-stuff" type="button" value="start stuff">
<h1>this is a green h1</h1>
<h1 class="blue">this is a blue h1</h1>
@@ -60,6 +60,9 @@
<p>Some text, <i>some italic text</i>, and <b>some bold text</b>.
<div id="metrics">a div</div>
+
+<input id="button-clear-output" type="button" value="clear output">
+<div id="output"></div>
</body>
</html>
diff --git a/weinre.web/demo/weinre-demo.html b/weinre.web/demo/weinre-demo.html
index 150c9cb..ebdd2de 100644
--- a/weinre.web/demo/weinre-demo.html
+++ b/weinre.web/demo/weinre-demo.html
@@ -14,14 +14,13 @@
<script type="text/javascript">
require("weinre/common/Weinre").showNotImplemented()
- require("weinre/target/Target").main()
</script>
<script src="weinre-demo.js"></script>
</head>
<body onload="onLoad()">
-<input id="button" type="button" value="start stuff">
+<input id="button-start-stuff" type="button" value="start stuff">
<h1>this is a green h1</h1>
<h1 class="blue">this is a blue h1</h1>
@@ -29,6 +28,9 @@
<p>Some text, <i>some italic text</i>, and <b>some bold text</b>.
<div id="metrics">a div</div>
+
+<input id="button-clear-output" type="button" value="clear output">
+<div id="output"></div>
</body>
</html>
diff --git a/weinre.web/demo/weinre-demo.js b/weinre.web/demo/weinre-demo.js
index ddec2b9..5e3be85 100644
--- a/weinre.web/demo/weinre-demo.js
+++ b/weinre.web/demo/weinre-demo.js
@@ -7,23 +7,33 @@
//------------------------------------------------------------------------------
var started = false
-var button
+
+var buttonStartStuff
+var buttonClearOutput
+var outputElement
//------------------------------------------------------------------------------
function onLoad() {
- if (!button) button = document.getElementById("button")
+ if (!buttonStartStuff) buttonStartStuff = document.getElementById("button-start-stuff")
+ if (!buttonClearOutput) buttonClearOutput = document.getElementById("button-clear-output")
+ if (!outputElement) outputElement = document.getElementById("output")
- button.addEventListener("click", function() {
+ buttonStartStuff.addEventListener("click", function() {
if (!started) {
- button.value = "stop stuff"
+ buttonStartStuff.value = "stop stuff"
startStuff()
}
else {
- button.value = "start stuff"
+ buttonStartStuff.value = "start stuff"
stopStuff()
}
started = !started
})
+
+ buttonClearOutput.addEventListener("click", function() {
+ outputElement.innerHTML = ""
+ })
+
}
//------------------------------------------------------------------------------
@@ -39,11 +49,17 @@
//------------------------------------------------------------------------------
function intervalStuff() {
+
+ var message = "doing interval stuff at " + new Date()
+
// add a timeout
- setTimeout(function() { console.log("doing interval stuff")}, 333)
+ setTimeout(function() { console.log(message)}, 333)
// add a timeline marker
- console.markTimeline("doing interval Stuff")
+ console.markTimeline(message)
+
+ // write the message to the page
+ output(message)
// do an XHR
var xhr = new XMLHttpRequest()
@@ -58,6 +74,13 @@
}
//------------------------------------------------------------------------------
+function output(string) {
+ var element = document.createElement("div")
+ element.innerHTML = string
+ outputElement.appendChild(element)
+}
+
+//------------------------------------------------------------------------------
function logXhr(xhr) {
console.log("xhr: readyState: " + xhr.readyState)
}
diff --git a/weinre.web/modules/weinre/target/CheckForProblems.scoop b/weinre.web/modules/weinre/target/CheckForProblems.scoop
new file mode 100644
index 0000000..dc25ab8
--- /dev/null
+++ b/weinre.web/modules/weinre/target/CheckForProblems.scoop
@@ -0,0 +1,28 @@
+
+/*
+ * weinre is available under *either* the terms of the modified BSD license *or* the
+ * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ *
+ * Copyright (c) 2010, 2011 IBM Corporation
+ */
+
+//-----------------------------------------------------------------------------
+class CheckForProblems
+
+//-----------------------------------------------------------------------------
+static method check
+ checkForOldPrototypeVersion()
+
+//-----------------------------------------------------------------------------
+function checkForOldPrototypeVersion
+ var badVersion = false
+
+ if (typeof Prototype == "undefined") return
+ if (!Prototype.Version) return
+
+ if (Prototype.Version.match(/^1\.5.*/)) badVersion = true
+ if (Prototype.Version.match(/^1\.6.*/)) badVersion = true
+
+ if (badVersion) {
+ alert("Sorry, weinre is not support in versions of Prototype earlier than 1.7")
+ }
\ No newline at end of file
diff --git a/weinre.web/modules/weinre/target/Console.scoop b/weinre.web/modules/weinre/target/Console.scoop
index e796a02..b528b4d 100644
--- a/weinre.web/modules/weinre/target/Console.scoop
+++ b/weinre.web/modules/weinre/target/Console.scoop
@@ -52,6 +52,10 @@
}
//-----------------------------------------------------------------------------
+static getter original
+ return OriginalConsole
+
+//-----------------------------------------------------------------------------
static method useRemote(value)
if (arguments.length == 0) return UsingRemote
@@ -69,13 +73,21 @@
//-----------------------------------------------------------------------------
method _generic(level, messageParts)
- var message = messageParts.join(" ")
+ var message = messageParts[0]
+
+ var parameters = []
+ for (var i=0; i<messageParts.length; i++) {
+ parameters.push(
+ Weinre.injectedScript.wrapObjectForConsole(messageParts[i], true)
+ )
+ }
var payload = {
source: MessageSource.JS,
type: MessageType.Log,
level: level,
- message: message
+ message: message,
+ parameters: parameters
}
Weinre.wi.ConsoleNotify.addConsoleMessage(payload)
diff --git a/weinre.web/modules/weinre/target/NodeStore.scoop b/weinre.web/modules/weinre/target/NodeStore.scoop
index 2ddd83a..3c77093 100644
--- a/weinre.web/modules/weinre/target/NodeStore.scoop
+++ b/weinre.web/modules/weinre/target/NodeStore.scoop
@@ -6,13 +6,20 @@
* Copyright (c) 2010, 2011 IBM Corporation
*/
+requireClass ../common/Weinre
+requireClass ../common/IDGenerator
+
//-----------------------------------------------------------------------------
class NodeStore
this.__nodeMap = {}
this.__nodeDataMap = {}
- this.__nextId = 0
this.inspectedNodes = []
-
+
+ document.addEventListener("DOMSubtreeModified", handleDOMSubtreeModified, false)
+ document.addEventListener("DOMNodeInserted", handleDOMNodeInserted, false)
+ document.addEventListener("DOMNodeRemoved", handleDOMNodeRemoved, false)
+ document.addEventListener("DOMAttrModified", handleDOMAttrModified, false)
+ document.addEventListener("DOMCharacterDataModified", handleDOMCharacterDataModified, false)
//-----------------------------------------------------------------------------
method addInspectedNode(nodeId)
@@ -30,6 +37,10 @@
return this.__nodeMap[nodeId]
//-----------------------------------------------------------------------------
+method checkNodeId(node)
+ return node.__weinre_id
+
+//-----------------------------------------------------------------------------
method getNodeId(node)
if (node.__weinre_id) {
return node.__weinre_id
@@ -45,8 +56,20 @@
return this.serializeNode(this.getNode(nodeId), depth)
//-----------------------------------------------------------------------------
+method getPreviousSiblingId(node)
+ while (true) {
+ var sib = node.previousSibling
+ if (!sib) return 0
+
+ var id = this.checkNodeId(sib)
+ if (id) return id
+
+ node = sib
+ }
+
+//-----------------------------------------------------------------------------
method nextNodeId()
- return "" + (++this.__nextId)
+ return "" + IDGenerator.next()
//-----------------------------------------------------------------------------
method serializeNode(node, depth)
@@ -158,3 +181,57 @@
if (node.__weinreHighlighter) return true
if (node.nodeType != Node.TEXT_NODE) return false
return !!node.nodeValue.match(/^\s*$/)
+
+//-----------------------------------------------------------------------------
+function handleDOMSubtreeModified(event)
+ if (!event.attrChange) return
+
+ NodeStore.handleDOMAttrModified(event)
+
+//-----------------------------------------------------------------------------
+function handleDOMNodeInserted(event)
+ var targetId = Weinre.nodeStore.checkNodeId(event.target)
+ var parentId = Weinre.nodeStore.checkNodeId(event.relatedNode)
+
+ if (!parentId) return
+
+ var child = Weinre.nodeStore.serializeNode(event.target, 0)
+ var previous = Weinre.nodeStore.getPreviousSiblingId(event.target)
+ Weinre.wi.DOMNotify.childNodeInserted(parentId, previous, child)
+
+//-----------------------------------------------------------------------------
+function handleDOMNodeRemoved(event)
+ var targetId = Weinre.nodeStore.checkNodeId(event.target)
+ var parentId = Weinre.nodeStore.checkNodeId(event.relatedNode)
+
+ if (!parentId) return
+
+ if (targetId) {
+ Weinre.wi.DOMNotify.childNodeRemoved(parentId, targetId)
+ }
+ else {
+ var childCount = Weinre.nodeStore.childNodeCount(event.relatedNode)
+ Weinre.wi.DOMNotify.childNodeCountUpdated(parentId, childCount)
+ }
+
+//-----------------------------------------------------------------------------
+// This event is not actually fired in WebKit, but DOMSubtreeModified may
+// be fired for attribute changes. Doesn't seem to be at the moment.
+function handleDOMAttrModified(event)
+ var targetId = Weinre.nodeStore.checkNodeId(event.target)
+ if (!targetId) return
+
+ attrs = []
+ for (var i=0; i<event.target.attributes.length; i++) {
+ attrs.push(event.target.attributes[i].name)
+ attrs.push(event.target.attributes[i].value)
+ }
+
+ Weinre.wi.DOMNotify.attributesUpdated(targetId, attrs)
+
+//-----------------------------------------------------------------------------
+function handleDOMCharacterDataModified(event)
+ var targetId = Weinre.nodeStore.checkNodeId(event.target)
+ if (!targetId) return
+
+ Weinre.wi.DOMNotify.characterDataModified(targetId, event.newValue)
diff --git a/weinre.web/modules/weinre/target/Target.scoop b/weinre.web/modules/weinre/target/Target.scoop
index 73d8c00..d51ce41 100644
--- a/weinre.web/modules/weinre/target/Target.scoop
+++ b/weinre.web/modules/weinre/target/Target.scoop
@@ -14,6 +14,7 @@
requireClass ../common/MessageDispatcher
requireClass ../common/Weinre
+requireClass ./CheckForProblems
requireClass ./NodeStore
requireClass ./CSSStore
requireClass ./ElementHighlighter
@@ -34,6 +35,8 @@
//-----------------------------------------------------------------------------
static method main
+ CheckForProblems.check()
+
Weinre.target = new Target()
Weinre.target.initialize()