diff --git a/atom/browser/api/atom_api_session.cc b/atom/browser/api/atom_api_session.cc index 0b7640e416b..3ca15ab871f 100644 --- a/atom/browser/api/atom_api_session.cc +++ b/atom/browser/api/atom_api_session.cc @@ -106,12 +106,12 @@ template<> struct Converter { static v8::Local ToV8(v8::Isolate* isolate, content::DownloadItem* val) { - return mate::ObjectTemplateBuilder(isolate) - .SetValue("url", val->GetURL()) - .SetValue("filename", val->GetSuggestedFilename()) - .SetValue("mimeType", val->GetMimeType()) - .SetValue("hasUserGesture", val->HasUserGesture()) - .Build()->NewInstance(); + mate::Dictionary dict(isolate, v8::Object::New(isolate)); + dict.Set("url", val->GetURL()); + dict.Set("filename", val->GetSuggestedFilename()); + dict.Set("mimeType", val->GetMimeType()); + dict.Set("hasUserGesture", val->HasUserGesture()); + return dict.GetHandle(); } }; @@ -123,6 +123,10 @@ namespace api { namespace { +// The wrapSession funtion which is implemented in JavaScript +using WrapSessionCallback = base::Callback)>; +WrapSessionCallback g_wrap_session; + class ResolveProxyHelper { public: ResolveProxyHelper(AtomBrowserContext* browser_context, @@ -321,9 +325,33 @@ mate::Handle Session::CreateFrom( if (existing) return mate::CreateHandle(isolate, static_cast(existing)); - return mate::CreateHandle(isolate, new Session(browser_context)); + auto handle = mate::CreateHandle(isolate, new Session(browser_context)); + g_wrap_session.Run(handle.ToV8()); + return handle; +} + +void SetWrapSession(const WrapSessionCallback& callback) { + g_wrap_session = callback; +} + +void ClearWrapSession() { + g_wrap_session.Reset(); } } // namespace api } // namespace atom + +namespace { + +void Initialize(v8::Local exports, v8::Local unused, + v8::Local context, void* priv) { + v8::Isolate* isolate = context->GetIsolate(); + mate::Dictionary dict(isolate, exports); + dict.SetMethod("_setWrapSession", &atom::api::SetWrapSession); + dict.SetMethod("_clearWrapSession", &atom::api::ClearWrapSession); +} + +} // namespace + +NODE_MODULE_CONTEXT_AWARE_BUILTIN(atom_browser_session, Initialize) diff --git a/atom/browser/api/lib/app.coffee b/atom/browser/api/lib/app.coffee index f71297c596f..b3446e86e23 100644 --- a/atom/browser/api/lib/app.coffee +++ b/atom/browser/api/lib/app.coffee @@ -1,10 +1,15 @@ EventEmitter = require('events').EventEmitter bindings = process.atomBinding 'app' +sessionBindings = process.atomBinding 'session' app = bindings.app app.__proto__ = EventEmitter.prototype +wrapSession = (session) -> + # session is an Event Emitter. + session.__proto__ = EventEmitter.prototype + app.setApplicationMenu = (menu) -> require('menu').setApplicationMenu menu @@ -32,10 +37,8 @@ app.setAppPath = (path) -> app.getAppPath = -> appPath -app.once 'ready', -> - app.defaultSession.__proto__ = EventEmitter.prototype - # Be compatible with old API. - @emit 'finish-launching' +# Be compatible with old API. +app.once 'ready', -> @emit 'finish-launching' app.terminate = app.quit app.exit = process.exit app.getHomeDir = -> @getPath 'home' @@ -43,5 +46,9 @@ app.getDataPath = -> @getPath 'userData' app.setDataPath = (path) -> @setPath 'userData', path app.resolveProxy = -> @defaultSession.resolveProxy.apply @defaultSession, arguments +# Session wrapper. +sessionBindings._setWrapSession wrapSession +process.once 'exit', sessionBindings._clearWrapSession + # Only one App object pemitted. module.exports = app diff --git a/atom/common/node_bindings.cc b/atom/common/node_bindings.cc index 5aed5619f9c..09666a470b6 100644 --- a/atom/common/node_bindings.cc +++ b/atom/common/node_bindings.cc @@ -40,6 +40,7 @@ REFERENCE_MODULE(atom_browser_power_monitor); REFERENCE_MODULE(atom_browser_power_save_blocker); REFERENCE_MODULE(atom_browser_protocol); REFERENCE_MODULE(atom_browser_global_shortcut); +REFERENCE_MODULE(atom_browser_session); REFERENCE_MODULE(atom_browser_tray); REFERENCE_MODULE(atom_browser_web_contents); REFERENCE_MODULE(atom_browser_web_view_manager); diff --git a/docs/api/app.md b/docs/api/app.md index 8951adf45cf..db34d37ec59 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -330,35 +330,3 @@ Sets the application's [dock menu][dock-menu]. [dock-menu]:https://developer.apple.com/library/mac/documentation/Carbon/Conceptual/customizing_docktile/concepts/dockconcepts.html#//apple_ref/doc/uid/TP30000986-CH2-TPXREF103 [tasks]:http://msdn.microsoft.com/en-us/library/windows/desktop/dd378460(v=vs.85).aspx#tasks - -## `app.defaultSession` - -The default session of the app available once the (ready)[app.md#event-ready] event is fired. - -```javascript -app.on('ready', function() { - var defaultSession = app.defaultSession; -}) -``` - -### Event: 'will-download' - -* `event` Event -* `downloadItem` Object - * `url` String - * `filename` String - * `mimeType` String - * `hasUserGesture` Boolean -* `webContents` (WebContents)[web-contents.md] - -Fired when a download is about to start. Calling `preventDefault()` -will cancel the download. - -```javascript -app.defaultSession.on('will-download', function(e, downloadItem, webContents) { - e.preventDefault(); - require('request')(downloadItem.url, function(data) { - require('fs').writeFileSync('/somewhere', data); - }); -}); -``` diff --git a/docs/api/session.md b/docs/api/session.md index 7b0c1b44c7d..28a0c92ca65 100644 --- a/docs/api/session.md +++ b/docs/api/session.md @@ -13,6 +13,30 @@ win.loadUrl("http://github.com"); var session = win.webContents.session ``` +## Events + +### Event: 'will-download' + +* `event` Event +* `downloadItem` Object + * `url` String + * `filename` String + * `mimeType` String + * `hasUserGesture` Boolean +* `webContents` (WebContents)[web-contents.md] + +Fired when a download is about to start. Calling `preventDefault()` +will cancel the download. + +```javascript +session.on('will-download', function(e, downloadItem, webContents) { + e.preventDefault(); + require('request')(downloadItem.url, function(data) { + require('fs').writeFileSync('/somewhere', data); + }); +}); +``` + ## Methods The `session` object has the following methods: