implement wrapSession
This commit is contained in:
parent
aed487ef40
commit
4062ca5f68
5 changed files with 71 additions and 43 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue