implement wrapSession

This commit is contained in:
Robo 2015-09-01 15:32:14 +05:30
parent aed487ef40
commit 4062ca5f68
5 changed files with 71 additions and 43 deletions

View file

@ -106,12 +106,12 @@ template<>
struct Converter<content::DownloadItem*> { struct Converter<content::DownloadItem*> {
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate, static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
content::DownloadItem* val) { content::DownloadItem* val) {
return mate::ObjectTemplateBuilder(isolate) mate::Dictionary dict(isolate, v8::Object::New(isolate));
.SetValue("url", val->GetURL()) dict.Set("url", val->GetURL());
.SetValue("filename", val->GetSuggestedFilename()) dict.Set("filename", val->GetSuggestedFilename());
.SetValue("mimeType", val->GetMimeType()) dict.Set("mimeType", val->GetMimeType());
.SetValue("hasUserGesture", val->HasUserGesture()) dict.Set("hasUserGesture", val->HasUserGesture());
.Build()->NewInstance(); return dict.GetHandle();
} }
}; };
@ -123,6 +123,10 @@ namespace api {
namespace { namespace {
// The wrapSession funtion which is implemented in JavaScript
using WrapSessionCallback = base::Callback<void(v8::Local<v8::Value>)>;
WrapSessionCallback g_wrap_session;
class ResolveProxyHelper { class ResolveProxyHelper {
public: public:
ResolveProxyHelper(AtomBrowserContext* browser_context, ResolveProxyHelper(AtomBrowserContext* browser_context,
@ -321,9 +325,33 @@ mate::Handle<Session> Session::CreateFrom(
if (existing) if (existing)
return mate::CreateHandle(isolate, static_cast<Session*>(existing)); return mate::CreateHandle(isolate, static_cast<Session*>(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 api
} // namespace atom } // namespace atom
namespace {
void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
v8::Local<v8::Context> 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)

View file

@ -1,10 +1,15 @@
EventEmitter = require('events').EventEmitter EventEmitter = require('events').EventEmitter
bindings = process.atomBinding 'app' bindings = process.atomBinding 'app'
sessionBindings = process.atomBinding 'session'
app = bindings.app app = bindings.app
app.__proto__ = EventEmitter.prototype app.__proto__ = EventEmitter.prototype
wrapSession = (session) ->
# session is an Event Emitter.
session.__proto__ = EventEmitter.prototype
app.setApplicationMenu = (menu) -> app.setApplicationMenu = (menu) ->
require('menu').setApplicationMenu menu require('menu').setApplicationMenu menu
@ -32,10 +37,8 @@ app.setAppPath = (path) ->
app.getAppPath = -> app.getAppPath = ->
appPath appPath
app.once 'ready', -> # Be compatible with old API.
app.defaultSession.__proto__ = EventEmitter.prototype app.once 'ready', -> @emit 'finish-launching'
# Be compatible with old API.
@emit 'finish-launching'
app.terminate = app.quit app.terminate = app.quit
app.exit = process.exit app.exit = process.exit
app.getHomeDir = -> @getPath 'home' app.getHomeDir = -> @getPath 'home'
@ -43,5 +46,9 @@ app.getDataPath = -> @getPath 'userData'
app.setDataPath = (path) -> @setPath 'userData', path app.setDataPath = (path) -> @setPath 'userData', path
app.resolveProxy = -> @defaultSession.resolveProxy.apply @defaultSession, arguments app.resolveProxy = -> @defaultSession.resolveProxy.apply @defaultSession, arguments
# Session wrapper.
sessionBindings._setWrapSession wrapSession
process.once 'exit', sessionBindings._clearWrapSession
# Only one App object pemitted. # Only one App object pemitted.
module.exports = app module.exports = app

View file

@ -40,6 +40,7 @@ REFERENCE_MODULE(atom_browser_power_monitor);
REFERENCE_MODULE(atom_browser_power_save_blocker); REFERENCE_MODULE(atom_browser_power_save_blocker);
REFERENCE_MODULE(atom_browser_protocol); REFERENCE_MODULE(atom_browser_protocol);
REFERENCE_MODULE(atom_browser_global_shortcut); REFERENCE_MODULE(atom_browser_global_shortcut);
REFERENCE_MODULE(atom_browser_session);
REFERENCE_MODULE(atom_browser_tray); REFERENCE_MODULE(atom_browser_tray);
REFERENCE_MODULE(atom_browser_web_contents); REFERENCE_MODULE(atom_browser_web_contents);
REFERENCE_MODULE(atom_browser_web_view_manager); REFERENCE_MODULE(atom_browser_web_view_manager);

View file

@ -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 [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 [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);
});
});
```

View file

@ -13,6 +13,30 @@ win.loadUrl("http://github.com");
var session = win.webContents.session 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 ## Methods
The `session` object has the following methods: The `session` object has the following methods: