<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: xmlhttprequest</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/xmlhttprequest.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2012-02-11T13:25:00+00:00</updated><author><name>Simon Willison</name></author><entry><title>How do you change page content and URL without reloading the whole page?</title><link href="https://simonwillison.net/2012/Feb/11/how-do-you-change/#atom-tag" rel="alternate"/><published>2012-02-11T13:25:00+00:00</published><updated>2012-02-11T13:25:00+00:00</updated><id>https://simonwillison.net/2012/Feb/11/how-do-you-change/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/How-do-you-change-page-content-and-URL-without-reloading-the-whole-page/answer/Simon-Willison"&gt;How do you change page content and URL without reloading the whole page?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This can only be done using JavaScript. You use XMLHttpRequest to pull in new information from the server (also known as Ajax - most people use a JavaScript library such as jQuery to handle this) and then use the HTML5 history API, in particular the pushState method, to update the URL.&lt;/p&gt;

&lt;p&gt;Sadly pushState isn't supported by IE versions older than IE10 - it's up to you if you resort to fragment identifier URL hacks to support that browser or (my preferred approach) just leave IE users with full page refreshes. Sadly most versions of the Android browser don't support pushState either, and performance constraints on mobile means they are harder to ignore than IE.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jquery"&gt;jquery&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ajax"/><category term="javascript"/><category term="jquery"/><category term="web-development"/><category term="xmlhttprequest"/><category term="quora"/></entry><entry><title>flXHR</title><link href="https://simonwillison.net/2009/Nov/26/flxhr/#atom-tag" rel="alternate"/><published>2009-11-26T12:52:16+00:00</published><updated>2009-11-26T12:52:16+00:00</updated><id>https://simonwillison.net/2009/Nov/26/flxhr/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://flxhr.flensed.com/"&gt;flXHR&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I was looking for something like this recently, glad to see it exists. flXHR is a drop-in replacement for regular XMLHttpRequest which uses an invisible Flash shim to allow cross-domain calls to be made, taking advantage of the Flash crossdomain.xml security model.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/crossdomain"&gt;crossdomain&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/flash"&gt;flash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/flxhr"&gt;flxhr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/swf"&gt;swf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xhr"&gt;xhr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="crossdomain"/><category term="flash"/><category term="flxhr"/><category term="javascript"/><category term="swf"/><category term="xhr"/><category term="xmlhttprequest"/></entry><entry><title>Quoting Iain Lamb</title><link href="https://simonwillison.net/2009/Aug/18/performance/#atom-tag" rel="alternate"/><published>2009-08-18T12:27:31+00:00</published><updated>2009-08-18T12:27:31+00:00</updated><id>https://simonwillison.net/2009/Aug/18/performance/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://yuiblog.com/blog/2007/03/01/performance-research-part-3/#comment-59531"&gt;&lt;p&gt;rather baffling finding: POST requests, made via the XMLHTTP object, send header and body data in separate tcp/ip packets [and therefore,] xmlhttp GET performs better when sending small amounts of data than an xmlhttp POST&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://yuiblog.com/blog/2007/03/01/performance-research-part-3/#comment-59531"&gt;Iain Lamb&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/get"&gt;get&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/http"&gt;http&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/iainlamb"&gt;iainlamb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/performance"&gt;performance&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/post"&gt;post&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="get"/><category term="http"/><category term="iainlamb"/><category term="performance"/><category term="post"/><category term="xmlhttprequest"/></entry><entry><title>Reading binary files using Ajax</title><link href="https://simonwillison.net/2008/Apr/22/reading/#atom-tag" rel="alternate"/><published>2008-04-22T19:02:02+00:00</published><updated>2008-04-22T19:02:02+00:00</updated><id>https://simonwillison.net/2008/Apr/22/reading/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://nagoon97.wordpress.com/2008/04/06/reading-binary-files-using-ajax/"&gt;Reading binary files using Ajax&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
There’s a simple trick for Firefox, and (amazingly) you can get IE to play along using a function written in VBScript.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/binary"&gt;binary&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/firefox"&gt;firefox&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/internet-explorer"&gt;internet-explorer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vbscript"&gt;vbscript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="binary"/><category term="firefox"/><category term="internet-explorer"/><category term="javascript"/><category term="vbscript"/><category term="xmlhttprequest"/></entry><entry><title>Cross-Site XMLHttpRequest</title><link href="https://simonwillison.net/2008/Jan/9/crosssite/#atom-tag" rel="alternate"/><published>2008-01-09T23:57:00+00:00</published><updated>2008-01-09T23:57:00+00:00</updated><id>https://simonwillison.net/2008/Jan/9/crosssite/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://developer.mozilla.org/en/docs/Cross-Site_XMLHttpRequest"&gt;Cross-Site XMLHttpRequest&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“Firefox 3 implements the W3C Access Control working draft, which gives you the ability to do XMLHttpRequests to other web sites”—you can mark a document as available for cross-domain requests using either an Access-Control HTTP header or an XML processing instruction.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://ejohn.org/blog/cross-site-xmlhttprequest/"&gt;John Resig&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/accesscontrol"&gt;accesscontrol&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/crossdomain"&gt;crossdomain&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/firefox"&gt;firefox&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/firefox3"&gt;firefox3&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/http"&gt;http&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/john-resig"&gt;john-resig&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mozilla"&gt;mozilla&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/w3c"&gt;w3c&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xml"&gt;xml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="accesscontrol"/><category term="ajax"/><category term="crossdomain"/><category term="firefox"/><category term="firefox3"/><category term="http"/><category term="javascript"/><category term="john-resig"/><category term="mozilla"/><category term="w3c"/><category term="xml"/><category term="xmlhttprequest"/></entry><entry><title>The Future of Comet: Part 1, Comet Today</title><link href="https://simonwillison.net/2007/Dec/11/comet/#atom-tag" rel="alternate"/><published>2007-12-11T13:13:11+00:00</published><updated>2007-12-11T13:13:11+00:00</updated><id>https://simonwillison.net/2007/Dec/11/comet/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://cometdaily.com/2007/12/11/the-future-of-comet-part-1-comet-today/"&gt;The Future of Comet: Part 1, Comet Today&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Absolutely the best summary I’ve seen of all of the current Comet techniques in one place.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/comet"&gt;comet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/iframes"&gt;iframes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jacob-rus"&gt;jacob-rus&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/long-polling"&gt;long-polling&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="comet"/><category term="iframes"/><category term="jacob-rus"/><category term="javascript"/><category term="long-polling"/><category term="xmlhttprequest"/></entry><entry><title>Ten New Things in WebKit 3</title><link href="https://simonwillison.net/2007/Nov/16/surfinu/#atom-tag" rel="alternate"/><published>2007-11-16T01:19:52+00:00</published><updated>2007-11-16T01:19:52+00:00</updated><id>https://simonwillison.net/2007/Nov/16/surfinu/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://webkit.org/blog/122/webkit-3-10-new-things/"&gt;Ten New Things in WebKit 3&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Does “incremental updates for persistent server connections” for XMLHttpRequest mean Safari now has native support for Comet?


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/comet"&gt;comet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari3"&gt;safari3&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="comet"/><category term="javascript"/><category term="safari"/><category term="safari3"/><category term="webkit"/><category term="xmlhttprequest"/></entry><entry><title>Quoting Alex Hopmann</title><link href="https://simonwillison.net/2007/Jan/24/marketing/#atom-tag" rel="alternate"/><published>2007-01-24T20:48:17+00:00</published><updated>2007-01-24T20:48:17+00:00</updated><id>https://simonwillison.net/2007/Jan/24/marketing/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://www.alexhopmann.com/xmlhttp.htm"&gt;&lt;p&gt;Which is the real explanation of where the name XMLHTTP comes from- the thing is mostly about HTTP and doesn't have any specific tie to XML other than that was the easiest excuse for shipping it so I needed to cram XML into the name (plus- XML was the hot technology at the time and it seemed like some good marketing for the component).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://www.alexhopmann.com/xmlhttp.htm"&gt;Alex Hopmann&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/marketing"&gt;marketing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xml"&gt;xml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="marketing"/><category term="xml"/><category term="xmlhttprequest"/></entry><entry><title>XMLHttpRequests using an IFrame Proxy</title><link href="https://simonwillison.net/2006/Aug/1/xmlhttprequests/#atom-tag" rel="alternate"/><published>2006-08-01T17:40:02+00:00</published><updated>2006-08-01T17:40:02+00:00</updated><id>https://simonwillison.net/2006/Aug/1/xmlhttprequests/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://dojotoolkit.org/~jburke/XHRIFrameProxy.html"&gt;XMLHttpRequests using an IFrame Proxy&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Another scary hack abstracted away by Dojo.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://blog.dojotoolkit.org/2006/07/31/cross-domain-xmlhttprequests-using-an-iframe-proxy"&gt;dojo.foo&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/crossdomain"&gt;crossdomain&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dojo"&gt;dojo&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="crossdomain"/><category term="dojo"/><category term="javascript"/><category term="xmlhttprequest"/></entry><entry><title>The XMLHttpRequest Object</title><link href="https://simonwillison.net/2006/Apr/9/xmlhttprequest/#atom-tag" rel="alternate"/><published>2006-04-09T23:58:44+00:00</published><updated>2006-04-09T23:58:44+00:00</updated><id>https://simonwillison.net/2006/Apr/9/xmlhttprequest/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.w3.org/TR/XMLHttpRequest/"&gt;The XMLHttpRequest Object&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A W3C Working Draft.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://diveintomark.org/"&gt;Mark Pilgrim&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/w3c"&gt;w3c&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="w3c"/><category term="xmlhttprequest"/></entry><entry><title>Understanding the Greasemonkey vulnerability</title><link href="https://simonwillison.net/2005/Jul/20/vulnerability/#atom-tag" rel="alternate"/><published>2005-07-20T03:09:19+00:00</published><updated>2005-07-20T03:09:19+00:00</updated><id>https://simonwillison.net/2005/Jul/20/vulnerability/#atom-tag</id><summary type="html">
    &lt;p id="p-0"&gt;If you have any version of Greasemonkey installed prior to 0.3.5, which was released a few hours ago, or if you are running any of the 0.4 alphas, you need to go and upgrade &lt;a href="http://greasemonkey.mozdev.org/"&gt;right now&lt;/a&gt;. All versions of Greasemonkey aside from 0.3.5 contain a &lt;a href="http://mozdev.org/pipermail/greasemonkey/2005-July/004022.html" title="Mark Pilgrim&amp;apos;s announcement of the vulnerability"&gt;nasty security hole&lt;/a&gt;, which could enable malicious web sites to read any file from your hard drive without you knowing.&lt;/p&gt;

&lt;p id="p-1"&gt;Unfortunately, 0.3.5 disables all of the &lt;a href="http://diveintogreasemonkey.org/api/"&gt;GM_ API functions&lt;/a&gt;, without which many of the more interesting user scripts out there simple won't work. This is a temporary measure - the &lt;code&gt;GM_&lt;/code&gt; functions should return in a later release, once the security problem with them has been resolved.&lt;/p&gt;

&lt;p id="p-2"&gt;I'm going to explain how the vulnerability works, because it illustrates a number of interesting concepts in both web application security and JavaScript.&lt;/p&gt;

&lt;h4&gt;Same-origin policy&lt;/h4&gt;

&lt;p id="p-3"&gt;JavaScript has always enforced a &lt;em&gt;same-origin policy&lt;/em&gt; for scripts loaded over the internet. This originally applied to scripting between frames (and iframes): a script loaded from a certain domain is only allowed to access the DOM of other pages loaded from that same domain. The same restriction has been extended to &lt;code&gt;XMLHttpRequest&lt;/code&gt; - you are only allowed to make an &lt;code&gt;XMLHttpRequest&lt;/code&gt; call back to the domain from which the script was originally loaded.&lt;/p&gt;

&lt;p id="p-4"&gt;This policy exists to prevent cross-domain attacks. Say for example you work for a company with an intranet hidden behind the firewall, full of interesting proprietary information. Without the same-origin policy, malicious sites that you visit on the public internet would be able to read information from your intranet, using your browser as the middle-man.&lt;/p&gt;

