<!doctype html>

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

<html>
<head>
<title>weinre - Home</title>
<link rel="stylesheet" href="css/main.css" type="text/css">
<link rel="shortcut icon" href="images/weinre-icon-64x64.png" />
<script src="scripts/main.js"></script>
<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-736164-7']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>
</head>

<body>

<a class="no-decoration" href="https://github.com/pmuellr/weinre"><div class="ribbon">Fork weinre on GitHub</div></a>

<!-- ======================================================================= -->
<h1 class="page-title">weinre - Home</h1>

<div class="toc">
  <a href="Home.html">Home</a>
- <a href="TestDrive.html">Test Drive</a>
- <a href="Installing.html">Installing</a>
- <a href="Running.html">Running</a>
- <a href="MultiUser.html">Multi-User</a>
- <a href="Security.html">Security</a>
- <a href="Building.html">Building</a>
- <a href="ChangeLog.html">ChangeLog</a>
- <a href="License.html">License</a>
<p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
</div>


<!--
 * 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/pmuellr/weinre">https://github.com/pmuellr/weinre</a>
<li>Documentation: <a href="http://pmuellr.github.com/weinre">http://pmuellr.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>



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

<div class="toc">
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<p>
  <a href="Home.html">Home</a>
- <a href="TestDrive.html">Test Drive</a>
- <a href="Installing.html">Installing</a>
- <a href="Running.html">Running</a>
- <a href="MultiUser.html">Multi-User</a>
- <a href="Security.html">Security</a>
- <a href="Building.html">Building</a>
- <a href="ChangeLog.html">ChangeLog</a>
- <a href="License.html">License</a>

<br><img src="images/weinre-icon-128x128.png">
</div>

</body>
</html>
