<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[André Selmanagić]]></title>
  <link href="http://FunkMonkey.github.com/atom.xml" rel="self"/>
  <link href="http://FunkMonkey.github.com/"/>
  <updated>2012-11-17T19:45:01+01:00</updated>
  <id>http://FunkMonkey.github.com/</id>
  <author>
    <name><![CDATA[André]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Using TypeScript for Mozilla platform development]]></title>
    <link href="http://FunkMonkey.github.com/blog/2012/11/17/using-typescript-for-mozilla-platform-development/"/>
    <updated>2012-11-17T18:35:00+01:00</updated>
    <id>http://FunkMonkey.github.com/blog/2012/11/17/using-typescript-for-mozilla-platform-development</id>
    <content type="html"><![CDATA[<p>Recently I started converting <a href="https://github.com/FunkMonkey/Loomo">Loomo</a> to <a href="http://www.typescriptlang.org/">TypeScript</a>. Results are currently in the <a href="https://github.com/FunkMonkey/Loomo/tree/typescript-support">typescript</a> branch.</p>

<h2>JS code modules</h2>

<p>The most challenging part was the support for Mozilla&#8217;s <a href="https://developer.mozilla.org/en-US/docs/JavaScript_code_modules">JS code modules</a>, as they don&#8217;t fit well with the two module formats TypeScript can generate - CommonJS and AMD.</p>

<p>I created a module (in plain JS) that provides functionality for writing a JS code module using CommonJS syntax (the format TS compiles to).</p>

<p>It does two important things:</p>

<ul>
<li>it gives the module a <code>require</code> function that allows loading of relatively located modules</li>
<li>it turns exported objects (<code>exports.foo</code>) into elements of <code>EXPORTED_SYMBOLS</code></li>
</ul>


<figure class='code'><figcaption><span>CommonJS.jsm  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">EXPORTED_SYMBOLS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;initCommonJSModule&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"> * Initializes the global object of a Mozilla JS Module to be a CommonJS module</span>
</span><span class='line'><span class="cm"> *    - adds require and exports</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'><span class="cm"> * @param  {Object}   global   Global object of Mozilla JS module</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">initCommonJSModule</span><span class="p">(</span><span class="nx">global</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// adding CommonJS require</span>
</span><span class='line'>  <span class="nx">global</span><span class="p">.</span><span class="nx">require</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">require</span><span class="p">(</span><span class="nx">path</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="s2">&quot;__URI__&quot;</span> <span class="k">in</span> <span class="nx">global</span><span class="p">))</span>
</span><span class='line'>            <span class="k">throw</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&quot;require may only be used from a JSM, and its first argument &quot;</span><span class="o">+</span>
</span><span class='line'>                        <span class="s2">&quot;must be that JSM&#39;s global object (hint: use this)&quot;</span><span class="p">);</span>
</span><span class='line'>          <span class="kd">let</span> <span class="nx">uri</span> <span class="o">=</span> <span class="nx">global</span><span class="p">.</span><span class="nx">__URI__</span><span class="p">;</span>
</span><span class='line'>          <span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="nx">uri</span><span class="p">.</span><span class="nx">lastIndexOf</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">);</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">res</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>          <span class="nx">Components</span><span class="p">.</span><span class="nx">utils</span><span class="p">.</span><span class="kr">import</span><span class="p">(</span><span class="nx">uri</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nx">path</span> <span class="o">+</span> <span class="s2">&quot;.js&quot;</span><span class="p">,</span> <span class="nx">res</span><span class="p">);</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">res</span><span class="p">;</span>
</span><span class='line'>      <span class="p">};</span>
</span><span class='line'>  
</span><span class='line'>  <span class="c1">// adding the symbols needes for Mozilla JS modules</span>
</span><span class='line'>  <span class="nx">global</span><span class="p">.</span><span class="nx">EXPORTED_SYMBOLS</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>  
</span><span class='line'>  <span class="c1">// Proxy handler used for CommonJS exports that will automatically adjust EXPORTED_SYMBOLS</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">handler</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">set</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">target</span><span class="p">,</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">value</span><span class="p">){</span>
</span><span class='line'>          <span class="k">if</span><span class="p">(</span><span class="nx">global</span><span class="p">.</span><span class="nx">EXPORTED_SYMBOLS</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="o">===</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>              <span class="nx">global</span><span class="p">.</span><span class="nx">EXPORTED_SYMBOLS</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'>          <span class="nx">target</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>          <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  
</span><span class='line'>  <span class="c1">// adding CommonJS exports</span>
</span><span class='line'>  <span class="nx">global</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Proxy</span><span class="p">(</span><span class="nx">global</span><span class="p">,</span> <span class="nx">handler</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">global</span><span class="p">.</span><span class="nx">module</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>  <span class="nx">global</span><span class="p">.</span><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">global</span><span class="p">.</span><span class="nx">exports</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>All you need to do, is to include the JS module in your TypeScript file.</p>

<figure class='code'><figcaption><span>SomeFile.ts  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Boilerplate for hacking support JS modules in TypeScript</span>
</span><span class='line'><span class="c1">///&lt;reference path=&#39;../../Moz.d.ts&#39; /&gt;</span>
</span><span class='line'><span class="nx">Components</span><span class="p">.</span><span class="nx">utils</span><span class="p">.</span><span class="kr">import</span><span class="p">(</span><span class="s2">&quot;chrome://path/to/CommonJS.jsm&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">initCommonJSModule</span><span class="p">(</span><span class="nb">eval</span><span class="p">(</span><span class="s1">&#39;this&#39;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="kr">import</span> <span class="nx">Bar</span> <span class="o">=</span> <span class="nx">module</span><span class="p">(</span><span class="s2">&quot;../Bar&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kr">export</span> <span class="kr">class</span> <span class="nx">Foo</span> <span class="p">{</span>
</span><span class='line'>  
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Relative file loading in <code>require</code> uses the <code>__URI__</code> property every JS code module provides and which is also used in the implementation of <a href="https://developer.mozilla.org/en-US/docs/JavaScript_code_modules/XPCOMUtils.jsm#importRelative"><code>XPCOMUtils.importRelative</code></a>.</p>

<p>There are some things to consider.</p>

<p>You need to provide declarations for Mozilla specific APIs like <code>Components.xxx</code>, which I do provide in <a href="https://github.com/FunkMonkey/Loomo/blob/typescript-support/Loomo/chrome/content/MozGlobals.d.ts"><code>MozGlobals.d.ts</code></a> (which is referenced by <code>Moz.d.ts</code>). You will also have to provide the declaration for <code>initCommonJSModule</code>, otherwise TypeScript won&#8217;t compile. Doh!</p>

<p>Also TypeScript does not support using <code>this</code> in global scope, but it is the only way to access the global object of the module and thus needed. I had to hack it using <code>eval(this)</code>. I considered using a function which simply returns <code>this</code>, but I think this will be problematic in <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode">strict mode</a>.</p>

<p>One big caveat is still there: importing modules from other contexts (like &#8220;chrome://browser&#8221; or extensions) can&#8217;t be done, as <code>require</code> can only import relative to the source file. You will have to use <code>Components.utils.import</code> and provide TypeScript declarations.</p>

<h2>Some remarks: Mozilla specifics, ES6/Harmony features and host objects</h2>

<p>As I already said, you will have to provide declarations for all Mozilla specific APIs. This includes APIs and functions that will appear with ES6/Harmony, which shouldn&#8217;t be too complicated.</p>

<p>Really problematic are ES6/Harmony&#8217;s syntactic changes. TypeScript currently does not support <code>let</code> and <code>const</code>. I opened a bug <a href="https://typescript.codeplex.com/workitem/368">report for it</a>, but I don&#8217;t see it happening in the near future. I&#8217;m not sure about generators and <code>yield</code> either.</p>

<p>Also, <a href="http://typescript.codeplex.com/workitem/13">for now</a>, host objects like <code>Array</code> can not be extended.</p>

<h2>Conclusion</h2>

<p>Apart from some problems here and there and missing features of ES6/Harmony, TypeScript conversion went pretty smoothly.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Added basic TypeScript support to SublimeLinter]]></title>
    <link href="http://FunkMonkey.github.com/blog/2012/10/14/sublimelinter-basic-typescript-support/"/>
    <updated>2012-10-14T14:30:00+02:00</updated>
    <id>http://FunkMonkey.github.com/blog/2012/10/14/sublimelinter-basic-typescript-support</id>
    <content type="html"><![CDATA[<p>I took a look at <a href="https://github.com/SublimeLinter/SublimeLinter">SublimeLinter</a> and added basic TypeScript support, see <a href="https://github.com/SublimeLinter/SublimeLinter/pull/259">this pull request</a>.</p>

<p>Sublime can now show errors from TypeScript files, but it is still quite problematic when working with bigger TypeScript projects, as every lint operation will reparse everything (including referenced files) - thus there is still a lot to be done, but it is a start.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sublime plugin for automatically resizing the active group]]></title>
    <link href="http://FunkMonkey.github.com/blog/2012/10/14/sublimeresizeactivegroup/"/>
    <updated>2012-10-14T14:24:00+02:00</updated>
    <id>http://FunkMonkey.github.com/blog/2012/10/14/sublimeresizeactivegroup</id>
    <content type="html"><![CDATA[<p>I developed a little Sublime plugin that automatically resizes the active layout group to use up the most space. You can find <a href="https://github.com/FunkMonkey/SublimeResizeActiveGroup">SublimeResizeActiveGroup</a> on github.</p>

<blockquote><p>Sublime Plugin for resizing the active layout group when the user switches groups. Resize the groups once as usual using the sliders. Whenever you activate a different group now, the selected group will be resized to have the most space.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Link Roundup (October 2012)]]></title>
    <link href="http://FunkMonkey.github.com/blog/2012/10/14/link-roundup/"/>
    <updated>2012-10-14T14:01:00+02:00</updated>
    <id>http://FunkMonkey.github.com/blog/2012/10/14/link-roundup</id>
    <content type="html"><![CDATA[<p>Some interesting links &#8230;</p>

<h3>Functional Programming</h3>

<ul>
<li><a href="http://www.defmacro.org/ramblings/fp.html">Functional Programming For The Rest of Us</a><br/>
Great introduction to functional programming</li>
</ul>


<h3>JavaScript</h3>

<ul>
<li><a href="http://smallcultfollowing.com/babysteps/blog/2012/10/10/rivertrail/">Rivertrail</a><br/>
Mozilla started implementing Intel&#8217;s Rivertrail specification</li>
</ul>


<h3>Sublime Text 2</h3>

<ul>
<li><a href="https://tutsplus.com/course/improve-workflow-in-sublime-text-2/">Perfect Workflow in Sublime Text 2</a><br/>
A great video tutorial series about Sublime</li>
</ul>


<h3>TypeScript</h3>

<p>TypeScript is a new statically typed programming language from Microsoft that compiles to pure JavaScript.</p>

<ul>
<li><a href="http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript">Anders Hejlsberg: Introducing TypeScript</a></li>
<li><a href="http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript">Anders Hejlsberg, Steve Lucco, and Luke Hoban: Inside TypeScript</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Switching to Octopress]]></title>
    <link href="http://FunkMonkey.github.com/blog/2012/08/24/switching-to-octopress/"/>
    <updated>2012-08-24T22:49:00+02:00</updated>
    <id>http://FunkMonkey.github.com/blog/2012/08/24/switching-to-octopress</id>
    <content type="html"><![CDATA[<p>This is more a test post than anything else.</p>

<p>Switched from Joomla to <a href="http://octopress.org/">Octopress</a>. I will transfer the old pages one by one.</p>

<p>Here are some things that I have learned.</p>

<h4>Use 32-bit Python</h4>

<p>Rubypython seems to depend on 32-bit Python. I had 64-bit Python installed, which gave me weird errors like</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>&#39;block in ffi_lib&#39;: Could not open library (LoadError)
</span></code></pre></td></tr></table></div></figure>


<p>followed by &#8220;library not found&#8221; or some gibberish unicode characters.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[C++11 auto and references]]></title>
    <link href="http://FunkMonkey.github.com/blog/2012/01/01/c-plus-plus-11-auto-and-references/"/>
    <updated>2012-01-01T19:08:00+01:00</updated>
    <id>http://FunkMonkey.github.com/blog/2012/01/01/c-plus-plus-11-auto-and-references</id>
    <content type="html"><![CDATA[<p>I just started playing around with the <code>auto</code> keyword of the new C++ standard. I assumed a variable declared with <code>auto</code> would have the type of the according expression.</p>

<p>Though consider the following example:</p>

<figure class='code'><figcaption><span>Example of using auto  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;vector&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">data</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">getData</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">data</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">(</span> <span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[]</span> <span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">data</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">auto</span> <span class="n">data2</span> <span class="o">=</span> <span class="n">getData</span><span class="p">();</span>
</span><span class='line'>  <span class="n">data</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Looking at the variables in the debugger, you see that <code>data</code> contains the values <code>1</code> and <code>2</code>, whereas <code>data2</code> only contains <code>1</code>, thus <code>data2</code> is not the same object as <code>data</code>. I assumed <code>data2</code> was of type <code>vector&lt;int&gt;&amp;</code> (the return type of <code>getData</code>), though it obviously just is <code>vector&lt;int&gt;</code>.</p>

<p>Declaring it as</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="k">auto</span><span class="o">&amp;</span> <span class="n">data2</span> <span class="o">=</span> <span class="n">getData</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>works though. <code>data2</code> is now a reference to <code>data</code>.</p>

<p>It makes sense, the standard defines it that way. Otherwise, how could you create a copy of the return value? Still it makes using <code>auto</code> a little more confusing &#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Coolest Javascript Features - Part 1: let, logical operators, destructuring, labels]]></title>
    <link href="http://FunkMonkey.github.com/blog/2010/09/02/coolest-javascript-features/"/>
    <updated>2010-09-02T13:48:00+02:00</updated>
    <id>http://FunkMonkey.github.com/blog/2010/09/02/coolest-javascript-features</id>
    <content type="html"><![CDATA[<p>This is going to be an unsorted list about the nicest Javascript features. Look closely at the title: Javascript! Thus this list may contain features only present in the Mozilla-implementation and not standardized in ECMAScript! I am going to update this list every now and then.</p>

<h2>Block scoping with <code>let</code></h2>

<p><em>Support: <a href="http://wiki.ecmascript.org/doku.php?id=proposals:block_expressions&amp;s=let">ECMAScript Harmony</a>, <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let">Javascript 1.7</a>, Mozilla-only (as of September 2010)</em></p>

<p>Finally <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let">lexical scoping / block scoping</a> in Javascript. Declare variables with <code>let</code> instead of <code>var</code>. May come in handy when you are creating closures in a loop.</p>

<h2>Logical operators <code>&amp;&amp;</code> and <code>||</code></h2>

<p><em>Support: should work in all modern browsers</em></p>

<p><a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Logical_Operators">Logical operators</a> are nothing spectecular in programming languages. But Javascript handles them a little different. <code>&amp;&amp;</code> and <code>||</code> don&#8217;t necessarily return boolean values, but can also return other types (objects, etc). Here are some examples from <a href="http://javascriptweblog.wordpress.com/2010/07/26/no-more-ifs-alternatives-to-statement-branching-in-javascript/">Angus Croll&#8217;s JavaScript blog</a>:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">//invoke callback if there is one</span>
</span><span class='line'><span class="nx">callback</span> <span class="o">&amp;&amp;</span> <span class="nx">callback</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//delay by argument or 20</span>
</span><span class='line'><span class="nx">delayBy</span><span class="p">(</span><span class="nx">delay</span> <span class="o">||</span> <span class="mi">20</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>But you should be careful, when using this with values that evaluate to false. See the following example:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">//delay by argument or 20</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">delay</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="nx">delayBy</span><span class="p">(</span><span class="nx">delay</span> <span class="o">||</span> <span class="mi">20</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>0</code> will evaluate to <code>false</code> and thus <code>delayBy</code> will be called with <code>20</code>.</p>

<p><code>||</code> is often used for setting default-values for functions parameters (well, harmony may contain that <a href="http://wiki.ecmascript.org/doku.php?id=harmony:parameter_default_values">natively</a>), but as shown that may not always lead to the expected behaviour, thus I wouldn&#8217;t recommend setting default values that way.</p>

<h2>Destructuring</h2>

<p><em>Support: <a href="http://wiki.ecmascript.org/doku.php?id=harmony:destructuring">ECMAScript Harmony</a>, <a href="https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7#Destructuring_assignment_%28Merge_into_own_page.2Fsection%29">Javascript 1.7</a>, Mozilla-only (as of September 2010)</em></p>

<p>Don&#8217;t confuse this with destructors known from languages like Java or C++. <a href="https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7#Destructuring_assignment_%28Merge_into_own_page.2Fsection%29">Destructuring</a> assignment makes it possible to extract data from arrays or objects using a syntax that mirrors the construction of array and object literals</p>

<p>This allows things like swapping variables without a temporary variable, multiple return values and <a href="https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7#Looping_across_objects">more</a>. Here is an example for multiple return values from MDN:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">f</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">;</span>
</span><span class='line'><span class="p">[</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">]</span> <span class="o">=</span> <span class="nx">f</span><span class="p">();</span>
</span><span class='line'><span class="nb">document</span><span class="p">.</span><span class="nx">write</span> <span class="p">(</span><span class="s2">&quot;A is &quot;</span> <span class="o">+</span> <span class="nx">a</span> <span class="o">+</span> <span class="s2">&quot; B is &quot;</span> <span class="o">+</span> <span class="nx">b</span> <span class="o">+</span> <span class="s2">&quot;\n&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The function simply returns an array, but the destructuring syntax allows to split this into multiple variables.</p>

<h2>Labeling statements</h2>

<p><em>Support: should work in all modern browsers</em></p>

<p>By <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Statements#label_Statement">labeling</a> statements you can give them an identifier that you can refer to from somewhere else. That may come in handy when using loops with <code>continue</code> or <code>break</code>.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">loopX</span><span class="o">:</span>
</span><span class='line'><span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">x</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">;</span> <span class="o">++</span><span class="nx">x</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">y</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">;</span> <span class="o">++</span><span class="nx">y</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// ... do something</span>
</span><span class='line'>        <span class="k">if</span><span class="p">(...)</span>
</span><span class='line'>            <span class="k">break</span> <span class="nx">loopX</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Compiling a NPAPI-Plugin from the Mozilla source-code]]></title>
    <link href="http://FunkMonkey.github.com/blog/2010/08/02/compiling-a-npapi-plugin-from-the-mozilla-source-code/"/>
    <updated>2010-08-02T16:50:00+02:00</updated>
    <id>http://FunkMonkey.github.com/blog/2010/08/02/compiling-a-npapi-plugin-from-the-mozilla-source-code</id>
    <content type="html"><![CDATA[<p>Some days ago I tried to compile the basic NPAPI-Plugin from the Mozilla codebase and of course ran into some problems that could easily be solved, though finding the answers wasn&#8217;t that easy.</p>

<p>Here&#8217;s the first one, when compiling:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>c:\program files\microsoft sdks\windows\v7.0\include\winnt.h(6361): error C2146: syntax error : missing &#39;;&#39; before identifier &#39;ContextRecord&#39;
</span></code></pre></td></tr></table></div></figure>


<p>Huh? <code>winnt.h</code>. Shouldn&#8217;t change something in there. I googled a little and <a href="http://www.apijunkie.com/APIJunkie/blog/post/2008/09/22/Building-Firefox-Plugins-using-Visual-Studio.aspx">someone</a> knew the problem. He suggested to alter <code>npplat.h</code> and move some includes after the include of <code>windows.h</code>. Though this will work, it doesn&#8217;t actually sound like something you&#8217;re supposed to do. So I digged further and checked out the <a href="https://developer.mozilla.org/@api/deki/files/3844/=GeckoPluginSDK-samplesWin32.zip">Gecko-Win32-Plugin-Samples-Package</a> that you can get at <a href="https://developer.mozilla.org/en-US/docs/Plugins/Samples_and_Test_Cases">MDC</a>. The basic plugin in there compiled fine, which confused me a little, so I diffed the project-files and there I found the solution: The project-file from comm-central missed the preprocessor-tag <code>_X86_</code>.</p>

<p>I used some XPCOM-Components in my plugin, which lead to another compile-error:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>nsidomnode.h(94) : error C2059: syntax error : &#39;constant&#39;
</span></code></pre></td></tr></table></div></figure>


<p>I found <a href="http://osdir.com/ml/mozilla.devel.dom/2003-10/msg00059.html">someone</a> in the net, having the same problem. Seems there is a <code>#define GetNextSibling GetWindow</code> somewhere in <code>windows.h</code>, which collides with the method-declaration of <code>GetNextSibling</code> in <code>nsidomnode.h</code>. So I undef&#8217;ed it after including <code>windows.h</code> and got the problem solved.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Tutorial] Get rid of XPCOM syntax with JS Modules and Components.Constructor]]></title>
    <link href="http://FunkMonkey.github.com/blog/2010/02/26/tutorial-get-rid-of-xpcom-syntax-with-js-modules-and-components-dot-constructor/"/>
    <updated>2010-02-26T14:19:00+01:00</updated>
    <id>http://FunkMonkey.github.com/blog/2010/02/26/tutorial-get-rid-of-xpcom-syntax-with-js-modules-and-components-dot-constructor</id>
    <content type="html"><![CDATA[<p>In case you dislike the syntax of creating XPCOM components, you can use <a href="https://developer.mozilla.org/en-US/docs/Components.Constructor">Components.Constructor</a> to achieve a more Javascript like syntax for object-creation. Combine this with <a href="https://developer.mozilla.org/en-US/docs/JavaScript_code_modules">JS modules</a> and your constructors can be accessed from everywhere.</p>

<h3>MozXPCOM.jsm</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">EXPORTED_SYMBOLS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;MOZ&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="kr">const</span> <span class="nx">Cc</span> <span class="o">=</span> <span class="nx">Components</span><span class="p">.</span><span class="nx">classes</span><span class="p">;</span>
</span><span class='line'><span class="kr">const</span> <span class="nx">Ci</span> <span class="o">=</span> <span class="nx">Components</span><span class="p">.</span><span class="nx">interfaces</span><span class="p">;</span>
</span><span class='line'><span class="kr">const</span> <span class="nx">CCtor</span> <span class="o">=</span> <span class="nx">Components</span><span class="p">.</span><span class="nx">Constructor</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">MOZ</span> <span class="o">=</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nx">CON</span><span class="o">:</span> <span class="p">{}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">MOZ</span><span class="p">.</span><span class="nx">CON</span><span class="p">.</span><span class="nx">nsLocalFile</span>     <span class="o">=</span> <span class="s2">&quot;@mozilla.org/file/local;1&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">MOZ</span><span class="p">.</span><span class="nx">LocalFile</span>           <span class="o">=</span> <span class="nx">CCtor</span><span class="p">(</span><span class="nx">MOZ</span><span class="p">.</span><span class="nx">CON</span><span class="p">.</span><span class="nx">nsLocalFile</span><span class="p">,</span> <span class="nx">Ci</span><span class="p">.</span><span class="nx">nsILocalFile</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">MOZ</span><span class="p">.</span><span class="nx">CON</span><span class="p">.</span><span class="nx">nsMutableArray</span>  <span class="o">=</span> <span class="s2">&quot;@mozilla.org/array;1&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">MOZ</span><span class="p">.</span><span class="nx">MutableArray</span>        <span class="o">=</span> <span class="nx">CCtor</span><span class="p">(</span><span class="nx">MOZ</span><span class="p">.</span><span class="nx">CON</span><span class="p">.</span><span class="nx">nsMutableArray</span><span class="p">,</span> <span class="nx">Ci</span><span class="p">.</span><span class="nx">nsIMutableArray</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Usage</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Components</span><span class="p">.</span><span class="nx">utils</span><span class="p">.</span><span class="kr">import</span><span class="p">(</span><span class="s2">&quot;resource://myext/MozXPCOM.jsm&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// ...</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">anArray</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MOZ</span><span class="p">.</span><span class="nx">MutableArray</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>I prefer to put all constructors in a MOZ-object, so I don&#8217;t have to export them all.</p>
]]></content>
  </entry>
  
</feed>