&lt;h4&gt;GM_xmlhttpRequest&lt;/h4&gt;

&lt;p id="p-5"&gt;The &lt;code&gt;GM_xmlhttpRequest&lt;/code&gt; API function does not have this restriction - it can load data from any domain. This enables a whole host of interesting user scripts - the most famous of which is probably &lt;a href="http://bookburro.org/"&gt;Book Burro&lt;/a&gt;, which shows comparison prices from different online stores for the item you are currently looking at on Amazon, Barnes and Noble and more.&lt;/p&gt;

&lt;p id="p-6"&gt;Malicious user scripts could use this feature to steal information from your private intranet, but malicious user scripts could also do all manner of other nasty things - stealing your Hotmail password for example. This is why you should never install a user script from an untrusted source without first reviewing the code.&lt;/p&gt;

&lt;h4&gt;Restricting API functions to user scripts only&lt;/h4&gt;

&lt;p id="p-7"&gt;To keep things safe then, it is essential that the &lt;code&gt;GM_&lt;/code&gt; family of API functions can only ever be used by user scripts, not by code running on pages that you have visited. By installing a user script you have declared it trustworthy - but visiting a web page does not carry that contract.&lt;/p&gt;

&lt;p id="p-8"&gt;The way the flawed versions of Greasemonkey do that now is simple: the &lt;code&gt;GM_&lt;/code&gt; functions are added to the JavaScript global object (which is the window object), the user scripts for the page are "injected" using dynamically created &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; elements, they run, then the &lt;code&gt;GM_&lt;/code&gt; functions are removed from the global object to prevent scripts on the page from accessing them. This works because Greasemonkey injection and execution happens just before the onload event is fired - which is when most well behaved scripts kick in.&lt;/p&gt;

