
<!--
 * 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
-->

<p><span class="weinre">weinre</span> is <b>We</b>b <b>In</b>spector <b>Re</b>mote.
Pronounced like the word "winery".  Or maybe like the word "weiner".  Who knows,
really.

<p>It's a debugger for web pages, like 
FireBug (for FireFox)
and 
Web Inspector (for WebKit-based browsers), except it's designed
to work <b>remotely</b>, and in particular, to <b>allow you debug web pages
on a mobile device such as a phone</b>.

<p>If you aren't familiar with FireBug or Web Inspector, 
<span class="weinre">weinre</span> isn't going to make too much sense to you.
<span class="weinre">weinre</span> reuses the user interface code from the
<a href="http://trac.webkit.org/wiki/WebInspector">Web Inspector project at WebKit</a>,
so if you've used Safari's Web Inspector or Chrome's Developer Tools,  
<span class="weinre">weinre</span> will be very familiar. 

<!--
<div class="note">
<p>NOTE: Please note that <span class="weinre">weinre</span> is still under development and 
is not fully operational.  
The current version only supports the following functionality:

<ul class="spaced">
<li>basic console interaction, to capture <tt>console.log()</tt> messages, and 
interactively execute JavaScript in the web page
<li>displaying the DOM in the elements panel
</ul>

</div>
-->

<p>Here's what you can do with it:

<p><img src="images/gmail-green-target-client.jpg">

<p>Two screen captures are shown above.  

<p>The screen capture on the left is from an 
iPod Touch, running the Mobile Safari app, visiting a browser-based email web site
you may be familiar with.

<p>The screen capture on the right is the from a laptop computer, running the
<span class="weinre">weinre</span> debug client, debugging the web page on the left.  The DOM being displayed
in the elements panel is from the HTML being displayed in the web browser on the iPod Touch.

<p>You might think that green background in the email client is a bit horrifying.
It's not normally green.  I made it green by executing the following JavaScript code
in the <span class="weinre">weinre</span> console area (as you can see above):

<pre>
document.body.style.background = "green"
</pre>

<p>If you are familiar with WebKit's Web Inspector,
a partial list of differences between it and <span class="weinre">weinre</span>
are listed below:

<ul class="spaced">

<li><span class="weinre">weinre</span> does not make use of any 'native' code, 
it's all JavaScript (and currently Java code for the 'server').

<li>Because <span class="weinre">weinre</span> doesn't use 'native' code, 
it's functionality is limited.  For instance, source level debug of JavaScript
is not possible.
  
<li>Because <span class="weinre">weinre</span> doesn't use 'native' code, 
the debug target code will run on browsers
without specialized debug support.  For instance, a browser running on your phone.
  
<li><span class="weinre">weinre</span> supports 'remote' interaction, 
so you can run the debugger user interface on one 
machine and can debug a web page running
on another machine.  For instance, debug a web page displayed on your phone from your
laptop.
  
<li>Because <span class="weinre">weinre</span> supports 'remote' interaction, 
multiple debug clients can be debugging the same debug target at the same time.

<li>One thing <b>not</b> different from Web Inspector is that the debug client
user interface only runs on WebKit-based browsers.  Sorry folks.

</ul>

<p>Find out more by clicking one of the links at the top or bottom of the page 
- to see a walkthrough of
how to use it, visit the <a href="TestDrive.html">Test Drive</a>.

<!-- ======================================================== -->
<h2>Places</h2>

<ul>
<li>GitHub: <a href="https://github.com/phonegap/weinre">https://github.com/phonegap/weinre</a>
<li>Documentation: <a href="http://phonegap.github.com/weinre">http://phonegap.github.com/weinre</a>
<li>Google Group: <a href="http://groups.google.com/group/weinre">http://groups.google.com/group/weinre</a>
</ul>

<!-- ======================================================== -->
<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>Platforms not supported</h3>

<ul>
<li>iOS 3.1.3 or earlier
<li>webOS 1.45 or earlier
</ul>

<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>Platforms supported - debug client</h3>
<p>The browser where the debugger user interface runs.

<ul>
<li>weinre Mac application - Mac OS X 10.6 64-bit
<li>Google Chrome 8.x
<li>Apple Safari 5.x 
</ul>

<h3>Platforms supported - debug target</h3>
<p>The browser with the page you are debugging.

<ul>
<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>webOS 2.x (unspecified version)
</ul>

