Merge pull request #65 from atom/custom-protocol
Support custom protocols
This commit is contained in:
commit
3b7dd85d3f
25 changed files with 1184 additions and 24 deletions
|
@ -16,7 +16,14 @@ describe 'ipc', ->
|
|||
a = remote.require path.join(fixtures, 'module', 'id.js')
|
||||
assert.equal a.id, 1127
|
||||
|
||||
describe 'remote object', ->
|
||||
describe 'remote.createFunctionWithReturnValue', ->
|
||||
it 'should be called in browser synchronously', ->
|
||||
buf = new Buffer('test')
|
||||
call = remote.require path.join(fixtures, 'module', 'call.js')
|
||||
result = call.call remote.createFunctionWithReturnValue(buf)
|
||||
assert.equal result.constructor.name, 'Buffer'
|
||||
|
||||
describe 'remote object in renderer', ->
|
||||
it 'can change its properties', ->
|
||||
property = remote.require path.join(fixtures, 'module', 'property.js')
|
||||
assert.equal property.property, 1127
|
||||
|
@ -28,6 +35,17 @@ describe 'ipc', ->
|
|||
# Restore.
|
||||
property.property = 1127
|
||||
|
||||
it 'can construct an object from its member', ->
|
||||
call = remote.require path.join(fixtures, 'module', 'call.js')
|
||||
obj = new call.constructor
|
||||
assert.equal obj.test, 'test'
|
||||
|
||||
describe 'remote value in browser', ->
|
||||
it 'keeps its constructor name for objects', ->
|
||||
buf = new Buffer('test')
|
||||
print_name = remote.require path.join(fixtures, 'module', 'print_name.js')
|
||||
assert.equal print_name.print(buf), 'Buffer'
|
||||
|
||||
describe 'ipc.send', ->
|
||||
it 'should work when sending an object containing id property', (done) ->
|
||||
obj = id: 1, name: 'ly'
|
||||
|
|
132
spec/api/protocol.coffee
Normal file
132
spec/api/protocol.coffee
Normal file
|
@ -0,0 +1,132 @@
|
|||
assert = require 'assert'
|
||||
ipc = require 'ipc'
|
||||
remote = require 'remote'
|
||||
protocol = remote.require 'protocol'
|
||||
|
||||
describe 'protocol API', ->
|
||||
describe 'protocol.registerProtocol', ->
|
||||
it 'throws error when scheme is already registered', (done) ->
|
||||
register = -> protocol.registerProtocol('test1', ->)
|
||||
protocol.once 'registered', (scheme) ->
|
||||
assert.equal scheme, 'test1'
|
||||
assert.throws register, /The scheme is already registered/
|
||||
protocol.unregisterProtocol 'test1'
|
||||
done()
|
||||
register()
|
||||
|
||||
it 'calls the callback when scheme is visited', (done) ->
|
||||
protocol.registerProtocol 'test2', (request) ->
|
||||
assert.equal request.url, 'test2://test2'
|
||||
assert.equal request.referrer, window.location.toString()
|
||||
protocol.unregisterProtocol 'test2'
|
||||
done()
|
||||
$.get 'test2://test2', ->
|
||||
|
||||
describe 'protocol.unregisterProtocol', ->
|
||||
it 'throws error when scheme does not exist', ->
|
||||
unregister = -> protocol.unregisterProtocol 'test3'
|
||||
assert.throws unregister, /The scheme has not been registered/
|
||||
|
||||
describe 'registered protocol callback', ->
|
||||
it 'returns string should send the string as request content', (done) ->
|
||||
handler = remote.createFunctionWithReturnValue 'valar morghulis'
|
||||
protocol.registerProtocol 'atom-string', handler
|
||||
|
||||
$.ajax
|
||||
url: 'atom-string://fake-host'
|
||||
success: (data) ->
|
||||
assert.equal data, handler()
|
||||
protocol.unregisterProtocol 'atom-string'
|
||||
done()
|
||||
error: (xhr, errorType, error) ->
|
||||
assert false, 'Got error: ' + errorType + ' ' + error
|
||||
protocol.unregisterProtocol 'atom-string'
|
||||
|
||||
it 'returns RequestStringJob should send string', (done) ->
|
||||
data = 'valar morghulis'
|
||||
job = new protocol.RequestStringJob(mimeType: 'text/html', data: data)
|
||||
handler = remote.createFunctionWithReturnValue job
|
||||
protocol.registerProtocol 'atom-string-job', handler
|
||||
|
||||
$.ajax
|
||||
url: 'atom-string-job://fake-host'
|
||||
success: (response) ->
|
||||
assert.equal response, data
|
||||
protocol.unregisterProtocol 'atom-string-job'
|
||||
done()
|
||||
error: (xhr, errorType, error) ->
|
||||
assert false, 'Got error: ' + errorType + ' ' + error
|
||||
protocol.unregisterProtocol 'atom-string-job'
|
||||
|
||||
it 'returns RequestFileJob should send file', (done) ->
|
||||
job = new protocol.RequestFileJob(__filename)
|
||||
handler = remote.createFunctionWithReturnValue job
|
||||
protocol.registerProtocol 'atom-file-job', handler
|
||||
|
||||
$.ajax
|
||||
url: 'atom-file-job://' + __filename
|
||||
success: (data) ->
|
||||
content = require('fs').readFileSync __filename
|
||||
assert.equal data, String(content)
|
||||
protocol.unregisterProtocol 'atom-file-job'
|
||||
done()
|
||||
error: (xhr, errorType, error) ->
|
||||
assert false, 'Got error: ' + errorType + ' ' + error
|
||||
protocol.unregisterProtocol 'atom-file-job'
|
||||
|
||||
describe 'protocol.isHandledProtocol', ->
|
||||
it 'returns true if the scheme can be handled', ->
|
||||
assert.equal protocol.isHandledProtocol('file'), true
|
||||
assert.equal protocol.isHandledProtocol('http'), true
|
||||
assert.equal protocol.isHandledProtocol('https'), true
|
||||
assert.equal protocol.isHandledProtocol('atom'), false
|
||||
|
||||
describe 'protocol.interceptProtocol', ->
|
||||
it 'throws error when scheme is not a registered one', ->
|
||||
register = -> protocol.interceptProtocol('test-intercept', ->)
|
||||
assert.throws register, /Cannot intercept procotol/
|
||||
|
||||
it 'throws error when scheme is a custom protocol', (done) ->
|
||||
protocol.once 'unregistered', (scheme) ->
|
||||
assert.equal scheme, 'atom'
|
||||
done()
|
||||
protocol.once 'registered', (scheme) ->
|
||||
assert.equal scheme, 'atom'
|
||||
register = -> protocol.interceptProtocol('test-intercept', ->)
|
||||
assert.throws register, /Cannot intercept procotol/
|
||||
protocol.unregisterProtocol scheme
|
||||
protocol.registerProtocol('atom', ->)
|
||||
|
||||
it 'returns original job when callback returns nothing', (done) ->
|
||||
targetScheme = 'file'
|
||||
protocol.once 'intercepted', (scheme) ->
|
||||
assert.equal scheme, targetScheme
|
||||
free = -> protocol.uninterceptProtocol targetScheme
|
||||
$.ajax
|
||||
url: "#{targetScheme}://#{__filename}",
|
||||
success: ->
|
||||
protocol.once 'unintercepted', (scheme) ->
|
||||
assert.equal scheme, targetScheme
|
||||
done()
|
||||
free()
|
||||
error: (xhr, errorType, error) ->
|
||||
free()
|
||||
assert false, 'Got error: ' + errorType + ' ' + error
|
||||
protocol.interceptProtocol targetScheme, (request) ->
|
||||
assert.equal request.url, "#{targetScheme}://#{__filename}"
|
||||
|
||||
it 'can override original protocol handler', (done) ->
|
||||
handler = remote.createFunctionWithReturnValue 'valar morghulis'
|
||||
protocol.once 'intercepted', ->
|
||||
free = -> protocol.uninterceptProtocol 'file'
|
||||
$.ajax
|
||||
url: 'file://fake-host'
|
||||
success: (data) ->
|
||||
protocol.once 'unintercepted', ->
|
||||
assert.equal data, handler()
|
||||
done()
|
||||
free()
|
||||
error: (xhr, errorType, error) ->
|
||||
assert false, 'Got error: ' + errorType + ' ' + error
|
||||
free()
|
||||
protocol.interceptProtocol 'file', handler
|
7
spec/fixtures/module/call.js
vendored
Normal file
7
spec/fixtures/module/call.js
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
exports.call = function(func) {
|
||||
return func();
|
||||
}
|
||||
|
||||
exports.constructor = function() {
|
||||
this.test = 'test';
|
||||
}
|
3
spec/fixtures/module/print_name.js
vendored
Normal file
3
spec/fixtures/module/print_name.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
exports.print = function(obj) {
|
||||
return obj.constructor.name;
|
||||
}
|
|
@ -1,6 +1,8 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta name="referrer" content="always">
|
||||
<link href="../node_modules/mocha/mocha.css" rel="stylesheet">
|
||||
<script src="jquery-2.0.3.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
@ -24,21 +26,23 @@
|
|||
}
|
||||
|
||||
require('coffee-script'); // Supports .coffee tests.
|
||||
var ipc = require('ipc');
|
||||
|
||||
// Rediret all output to browser.
|
||||
var ipc = require('ipc');
|
||||
global.__defineGetter__('console', function() {
|
||||
return {
|
||||
log: function() {
|
||||
args = Array.prototype.slice.call(arguments);
|
||||
ipc.sendChannel('console.log', args);
|
||||
},
|
||||
error: function() {
|
||||
args = Array.prototype.slice.call(arguments);
|
||||
ipc.sendChannel('console.error', args);
|
||||
},
|
||||
}
|
||||
});
|
||||
if (isCi) {
|
||||
global.__defineGetter__('console', function() {
|
||||
return {
|
||||
log: function() {
|
||||
args = Array.prototype.slice.call(arguments);
|
||||
ipc.sendChannel('console.log', args);
|
||||
},
|
||||
error: function() {
|
||||
args = Array.prototype.slice.call(arguments);
|
||||
ipc.sendChannel('console.error', args);
|
||||
},
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var Mocha = require('mocha');
|
||||
|
||||
|
|
6
spec/jquery-2.0.3.min.js
vendored
Normal file
6
spec/jquery-2.0.3.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
|
@ -22,6 +22,10 @@ ipc.on('process.exit', function(pid, rid, code) {
|
|||
process.exit(code);
|
||||
});
|
||||
|
||||
ipc.on('eval', function(ev, pid, rid, script) {
|
||||
ev.result = eval(script);
|
||||
});
|
||||
|
||||
process.on('uncaughtException', function() {
|
||||
window.openDevTools();
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue