From 113d6446155a5bb6d3732c3078fec8ea040a93bb Mon Sep 17 00:00:00 2001 From: Matt Colyer Date: Tue, 19 Nov 2013 15:18:54 -0800 Subject: [PATCH 01/11] Don't map command to ctrl We no longer what this behavior because it's confusing unless you understand that atom-shell does this. --- browser/ui/accelerator_util.cc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/browser/ui/accelerator_util.cc b/browser/ui/accelerator_util.cc index b814783574..1fb89a7e23 100644 --- a/browser/ui/accelerator_util.cc +++ b/browser/ui/accelerator_util.cc @@ -108,13 +108,7 @@ bool StringToAccelerator(const std::string& description, } else if (tokens[i] == "ctrl") { modifiers |= ui::EF_CONTROL_DOWN; } else if (tokens[i] == "command") { - // The "Command" would be translated to "Ctrl" on platforms other than - // OS X. -#if defined(OS_MACOSX) modifiers |= ui::EF_COMMAND_DOWN; -#else - modifiers |= ui::EF_CONTROL_DOWN; -#endif } else if (tokens[i] == "alt") { modifiers |= ui::EF_ALT_DOWN; } else if (tokens[i] == "shift") { From 84939758403088f246d17d27238ac179b90ef6b8 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 20 Nov 2013 22:48:47 +0800 Subject: [PATCH 02/11] doc: Mention that Command would not be meaningful on Windows. --- docs/api/browser/menu-item.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/api/browser/menu-item.md b/docs/api/browser/menu-item.md index df922e14f6..6ad24d94e0 100644 --- a/docs/api/browser/menu-item.md +++ b/docs/api/browser/menu-item.md @@ -23,5 +23,4 @@ ## Notes on accelerator -On Linux and Windows, the `Command` would be translated to `Ctrl`, so usually -you can use `Command` for most of the commands. +On Linux and Windows, the `Command` key would not have any effect. From 9ad3b7939f93d501821874f585cf22d54605e3d1 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 20 Nov 2013 22:51:26 +0800 Subject: [PATCH 03/11] Bump v0.6.11. --- app/win/atom.rc | 8 ++++---- browser/mac/Info.plist | 2 +- common/atom_version.h | 2 +- package.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/win/atom.rc b/app/win/atom.rc index e10d3274b1..f99bd9d9f2 100644 --- a/app/win/atom.rc +++ b/app/win/atom.rc @@ -50,8 +50,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,6,10,0 - PRODUCTVERSION 0,6,10,0 + FILEVERSION 0,6,11,0 + PRODUCTVERSION 0,6,11,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -68,12 +68,12 @@ BEGIN BEGIN VALUE "CompanyName", "GitHub, Inc." VALUE "FileDescription", "Atom-Shell" - VALUE "FileVersion", "0.6.10" + VALUE "FileVersion", "0.6.11" VALUE "InternalName", "atom.exe" VALUE "LegalCopyright", "Copyright (C) 2013 GitHub, Inc. All rights reserved." VALUE "OriginalFilename", "atom.exe" VALUE "ProductName", "Atom-Shell" - VALUE "ProductVersion", "0.6.10" + VALUE "ProductVersion", "0.6.11" END END BLOCK "VarFileInfo" diff --git a/browser/mac/Info.plist b/browser/mac/Info.plist index 642167b389..4f9f87c085 100644 --- a/browser/mac/Info.plist +++ b/browser/mac/Info.plist @@ -11,7 +11,7 @@ CFBundleIconFile atom.icns CFBundleVersion - 0.6.10 + 0.6.11 NSMainNibFile MainMenu NSPrincipalClass diff --git a/common/atom_version.h b/common/atom_version.h index 0168812988..41c2a26f8b 100644 --- a/common/atom_version.h +++ b/common/atom_version.h @@ -7,7 +7,7 @@ #define ATOM_MAJOR_VERSION 0 #define ATOM_MINOR_VERSION 6 -#define ATOM_PATCH_VERSION 10 +#define ATOM_PATCH_VERSION 11 #define ATOM_VERSION_IS_RELEASE 1 diff --git a/package.json b/package.json index c68e6d16f4..6b47af3d60 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "atom-shell", - "version": "0.6.10", + "version": "0.6.11", "devDependencies": { "coffee-script": "~1.6.3", From 36ecb35cb158a02248e63c61f5c473ff77c6294a Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 21 Nov 2013 21:50:06 +0800 Subject: [PATCH 04/11] Add API to capture a page into file. --- browser/native_window.cc | 36 ++++++++++++++++++++++++++++++++++++ browser/native_window.h | 13 +++++++++++++ 2 files changed, 49 insertions(+) diff --git a/browser/native_window.cc b/browser/native_window.cc index db671f9a77..182edc3519 100644 --- a/browser/native_window.cc +++ b/browser/native_window.cc @@ -29,6 +29,7 @@ #include "common/api/api_messages.h" #include "common/options_switches.h" #include "ipc/ipc_message_macros.h" +#include "ui/gfx/codec/png_codec.h" #include "ui/gfx/point.h" #include "ui/gfx/rect.h" #include "ui/gfx/size.h" @@ -198,6 +199,18 @@ bool NativeWindow::SetIcon(const std::string& str_path) { return true; } +void NativeWindow::CapturePage(const gfx::Rect& rect, + const base::FilePath& path, + const CapturePageCallback& callback) { + GetWebContents()->GetRenderViewHost()->CopyFromBackingStore( + rect, + gfx::Size(), + base::Bind(&NativeWindow::OnCapturePageDone, + base::Unretained(this), + path, + callback)); +} + void NativeWindow::CloseWebContents() { bool prevent_default = false; FOR_EACH_OBSERVER(NativeWindowObserver, @@ -374,6 +387,29 @@ void NativeWindow::Observe(int type, } } +void NativeWindow::OnCapturePageDone(const base::FilePath& filename, + const CapturePageCallback& callback, + bool succeed, + const SkBitmap& bitmap) { + if (!succeed) { + callback.Run(false); + return; + } + + std::vector data; + bool encoded = gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, true, &data); + if (!encoded) { + callback.Run(false); + return; + } + + int written = file_util::WriteFile( + filename, + reinterpret_cast(&data[0]), + data.size()); + callback.Run(written > 0); +} + void NativeWindow::OnRendererMessage(const string16& channel, const base::ListValue& args) { AtomBrowserMainParts::Get()->atom_bindings()->OnRendererMessage( diff --git a/browser/native_window.h b/browser/native_window.h index e10c0f7d88..07e839e839 100644 --- a/browser/native_window.h +++ b/browser/native_window.h @@ -108,6 +108,13 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, virtual void RestartHangMonitorTimeout(); virtual bool SetIcon(const std::string& path); + // Captures the page with |rect| and saves the image to |path|, |callback| + // would be called when capturing is done. + typedef base::Callback CapturePageCallback; + virtual void CapturePage(const gfx::Rect& rect, + const base::FilePath& path, + const CapturePageCallback& callback); + // The same with closing a tab in a real browser. // // Should be called by platform code when user want to close the window. @@ -184,6 +191,12 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, private: void RendererUnresponsiveDelayed(); + // Called when CapturePage has done. + void OnCapturePageDone(const base::FilePath& filename, + const CapturePageCallback& callback, + bool succeed, + const SkBitmap& bitmap); + void OnRendererMessage(const string16& channel, const base::ListValue& args); From 8d6764e0a07de877926a55db8c88733aed87ebe0 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 21 Nov 2013 22:03:29 +0800 Subject: [PATCH 05/11] Return screenshot's data buffer instead of directly saving to file. --- browser/native_window.cc | 24 ++++-------------------- browser/native_window.h | 12 ++++++------ 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/browser/native_window.cc b/browser/native_window.cc index 182edc3519..b3bb5efc5d 100644 --- a/browser/native_window.cc +++ b/browser/native_window.cc @@ -200,14 +200,12 @@ bool NativeWindow::SetIcon(const std::string& str_path) { } void NativeWindow::CapturePage(const gfx::Rect& rect, - const base::FilePath& path, const CapturePageCallback& callback) { GetWebContents()->GetRenderViewHost()->CopyFromBackingStore( rect, gfx::Size(), base::Bind(&NativeWindow::OnCapturePageDone, base::Unretained(this), - path, callback)); } @@ -387,27 +385,13 @@ void NativeWindow::Observe(int type, } } -void NativeWindow::OnCapturePageDone(const base::FilePath& filename, - const CapturePageCallback& callback, +void NativeWindow::OnCapturePageDone(const CapturePageCallback& callback, bool succeed, const SkBitmap& bitmap) { - if (!succeed) { - callback.Run(false); - return; - } - std::vector data; - bool encoded = gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, true, &data); - if (!encoded) { - callback.Run(false); - return; - } - - int written = file_util::WriteFile( - filename, - reinterpret_cast(&data[0]), - data.size()); - callback.Run(written > 0); + if (succeed) + gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, true, &data); + callback.Run(data); } void NativeWindow::OnRendererMessage(const string16& channel, diff --git a/browser/native_window.h b/browser/native_window.h index 07e839e839..2506afb550 100644 --- a/browser/native_window.h +++ b/browser/native_window.h @@ -49,6 +49,9 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, public content::WebContentsObserver, public content::NotificationObserver { public: + typedef base::Callback& buffer)> + CapturePageCallback; + virtual ~NativeWindow(); // Create window with existing WebContents. @@ -108,11 +111,9 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, virtual void RestartHangMonitorTimeout(); virtual bool SetIcon(const std::string& path); - // Captures the page with |rect| and saves the image to |path|, |callback| - // would be called when capturing is done. - typedef base::Callback CapturePageCallback; + // Captures the page with |rect|, |callback| would be called when capturing is + // done. virtual void CapturePage(const gfx::Rect& rect, - const base::FilePath& path, const CapturePageCallback& callback); // The same with closing a tab in a real browser. @@ -192,8 +193,7 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, void RendererUnresponsiveDelayed(); // Called when CapturePage has done. - void OnCapturePageDone(const base::FilePath& filename, - const CapturePageCallback& callback, + void OnCapturePageDone(const CapturePageCallback& callback, bool succeed, const SkBitmap& bitmap); From a0548530e70df6c02dc37f20a2bac6560b83a432 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 22 Nov 2013 14:22:28 +0800 Subject: [PATCH 06/11] Enable converting V8 value to gfx::Rect. --- common/v8_conversions.h | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/common/v8_conversions.h b/common/v8_conversions.h index bd5f72a6aa..b56061119f 100644 --- a/common/v8_conversions.h +++ b/common/v8_conversions.h @@ -11,6 +11,7 @@ #include "base/files/file_path.h" #include "base/string16.h" #include "browser/api/atom_api_window.h" +#include "ui/gfx/rect.h" #include "v8/include/v8.h" // Convert V8 value to arbitrary supported types. @@ -38,6 +39,20 @@ struct FromV8Value { return base::FilePath::FromUTF8Unsafe(FromV8Value(value_)); } + operator gfx::Rect() { + v8::Handle rect = value_->ToObject(); + v8::Handle x = rect->Get(v8::String::New("x")); + v8::Handle y = rect->Get(v8::String::New("y")); + v8::Handle width = rect->Get(v8::String::New("width")); + v8::Handle height = rect->Get(v8::String::New("height")); + if (!x->IsNumber() || !y->IsNumber() || + !width->IsNumber() || !height->IsNumber()) + return gfx::Rect(); + else + return gfx::Rect(x->IntegerValue(), y->IntegerValue(), + width->IntegerValue(), height->IntegerValue()); + } + operator std::vector() { std::vector array; v8::Handle v8_array = v8::Handle::Cast(value_); @@ -58,11 +73,9 @@ struct FromV8Value { } operator v8::Persistent() { - return value_->IsFunction() ? - v8::Persistent::New( - node::node_isolate, - v8::Handle::Cast(value_)) : - v8::Persistent(); + return v8::Persistent::New( + node::node_isolate, + v8::Handle::Cast(value_)); } v8::Handle value_; @@ -137,6 +150,11 @@ bool V8ValueCanBeConvertedTo(v8::Handle value) { return V8ValueCanBeConvertedTo(value); } +template<> inline +bool V8ValueCanBeConvertedTo(v8::Handle value) { + return value->IsObject(); +} + template<> inline bool V8ValueCanBeConvertedTo>( v8::Handle value) { From 3b4a45ac65b11fb05db319295e941aa53beb77d0 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 22 Nov 2013 14:23:19 +0800 Subject: [PATCH 07/11] Add BrowserWindow.capturePage API. --- browser/api/atom_api_window.cc | 32 ++++++++++++++++++++++++++++++++ browser/api/atom_api_window.h | 7 +++++++ vendor/node | 2 +- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/browser/api/atom_api_window.cc b/browser/api/atom_api_window.cc index 42404a4c18..0dda0617bd 100644 --- a/browser/api/atom_api_window.cc +++ b/browser/api/atom_api_window.cc @@ -14,6 +14,7 @@ #include "ui/gfx/point.h" #include "ui/gfx/rect.h" #include "ui/gfx/size.h" +#include "vendor/node/src/node_buffer.h" using content::V8ValueConverter; using content::NavigationController; @@ -82,6 +83,20 @@ void Window::OnRendererCrashed() { Emit("crashed"); } +void Window::OnCapturePageDone(v8::Persistent callback, + const std::vector& data) { + v8::HandleScope scope; + + // TODO Use new Buffer API when we updated to node v0.12.x. + node::Buffer* buffer = node::Buffer::New( + reinterpret_cast(data.data()), + data.size()); + + v8::Handle arg = buffer->handle_; + callback->Call(v8::Context::GetCurrent()->Global(), 1, &arg); + callback.Dispose(v8::Isolate::GetCurrent()); +} + // static v8::Handle Window::New(const v8::Arguments &args) { v8::HandleScope scope; @@ -480,6 +495,22 @@ v8::Handle Window::RestartHangMonitorTimeout( return v8::Undefined(); } +// static +v8::Handle Window::CapturePage(const v8::Arguments& args) { + UNWRAP_WINDOW_AND_CHECK; + + gfx::Rect rect; + v8::Persistent callback; + if (!FromV8Arguments(args, &rect, &callback)) + return node::ThrowTypeError("Bad argument"); + + self->window_->CapturePage(rect, base::Bind(&Window::OnCapturePageDone, + base::Unretained(self), + callback)); + + return v8::Undefined(); +} + // static v8::Handle Window::GetPageTitle(const v8::Arguments &args) { UNWRAP_WINDOW_AND_CHECK; @@ -721,6 +752,7 @@ void Window::Initialize(v8::Handle target) { NODE_SET_PROTOTYPE_METHOD(t, "restartHangMonitorTimeout", RestartHangMonitorTimeout); + NODE_SET_PROTOTYPE_METHOD(t, "capturePage", CapturePage); NODE_SET_PROTOTYPE_METHOD(t, "getPageTitle", GetPageTitle); NODE_SET_PROTOTYPE_METHOD(t, "isLoading", IsLoading); diff --git a/browser/api/atom_api_window.h b/browser/api/atom_api_window.h index 14a707e28b..03709dc22a 100644 --- a/browser/api/atom_api_window.h +++ b/browser/api/atom_api_window.h @@ -5,6 +5,8 @@ #ifndef ATOM_BROWSER_API_ATOM_API_WINDOW_H_ #define ATOM_BROWSER_API_ATOM_API_WINDOW_H_ +#include + #include "base/memory/scoped_ptr.h" #include "browser/api/atom_api_event_emitter.h" #include "browser/native_window_observer.h" @@ -87,6 +89,7 @@ class Window : public EventEmitter, static v8::Handle IsWebViewFocused(const v8::Arguments& args); static v8::Handle RestartHangMonitorTimeout( const v8::Arguments &args); + static v8::Handle CapturePage(const v8::Arguments& args); // APIs for WebContents. static v8::Handle GetPageTitle(const v8::Arguments &args); @@ -110,6 +113,10 @@ class Window : public EventEmitter, static v8::Handle Reload(const v8::Arguments &args); static v8::Handle ReloadIgnoringCache(const v8::Arguments &args); + // Called when capturePage is done. + void OnCapturePageDone(v8::Persistent callback, + const std::vector& data); + scoped_ptr window_; DISALLOW_COPY_AND_ASSIGN(Window); diff --git a/vendor/node b/vendor/node index 7f44fac0fd..24c11bdc79 160000 --- a/vendor/node +++ b/vendor/node @@ -1 +1 @@ -Subproject commit 7f44fac0fd64af7ec172c9606af1f3cec684a9ce +Subproject commit 24c11bdc794c2b7b79163cb4737046f8de42446d From 4af802f2150560d042647dfc1a98038049b790df Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 22 Nov 2013 14:29:20 +0800 Subject: [PATCH 08/11] Enable ignoring |rect| when calling BrowserWindow.capturePage. --- browser/api/atom_api_window.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/browser/api/atom_api_window.cc b/browser/api/atom_api_window.cc index 0dda0617bd..a0262592ed 100644 --- a/browser/api/atom_api_window.cc +++ b/browser/api/atom_api_window.cc @@ -87,7 +87,7 @@ void Window::OnCapturePageDone(v8::Persistent callback, const std::vector& data) { v8::HandleScope scope; - // TODO Use new Buffer API when we updated to node v0.12.x. + // TODO(zcbenz): Use new Buffer API when we updated to node v0.12.x. node::Buffer* buffer = node::Buffer::New( reinterpret_cast(data.data()), data.size()); @@ -501,7 +501,8 @@ v8::Handle Window::CapturePage(const v8::Arguments& args) { gfx::Rect rect; v8::Persistent callback; - if (!FromV8Arguments(args, &rect, &callback)) + if (!FromV8Arguments(args, &rect, &callback) && + !FromV8Arguments(args, &callback)) return node::ThrowTypeError("Bad argument"); self->window_->CapturePage(rect, base::Bind(&Window::OnCapturePageDone, From 33ad68f7a7f29b1f0409055dbcfb2dd67ef63e5d Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 22 Nov 2013 14:39:10 +0800 Subject: [PATCH 09/11] doc: Explain BrowserWindow.capturePage. --- docs/api/browser/browser-window.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/api/browser/browser-window.md b/docs/api/browser/browser-window.md index 0977b077cf..eb9f6dd967 100644 --- a/docs/api/browser/browser-window.md +++ b/docs/api/browser/browser-window.md @@ -290,6 +290,23 @@ Starts inspecting element at position (`x`, `y`). ### BrowserWindow.restartHangMonitorTimeout() +### BrowserWindow.capturePage([rect, ]callback) + +* `rect` Object - The area of page to be captured + * `x` + * `y` + * `width` + * `height` +* `callback` Function + +Captures the snapshot of page within `rect`, upon completion `callback` would be +called with `callback(image)`, the `image` is a `Buffer` that stores the PNG +encoded data of the snapshot. Omitting the `rect` would capture the whole +visible page. + +You can write received `image` directly to a `.png` file, or you can base64 +encode it and use data URL to embed the image in HTML. + ### BrowserWindow.getPageTitle() Returns the title of web page. From 80824b13c61e1854c11df8f459e2c4fb64618673 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 22 Nov 2013 14:42:39 +0800 Subject: [PATCH 10/11] Add spec for BrowserWindow.capturePage. --- spec/api/window.coffee | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spec/api/window.coffee b/spec/api/window.coffee index ebaf69a422..66de175da9 100644 --- a/spec/api/window.coffee +++ b/spec/api/window.coffee @@ -75,6 +75,13 @@ describe 'window module', -> assert.equal w.isVisible(), false w.close() + describe 'BrowserWindow.capturePage(rect, callback)', -> + it 'calls the callback with a Buffer', -> + w = new BrowserWindow(show: false) + w.capturePage {x: 0, y: 0, width: 100, height: 100}, (image) -> + assert.equal image.constructor.name, 'SlowBuffer' + w.close() + describe 'beforeunload handler', -> it 'returning true would not prevent close', (done) -> w = new BrowserWindow(show: false) From 4af646b760a922d4e6b6e5089fd1d454fe0e8d88 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 22 Nov 2013 15:18:21 +0800 Subject: [PATCH 11/11] Bump v0.6.12. --- app/win/atom.rc | 8 ++++---- browser/mac/Info.plist | 2 +- common/atom_version.h | 2 +- package.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/win/atom.rc b/app/win/atom.rc index f99bd9d9f2..d7cd3a7b8f 100644 --- a/app/win/atom.rc +++ b/app/win/atom.rc @@ -50,8 +50,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,6,11,0 - PRODUCTVERSION 0,6,11,0 + FILEVERSION 0,6,12,0 + PRODUCTVERSION 0,6,12,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -68,12 +68,12 @@ BEGIN BEGIN VALUE "CompanyName", "GitHub, Inc." VALUE "FileDescription", "Atom-Shell" - VALUE "FileVersion", "0.6.11" + VALUE "FileVersion", "0.6.12" VALUE "InternalName", "atom.exe" VALUE "LegalCopyright", "Copyright (C) 2013 GitHub, Inc. All rights reserved." VALUE "OriginalFilename", "atom.exe" VALUE "ProductName", "Atom-Shell" - VALUE "ProductVersion", "0.6.11" + VALUE "ProductVersion", "0.6.12" END END BLOCK "VarFileInfo" diff --git a/browser/mac/Info.plist b/browser/mac/Info.plist index 4f9f87c085..0edcd042f7 100644 --- a/browser/mac/Info.plist +++ b/browser/mac/Info.plist @@ -11,7 +11,7 @@ CFBundleIconFile atom.icns CFBundleVersion - 0.6.11 + 0.6.12 NSMainNibFile MainMenu NSPrincipalClass diff --git a/common/atom_version.h b/common/atom_version.h index 41c2a26f8b..df61c62d26 100644 --- a/common/atom_version.h +++ b/common/atom_version.h @@ -7,7 +7,7 @@ #define ATOM_MAJOR_VERSION 0 #define ATOM_MINOR_VERSION 6 -#define ATOM_PATCH_VERSION 11 +#define ATOM_PATCH_VERSION 12 #define ATOM_VERSION_IS_RELEASE 1 diff --git a/package.json b/package.json index 6b47af3d60..f5b0e0f49a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "atom-shell", - "version": "0.6.11", + "version": "0.6.12", "devDependencies": { "coffee-script": "~1.6.3",