<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Planet Mozilla &#8211; Software is hard</title>
	<atom:link href="http://www.softwareishard.com/blog/category/planet-mozilla/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.softwareishard.com/blog</link>
	<description>More musings on software development</description>
	<lastBuildDate>Fri, 09 Aug 2024 12:19:39 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.33</generator>
	<item>
		<title>Inspecting WebSocket Traffic with Firefox Developer Tools</title>
		<link>http://www.softwareishard.com/blog/planet-mozilla/inspecting-websocket-traffic-with-firefox-developer-tools/</link>
		<pubDate>Mon, 11 Apr 2016 13:01:07 +0000</pubDate>
		<dc:creator><![CDATA[Honza]]></dc:creator>
				<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[WebSockets]]></category>

		<guid isPermaLink="false">http://www.softwareishard.com/blog/?p=1102</guid>
		<description><![CDATA[WebSocket monitor is an extension to Firefox developer tools that can be used to monitor WebSocket connections in Firefox. It allows inspecting all data sent and received. It's been a while since we published first version of our add-on for inspecting WebSocket traffic and it's good time to summarize all new features and show how [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><em>WebSocket monitor is an extension to Firefox developer tools that can be used to monitor WebSocket connections in Firefox. It allows inspecting all data sent and received.</em></p>
<p>It's been a while since we published first version of our add-on for inspecting WebSocket traffic and it's good time to summarize all new features and show how it's integrated with Firefox Developer tools.</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/addon/websocket-monitor/">Download</a> signed version of this add-on from AMO. The source code with further documentation is available on <a href="https://github.com/firebug/websocket-monitor">github</a>.</p>
<p><i style="color:red"> Update 2019/10/21: New <a href="https://hacks.mozilla.org/2019/10/firefoxs-new-websocket-inspector/">WebSocket inspector</a> has been released in Firefox 71</i></p>
<p>WebSocket Monitor can be used to track any WS connection, but following protocols have an extra support: <strong>Socket.IO, SockJS, Plain JSON, WAMP, MQTT</strong>.</p>
<p></p>
<p><a href="http://www.softwareishard.com/blog/wp-content/mainbig.png" rel="lightbox[1102]"><img src="http://www.softwareishard.com/blog/wp-content/main.png" alt="" title="" width="520" height="210" class="aligncenter size-full wp-image-1135" srcset="http://www.softwareishard.com/blog/wp-content/main.png 520w, http://www.softwareishard.com/blog/wp-content/main-300x121.png 300w" sizes="(max-width: 520px) 100vw, 520px" /></a><br />
(click to enlarge)</p>
<p><span id="more-1102"></span></p>
<h3>Introduction</h3>
<p>After the add-on is installed, open Firefox Developer Tools (F12 on Win or ⌥⌘I on OSX) and switch into a new <strong>Web Sockets</strong> panel. The panel displays list of frames sent/received by all WebSockets connections on the current page as well as <em>Connect</em> and <em>Disconnect</em> events.</p>
<p><img src="http://www.softwareishard.com/blog/wp-content/frames.png" alt="" title="" width="520" height="239" class="aligncenter size-full wp-image-1114" align="center" srcset="http://www.softwareishard.com/blog/wp-content/frames.png 520w, http://www.softwareishard.com/blog/wp-content/frames-300x137.png 300w" sizes="(max-width: 520px) 100vw, 520px" /></p>
<p>The screenshot above shows one <em>Connect</em> event, one <em>Sent</em> frame and one <em>Received</em> frame. There is also a summary at the bottom of the list showing number of frames in the list, total size of transferred payload and total time since the first frame.</p>
<p>The screenshot below shows content of the side panel that displays all details of the selected packet.</p>
<p style="text-align:center"><img src="http://www.softwareishard.com/blog/wp-content/side-panel2.png" alt="" title="side-panel" width="319" height="384" class="aligncenter size-full wp-image-1122" srcset="http://www.softwareishard.com/blog/wp-content/side-panel2.png 319w, http://www.softwareishard.com/blog/wp-content/side-panel2-249x300.png 249w" sizes="(max-width: 319px) 100vw, 319px" /></p>
<h3>Filtering</h3>
<p>The extension allows simple filtering of the frame list. It's possible to filter using a keyword where only frames with the keyword in the payload are displayed. Or you might pick a connection ID and see only frames sent/received through that connection.</p>
<p><img src="http://www.softwareishard.com/blog/wp-content/filter2.png" alt="" title="filter2" width="520" height="253" class="aligncenter size-full wp-image-1125" srcset="http://www.softwareishard.com/blog/wp-content/filter2.png 520w, http://www.softwareishard.com/blog/wp-content/filter2-300x145.png 300w" sizes="(max-width: 520px) 100vw, 520px" /></p>
<h3>Protocols</h3>
<p>WebSocket Monitor allows inspecting any WS connection, but there is an extra support for the following protocols:</p>
<ul>
<li><a href="http://socket.io/">Socket.IO</a></li>
<li><a href="https://github.com/sockjs">SockJS</a></li>
<li>Plain JSON</li>
<li><a href="http://wamp-proto.org/">WAMP</a></li>
<li><a href="http://mqtt.org/">MQTT</a></li>
</ul>
<p>These protocols introduce an extra side bar with parsed payload. See the next screenshot that shows parsed SocketIO frame payload as an expandable tree allowing quick inspection.</p>
<p><img src="http://www.softwareishard.com/blog/wp-content/socket.io_.png" alt="" title="socket.io" width="520" height="220" class="aligncenter size-full wp-image-1127" srcset="http://www.softwareishard.com/blog/wp-content/socket.io_.png 520w, http://www.softwareishard.com/blog/wp-content/socket.io_-300x126.png 300w" sizes="(max-width: 520px) 100vw, 520px" /></p>
<h3>Table and Chat Perspectives</h3>
<p>There are two ways how to visualize frames. Apart from the <strong>Tabular View</strong> (see the screenshot above) there is also a <strong>Chat View</strong> that uses well know 'user-chat' approach (used in various messengers).</p>
<p><img src="http://www.softwareishard.com/blog/wp-content/perspective.png" alt="" title="" width="520" height="224" class="aligncenter size-full wp-image-1129" srcset="http://www.softwareishard.com/blog/wp-content/perspective.png 520w, http://www.softwareishard.com/blog/wp-content/perspective-300x129.png 300w" sizes="(max-width: 520px) 100vw, 520px" /></p>
<h3>Inline Data Preview</h3>
<p>Both perspectives offers also an inline data preview. You don't have to always select the frame and go to the side bar, just open the data directly in the frame.</p>
<p><img src="http://www.softwareishard.com/blog/wp-content/inline.png" alt="" title="" width="520" height="252" class="aligncenter size-full wp-image-1131" srcset="http://www.softwareishard.com/blog/wp-content/inline.png 520w, http://www.softwareishard.com/blog/wp-content/inline-300x145.png 300w" sizes="(max-width: 520px) 100vw, 520px" /></p>
<p></p>
<p>There are more small and nifty features so, don't forget to checkout our <a href="https://github.com/firebug/websocket-monitor/wiki">wiki</a> if you are interested!</p>
<h3>Resources</h3>
<ul>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/websocket-monitor/">Download</a></li>
<li><a href="https://github.com/firebug/websocket-monitor">Source Code</a></li>
<li><a href="https://github.com/firebug/websocket-monitor/wiki">Wiki</a></li>
<li><a href="http://janodvarko.cz/test/websockets/">Test page</a></li>
</ul>
]]></content:encoded>
			</item>
		<item>
		<title>Firebug Internals II. &#8211; Unified object rendering</title>
		<link>http://www.softwareishard.com/blog/firebug/firebug-internals-ii-unified-object-rendering/</link>
		<pubDate>Tue, 10 Jun 2014 15:20:54 +0000</pubDate>
		<dc:creator><![CDATA[Honza]]></dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Planet Mozilla]]></category>

		<guid isPermaLink="false">http://www.softwareishard.com/blog/?p=964</guid>
		<description><![CDATA[Firebug 2 (released today!) uses number of internal architectural concepts that help to implement new features as well as effectively maintain the code base. Using transparent architecture and well known design patterns has always been one of the key strategies of the (relatively small) Firebug team that allows us maintain rather large set of features [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>Firebug 2</strong> (<a href="http://blog.getfirebug.com/2014/06/10/firebug-2-0/">released today</a>!) uses number of internal architectural concepts that help to implement new features as well as effectively maintain the code base.</p>
<p>Using transparent architecture and well known design patterns has always been one of the key strategies of the (relatively small) Firebug team that allows us maintain rather large set of features in Firebug.</p>
<p>This post describes the way how Firebug deals with JavaScript object representation and the concept ensuring that an object is always rendered the same way across entire Firebug UI.</p>
<ul>
<li><strong>Firebug 2.0</strong> is compatible with <strong>Firefox 30 - 32</strong></li>
</ul>
<p>&nbsp;</p>
<p>See also <a href="http://blog.getfirebug.com/2014/06/10/firebug-2-0/">list of new features in Firebug 2</a></p>
<p><a href="http://www.softwareishard.com/blog/firebug/firebug-internals-i-data-providers-and-viewers/">Firebug Internals I.</a> </p>
<p><span id="more-964"></span></p>
<h3>Unified Object Rendering</h3>
<p>Firebug (as a web developer tool) is primarily dealing with JS objects coming from the currently debugged page. All these objects are displayed to the user allowing further exploration and inspection. Important aspect of the rendering logic is that an object is always rendered using the same scheme (a template) across Firebug UI. It doesn't matter if the object is displayed in the Console panel, DOM panel or inside the Watch panel when Firebug is halted at a breakpoint. It always look the same and also offers the same set of actions (through the context menu).</p>
<p>Let's see an example. Following three images show how <code>&lt;body&gt;</code> element is displayed in different Firebug panels.</p>
<p>Here is <code>&lt;body&gt;</code> logged in the Console panel.</p>
<p><img alt="" src="http://www.softwareishard.com/architecture/unified-object-rendering/console-panel.png" class="aligncenter" width="520" height="171" /></p>
<p>This screenshot displays <code>&lt;body&gt;</code> in the DOM panel.</p>
<p><img alt="" src="http://www.softwareishard.com/architecture/unified-object-rendering/dom-panel.png" class="aligncenter" width="520" height="171" /></p>
<p>And the last screenshot shows how it looks like in the Watch side panel.</p>
<p><img alt="" src="http://www.softwareishard.com/architecture/unified-object-rendering/watch-panel.png" class="aligncenter" width="520" height="171" /></p>
<p>The element is always rendered using the same template and also the context menu associated with the object offers the same basic actions (plus those related to the current context).</p>
<h3>Architecture</h3>
<p>The architecture behind unified rendering is relatively simple. The logic is based on a repository of templates where every template is associated with JS object type (number, string, etc.). When a panel needs to render an object it gets its type and asks the repository for a template that is associated with it. The template is consequently used to generate HTML markup.</p>
<p>Firebug uses <a href="https://getfirebug.com/wiki/index.php/Domplate">Domplate</a> engine fore templates, but any other templating system could be used instead.</p>
<p><img alt="" src="http://www.softwareishard.com/architecture/unified-object-rendering/rendering-logic.png" class="aligncenter" width="473" height="272" /></p>
<ul>
<li>An object (JS object coming from debugged page content) is logged into the Console panel.</li>
<li>The panel asks the repository to render the object.</li>
<li>Repository gets the right registered template for the object (done usually according to object's type).</li>
<li>Finally, the template renders itself using the original object as data.</li>
</ul>
<h3>Implementation</h3>
<p>Let's yet see a few code examples that show how (simplified) implementation looks like from JavaScript perspective.</p>
<p>Here is how <code>getTemplate</code> can implemented (note that Firebug implementation is a bit different):</p>
<div class="dean_ch" style="white-space: wrap;">getTemplate: <span class="kw2">function</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">// Iterate registered templates and return the</span><br />
&nbsp; &nbsp; <span class="co1">// one that supports given object</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i=<span class="nu0">0</span>; i&lt;templates.<span class="me1">length</span>; i++<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> template = templates<span class="br0">&#91;</span>i<span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>template.<span class="me1">supportsObject</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> template;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> defaultTemplate;<br />
<span class="br0">&#125;</span></div>
<p>An interface of a template object looks like as follows (again simplified).</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">var</span> Template = <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; className: <span class="st0">&quot;&quot;</span>,</p>
<p>&nbsp; &nbsp; supportsObject: <span class="kw2">function</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="kw2">false</span>; <span class="br0">&#125;</span>,<br />
&nbsp; &nbsp; getContextMenuItems: <span class="kw2">function</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>; <span class="br0">&#125;</span>,<br />
&nbsp; &nbsp; getTooltip: <span class="kw2">function</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="kw2">null</span>; <span class="br0">&#125;</span>,<br />
&nbsp; &nbsp; highlightObject: <span class="kw2">function</span><span class="br0">&#40;</span>object, context<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>,<br />
&nbsp; &nbsp; inspectObject: <span class="kw2">function</span><span class="br0">&#40;</span>object, context<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>,<br />
<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
<ul>
<li><code>className</code> Every template should have a classname so CSS styles can be associated.</li>
<li><code>supportsObject</code> Used to pick the right template for an object</li>
<li><code>getContextMenuItems</code> Used to get commands that are should be displayed in the context menu.</li>
<li><code>getTooltip</code> Provides a text that is displayed in a tooltip.</li>
<li><code>highlightdObject</code> Can be used to highlight the object within the page if mouse hovers over the object.</li>
<li><code>inspectObject</code> Can be used for further inspection of the object (e.g. selecting the right target panel when the user clicks on the object).</li>
</ul>
<p>See real repository of templates (a template in Firebug is called <em>rep</em>) on <a href="https://github.com/firebug/firebug/blob/firebug1.12/extension/content/firebug/chrome/reps.js">github</a>.</p>
<h3>Extension Points</h3>
<p>The entire concept is also nicely extensible. This is great especially for extension (i.e. Mozilla add-ons) authors that can plug in into the logic and customize it.</p>
<ul>
<li>Extensions can provide and register new templates that are rendering specific object types (coming e.g. from JS libraries like jQuery or EmberJS) and define how objects are rendered across entire UI.</li>
<li>Extensions can also provide a set of actions that can be performed on existing of custom object types.</li>
<li>Extensions can specify new CSS for existing templates and create custom themes.</li>
</ul>
]]></content:encoded>
			</item>
		<item>
		<title>Firebug Internals I. &#8211; Data Providers and Viewers</title>
		<link>http://www.softwareishard.com/blog/firebug/firebug-internals-i-data-providers-and-viewers/</link>
		<comments>http://www.softwareishard.com/blog/firebug/firebug-internals-i-data-providers-and-viewers/#comments</comments>
		<pubDate>Fri, 28 Mar 2014 13:35:35 +0000</pubDate>
		<dc:creator><![CDATA[Honza]]></dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Planet Mozilla]]></category>

		<guid isPermaLink="false">http://www.softwareishard.com/blog/?p=920</guid>
		<description><![CDATA[One of the achievements of Firebug 2 alpha 1 release has been adoption of new JSD2 API and this task required significant changes and improvements in our code base. Among other things, we have also introduced a new concept that allows to nicely build asynchronously updated UI. There are other concepts in Firebug 2 and [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>One of the achievements of <a href="https://blog.getfirebug.com/2014/03/26/firebug-2-0-alpha-1/">Firebug 2 alpha 1 release</a> has been adoption of new <a href="https://wiki.mozilla.org/Debugger">JSD2 API</a> and this task required significant changes and improvements in our code base. Among other things, we have also introduced a new concept that allows to nicely build asynchronously updated UI.</p>
<p><em>There are other concepts in Firebug 2 and this version is with no doubt the best one we have released. Try it and let us know how it works for you (Firefox 30+ needed).</em></p>
<p>In order to implement remote access to the server side debugger API, Firebug UI needs to know how to deal with asynchronous update. We applied <strong>Viewer Provider</strong> pattern and extended it with support for asynchronous data processing.</p>
<p>If you like using <em>Document View</em>, <em>Model View Controller</em> or similar design patterns to build your code base, you'll probably like <em>Viewer Provider</em> too.</p>
<p>So, follow this post if you are interested to know what <em>Viewer Provider</em> looks like.</p>
<p><span id="more-920"></span></p>
<h3>Viewer Provider</h3>
<p>This design pattern represents a concept of data providers that mediate data access through an unified interface. Providers are usually consumed by <em>Views</em> (or <em>Viewers</em>) that use them to query for data and asynchronously populate their content when results are available.</p>
<p>First let's see simpler, but related <em>Document View</em> pattern:</p>
<p><img alt="" src="http://www.softwareishard.com/architecture/viewer-provider/view-document.png" class="center" /></p>
<ul>
<li><em>View</em> is responsible for data rendering</li>
<li><em>Document</em> represents a data source</li>
</ul>
<p>The problem with this concept is that <em>View</em> needs to know the interface (API) of the <em>Document</em>. This makes it hard for the <em>View</em> to switch to another data source, in other words, it's hard to reuse the same <em>View</em> for other <em>Documents</em>.</p>
<p>An improvement of this simple concept is incorporating a <em>Provider</em> in between the <em>Document</em> and <em>View</em>. The provider knows the <em>Document</em> API and expose them in unified way to the <em>Viewer</em>.</p>
<p><img alt="" src="http://www.softwareishard.com/architecture/viewer-provider/view-provider-document.png" class="center" /></p>
<ul>
<li><em>Provider</em> provides data through unified interface</li>
</ul>
<p>There is typically one provider for one specific data source/document,  but in complex application (like Firebug) there can be even a <a href="https://getfirebug.com/wiki/index.php/Data_Providers_%26_Viewers#Providers">hierarchy</a> of providers.</p>
<p>Having data providers implemented for various data sources means that existing viewers can easily consume any data and can be simply reused.</p>
<p><img alt="" src="http://www.softwareishard.com/architecture/viewer-provider/viewers.png" class="center" /></p>
<p>Here is how <em>Provider</em> interface looks like:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">var</span> Provider =<br />
<span class="br0">&#123;</span><br />
&nbsp; hasChildren: <span class="kw2">function</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="kw1">this</span>.<span class="me1">getChildren</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">length</span> &gt; <span class="nu0">0</span>; <span class="br0">&#125;</span>,<br />
&nbsp; getChildren: <span class="kw2">function</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>; <span class="br0">&#125;</span>,<br />
&nbsp; getLabel: <span class="kw2">function</span><span class="br0">&#40;</span>object, col<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="st0">&quot;&quot;</span>; <span class="br0">&#125;</span>,<br />
&nbsp; getValue: <span class="kw2">function</span><span class="br0">&#40;</span>object, col<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="kw2">null</span>; <span class="br0">&#125;</span>,<br />
<span class="br0">&#125;</span></div>
<ul>
<li><em>hasChildren</em>: used mostly by tree-style viewers that needs to know whether a twisty (+/- icons) should be displayed for specific item or not; It's implementation can be simple, as you can see in the code or optimized for various scenarios.</li>
<li><em>getChildren</em>: returns a list of child objects for the given object</li>
<li><em>getLabel</em>: returns a label for the given object; The label will be directly displayed within the UI (e.g. in a drop down list). The col argument can be used by UI widgets supporting tabular data display (several labels for given object/row).</li>
<li><em>getValue</em> returns a value for the given object </li>
</ul>
<h3>Asynchronous Viewer Provider</h3>
<p>One of the challenges when consuming data is support for asynchronous processing. Especially in case on web applications toady. If you need a data you send XHR and wait for the asynchronous response. Viewer and Provider pattern has a solution fort this too.</p>
<p><img alt="" src="http://www.softwareishard.com/architecture/viewer-provider/asynchronous-viewer-provider.png" class="center" /></p>
<ul>
<li><em>getChildren</em>  returns a <a href="https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Promise">Promise</a> instead of a direct list of children. The promise is resolved asynchronously as soon as data is available.</li>
</ul>
<p>The main difference is that <code>getChildren</code> returns a <a href="https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Promise">Promise</a>. The solid line (on the image above) represents synchronous data querying, the dashed line represents asynchronous update. The promise object usually comes from the data source and is passed through the provider to the view. Of course, the update happens when queried data are available.</p>
<h3>Online Demo</h3>
<p>You can also check out a simple web application that shows how viewers and providers can be implemented.</p>
<ul>
<li>Source repository on <a href="https://github.com/janodvarko/prototypes/tree/master/async-provider-demo">github</a>
<li>Online demo on <a href="http://www.softwareishard.com/architecture/viewer-provider/demo/">this page</a>
</ul>
<p>The demo application implements the following objects:</p>
<ul>
<li><em>Storage</em> a simple data storage (a document) returning data asynchronously</li>
<li><em>Provider</em> implemented for the <em>Storage</em> above</li>
<li><em>Viewer</em> simple list viewer that is using the <em>Provider</em> above to access data.</li>
</ul>
<p>The application's entry point is <em>main.js</em></p>
<div class="bullet">&nbsp;</div>
<p>&nbsp;<br />
&nbsp;</p>
<p>Read more about Data Provider and how they are <a href="https://getfirebug.com/wiki/index.php/Data_Providers_%26_Viewers#Firebug_Implementation">implemented</a> in <strong>Firebug 2</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwareishard.com/blog/firebug/firebug-internals-i-data-providers-and-viewers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Firebug 2: Support for dynamic scripts</title>
		<link>http://www.softwareishard.com/blog/firebug/firebug-2-support-for-dynamic-scripts/</link>
		<comments>http://www.softwareishard.com/blog/firebug/firebug-2-support-for-dynamic-scripts/#comments</comments>
		<pubDate>Thu, 27 Mar 2014 17:34:12 +0000</pubDate>
		<dc:creator><![CDATA[Honza]]></dc:creator>
				<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[Release]]></category>

		<guid isPermaLink="false">http://www.softwareishard.com/blog/?p=882</guid>
		<description><![CDATA[Firebug 2 (first alpha) has been released this week and it's time to checkout some of the new features. Note that you need at least Firefox 30 to run it. This brand new version introduces a lot of changes where the most important one is probably the fact that it's based on new Firefox debugging [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://bit.ly/1g1q5n0">Firebug 2</a> (first alpha) has been released this week and it's time to checkout some of the new features. Note that you need at least <strong>Firefox 30</strong> to run it.</p>
<p>This brand new version introduces a lot of changes where the most important one is probably the fact that it's based on new Firefox debugging engine known as <a href="https://wiki.mozilla.org/Debugger">JSD2</a>.</p>
<p>Also Firebug UI has been polished to match Australis theme introduced in Firefox 29.</p>
<p><img class="aligncenter" src="http://www.softwareishard.com/images/posts/firebug2a1/firebug-win.png" alt="" width="520" height="191" /><br />
<span id="more-882"></span></p>
<h3>Dynamically Created Scripts</h3>
<p>Let's see how debugging of dynamically created scripts has been improved in this release and how Firebug UI deals with this common task. We'll cover following dynamic scripts in this post:</p>
<ul>
<li>Inline Event Handlers</li>
<li>Script Element Injection</li>
<li>Function Object</li>
</ul>
<p><em>There are other ways how to create scripts dynamically.</em></p>
<p>&nbsp;</p>
<h4>Inline Event Handlers</h4>
<p>Inline event handlers are little pieces of JavaScript placed within HTML attributes designed to handle basic events like <em>onclick</em>.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="sc3"><span class="re1">&lt;button</span> <span class="re0">onclick</span>=<span class="st0">&quot;testFunction()&quot;</span><span class="re2">&gt;</span></span>Click Me<span class="sc3"><span class="re1">&lt;/button<span class="re2">&gt;</span></span></span></div>
<p>These scripts are compiled dynamically when needed (before executed for the first time). That's why they are considered dynamic and you don't have to see them in the Script location list (until compiled by the browser).</p>
<p><img class="aligncenter" src="http://www.softwareishard.com/images/posts/firebug2a1/inline-event-handler.png" alt="" /></p>
<p>Script's URL is composed dynamically (there is no real URL for dynamic scripts) and event handlers scripts follow this scheme:</p>
<p>&lt;element-name&gt; &lt;attribute-name&gt; &lt;button-label&gt;</p>
<p>If you select the script from the script location menu, you should see the source that is placed within the <em>onclick</em> attribute.</p>
<p><img class="aligncenter" src="http://www.softwareishard.com/images/posts/firebug2a1/inline-event-handler2.png" alt="" /></p>
<p>Of course, you can create a breakpoint as usual. Try live <a href="http://www.softwareishard.com/images/posts/firebug2a1/example1.html">example page</a> if you have Firebug 2 <a href="https://getfirebug.com/releases/firebug/2.0/">installed</a>.</p>
<p>&nbsp;</p>
<h4>Script Element Injection</h4>
<p>Another way how to dynamically compile a piece of script is using <code>&lt;script&gt;</code> element injection.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">var</span> script =<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;var a = 10;<span class="es0">\n</span>&quot;</span> +<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;var b = 10;<span class="es0">\n</span>&quot;</span> +<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;console.log('a + b = %d', a + b);<span class="es0">\n</span>&quot;</span> +<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;//# sourceURL=injected-script.js<span class="es0">\n</span>&quot;</span>;</p>
<p><span class="kw2">var</span> scriptTag = document.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">&quot;script&quot;</span><span class="br0">&#41;</span>;<br />
scriptTag.<span class="me1">textContent</span> = script;<br />
document.<span class="me1">body</span>.<span class="me1">appendChild</span><span class="br0">&#40;</span>scriptTag<span class="br0">&#41;</span>;</div>
<p>Again, you can check out <a href="http://www.softwareishard.com/images/posts/firebug2a1/example2.html">live example</a>.</p>
<p><img class="aligncenter" src="http://www.softwareishard.com/images/posts/firebug2a1/injected-script-element.png" alt="" /></p>
<p>There is couple of things to see:</p>
<ul>
<li>There is one event handler script: <em>button onclick Click Me</em> since we injected the script through a button and its event handler.</li>
<li>There is another dynamic script <em>injected-script.js</em> - this one created using the injected <code>&lt;script&gt;</code> element</li>
<li>Injected script uses custom URL, which is defined within the source using <em>sourceURL</em> comment:<br />
<code>//# sourceURL=injected-script.js</code></p>
<li>If no <code>sourceURL</code> is provided default one is generated (using <code>script</code> element id or xpath)</li>
</ul>
<p><img class="aligncenter" src="http://www.softwareishard.com/images/posts/firebug2a1/injected-script-element2.png" alt="" /></p>
<p>&nbsp;</p>
<h4>Function Object</h4>
<p>Another way how to compile a script dynamically is using JavaScript native <code>Function</code> object.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">var</span> source = <span class="st0">&quot;console.log('a + b = %d', a + b);<span class="es0">\n</span>&quot;</span>;<br />
<span class="kw2">var</span> myFunc = <span class="kw2">new</span> <span class="kw2">Function</span><span class="br0">&#40;</span><span class="st0">&quot;a&quot;</span>, <span class="st0">&quot;b&quot;</span>, source<span class="br0">&#41;</span>;<br />
myFunc.<span class="me1">displayName</span> = <span class="st0">&quot;myFunc&quot;</span>;</p>
<p>myFunc<span class="br0">&#40;</span><span class="nu0">10</span>, <span class="nu0">10</span><span class="br0">&#41;</span>;</div>
<p><img class="aligncenter" src="http://www.softwareishard.com/images/posts/firebug2a1/function-object.png" alt="" /></p>
<ul>
<li>The script URL is generated automatically. The following scheme is used: &lt;parent-page-url&gt; &lt;line-number&gt; "> Function";
</li>
<li>You can't use <em>sourceURL</em> due to a platform <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=981987">bug</a></li>
<li>There is one event handler script</li>
</ul>
<p><img class="aligncenter" src="http://www.softwareishard.com/images/posts/firebug2a1/function-object2.png" alt="" /></p>
<p>Check out <a href="http://www.softwareishard.com/images/posts/firebug2a1/example3.html">live example</a>.</p>
<p class="bullet">
<p>&nbsp;</p>
<p>We want to switch into beta phase soon and it would be great to hear from you about how this version is working for you.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwareishard.com/blog/firebug/firebug-2-support-for-dynamic-scripts/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Firebug Tip: Resend HTTP Request</title>
		<link>http://www.softwareishard.com/blog/planet-mozilla/firebug-tip-resend-http-request/</link>
		<comments>http://www.softwareishard.com/blog/planet-mozilla/firebug-tip-resend-http-request/#comments</comments>
		<pubDate>Fri, 06 Sep 2013 10:28:37 +0000</pubDate>
		<dc:creator><![CDATA[Honza]]></dc:creator>
				<category><![CDATA[Firebug Tip]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[request]]></category>
		<category><![CDATA[resend]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://www.softwareishard.com/blog/?p=844</guid>
		<description><![CDATA[There are many cases when web developer needs to resend an existing HTTP request (executed by the currently debugged page) and test the server back-end or perhaps even a specific web service. Such action can be often repeated, and so the task should be simple and quick. Firebug offers several ways how to resend HTTP [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>There are many cases when web developer needs to resend an existing HTTP request (executed by the currently debugged page) and test the server back-end or perhaps even a specific web service.</p>
<p>Such action can be often repeated, and so the task should be simple and quick.</p>
<p>Firebug offers several ways how to resend HTTP request, read more if you are interested...</p>
<p class="firebugTipsLink">See all <a href="http://www.softwareishard.com/blog/firebug-tips/">Firebug tips</a></p>
<p><span id="more-844"></span></p>
<h3>Resend Action</h3>
<p>The first and obvious way is to use <b>Resend</b> action that is available in the Net and Console panel context menu. It's the simplest method, just right click on an HTTP request in the Net panel or on XHR log in the Console panel and pick the <em>Resend</em> menu item.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/tips/resend/resend.png" class="aligncenter" width="520" height="174" /></p>
<p>You should see a new request displayed. Both requests will be the same since Firebug preserves headers, posted data, etc.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/tips/resend/resend2.png" class="aligncenter" width="520" height="281" /></p>
<p>You can use this <a href="http://www.softwareishard.com/firebug/tips/resend/resend.html">test page</a> to try it yourself.</p>
<p>The URL of the webservice is:</p>
<div class="dean_ch" style="white-space: wrap;">http://www.softwareishard.com/firebug/tips/resend/hello.php</div>
<p>...and the implementation looks like as follows:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">&lt;?php</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&quot;name&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Hello &quot;</span>.<span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&quot;name&quot;</span><span class="br0">&#93;</span>.<span class="st0">&quot;!&quot;</span>;<br />
<span class="kw1">else</span><br />
&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Hello!&quot;</span>;<br />
<span class="kw2">?&gt;</span></div>
<h3>Copy as cURL</h3>
<p>You might prefer OS system command line and its <a href="http://curl.haxx.se/">cURL</a> command line tool.</p>
<p>A simple example first. To get the response from our <em>hello.php</em> service you need to execute:</p>
<div class="dean_ch" style="white-space: wrap;">curl http://www.softwareishard.com/firebug/tips/resend/hello.php</div>
<p>In order to get the cURL command for an existing HTTP request, right click on the request in the Net or Console panel and pick <b>Copy as cURL</b> action. Firebug will copy it with all necessary arguments to the clipboard (preserving headers, etc.)</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/tips/resend/resend3.png" class="aligncenter" width="520" height="214" /></p>
<p>The result in our case is:</p>
<div class="dean_ch" style="white-space: wrap;">curl 'http://www.softwareishard.com/firebug/tips/resend/hello.php' -H 'Host: www.softwareishard.com' -H 'User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:26.0) Gecko/20100101 Firefox/26.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Referer: http://www.softwareishard.com/firebug/tips/resend/resend.html' --data 'name=Bob'</div>
<h3>Command Editor</h3>
<p>The third option is using Firebug <strong>Command Editor</strong> and execute XHR with pure JavaScript. In this case you might specify headers and other options just as you like it.</p>
<p>Just open Firebug UI and select the Console panel on the page you are debugging.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/tips/resend/resend4.png" class="aligncenter" width="520" height="252" /></p>
<p>&nbsp;<br />
&nbsp;</p>
<ul>
<li>Would you be interested to have another way to resend a request?</li>
<li>Would it be useful to have also <strong>Copy as Wget</strong>? If yes star <a href="http://code.google.com/p/fbug/issues/detail?id=6645">this issue</a>, so we know how high priority it is for us.
</li>
</ul>
<p>&nbsp;</p>
<div class="bullet">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://www.softwareishard.com/blog/planet-mozilla/firebug-tip-resend-http-request/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Firebug Tip: getEventListeners() command</title>
		<link>http://www.softwareishard.com/blog/planet-mozilla/firebug-tip-geteventlisteners-command/</link>
		<comments>http://www.softwareishard.com/blog/planet-mozilla/firebug-tip-geteventlisteners-command/#comments</comments>
		<pubDate>Mon, 02 Sep 2013 06:40:47 +0000</pubDate>
		<dc:creator><![CDATA[Honza]]></dc:creator>
				<category><![CDATA[Firebug Tip]]></category>
		<category><![CDATA[Planet Mozilla]]></category>

		<guid isPermaLink="false">http://www.softwareishard.com/blog/?p=806</guid>
		<description><![CDATA[One of the new features introduced in Firebug 1.12 is a new Command Line command called: getEventListeners() &#160; The command returns all the event listeners registered for specific target. The target can be either an element, or another DOM object that accepts event listeners (e.g. window or an XMLHttpRequest). See all Firebug tips Basic Scenario [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>One of the new features introduced in <a href="https://blog.getfirebug.com/2013/08/21/firebug-1-12-0/">Firebug 1.12</a> is a new Command Line command called:</p>
<p><code>getEventListeners()</code><br />
&nbsp;<br />
<em>The command returns all the event listeners registered for specific target. The target can be either an element, or another DOM object that accepts event listeners (e.g. window or an XMLHttpRequest).</em></p>
<p class="firebugTipsLink">See all <a href="http://www.softwareishard.com/blog/firebug-tips/">Firebug tips</a></p>
<p><span id="more-806"></span></p>
<h3>Basic Scenario</h3>
<p>Let's see how the basic usage of the <em>getEventListeners()</em> command looks like. First, here is a test page that registers one click listener for a <em>testElement</em>.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="sc0">&lt;!DOCTYPE html&gt;</span><br />
<span class="sc3"><span class="re1">&lt;html<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;head<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>getEventListeners()<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/head<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;body<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;div</span> <span class="re0">id</span>=<span class="st0">&quot;testElement&quot;</span><span class="re2">&gt;</span></span>Click Me!<span class="sc3"><span class="re1">&lt;/div<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;script<span class="re2">&gt;</span></span></span><br />
function myClickListener()<br />
{<br />
&nbsp; &nbsp; console.log(&quot;click&quot;);<br />
}<br />
var testElement = document.getElementById(&quot;testElement&quot;);<br />
testElement.addEventListener(&quot;click&quot;, myClickListener, false);<br />
<span class="sc3"><span class="re1">&lt;/script<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/body<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/html<span class="re2">&gt;</span></span></span></div>
<p>The expression we are going to execute on Firebug's Command Line looks like as follows:</p>
<p><code>getEventListeners($("#testElement"))</code></p>
<p>It returns a descriptor object that is logged into the Console panel.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/tips/geteventlisteners/console-panel.png" class="aligncenter" width="520" height="177" /></p>
<p>If you click the descriptor you'll be navigated to the DOM panel that allows further inspection.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/tips/geteventlisteners/dom-panel.png" class="aligncenter" width="520" height="204" /></p>
<p>As you can see, there is one click listener registered with the <em>testElement</em> element (the <em>click</em> field is an array containing all registered <em>click</em> listeners). Clicking the <em>myClickListener</em> function navigates you to the Script panel to see its source code and perhaps create a breakpoint for further debugging.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/tips/geteventlisteners/script-panel.png" class="aligncenter" width="520" height="335" /></p>
<h3>Using getEventListeners() in an expression</h3>
<p>In some cases, we might want to reference the listener function directly in an expression:</p>
<p><code>getEventListeners($("#testElement")).click[0].listener</code></p>
<p>The expression returns directly the handler function that is logged into the Console panel. You'll be navigated to the Script panel directly if you click the return value.</p>
<p>You might also want to manually execute the listener function and e.g. break in the debugger in case you created a breakpoint inside the method.</p>
<p><code>getEventListeners($("#testElement")).click[0].listener()</code></p>
<h3>Event Listeners & Closures</h3>
<p>Some JavaScript libraries that implements API for event listener registration might register their own function and call the original listener through a closure. Let's see a simple example that demonstrates this technique.</p>
<div class="dean_ch" style="white-space: wrap;">observe<span class="br0">&#40;</span>testElement, <span class="st0">&quot;click&quot;</span>, <span class="kw2">function</span> myClickHandler<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;click&quot;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">function</span> observe<span class="br0">&#40;</span>element, eventType, handler<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> localHelper<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; handler<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> element.<span class="me1">addEventListener</span><span class="br0">&#40;</span>eventType, localHelper, <span class="kw2">false</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Executing the following expression on the command line returns <em>localHelper</em> function since it's the registered event handler.</p>
<p><code>getEventListeners($("#testElement")).click[0].listener</code></p>
<p>If you want to log the original listener function <em>myClickHandler</em> - you need to get the <em>handler</em> argument that is accessed by <em>localHelper</em> closure. Next expression shows how variable inside a closure can be accessed (via: <code>.%</code> syntax).</p>
<p><code>getEventListeners($("#testElement")).click[0].listener.%handler</code></p>
<p>This expression returns reference to <em>myClickHandler</em> function.</p>
<p>&nbsp;</p>
<p>You can read more about <a href="https://getfirebug.com/wiki/index.php/Closure_Inspector">Closure Inspector</a> on Firebug wiki.<br />
You can also read wiki page about <a href="https://getfirebug.com/wiki/index.php/GetEventListeners">getEventListeners</a> command.</p>
<div class="bullet">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://www.softwareishard.com/blog/planet-mozilla/firebug-tip-geteventlisteners-command/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>How to Start with Firebug Lite</title>
		<link>http://www.softwareishard.com/blog/planet-mozilla/how-to-start-with-firebug-lite/</link>
		<comments>http://www.softwareishard.com/blog/planet-mozilla/how-to-start-with-firebug-lite/#comments</comments>
		<pubDate>Wed, 21 Aug 2013 18:30:53 +0000</pubDate>
		<dc:creator><![CDATA[Honza]]></dc:creator>
				<category><![CDATA[Firebug Lite]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[bookmarklet]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Extension]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[iPad]]></category>

		<guid isPermaLink="false">http://www.softwareishard.com/blog/?p=800</guid>
		<description><![CDATA[FirebugLite is lightweight version of Firebug (the Firefox extension) that does implement only a subset of features (mainly missing the Script and Net panel). It's implemented as pure web application and running in all major browser. Using Firebug lite is quick since it doesn't have to be installed (it's a web app) and it can [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="https://getfirebug.com/firebuglite">FirebugLite</a> is lightweight version of <a href="https://getfirebug.com/">Firebug</a> (the Firefox extension) that does implement only a subset of features (mainly missing the Script and Net panel).</p>
<p>It's implemented as pure web application and running in all major browser.</p>
<p>Using Firebug lite is quick since it doesn't have to be installed (it's a web app) and it can also be injected into an existing page using a bookmarklet.</p>
<p>The next set of screenshots shows how Firebug Lite looks like in various browsers.</p>
<p><img alt="" src="http://www.softwareishard.com/images/posts/start-with-firebuglite/firefox.png" class="aligncenter" width="520" height="300" /></p>
<p>&nbsp;</p>
<p><img alt="" src="http://www.softwareishard.com/images/posts/start-with-firebuglite/chrome.png" class="aligncenter" width="520" height="297" /></p>
<p>&nbsp;</p>
<p><img alt="" src="http://www.softwareishard.com/images/posts/start-with-firebuglite/explorer.png" class="aligncenter" width="520" height="263" /></p>
<p>&nbsp;</p>
<p>Let's see how you can run Firebug Lite within a web page. This post covers four scenarios:</p>
<ul>
<li>Include using &lt;script&gt; element</li>
<li>Run through Bookmarklet</li>
<li>Firebug Lite on iPad</li>
<li>Run as Chrome Extension</li>
</ul>
<p><span id="more-800"></span></p>
<h3>Include using &lt;script&gt; element</h3>
<p>Firebug Lite is pure JS application and so you can include it in your page just like any other JavaScript code. See an example:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="sc0">&lt;!DOCTYPE html&gt;</span><br />
<span class="sc3"><span class="re1">&lt;html<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;head<span class="re2">&gt;</span></span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>Test<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;script</span> <span class="re0">src</span>=<span class="st0">&quot;https://getfirebug.com/firebug-lite.js&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">type</span>=<span class="st0">&quot;text/javascript&quot;</span><span class="re2">&gt;</span></span><span class="sc3"><span class="re1">&lt;/script<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/head<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;body<span class="re2">&gt;</span></span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;div</span> <span class="re0">style</span>=<span class="st0">&quot;color:green&quot;</span><span class="re2">&gt;</span></span>Hello<span class="sc3"><span class="re1">&lt;/div<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/body<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/html<span class="re2">&gt;</span></span></span></div>
<p>This approach is recommended in cases when you often inspect the same page and you want to have Firebug Lite UI always ready after page load (refresh). You can also download <a href="https://getfirebug.com/releases/lite/latest/firebug-lite.tar.tgz">firebug-lite.js</a> file and run it locally from your web server as follows:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="sc3"><span class="re1">&lt;script</span> <span class="re0">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="re0">src</span>=<span class="st0">&quot;/local/path/to/firebug-lite.js&quot;</span><span class="re2">&gt;</span></span><span class="sc3"><span class="re1">&lt;/script<span class="re2">&gt;</span></span></span></div>
<p>Read <a href="https://getfirebug.com/firebuglite">more</a>.</p>
<h3>Run through Bookmarklet</h3>
<p>You an also inject Firebug Lite into an existing page using the following bookmarklet. </p>
<div class="dean_ch" style="white-space: wrap;">javascript:<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>F,i,r,e,b,u,g,L,I,T,E<span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw1">if</span><span class="br0">&#40;</span>F.<span class="me1">getElementById</span><span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="kw1">return</span>;E=F<span class="br0">&#91;</span>i+<span class="st0">'NS'</span><span class="br0">&#93;</span>&amp;&amp;F.<span class="me1">documentElement</span>.<span class="me1">namespaceURI</span>;E=E?F<span class="br0">&#91;</span>i+<span class="st0">'NS'</span><span class="br0">&#93;</span><span class="br0">&#40;</span>E,<span class="st0">'script'</span><span class="br0">&#41;</span>:F<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'script'</span><span class="br0">&#41;</span>;E<span class="br0">&#91;</span>r<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'id'</span>,b<span class="br0">&#41;</span>;E<span class="br0">&#91;</span>r<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'src'</span>,I+g+T<span class="br0">&#41;</span>;E<span class="br0">&#91;</span>r<span class="br0">&#93;</span><span class="br0">&#40;</span>b,u<span class="br0">&#41;</span>;<span class="br0">&#40;</span>F<span class="br0">&#91;</span>e<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'head'</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>||F<span class="br0">&#91;</span>e<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'body'</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>.<span class="me1">appendChild</span><span class="br0">&#40;</span>E<span class="br0">&#41;</span>;E=new%20Image;E<span class="br0">&#91;</span>r<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'src'</span>,I+L<span class="br0">&#41;</span>;<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span>document,<span class="st0">'createElement'</span>,<span class="st0">'setAttribute'</span>,<span class="st0">'getElementsByTagName'</span>,<span class="st0">'FirebugLite'</span>,<span class="st0">'4'</span>,<span class="st0">'firebug-lite.js'</span>,<span class="st0">'releases/lite/latest/skin/xp/sprite.png'</span>,<span class="st0">'https://getfirebug.com/'</span>,<span class="st0">'#startOpened'</span><span class="br0">&#41;</span>;</div>
<p>Just drag this <a href="javascript:(function(F,i,r,e,b,u,g,L,I,T,E){if(F.getElementById(b))return;E=F[i+'NS']&&F.documentElement.namespaceURI;E=E?F[i+'NS'](E,'script'):F[i]('script');E[r]('id',b);E[r]('src',I+g+T);E[r](b,u);(F[e]('head')[0]||F[e]('body')[0]).appendChild(E);E=new%20Image;E[r]('src',I+L);})(document,'createElement','setAttribute','getElementsByTagName','FirebugLite','4','firebug-lite.js','releases/lite/latest/skin/xp/sprite.png','https://getfirebug.com/','#startOpened');">Firebug Lite Link</a> into your Bookmarks toolbar. You can also click the link immediately to test Firebug Lite on this page.</p>
<p>This approach is recommended in cases when you use Firebug Lite for inspecting random pages.</p>
<h3>Firebug Lite on iPad</h3>
<p>One of the most interesting use cases is running Firebug Lite on mobile devices, especially tablets since they have bigger screen (Firebug Lite is not yet optimized for small screens).</p>
<p>Inspecting pages on mobile devices can be faster with Firebug Lite since you don't have to deal with remote debugging settings, setup connection with the PC, etc. All you need is to click a bookmarklet.</p>
<p><a href="http://www.softwareishard.com/images/posts/start-with-firebuglite/iPad.png" rel="lightbox[800]"><img src="http://www.softwareishard.com/images/posts/start-with-firebuglite/iPad-thumb.png" alt="" title="iPad" width="520" height="395" class="aligncenter size-medium wp-image-3366" /></a></p>
<p>Read a post about how to create <a href="http://iosbookmarklets.com/tutorials/firebug-lite-bookmarklet-ipad/">Firebug Lite Bookmarklet for iPad</a>.</p>
<h3>Run as Chrome Extension</h3>
<p>Finally, you can <a href="https://chrome.google.com/webstore/detail/firebug-lite-for-google-c/bmagokdooijbeehmkpknfglimnifench">install Firebug Lite</a> as an extension into Google Chrome browser. </p>
<p>There are benefits over Firebug Lite bookmarlet:</p>
<ul>
<li>Browser toolbar integration</li>
<li>Able to activate Firebug Lite for a particular domain</li>
<li>Firebug Lite will be loaded before all other scripts, allowing it to capture all console calls, and all XHR requests for that page</li>
<li>It is faster to load, because all code and images will be store in the extension's directory in your machine</li>
<li>Will be able to read external resources in the next version</li>
</ul>
<p>Read more about <a href="https://getfirebug.com/releases/lite/chrome/">Firebug Lite on Chrome</a>.</p>
<h3>Resources</h3>
<ul>
<li><a href="https://getfirebug.com/firebuglite">Home Page</a></li>
<li><a href="https://github.com/firebug/firebug-lite">Source Repository</a></li>
<li><a href="https://github.com/firebug/firebug-lite/issues">Issue List</a></li>
<li><a href="https://getfirebug.com/wiki/index.php/Firebug_Lite_FAQ">FAQ Page</a></li>
<li><a href="https://groups.google.com/forum/?fromgroups#!forum/firebug">Newsgroups</a> (shared with Firebug)</li>
</ul>
<p>If you are interested to contribute to the project you can start with reading <a href="http://gal.steinitz.com/blog/2013/07/19/remember-firebug-lite/">Gal's post</a> explaining what you can do. <a href="https://twitter.com/galori">Gal Steinitz</a> is the current Firebug Lite maintainer, so shoot any questions about what's coming up in his direction!</p>
<p>You might also be interested in what <a href="https://blog.getfirebug.com/2013/05/02/future-of-firebug-lite/">the future holds for Firebug Lite</a>.</p>
<div class="bullet">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://www.softwareishard.com/blog/planet-mozilla/how-to-start-with-firebug-lite/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Firebug Extension: FirePicker &#8211; Pick your color</title>
		<link>http://www.softwareishard.com/blog/firebug/firebug-extension-firepicker-pick-your-color/</link>
		<pubDate>Thu, 08 Aug 2013 09:20:59 +0000</pubDate>
		<dc:creator><![CDATA[Honza]]></dc:creator>
				<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Firebug Extension]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[color]]></category>
		<category><![CDATA[Firebug extension]]></category>
		<category><![CDATA[FirePicker]]></category>
		<category><![CDATA[picker]]></category>

		<guid isPermaLink="false">http://www.softwareishard.com/blog/?p=796</guid>
		<description><![CDATA[I couldn't miss this nifty extension in my series of posts about Firebug extensions. It's a small plugin focused on one thing and working great! This extension is compatible with Firebug 1.12 (will be released in couple of weeks). FirePicker adds a small color picker dialog when editing a CSS rule in Firebug. The addon [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I couldn't miss this nifty extension in my series of posts about Firebug extensions. It's a small plugin focused on one thing and working great!</p>
<p><em>This extension is compatible with Firebug 1.12 (will be released in couple of weeks).</em></p>
<p><a href="https://addons.mozilla.org/en-us/firefox/addon/firepicker/">FirePicker</a> adds a small color picker dialog when editing a CSS rule in Firebug. The addon scans for values that can be parsed as CSS colors and displays them in a drop-down list right below the firebug's CSS editor box. Clicking on the color value in the drop-down brings up a color picker dialog.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firepicker/firepicker.png" title="FirePicker Color Dialog" class="aligncenter" width="520" height="304" /></p>
<p><span id="more-796"></span></p>
<h3>Multiple Colors</h3>
<p>The integration works well and the UI/UX is pretty intuitive, so let me just mention how multiple color support look like. In case there are more colors values specified for single CSS property Fire picker previews them all in the drop down list.</p>
<p>See an example.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="sc3"><span class="re1">&lt;html<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;head<span class="re2">&gt;</span></span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>FirePicker<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;style<span class="re2">&gt;</span></span></span><br />
&nbsp; body {<br />
&nbsp; &nbsp; border: 1px solid;<br />
&nbsp; &nbsp; border-color: red green blue orange;<br />
&nbsp; }<br />
&nbsp; <span class="sc3"><span class="re1">&lt;/style<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/head<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;body<span class="re2">&gt;</span></span></span>Hello World!<span class="sc3"><span class="re1">&lt;/body<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/html<span class="re2">&gt;</span></span></span></div>
<p>If you click the <code>border-color</code> CSS property value to edit it FirePicker displays a little preview for every color.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firepicker/multiple-colors.png" class="aligncenter" width="520" height="366" /></p>
<p>Clicking on a color in the list shows the color-picker dialog that allows changing the value.</p>
<h3>Resources</h3>
<ul>
<li><a href="http://thedarkone.github.io/firepicker/">Home Page</a></li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/firepicker/">Download</a></li>
<li><a href="https://github.com/thedarkone/firepicker/issues">Issue List</a></li>
</ul>
<div class="bullet">&nbsp;</div>
]]></content:encoded>
			</item>
		<item>
		<title>Firebug Extension: FireStorage Plus! &#8211; Manage web storage</title>
		<link>http://www.softwareishard.com/blog/firebug/firebug-extension-firestorage-plus-manage-web-storage/</link>
		<comments>http://www.softwareishard.com/blog/firebug/firebug-extension-firestorage-plus-manage-web-storage/#comments</comments>
		<pubDate>Tue, 06 Aug 2013 14:08:47 +0000</pubDate>
		<dc:creator><![CDATA[Honza]]></dc:creator>
				<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Firebug Extension]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[FireStorage]]></category>
		<category><![CDATA[local]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[storage]]></category>

		<guid isPermaLink="false">http://www.softwareishard.com/blog/?p=785</guid>
		<description><![CDATA[Another Firebug extension we have tested with upcoming Firebug 1.12 (will be available in several weeks) allows managing web storage directly in your Firebug. &#160; FireStorage Plus! appends an extra Firebug tab which lets you inspect and modify the local and session storage. Local Storage Example The user interface and experience is simple and intuitive. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Another Firebug extension we have tested with upcoming Firebug 1.12 (will be available in several weeks) allows managing web storage directly in your Firebug.<br />
&nbsp;<br />
<a href="https://addons.mozilla.org/en-US/firefox/addon/firestorage-plus/">FireStorage Plus!</a> appends an extra Firebug tab which lets you inspect and modify the local and session storage.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firestorageplus/firestorageplus.png" title="FireStorage Plus!" class="aligncenter" width="520" height="229" /></p>
<p><span id="more-785"></span></p>
<h3>Local Storage Example</h3>
<p>The user interface and experience is simple and intuitive. It looks and works just like you would expect from this kind of extension. Let's see a quick example that puts some data into the local storage:</p>
<div class="dean_ch" style="white-space: wrap;">localStorage.<span class="me1">setItem</span><span class="br0">&#40;</span><span class="st0">&quot;Father&quot;</span>, <span class="st0">&quot;John, 32 years old&quot;</span><span class="br0">&#41;</span>;<br />
localStorage.<span class="me1">setItem</span><span class="br0">&#40;</span><span class="st0">&quot;Mother&quot;</span>, <span class="st0">&quot;Angela, 31 years old&quot;</span><span class="br0">&#41;</span>;</div>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firestorageplus/localstorage.png" title="Local Storage Example" class="aligncenter" width="520" height="194" /></p>
<h3>Modify Data</h3>
<p>You can also easily modify existing data. Just right click on an entry in the panel and pick <em>Edit</em>.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firestorageplus/edit.png" title="Edit data" class="aligncenter" width="520" height="343" /></p>
<p>As you can see in the context menu there are more actions related to data management. You can also remove existing or create new storage entries.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firestorageplus/editdialog.png" title="Edit Dialog" class="center" width="376" height="336" /></p>
<h3>Filtering</h3>
<p>The <em>FireStorage Plus!</em> panel offers also a few buttons for filtering its content. See extended example that also stores some data into the session storage.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="co1">// Initialize local storage</span><br />
localStorage.<span class="me1">setItem</span><span class="br0">&#40;</span><span class="st0">&quot;Father&quot;</span>, <span class="st0">&quot;John, 32 years old&quot;</span><span class="br0">&#41;</span>;<br />
localStorage.<span class="me1">setItem</span><span class="br0">&#40;</span><span class="st0">&quot;Mother&quot;</span>, <span class="st0">&quot;Angela, 31 years old&quot;</span><span class="br0">&#41;</span>;</p>
<p><span class="co1">// Initialize session storage</span><br />
sessionStorage.<span class="me1">Vacation</span> = <span class="st0">&quot;Bali, middle of August&quot;</span>;</div>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firestorageplus/localandsession.png" title="Local and Session storage displayed" class="aligncenter" width="520" height="207" /></p>
<ul>
<li><em>Both</em> - display data from both local and session storage</li>
<li><em>localStorage</em> - display data from the local storage only</li>
<li><em>sessionStorage</em> - display data from the session storage only</li>
<li><em>localStorage all scopes</em> - display data from the local storage for all scopes</li>
</ul>
<h3>DOM Panel</h3>
<p>Note, that the (built-in) DOM panel has also basic support for data storage management. It's not that nice and useful especially in case of bigger amount of data, but worth of mentioning.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firestorageplus/dompanel.png" title="DOM Panel & Local storage" class="aligncenter" width="520" height="159" /></p>
<h3>Resources</h3>
<ul>
<li><a href="http://nickbelhomme.com/">FireStorage Plus! home page</a></li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/firestorage-plus/">Download</a></li>
<li><a href="http://www.softwareishard.com/firebug/extensions/firestorageplus/storage.html">Test Page</a></li>
<li><a href="https://github.com/NickBelhomme">Source Code</a></li>
</ul>
<p>&nbsp;</p>
<p>Is there any other feature you'd like to see in this extension?</p>
<div class="bullet">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://www.softwareishard.com/blog/firebug/firebug-extension-firestorage-plus-manage-web-storage/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Firebug Extension: FireQuery &#8211; jQuery development</title>
		<link>http://www.softwareishard.com/blog/firebug/firebug-extension-firequery-jquery-development/</link>
		<comments>http://www.softwareishard.com/blog/firebug/firebug-extension-firequery-jquery-development/#comments</comments>
		<pubDate>Thu, 25 Jul 2013 07:34:01 +0000</pubDate>
		<dc:creator><![CDATA[Honza]]></dc:creator>
				<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Firebug Extension]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[FireQuery]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.softwareishard.com/blog/?p=780</guid>
		<description><![CDATA[FireQuery is one of my favorite extensions for Firebug and I am regularly using it every time I am debugging web application that is build on top of jQuery. &#160; FireQuery is a Firebug extension for jQuery development. It's a collection of Firebug enhancements for jQuery. jQuerify FireQuery allows you to inject jQuery into any [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>FireQuery</strong> is one of my favorite extensions for Firebug and I am regularly using it every time I am debugging web application that is build on top of <strong>jQuery</strong>.<br />
&nbsp;<br />
<a href="https://addons.mozilla.org/en-us/firefox/addon/firequery/">FireQuery</a> is a Firebug extension for jQuery development. It's a collection of Firebug enhancements for jQuery.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firequery/firequery.png" class="aligncenter" width="520" height="305" /></p>
<p><span id="more-780"></span></p>
<h3>jQuerify</h3>
<p><strong>FireQuery</strong> allows you to inject jQuery into any web page. Just click the <em>jQuerify</em> button in the Console panel.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firequery/jquerify.png" class="alignnone" width="520" height="61" /></p>
<p>You can specify your own URL in <code>about:config</code> for the key <code>extensions.firebug.firequery.jQueryURL</code>.</p>
<p><em>Note that page jQuerifying can be also done through Firebug built-in <a href="http://www.softwareishard.com/blog/firebug/firebug-tip-include-command/">include()</a> command.</em></p>
<h3>jQuery Wrapper</h3>
<p><b>FireQuery</b> also improves logs displayed in the Console panel. When you use <code>$()</code> (the one coming from jQuery) you'll see that the log is marked as being done using jQuery wrapper.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firequery/jquery-wrapper.png" class="aligncenter" width="520" height="171" /></p>
<h3>jQuery Data</h3>
<p><b>FireQuery</b> visualizes attached <a href="http://api.jquery.com/jQuery.data/">jQuery.data()</a>.</p>
<div class="dean_ch" style="white-space: wrap;">$<span class="br0">&#40;</span><span class="st0">&quot;body&quot;</span><span class="br0">&#41;</span>.<span class="me1">data</span><span class="br0">&#40;</span><span class="st0">&quot;name&quot;</span>, <span class="st0">&quot;Joe&quot;</span><span class="br0">&#41;</span>.<span class="me1">data</span><span class="br0">&#40;</span><span class="st0">&quot;age&quot;</span>, <span class="st0">&quot;39&quot;</span><span class="br0">&#41;</span></div>
<p>Executing the script in a page (or on Firebug's Command Line) will associate data with the <code>body</code> element. Now if you query for the <code>body</code> element you'll see a little envelop icon attached to the result.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firequery/jquery-data.png" class="aligncenter" width="520" height="162" /></p>
<p>Clicking on the icon will navigate you to the DOM Panel where you can see/inspect all details.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firequery/jquery-data-dompanel.png" class="aligncenter" width="520" height="126" /></p>
<p>Finally, you can also use the HTML panel to see the data.</p>
<p><img alt="" src="http://www.softwareishard.com/firebug/extensions/firequery/jquery-data-htmlpanel.png" class="aligncenter" width="520" height="180" /></p>
<p>&nbsp;</p>
<p>There are more features, so check out the <a href="http://firequery.binaryage.com/">FireQuery home page</a>.</p>
<h3>Resources</h3>
<ul>
<li><a href="http://firequery.binaryage.com/">FireQuery Home Page</a></li>
<li><a href="http://firequery.binaryage.com/test/">Test Page</a></li>
<li><a href="https://addons.mozilla.org/en-us/firefox/addon/firequery/">Download</a></li>
</ul>
<div class="bullet">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://www.softwareishard.com/blog/firebug/firebug-extension-firequery-jquery-development/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
