Ariya Hidayat 2012-09-22 08:00:38 -07:00
parent cf2b4e9914
commit 84119eb9ff
8 changed files with 1466 additions and 1 deletions

View File

@ -72,7 +72,7 @@ var <span class="object">url</span> = <span class="literal">'http://www.phantomj
<h2>Community:</h2>
<ul>
<li>
<a href="http://code.google.com/p/phantomjs/wiki/ReleaseNotes" id="link-release">Read the release notes</a>
<a href="release-1.6.html" id="link-release">Read the release notes</a>
</li>
<li>
<a href="https://groups.google.com/forum/#!forum/phantomjs" id="link-ml">Join the mailing list</a>

135
release-1.1.html Executable file
View File

@ -0,0 +1,135 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<title>PhantomJS 1.1 Release Notes</title>
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="screen.min.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-21665893-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<style>
#description p {
line-height: 125%;
text-align: left;
margin-bottom: 10px;
margin-top: 10px;
}
#description h2 {
text-align: left;
margin: 0.8em 0;
font-size: 150%;
}
#description pre {
margin-left: 2em;
}
#description ul {
line-height: 125%;
list-style-type: disc;
margin-left: 1em;
margin-bottom: 1em;
}
#description li {
margin-left: 1em;
}
</style>
</head>
<body>
<div id="intro">
<div id="header" class="container_12">
<a href="index.html" class="grid_4 alpha"><img src="images/phantomjs-logo.png" alt="PhantomJS" id="logo" width="240" height="80"></a>
<ul id="nav" class="grid_8 omega">
<li><a href="https://github.com/ariya/phantomjs">Source Code</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/PhantomJS?tm=6">Documentation</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/Interface">API</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/QuickStart">Examples</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</div>
<div id="introduction" class="container_12">
<div class="grid_7 alpha">
<h1>PhantomJS 1.1 Release Notes</h1>
</div>
</div>
</div>
<div id="description" class="container_12">
<div class="grid_10">
<p>PhantomJS 1.1, <em><a href="release-names.html">Cherry Blossom</a></em>, was released on April 27, 2011. This release is a minor update and all existing scripts should still work.</p>
<p>Some highlights of this release:</p>
<ul>
<li>Support for file upload, network proxy, disk cache, and GIF rasterization output
<li>Scripts can be written in CoffeeScript
<li>Another implementation of PhantomJS using Python (via PyQt)
</ul>
The complete changes are as follows.
<p><strong>Bug fixes:</strong></p>
<ul>
<li>Fixed the script loading to use UTF-8 encoding
<li>Fixed building with Cygwin and Qt 4.5
<li>Fixed issue #20 : problem with JPG transparent color
<li>Fixed issue #9 : ignore first line starting with #!
<li>Fixed issue #7 : support for file upload for form submission
<li>Fixed issue #35 : support for disabling images loading
<li>Fixed issue #14 : enable or disable plugins
<li>Fixed issue #19 : option for setting the proxy
<li>Fixed issue #17 : Specify paper size for PDF export
<li>Fixed issue #60 : Win32 and OS/2 icon files
<li>Fixed issue #93 : Build with Qt &lt; 4.7
</ul>
<p><strong>New features:</strong></p>
<ul>
<li>Added check for system proxy setting</li>
<li>Added support for rasterizing as GIF image</li>
<li>Added support for CoffeeScript</li
<li>Python implementation using PyQt</li>
<li>Added clipping rectangle to the render function</li>
<li>Added command line option to use disk cache</li>
</ul>
<p><strong>Examples:</strong></p>
<ul><li>Added a new example: driver for QUnit tests </li><li>Added a new example: using Canvas to produce the color wheel </li><li>Added an example on sychronous waiting </li><li>Added text extracting example </li><li>Ported all examples to CoffeeScript </li></ul>
<p>Back to <a href="releases.html">all releases</a>.</p>
</div>
</div>
<div id="footer">
<div id="footer-content" class="container_12">
<p>
&copy; Copyright 2010-2012 <a href="http://twitter.com/AriyaHidayat">Ariya Hidayat</a> &mdash; Website design by <a href="http://svay.com/">Maurice Svay</a>
</p>
</div>
</div>
</body>
</html>

279
release-1.2.html Executable file
View File

@ -0,0 +1,279 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<title>PhantomJS 1.2 Release Notes</title>
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="screen.min.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-21665893-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<style>
#description p {
line-height: 125%;
text-align: left;
margin-bottom: 10px;
margin-top: 10px;
}
#description h2 {
text-align: left;
margin: 0.8em 0;
font-size: 150%;
}
#description pre {
margin-left: 2em;
}
#description ul {
line-height: 125%;
list-style-type: disc;
margin-left: 1em;
margin-bottom: 1em;
}
#description li {
margin-left: 1em;
}
</style>
</head>
<body>
<div id="intro">
<div id="header" class="container_12">
<a href="index.html" class="grid_4 alpha"><img src="images/phantomjs-logo.png" alt="PhantomJS" id="logo" width="240" height="80"></a>
<ul id="nav" class="grid_8 omega">
<li><a href="https://github.com/ariya/phantomjs">Source Code</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/PhantomJS?tm=6">Documentation</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/Interface">API</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/QuickStart">Examples</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</div>
<div id="introduction" class="container_12">
<div class="grid_7 alpha">
<h1>PhantomJS 1.2 Release Notes</h1>
</div>
</div>
</div>
<div id="description" class="container_12">
<div class="grid_10">
<p>PhantomJS 1.2, <em><a href="release-names.html">Birds of Paradise</a></em>, was released on June 21, 2011. It is a major update, it introduces a whole set of new API. It is not compatible with the previous version. For porting existing scripts into the new API, follow the description below.</p>
<p><strong>WebPage object</strong></p>
<p>In order to improve the security aspect (see issue 41), PhantomJS scripts will not run in the context of web page execution. This means, there is no way for malicious scripts to detect the presence of 'phantom' object and exploits its API.
<p>The "sandboxing" is achieved via a new WebPage object. It is an encapsulation of a web page. A specific URL can be loaded using its open() function. A typical usage is:</p>
<pre>
var page = new WebPage();
page.open(url, function (status) {
// do something
});
</pre>
<p>The callback in the open() is executed when the page loading is completed, with status equals to "success" if there is no error and "failed" is error has occurred.</p>
<p>The above construct is a convenient version of the following:</p>
<pre>
var page = new WebPage();
page.onLoadFinished = function (status) {
// do something
};
page.open(url);
</pre>
<p>Beside onLoadFinished, there is also onLoadStarted which is invoked when page loading starts for the first time:</p>
<pre>
var page = new WebPage();
page.onLoadStarted = function () {
console.log('Start loading...');
};
page.onLoadFinished = function (status) {
console.log('Loading finished.');
};
page.open(url);
</pre>
<p><strong>Page settings</strong></p>
<p>The behavior of the web page can be set via its settings object, with the following properties:</p>
<ul>
<li>loadImages defines whether to load inline images or not (default to true)
<li>loadPlugins defines whether to load plugins (Flash, Silverlight, ...) or not (default to false)
<li>userAgent defines the user agent string passed to the server
</ul>
<p>As an example, here is how to change the user agent:</p>
<pre>
var page = new WebPage();
page.settings.userAgent = 'Dragonless Phantom';
page.open(url, function (status) {
// do something
});
</pre>
<p><strong>Rasterization</strong></p>
<p>A web page can be rasterized to an image or a PDF file using render() function.</p>
<p>This rasterize.js is all it takes to capture a web site.</p>
<pre>
var page = new WebPage(),
address, output, size;
if (phantom.args.length &lt; 2 || phantom.args.length &gt; 3) {
console.log('Usage: rasterize.js URL filename');
phantom.exit();
} else {
address = phantom.args[0];
output = phantom.args[1];
page.viewportSize = { width: 600, height: 600 };
page.open(address, function (status) {
if (status !== 'success') {
console.log('Unable to load the address!');
} else {
window.setTimeout(function () {
page.render(output);
phantom.exit();
}, 200);
}
});
}
</pre>
<p><strong>Network traffic</strong></p>
<p>All the resource requests and responses can be sniffed using the onResourceRequested and onResourceReceived. An example to dump everything is:</p>
<pre>
var page = new WebPage();
page.onResourceRequested = function (request) {
console.log('Request ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function (response) {
console.log('Receive ' + JSON.stringify(response, undefined, 4));
};
page.open(url);
</pre>
<p>The included examples/netsniff.js shows how to capture and process all the resource requests and responses and export the result in <a href="http://groups.google.com/group/http-archive-specification?hl=en">HAR format</a>.</p>
<p>The following shows the waterfall diagram obtained from BBC website:</p>
<p><img src="https://lh6.googleusercontent.com/-xoooH5EB6EE/TgnyJ3r9sRI/AAAAAAAAB98/wYJ_VoWED34/s640/bbc-har.png"/></p>
<p><strong>JavaScript evaluation</strong></p>
<p>To evaluate JavaScript code in the context of the web page, use evaluate() function. The execution is sandboxed, there is no way for the code to access any JavaScript objects and variables outside its own page context. An object can be returned from evaluate(), however it is limited to simple objects and can't contain functions or closures.</p>
<p>Here is an example to show the title of a web page:</p>
<pre>
var page = new WebPage();
page.open(url, function (status) {
var title = page.evaluate(function () {
return document.title;
});
console.log('Page title is ' + title);
});
</pre>
<p>Any console message from a web page, including from the code inside evaluate(), will not be displayed by default. To override this behavior, use the onConsoleMessage callback. The previous example can be rewritten to:</p>
<pre>
var page = new WebPage();
page.onConsoleMessage = function (msg) {
console.log('Page title is ' + msg);
};
page.open(url, function (status) {
page.evaluate(function () {
console.log(document.title);
});
});
</pre>
<p>To inject external code, use injectJs function passing the file name containing the code to be loaded. If the file can not be found in the current directory, it will be searched in the path specified in the libraryPath property. Both phantom and WebPage object have injectJs function.</p>
<p>To load external JavaScript library, includeJs is very useful. It behaves like the well-known dynamic script loading technique. An example:</p>
<pre>
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
// jQuery is loaded, now manipulate the DOM
});
</pre>
<p><strong>Bug fixes</strong></p>
<ul>
<li>Fixed rendering a very large web page (issue 54)
<li>Fixed reporting of CoffeeScript compile error (issue 125)
</ul>
<p><strong>New features</strong></p>
<ul>
<li>Added callback for console message (issue 12)
<li>Improved security model via WebPage object (issue 41)
<li>Added support for POST, HEAD, PUT, and DELETE (issue 88)
<li>Scripts filename is now passed as phantom.scriptName
<li>Added callback to capture resource requests and responses (issue 2)
<li>Added the ability to load external JavaScript (issue 32)
</ul>
<p><strong>Examples</strong></p>
<ul>
<li>Ported examples to use WebPage object
<li>Added a new example to upload an image to imagebin.org
<li>Added a new example to show HTTP POST feature
<li>Added a new example to sniff network traffic and save it in HAR format
</ul>
<p>Back to <a href="releases.html">all releases</a>.</p>
</div>
</div>
<div id="footer">
<div id="footer-content" class="container_12">
<p>
&copy; Copyright 2010-2012 <a href="http://twitter.com/AriyaHidayat">Ariya Hidayat</a> &mdash; Website design by <a href="http://svay.com/">Maurice Svay</a>
</p>
</div>
</div>
</body>
</html>

355
release-1.3.html Executable file
View File

@ -0,0 +1,355 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<title>PhantomJS 1.3 Release Notes</title>
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="screen.min.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-21665893-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<style>
#description p {
line-height: 125%;
text-align: left;
margin-bottom: 10px;
margin-top: 10px;
}
#description h2 {
text-align: left;
margin: 0.8em 0;
font-size: 150%;
}
#description pre {
margin-left: 2em;
}
#description ul {
line-height: 125%;
list-style-type: disc;
margin-left: 1em;
margin-bottom: 1em;
}
#description li {
margin-left: 1em;
}
</style>
</head>
<body>
<div id="intro">
<div id="header" class="container_12">
<a href="index.html" class="grid_4 alpha"><img src="images/phantomjs-logo.png" alt="PhantomJS" id="logo" width="240" height="80"></a>
<ul id="nav" class="grid_8 omega">
<li><a href="https://github.com/ariya/phantomjs">Source Code</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/PhantomJS?tm=6">Documentation</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/Interface">API</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/QuickStart">Examples</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</div>
<div id="introduction" class="container_12">
<div class="grid_7 alpha">
<h1>PhantomJS 1.3 Release Notes</h1>
</div>
</div>
</div>
<div id="description" class="container_12">
<div class="grid_10">
<p>PhantomJS 1.3, <em><a href="release-names.html">Water Lily</a></em>, was released on September 23, 2011. It is a minor update, mostly bug fixes and few additional new features.</p>
<p>This version is backward compatible with version 1.2. Existing scripts should work without any modification.</p>
<p>Minimum requirement to build PhantomJS 1.3 is Qt 4.6 or later. Latest stable release of Qt, i.e. version 4.7.4, is strongly recommended.</p>
<p><strong>Initial module support</strong></p>
<p>Module API modelled after CommonJS Modules is available, currently only supporting webpage and fs built-in modules.</p>
<p>For compatibility reason, WebPage object at the global scope is still available. It will be deprecated in some future release. The new recommended way to create a web page is as follows:</p>
<pre>
var page = require('webpage').create();
page.open(url, function (status) {
// do something
});
</pre>
<p><strong>WebPage object improvement</strong></p>
<p>WebPage object wraps a native object that represents the web page. Because of technical limitation, a WebPage object can not be properly garbage collected and freed from the memory. To prevent increasing heap usage when create a lot of WebPage objects, use the new release() function, as in this example:</p>
<pre>
var page = require('webpage').create();
page.open(url, function (status) {
// do something
// ....
// finish
page.release();
});
</pre>
<p>A new callback onInitialized can be used to modify the global objects before a page is loaded. In the following example, further calls to Math.random() effectively will always return the specified constant.</p>
<pre>
page.onInitialized = function() {
Math.random = function() {
return 42;
};
};
</pre>
<p>Related to page rasterization using render() function, it is now possible to control the physical scroll offset of the web page using the new property of WebPage called scrollPosition, as illustrated below:
<pre>
page.scrollPosition = { top: 100, left: 0 };
page.render('output.png');
</pre>
<p>There is now a convenient way to create a new page by passing an option the constructor:
<pre>
var page = new WebPage({
onConsoleMessage: function (msg) {
console.log(msg);
},
settings: {
loadPlugins: false,
userAgent: 'Dragonless Phantom'
},
viewportSize: {
width: 800,
height: 600
}
});
</pre>
<p><strong>Page settings</strong></p>
<p>The behavior of the web page can be further modified by the following new settings:</p>
<ul>
<li>javascriptEnabled defines whether to execute the script in the page or not (default to true)
<li>XSSAuditingEnabled defines whether load requests should be monitored for cross-site scripting attempts (default to false)
<li>localToRemoteUrlAccessEnabled defines whether local resource (e.g. from file) can access remote URLs or not (default to false)
<li>userName sets the user name used for HTTP authentication
<li>password sets the password used for HTTP authentication
</ul>
<p>Example usage:</p>
<pre>
var page = new WebPage();
page.settings.javascriptEnabled = true;
page.settings.XSSAuditingEnabled = true;
page.settings.localToRemoteUrlAccessEnabled = true;
page.open(url, function (status) {
// do something
});
</pre>
<p><strong>Mouse events</strong></p>
<p>Mouse events can be sent to the page using the new sendEvent function, like in the following examples:</p>
<pre>
page.sendEvent('mousedown', 45, 50);
</pre>
<p>The first argument is the event type. Other available types are mouseup, mousemove, and click. The next two arguments represents the mouse position.</p>
<p>As of now, left button is the only pressed button for the event. For mousemove however, there is no button pressed (i.e. it is not dragging).</p>
<p>The events are not like synthetic DOM events. Each event is sent to the web page as if it comes as part of user interaction.</p>
<p><strong>File system access</strong></p>
<p>A set of API functions is available to access files and directories. They are modelled after CommonJS Filesystem proposal.
<p>To start using, it needs to be instantiated via the fs module such as:
<pre>
var fs = require('fs');
</pre>
<p>Read-only properties:</p>
<ul>
<li>separator is the path separator (forward slash or backslash, depending on the operating system).
<li>workingDirectory is the current working directory.
</ul>
<p>Query functions:</p>
<ul>
<li>list(path) returns the list of all the names of all the files in a specified path.
<li>absolute(path) returns the absolute path starting from the root file system, resolved from the current working directory.
<li>exists(path) returns true if a file or a directory exists.
<li>isDirectory(path) returns true if the specified path is a directory.
<li>isFile(path) returns true if the specified path is a file.
<li>isAbsolute(path) returns true if the specified path is an absolute path.
<li>isExecutable(path) returns true if the specified file can be executed.
<li>isReadable(path) returns true if a file or a directory is readable.
<li>isWritable(path) returns true if a file or a directory is writeable.
<li>isLink(path) returns true if the specified path is a symbolic link.
</ul>
<p>Directory-related functions:</p>
<ul>
<li>changeWorkingDirectory(path) changes the current working directory to the specified path.
<li>makeDirectory(path) creates a new directory.
<li>makeTree(path) creates a directory including any missing parent directories.
<li>removeDirectory(path) removes a directory if it is empty
<li>removeTree(path) removes the specified path, regardless of whether it is a file or a directory.
<li>copyTree(source, destination) copies the entire files from a source path to the destination path.
</ul>
<p>File-related functions:</p>
<ul>
<li>open(path, mode) returns a stream object representing the stream interface to the specified file (mode can be r for read, w for write, or a for append).
<li>read(path) returns the entire content of a file.
<li>write(path, content, mode) writes content to a file (mode can be w for write or a for append).
<li>size(path) returns the size (in bytes) of the file specified by the path.
<li>remove(path) removes the file specified by the path.
<li>copy(source, destination) copies a file to another.
<li>move(source, destination) movies a file to another, effectively renaming it.
<li>touch(path) touches a file (i.e. changes its access timestamp).
</ul>
<p>A stream object returned from the open() function has the following functions:
<ul>
<li>read returns the content of the stream.
<li>write(data) writes the string to the stream.
<li>readLine reads only a line from the stream and return it.
<li>writeLine(data) writes the data as a line to the stream.
<li>flush() flushes all pending input output.
<li>close() completes the stream operation.
</ul>
<p>As an example of file access API, the following function recursively traverses a directory and prints all the found entries:
<pre>
function scanDirectory(path) {
var fs = require('fs');
if (fs.exists(path) && fs.isFile(path)) {
console.log(path);
} else if (fs.isDirectory(path)) {
fs.list(path).forEach(function (e) {
if (e !== '.' && e !== '..') {
scanDirectory(path + '/' + e);
}
});
}
};
</pre>
<p><strong>Command-line options</strong></p>
<p>Newly available options are:</p>
<ul>
<li>--max-disk-cache-size=size limits the size of disk cache (in KB)
<li>--output-encoding=encoding sets the encoding used for terminal output (default is utf8).
<li>--script-encoding=encoding sets the encoding used for the starting script (default is utf8).
<li>--local-to-remote-url-access=[yes|no] allows local content to access remote URL (default is no).
<li>--ignore-ssl-errors=[yes|no] ignores SSL errors, such as expired or self-signed certificate errors (default is no).
<li>--cookies-file=/path/to/cookies.txt specifies the file name to store the persistent cookies.
</ul>
<p>Rather than passing all options in the command-line, it is also possible to store the options in a file using JavaScript Object Notation (JSON) and then tell PhantomJS to read it:</p>
<pre>phantomjs --config=/path/to/config.json script.js arg1 arg2 arg3</pre>
<p>where the contents of config.json looks like:</p>
<pre>
{
'ignoreSslErrors': true,
'localToRemoteUrlAccessEnabled': true
}
</pre>
<p><strong>Platform-specific</strong></p>
<p>Mac OS X: There is no more application bundle, the executable is bin/phantomjs and not bin/phantomjs.app/Contents/MacOS/phantomjs anymore.</p>
<p><strong>Bug fixes</strong></p>
<ul>
<li>Fixed open() and POST method, without specifying the finished handler
<li>Fixed script execution warning dialog (issue 165)
<li>Added WebPage.release() to free the web page from memory (issue 154)
<li>Added special handling of about:blank (issue 235)
<li>Made a separate network access manager for each page (issue 190)
</ul>
<p><strong>New features</strong></p>
<ul>
<li>Introduced file system API based on CommonJS Filesystem proposal (issue 129)
<li>Added support for persistent cookies (issue 91)
<li>Added event handling, currently only for mouse events (issue 234)
<li>Added page scroll position (issue 162)
<li>Added HTTP authentication support (issue 45)
<li>Added callback for page initialization (issue 143)
<li>Added support to specify script and output encoding (issue 186)
<li>Added option to allow local content to do cross-domain access (issue 28)
<li>Added support to apply configurations from a JSON file (issue 180)
<li>Added a convenient WebPage initialization construction (issue 206)
<li>Added option to limit the size of disk cache (issue 220)
</ul>
<p><strong>Examples</strong></p>
<ul>
<li>Added a new example on using Modernizr to detect features (issue 144)
<li>Fixed pizza.js example to use Mobile Yelp (issue 200)
<li>Fixed netsniff.coffee example due to wrong indentation (issue 225)
<li>Added an example to show live network traffic (issue 227)
<li>Added an example demonstrating different output encodings (issue 186)
</ul>
<p>Back to <a href="releases.html">all releases</a>.</p>
</div>
</div>
<div id="footer">
<div id="footer-content" class="container_12">
<p>
&copy; Copyright 2010-2012 <a href="http://twitter.com/AriyaHidayat">Ariya Hidayat</a> &mdash; Website design by <a href="http://svay.com/">Maurice Svay</a>
</p>
</div>
</div>
</body>
</html>

168
release-1.4.html Executable file
View File

@ -0,0 +1,168 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<title>PhantomJS 1.4 Release Notes</title>
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="screen.min.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-21665893-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<style>
#description p {
line-height: 125%;
text-align: left;
margin-bottom: 10px;
margin-top: 10px;
}
#description h2 {
text-align: left;
margin: 0.8em 0;
font-size: 150%;
}
#description pre {
margin-left: 2em;
}
#description ul {
line-height: 125%;
list-style-type: disc;
margin-left: 1em;
margin-bottom: 1em;
}
#description li {
margin-left: 1em;
}
</style>
</head>
<body>
<div id="intro">
<div id="header" class="container_12">
<a href="index.html" class="grid_4 alpha"><img src="images/phantomjs-logo.png" alt="PhantomJS" id="logo" width="240" height="80"></a>
<ul id="nav" class="grid_8 omega">
<li><a href="https://github.com/ariya/phantomjs">Source Code</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/PhantomJS?tm=6">Documentation</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/Interface">API</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/QuickStart">Examples</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</div>
<div id="introduction" class="container_12">
<div class="grid_7 alpha">
<h1>PhantomJS 1.4 Release Notes</h1>
</div>
</div>
</div>
<div id="description" class="container_12">
<div class="grid_10">
<p>PhantomJS 1.4, <em><a href="release-names.html">Glory of the Snow</a></em>, was released on December 22, 2011. It is a minor update, mostly bug fixes and one new major feature: WebServer module.</p>
<p>This version is backward compatible with version 1.3. Existing scripts should work without any modification.</p>
<p>Minimum requirement to build PhantomJS 1.3 is Qt 4.6 or later. Latest stable release of Qt, i.e. version 4.8.0, is strongly recommended.</p>
<p><strong>WebServer module</strong></p>
<p>Note: This WebServer module is intended for ease of communication between PhantomJS scripts and the outside world. It is not recommended to use it as a general production server.</p>
<p>By using the embedded web server module <a href="https://github.com/valenok/mongoose">Mongoose</a>, PhantomJS script can start a web server which listens to a particular port.</p>
<p>A very simple example is as follows. It always gives the same response for any request.</p>
<pre>var server, service;
server = require('webserver').create();
service = server.listen(8080, function (request, response) {
response.statusCode = 200;
response.write('<html><body>Hello!</body></html>');
});
</pre>
<p>The request object passed to the callback function may contain the following properties:</p>
<ul>
<li>method defines the request method (GET, POST, ...)
<li>url contains the complete request URL, including the query string (if any)
<li>httpVersion has the actual HTTP version
<li>headers stores all HTTP headers as key-value pair
</ul>
<p>The response object should be used to create the response:</p>
<ul>
<li>statusCode sets the returned status code
<li>write sends a chunk for the response body (it can be called multiple times).
</ul>
<p>This WebServer module is still rather simple in this version. Depending on the needs, the functionalities and the corresponding API will be expanded in the next versions.</p>
<p><strong>Static version build script</strong></p>
<p>For continuous integration server and various other uses cases, often it is desired to have a static version of PhantomJS which has almost zero dependencies. While building PhantomJS for the static build is not difficult, it is often a daunting task to figure out the bits and pieces necessary to achieve that build.</p>
<p>For convenience, now there are two build scripts, available in the deploy subdirectories, each for Linux and Mac. The script automatically downloads the source code of Qt, build everything locally, and then prepare the binary for deployment. There is no need to have Qt installed on the system before running the script.</p>
<p>The produced binary has very minimal dependencies and can be transferred to another machine easily. With the help of UPX (optional), the size of the binary is only about 10 MB.</p>
<p>Note: Even with the static build, as of now you still need to setup Xvfb for the Linux version. Also for Mac, don't forget the Info.plist file (see issue 281).</p>
<p><strong>New features</strong></p>
<ul>
<li>Added embedded HTTP server (issue 115)</li>
<li>Added convenient build script for Linux (issue 197)</li>
<li>Added support for SOCKS5 proxy (issue 266)</li>
<li>Updated CoffeeScript compiler to version 1.2 (issue 312)</li>
</ul>
<p><strong>Bug fixes</strong></p>
<ul>
<li>Fix potential crash in QUrl with Qt 4.8 (issue 304)</li>
<li>Fix bug in CookieJar with QSettings and string (PyPhantomJS issue 10)</li>
<li>Prevent showing the icon on Mac OS X Dock (issue 281)</li>
</ul>
<p><strong>Examples</strong></p>
<ul>
<li>Added a new example to detect browsers sniffing (issue 263)</li>
<li>Added HTTP server example (issue 115)</li>
</ul>
<p>Back to <a href="releases.html">all releases</a>.</p>
</div>
</div>
<div id="footer">
<div id="footer-content" class="container_12">
<p>
&copy; Copyright 2010-2012 <a href="http://twitter.com/AriyaHidayat">Ariya Hidayat</a> &mdash; Website design by <a href="http://svay.com/">Maurice Svay</a>
</p>
</div>
</div>
</body>
</html>

250
release-1.5.html Executable file
View File

@ -0,0 +1,250 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<title>PhantomJS 1.5 Release Notes</title>
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="screen.min.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-21665893-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<style>
#description p {
line-height: 125%;
text-align: left;
margin-bottom: 10px;
margin-top: 10px;
}
#description h2 {
text-align: left;
margin: 0.8em 0;
font-size: 150%;
}
#description pre {
margin-left: 2em;
}
#description ul {
line-height: 125%;
list-style-type: disc;
margin-left: 1em;
margin-bottom: 1em;
}
#description li {
margin-left: 1em;
}
</style>
</head>
<body>
<div id="intro">
<div id="header" class="container_12">
<a href="index.html" class="grid_4 alpha"><img src="images/phantomjs-logo.png" alt="PhantomJS" id="logo" width="240" height="80"></a>
<ul id="nav" class="grid_8 omega">
<li><a href="https://github.com/ariya/phantomjs">Source Code</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/PhantomJS?tm=6">Documentation</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/Interface">API</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/QuickStart">Examples</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</div>
<div id="introduction" class="container_12">
<div class="grid_7 alpha">
<h1>PhantomJS 1.5 Release Notes</h1>
</div>
</div>
</div>
<div id="description" class="container_12">
<div class="grid_10">
<p>PhantomJS 1.5, <em><a href="release-names.html">Ghost Flower</a></em>, was released on March 20, 2012. This version is backward compatible with version 1.4. Existing scripts should work without any modification, unless there is a need to run Flash or other plugins (see below).</p>
<p>PyPhantomJS, the implementation of PhantomJS in Python with PyQt, ceased the development (issue 344) and thus the code has been removed from the repository.</p>
<p><strong>Pure headless (no X11) on Linux</strong></p>
<p>While it's always possible to customize the build of PhantomJS Linux without X11 (in particular since the last 1.4 release), it's a tedious adventure. Beginning from this release, X11-less setup is the standard when building PhantomJS Linux from source.</p>
<p>The benefits of pure headless are two-fold: no need to use Xvfb, it also compiles out-of-the-box on a barebone Linux server without GUI. This should make it easy to place PhantomJS in various continuous integration systems and cloud/elastic platforms.</p>
<p>Note that the pure headless mode does not compromise the functionalities and rendering quality. For screen capture, text rasterization is still done through FreeType and Fontconfig. Various formats (PNG, GIF, JPEG) for inlined images are still supported. Even producing PDF from the web page works just fine.</p>
<p><strong>No more support for Flash and other plugins</strong></p>
<p>Plugin support has been completely disabled (see issue 413) for the following reasons:</p>
<ul>
<li>Going pure headless without X11 means it is not possible to have native window handle for the plugin.</li>
<li>Flash apps should be tested by whatever tools Adobe provides to the developers.</li>
<li>Issues are reported but nobody volunteers to analyze or fix them.</li>
</ul>
<p>Future reported issues and bugs which relate to Flash and other plugins will be marked as WontFix.</p>
<p><strong>Improved troubleshooting</strong></p>
<p>To facilitates easier troubleshooting, there exists support for interactive mode (REPL), remote debugging, and error handling.</p>
<p>If PhantomJS is launched without any argument, it starts in the so-called interactive mode, also known for REPL (read-eval-print-loop). This mode allows a faster cycle of experiment and script prototyping. PhantomJS REPL supports the expected features: command editing, persistent history, and autocomplete (with Tab key).</p>
<p>Terminal line editing feature of this interactive mode is based on <a href="https://github.com/tadmarshall/linenoise">Linenoise</a> (an improved fork of the <a href="https://github.com/antirez/linenoise">original project</a>).</p>
<p>Remote debugging permits inspection of the script and web page via another WebKit-based browser (Safari and Chrome). This is achieved by launching PhantomJS with the new option, as in this example</p>
<pre>phantomjs --remote-debugger-port=9000 test.js</pre>
<p>After than, open Safari/Chrome and go to the http://ipaddress:9000. The browser will show the familiar Web Inspector interface which in this case works on the script being tested.</p>
<p>Note: As of now, remote debugging is only for Linux (see issue 430) .</p>
<p>To easily catch an error occured in a web page, whether it is a syntax error or other thrown exception, an onError handler for the WebPage object has been added. An example on such a handler is:</p>
<pre>
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item) {
console.log(' ', item.file, ':', item.line);
})
}
</pre>
<p>Now if the page opens a site with some JavaScript? exceptions, a detailed information (including the stack trace) will be printed out.</p>
<p>Note: Further refinement to the stack trace is still being planned (see issue 166).</p>
<p><strong>System module</strong></p>
<p>A set of functions to access system-level functionalities is available, modelled after CommonJS System proposal.</p>
<p>To start using, it needs to be instantiated via the system module such as:</p>
<pre>var system = require('system');</pre>
<p>Read-only properties:</p>
<ul>
<li>platform is the name of the platform, always fixed as phantomjs.
</ul>
<p>Query functions:
<ul>
<li>env returns the list (as key value pair) of the environment variables.
<li>args returns the list of command-line arguments. The first one is always the script name, it is followed by the subsequent arguments.
</ul>
<p>An example printenv.js demonstrates the same functionality as in the Unix printenv utility:</p>
<pre>
var system = require('system'),
env = system.env,
key;
for (key in env) {
if (env.hasOwnProperty(key)) {
console.log(key + '=' + env[key]);
}
}
phantom.exit();
</pre>
<p>An example arguments.js prints all the command-line arguments:</p>
<pre>
var system = require('system');
if (system.args.length === 1) {
console.log('Try to pass some args when invoking this script!');
} else {
system.args.forEach(function (arg, i) {
console.log(i + ': ' + arg);
});
}
phantom.exit();
</pre>
<p>If the script is invoked:</p>
<pre>phantomjs arguments.js answer 42</pre>
<p>gives the following result:
<pre>
0: arguments.js
1: answer
2: 42
</pre>
<p><strong>Control web security</strong></p>
<p>Performing cross-domain XHR is often necessary for some scripting purposes. This is now possible by disabling web security (issue 28), either with --web-security=no command-line option or webSecurityEnabled page setting.</p>
<p>Note: Disabling web security may make the system more vulnerable to attacks and other malicious content. Use it with great caution.
<p>An example findads.js uses disabled web security to access the frame content from Google Ads server: https://gist.github.com/2037945.
<p><strong>New features</strong></p>
<ul>
<li>Added interactive mode, also known as REPL (issue 252)
<li>Added setting for web security, to allow cross domain XHR (issue 28)
<li>Added error handler for WebPage object (issue 166)
<li>Removed X11/Xlib requirement on Linux (issue 163)
<li>Added support for custom HTTP header in the network request (issue 77)
<li>Added support for read write encoding in the file system module (issue 367)
<li>Added remote debugging support on Linux (issue 6)
<li>Added support for proxy authentication (issue 105)
<li>Added System module, to retrieve environment variables (issue 271) and arguments (issue 276)
<li>Added fs.readLink function (issue 329)
<li>Added support for reading and writing binary data (issue 400)
<li>Added support to retrieve request data in the WebServer? module (issue 340)
<li>Added support for individual top/bottom/left/right print margins (issue 388)
<li>Added command-line option --help (issue 347)
<li>Added short command-line options -v and -h (issue 408)
<li>Removed support for Flash and other plugins (issue 418)
</ul>
<p><strong>Bug fixes</strong></p>
<ul>
<li>Fixed multiple console.log arguments (issue 36)
<li>Fixed file upload (issue 307)
<li>Fixed the web server instance to be asynchronous (issue 326) and still support Keep Alive (issue 416)
<li>Workaround Qt 4.8.0 crash due to empty URL scheme (issue 365)
<li>Fixed a Content-Type problem where POST does not work (issue 337)
<li>Fixed Jasmine test runner with Jasmine 1.1 (issue 402)
<li>Don't display debugging and warning messages (issue 323)
</ul>
<p>Back to <a href="releases.html">all releases</a>.</p>
</div>
</div>
<div id="footer">
<div id="footer-content" class="container_12">
<p>
&copy; Copyright 2010-2012 <a href="http://twitter.com/AriyaHidayat">Ariya Hidayat</a> &mdash; Website design by <a href="http://svay.com/">Maurice Svay</a>
</p>
</div>
</div>
</body>
</html>

176
release-1.6.html Executable file
View File

@ -0,0 +1,176 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<title>PhantomJS 1.6 Release Notes</title>
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="screen.min.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-21665893-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<style>
#description p {
line-height: 125%;
text-align: left;
margin-bottom: 10px;
margin-top: 10px;
}
#description h2 {
text-align: left;
margin: 0.8em 0;
font-size: 150%;
}
#description pre {
margin-left: 2em;
}
#description ul {
line-height: 125%;
list-style-type: disc;
margin-left: 1em;
margin-bottom: 1em;
}
#description li {
margin-left: 1em;
}
</style>
</head>
<body>
<div id="intro">
<div id="header" class="container_12">
<a href="index.html" class="grid_4 alpha"><img src="images/phantomjs-logo.png" alt="PhantomJS" id="logo" width="240" height="80"></a>
<ul id="nav" class="grid_8 omega">
<li><a href="https://github.com/ariya/phantomjs">Source Code</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/PhantomJS?tm=6">Documentation</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/Interface">API</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/QuickStart">Examples</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</div>
<div id="introduction" class="container_12">
<div class="grid_7 alpha">
<h1>PhantomJS 1.6 Release Notes</h1>
</div>
</div>
</div>
<div id="description" class="container_12">
<div class="grid_10">
<p>PhantomJS 1.6, <em><a href="release-names.html">Lavender</a></em>, was released on June 20, 2012. It is a minor update, mostly bug fixes and some new API.</p>
<p>This version is backward compatible with version 1.5. Existing scripts should work without any modification.</p>
<p><strong>Improved support for rendering</strong></p>
<p>While it is always possible to capture the web page and render it as an image, it involves creating an external file to hold that image. With this version, the captured content can be retrieved as a string, base64-encoded using the new renderBase64(format) function.</p>
<p>The example will dump the base64-encoded rendering of the web page in PNG format (the default if no format is specified) to the terminal:</p>
<pre>
var page = require('webpage').create();
page.open('http://m.bing.com', function (status) {
console.log(page.renderBase64());
phantom.exit();
});
</pre>
<p>To facilitate creating thumbnail preview, scaling the screen capture is now possible via the new zoomFactor property. In this example, the BBC site is captured to an image at 25% zoom.</p>
<pre>
var page = require('webpage').create();
page.open('http://news.bbc.co.uk', function (status) {
page.zoomFactor = 0.25;
page.render('bbc.png');
phantom.exit();
});
</pre>
<p><strong>Better script evaluation</strong></p>
<p>Arguments can be passed to evaluate() function to run a script in the context of the web page.</p>
<p>In the following example, the text value of a DOM element is extracted. The element is chosen based on the selector which is passed to evaluate.</p>
<pre>
var page = require('webpage').create();
page.open('http://m.bing.com', function (status) {
var title = page.evaluate(function (s) {
return document.querySelector(s).innerText;
}, 'title');
console.log(title);
phantom.exit();
});
</pre>
<p>Evaluating a script asynchronously is now possible via the new evaluateAsync function. Unlike the standard evaluate, the function returns immediately and does not wait until the script execution finishes. Consequently there is no return value from this function.</p>
<p><strong>New features</strong></p>
<ul>
<li>Added support for passing arguments to WebPage's evaluate (issue 132)
<li>Added callbacks for JavaScript onConfirm and onPrompt (issue 133)
<li>Added stack trace when error occurs (issue 166)
<li>Added initial support for cookies handling (issue 354)
<li>Added support for header footer when printing the page (issue 410, 512)
<li>Added headers support in the loading request (issue 452)
<li>Added support to render the web page as base64-encoded string (issue 547)
<li>Added hooks for navigation event (issue 562)
<li>Added command-line option to show debug messages (issue 575)
<li>Added support for the zoom factor for web page rendering (issue 579)
<li>Added crash reporter for Mac OS X and Linux, based on Google Breakpad (issue 576)
<li>Added 'os' object to the system module (issue 585)
<li>Added support for asynchronous evaluation (issue 593)
</ul>
<p><strong>Improvements</strong></p>
<ul>
<li>Fixed remote debugging to work on Mac OS X and Windows (issue 430)
<li>Fixed web server getting the dropped connection for empty response (issue 451)
<li>Fixed text rendered as boxes (squares) on headless Linux (issue 460)
<li>Updated Qt to version 4.8.2 (issue 495)
<li>Updated CoffeeScript compiler to version 1.3.3 (issue 496)
<li>Fixed the build script to detect and use MAKEFLAGS (issue 503)
<li>Fixed the build script to properly pass Qt config flags (issue 507)
<li>Changed Info.plist to be embedded in Mac OS X executable (issue 528)
<li>Fixed wrong module require in the imagebin example (issue 536)
<li>Fixed example scripts to exit with the right exit code (issue 544)
<li>Fixed build failure with glib 2.31.0+ (issue 559)
<li>Fixed error handler failures in some cases (issue 589)
</ul>
<p>Back to <a href="releases.html">all releases</a>.</p>
</div>
</div>
<div id="footer">
<div id="footer-content" class="container_12">
<p>
&copy; Copyright 2010-2012 <a href="http://twitter.com/AriyaHidayat">Ariya Hidayat</a> &mdash; Website design by <a href="http://svay.com/">Maurice Svay</a>
</p>
</div>
</div>
</body>
</html>

102
releases.html Executable file
View File

@ -0,0 +1,102 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<title>PhantomJS: Releases</title>
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="screen.min.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-21665893-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<style>
#description p {
line-height: 125%;
text-align: left;
margin-bottom: 10px;
margin-top: 10px;
}
#description h2 {
text-align: left;
margin: 0.8em 0;
font-size: 150%;
}
#description pre {
margin-left: 2em;
}
#description ul {
line-height: 125%;
list-style-type: disc;
margin-left: 1em;
margin-bottom: 1em;
}
#description li {
margin-left: 1em;
}
</style>
</head>
<body>
<div id="intro">
<div id="header" class="container_12">
<a href="index.html" class="grid_4 alpha"><img src="images/phantomjs-logo.png" alt="PhantomJS" id="logo" width="240" height="80"></a>
<ul id="nav" class="grid_8 omega">
<li><a href="https://github.com/ariya/phantomjs">Source Code</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/PhantomJS?tm=6">Documentation</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/Interface">API</a></li>
<li><a href="http://code.google.com/p/phantomjs/wiki/QuickStart">Examples</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</div>
<div id="introduction" class="container_12">
<div class="grid_7 alpha">
<h1>PhantomJS Releases</h1>
</div>
</div>
</div>
<div id="description" class="container_12">
<div class="grid_10">
<p><a href="release-1.6.html">PhantomJS 1.6</a> "Lavender" was released on June 20, 2012. It is a minor update with some improvements on the rendering and script evaluation, as well as various bug fixes.</p>
<p><a href="release-1.5.html">PhantomJS 1.5</a> "Ghost Flower" was released on March 20, 2012. It added pure headless (no X11) for the Linux version, improved troubleshooting with interactive mode and remote debugger, and a new system module.</p>
<p><a href="release-1.4.html">PhantomJS 1.4</a> "Glory of the Snow" was released on December 22, 2011. It is a minor update, mostly bug fixes and one new major feature: WebServer module.</p>
<p><a href="release-1.3.html">PhantomJS 1.3</a> "Water Lily" was released on September 23, 2011. It added preliminary module syntax, file system support, mouse events, and other page-related improvements.</p>
<p><a href="release-1.2.html">PhantomJS 1.2</a> "Birds of Paradise" was released on June 21, 2011. It implemented an abstraction for web page object, added support for rasterization and network traffic monitoring.</p>
<p><a href="release-1.1.html">PhantomJS 1.1</a> "Cherry Blossom" was released on April 27, 2011. It added supports for file upload, network proxy, disk cache, GIF output. In addition, scripts can now be written in CoffeeScript.</p>
</div>
</div>
<div id="footer">
<div id="footer-content" class="container_12">
<p>
&copy; Copyright 2010-2012 <a href="http://twitter.com/AriyaHidayat">Ariya Hidayat</a> &mdash; Website design by <a href="http://svay.com/">Maurice Svay</a>
</p>
</div>
</div>
</body>
</html>