&lt;h4&gt;Object.watch()&lt;/h4&gt;

&lt;p id="p-9"&gt;Here's the clever part: JavaScript 1.5 defines a method of the Object class (which is inherited by all other JavaScript objects) called &lt;a href="http://developer-test.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Object:watch"&gt;watch&lt;/a&gt;. Watch is extremely powerful: it lets you register some code to be executed when a property on some other object is assigned. This is the key to the Greasemonkey vulnerability - by watching the window object for the point at which Greasemonkey adds the API functions, a malicious script can use those functions at the moment they are attached.&lt;/p&gt;

&lt;h4&gt;The file:// protocol&lt;/h4&gt;

&lt;p id="p-10"&gt;Here's the final piece of the puzzle: the &lt;code&gt;file://&lt;/code&gt; protocol in Firefox allows you to view files and directory listings in your browser. Unfortunately, it also allows the &lt;code&gt;GM_xmlhttpRequest&lt;/code&gt; function to do the same. It's not at all hard for a malicious script to use the function to load in files at a known location - or even load in directory listings (as HTML), parse them and use them to find all kinds of things scattered around your hard drive.&lt;/p&gt;

&lt;h4&gt;Solving the problem&lt;/h4&gt;

&lt;p id="p-11"&gt;The principle problem then is the requirement for "safe" Greasemonkey API functions - that is, functions that can be used by the user scripts but &lt;em&gt;not&lt;/em&gt; by code running on a website. Aaron is looking in to this right now - it looks like the solution will require a minor change to be made to many existing scripts, but the trade-off in terms of security is more than worth it. The &lt;code&gt;GM_xmlhttpRequest&lt;/code&gt; function will also be modified to disallow &lt;code&gt;file://&lt;/code&gt; URLs.&lt;/p&gt;

&lt;p id="p-12"&gt;Until then, 0.3.5 is the only safe version of Greasemonkey.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/greasemonkey"&gt;greasemonkey&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="greasemonkey"/><category term="javascript"/><category term="security"/><category term="xmlhttprequest"/></entry><entry><title>Why the term Ajax is useful</title><link href="https://simonwillison.net/2005/Apr/19/useful/#atom-tag" rel="alternate"/><published>2005-04-19T01:15:58+00:00</published><updated>2005-04-19T01:15:58+00:00</updated><id>https://simonwillison.net/2005/Apr/19/useful/#atom-tag</id><summary type="html">
    &lt;p id="p-0"&gt;Software design patterns are useful mainly because they provide a shared vocabulary: rather than discussing the intimate details of a three layered application architecture, we say "MVC". Rather than describing an object that tracks your progress while looping over a collection, we say "Iterator".&lt;/p&gt;

&lt;p id="p-1"&gt;The same is true for &lt;a href="http://www.adaptivepath.com/publications/essays/archives/000385.php"&gt;Ajax&lt;/a&gt;. While the techniques it describes have been around for years, grouping them under a single term is extremely valuable for raising the level of discussion about them. No longer will we have to explain XMLHttpRequest / hidden iframes / crazy cookie tricks in depth when discussing sites which pull fresh information from the server without reloading the whole page. Instead, we can say "Ajax" and move on to more interesting things.&lt;/p&gt;

&lt;p id="p-2"&gt;Matthew Haughey says it's &lt;a href="http://a.wholelottanothing.org/2005/04/note_to_geeks_l.html" title="Note to geeks: look beyond the end of your nose"&gt;all about marketing&lt;/a&gt;. I disagree; it's about smarter and more effective conversations.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/design-patterns"&gt;design-patterns&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jargon"&gt;jargon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ajax"/><category term="design-patterns"/><category term="jargon"/><category term="xmlhttprequest"/></entry><entry><title>Combining XMLHttpRequest and Rails to Produce More Efficient UIs</title><link href="https://simonwillison.net/2005/Mar/10/combining/#atom-tag" rel="alternate"/><published>2005-03-10T20:10:53+00:00</published><updated>2005-03-10T20:10:53+00:00</updated><id>https://simonwillison.net/2005/Mar/10/combining/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://hieraki.goodlad.ca/read/book/1"&gt;Combining XMLHttpRequest and Rails to Produce More Efficient UIs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Ruby on Rails is setting itself up to be THE framework for Ajax work.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="rails"/><category term="xmlhttprequest"/></entry><entry><title>map.search.ch</title><link href="https://simonwillison.net/2005/Jan/5/mapsearchch/#atom-tag" rel="alternate"/><published>2005-01-05T17:59:00+00:00</published><updated>2005-01-05T17:59:00+00:00</updated><id>https://simonwillison.net/2005/Jan/5/mapsearchch/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://map.search.ch/"&gt;map.search.ch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Unbelievably slick XMLHttpRequest powered map interface.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.sitepoint.com/blog-post-view.php?id=220528"&gt;Prototypes - SitePoint PHP Blog&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="xmlhttprequest"/></entry><entry><title>xmlhttprequest.cpp</title><link href="https://simonwillison.net/2004/Dec/23/xmlhttprequestcpp/#atom-tag" rel="alternate"/><published>2004-12-23T02:04:34+00:00</published><updated>2004-12-23T02:04:34+00:00</updated><id>https://simonwillison.net/2004/Dec/23/xmlhttprequestcpp/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.opensource.apple.com/darwinsource/10.3.6/WebCore-125.8.10/khtml/ecma/xmlhttprequest.cpp"&gt;xmlhttprequest.cpp&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The source code for Safari’s XMLHttpRequest implementation; for the curious.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="xmlhttprequest"/></entry><entry><title>Google Suggest</title><link href="https://simonwillison.net/2004/Dec/10/google/#atom-tag" rel="alternate"/><published>2004-12-10T16:41:01+00:00</published><updated>2004-12-10T16:41:01+00:00</updated><id>https://simonwillison.net/2004/Dec/10/google/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.google.com/webhp?complete=1"&gt;Google Suggest&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Google with auto-complete. XMLHttpRequest magic.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.sitepoint.com/blog-post-view.php?id=216588"&gt;Auto complete comes of age&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="xmlhttprequest"/></entry><entry><title>Opera 7.60 Preview 1 Changenotes</title><link href="https://simonwillison.net/2004/Sep/22/opera/#atom-tag" rel="alternate"/><published>2004-09-22T10:27:15+00:00</published><updated>2004-09-22T10:27:15+00:00</updated><id>https://simonwillison.net/2004/Sep/22/opera/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://snapshot.opera.com/windows/w760p1.html#important"&gt;Opera 7.60 Preview 1 Changenotes&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
XMLHttpRequest + other goodies.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="xmlhttprequest"/></entry><entry><title>XMLHttpRequest is coming to Opera!</title><link href="https://simonwillison.net/2004/Sep/22/xmlhttprequest/#atom-tag" rel="alternate"/><published>2004-09-22T10:20:35+00:00</published><updated>2004-09-22T10:20:35+00:00</updated><id>https://simonwillison.net/2004/Sep/22/xmlhttprequest/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.scss.com.au/family/andrew/webdesign/xmlhttprequest/"&gt;XMLHttpRequest is coming to Opera!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
It’s already in IE, Mozilla and Safari—Opera completes the set.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://webperso.easyconnect.fr/danielglazman/weblog/dotclear/index.php?2004/09/22/588-htmloverlays-on-opera"&gt;HTMLOverlays in Opera? - Glazblog&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/opera"&gt;opera&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="opera"/><category term="xmlhttprequest"/></entry><entry><title>Spotlight-like livesearch added</title><link href="https://simonwillison.net/2004/Sep/8/spotlightlike/#atom-tag" rel="alternate"/><published>2004-09-08T03:20:50+00:00</published><updated>2004-09-08T03:20:50+00:00</updated><id>https://simonwillison.net/2004/Sep/8/spotlightlike/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.bitflux.ch/p1735.html"&gt;Spotlight-like livesearch added&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
XmlHTTPRequest strikes again!

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://randomfoo.net/"&gt;random($foo)&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="xmlhttprequest"/></entry><entry><title>Using the XML HTTP Request object</title><link href="https://simonwillison.net/2004/Jul/7/using/#atom-tag" rel="alternate"/><published>2004-07-07T07:07:54+00:00</published><updated>2004-07-07T07:07:54+00:00</updated><id>https://simonwillison.net/2004/Jul/7/using/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://jibbering.com/2002/4/httprequest.html"&gt;Using the XML HTTP Request object&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Recently updated to include Safari as well.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://del.icio.us/tag/javascript"&gt;del.icio.us/tag/javascript&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xml"&gt;xml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="xml"/><category term="xmlhttprequest"/></entry><entry><title>XMLHttpRequest and Javascript Closures</title><link href="https://simonwillison.net/2004/May/27/xmlhttprequest/#atom-tag" rel="alternate"/><published>2004-05-27T00:23:03+00:00</published><updated>2004-05-27T00:23:03+00:00</updated><id>https://simonwillison.net/2004/May/27/xmlhttprequest/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.sitepoint.com/blog-post-view.php?id=171725"&gt;XMLHttpRequest and Javascript Closures&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Harry gets intimate with Mozilla’s XMLHttpRequest object.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/closures"&gt;closures&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="closures"/><category term="javascript"/><category term="xmlhttprequest"/></entry></feed>