web-console-rails3 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.markdown +1 -1
- data/Rakefile +1 -1
- data/app/assets/javascripts/web_console/application.js +0 -1
- data/app/assets/javascripts/web_console/console_sessions.js +177 -3
- data/app/assets/stylesheets/web_console/application.css +0 -1
- data/app/assets/stylesheets/web_console/console_sessions.css.erb +6 -0
- data/app/controllers/web_console/application_controller.rb +1 -6
- data/app/views/web_console/console_sessions/index.html.erb +11 -5
- data/lib/{web_console/backport/active_model.rb → active_model/model.rb} +0 -0
- data/lib/assets/javascripts/web_console.js +22 -183
- data/lib/web_console.rb +1 -9
- data/lib/web_console/colors.rb +86 -0
- data/lib/web_console/colors/light.rb +24 -0
- data/lib/web_console/colors/solarized.rb +47 -0
- data/lib/web_console/colors/tango.rb +24 -0
- data/lib/web_console/colors/xterm.rb +24 -0
- data/lib/web_console/engine.rb +34 -12
- data/lib/web_console/engine.rb.orig +75 -0
- data/lib/web_console/slave.rb +19 -1
- data/lib/web_console/version.rb +1 -1
- data/test/dummy/config/application.rb +13 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/log/development.log +275 -29309
- data/test/dummy/log/test.log +16 -2337
- data/test/dummy/tmp/cache/assets/C3D/0C0/sprockets%2Fb01666017530b122ba58894b59b1551b +0 -0
- data/test/dummy/tmp/cache/assets/C5D/870/sprockets%2F9695d21699b362bcc13260e71b679474 +0 -0
- data/test/dummy/tmp/cache/assets/C79/7C0/sprockets%2F831cb415f919c0a15d95e148020953f2 +0 -0
- data/test/dummy/tmp/cache/assets/CB7/870/sprockets%2F5358761e3329e2a4655ee7c0fd2609b5 +0 -0
- data/test/dummy/tmp/cache/assets/CD0/9A0/sprockets%2F61b95b7833a131f56a2096a3d2ba0c94 +0 -0
- data/test/dummy/tmp/cache/assets/CDA/480/sprockets%2F26eb073018913d788d2ee3f5151eea04 +0 -0
- data/test/dummy/tmp/cache/assets/CE1/850/sprockets%2Fb962434bbb22f17db956b8091c975f30 +0 -0
- data/test/dummy/tmp/cache/assets/D0C/EE0/sprockets%2F3fdf5762c392175ad2cba21454e5b972 +0 -0
- data/test/dummy/tmp/cache/assets/D42/180/sprockets%2F4af57a79abba3d4790ba1e7157f41939 +0 -0
- data/test/dummy/tmp/cache/assets/D54/E60/sprockets%2F8abf0788cb7dc878ea82239456149bed +0 -0
- data/test/dummy/tmp/cache/assets/D5F/7E0/sprockets%2F26c1c2c6ba96ba84abf150e402d677c3 +0 -0
- data/test/dummy/tmp/cache/assets/D66/680/sprockets%2Fe0ba18d897f0c45f5e66b003c5ebd061 +0 -0
- data/test/dummy/tmp/cache/assets/D66/AE0/sprockets%2F25c91de251a8ab43652dc2ef55e2a29d +0 -0
- data/test/dummy/tmp/cache/assets/DA7/470/sprockets%2F65bb61bf1edac19c0666e89b667d23ff +0 -0
- data/test/dummy/tmp/cache/assets/DA9/F60/sprockets%2Fa95e444e8dca0e1a586dcef972b623f7 +0 -0
- data/test/dummy/tmp/cache/assets/DAC/A90/sprockets%2F2015f79881b518e9cdcdaf8dfb3e46c5 +0 -0
- data/test/web_console/colors_test.rb +58 -0
- data/vendor/assets/javascripts/term.js +5726 -0
- metadata +110 -117
- data/app/assets/stylesheets/web_console/console_sessions.css +0 -0
- data/test/dummy/config/application.rb.orig +0 -58
- data/test/dummy/tmp/cache/assets/C9E/AD0/sprockets%2F4a42d8916f3fa47867445f696497a92c +0 -0
- data/test/dummy/tmp/cache/assets/CA7/D70/sprockets%2F3e9e32bbc8c81a93002555265a36a852 +0 -0
- data/test/dummy/tmp/cache/assets/CBD/6E0/sprockets%2F3293dfc0984076f0e8371a9e7640f4a8 +0 -0
- data/test/dummy/tmp/cache/assets/CD0/FC0/sprockets%2Fbb2777627d42a216f3d9ced4322040b3 +0 -0
- data/test/dummy/tmp/cache/assets/CFA/E30/sprockets%2F35be1d26565dc0310c29f1a5e2f62f10 +0 -0
- data/test/dummy/tmp/cache/assets/D1D/FD0/sprockets%2Fa4a5ffe670666ce3d8d59179905201ef +0 -0
- data/test/dummy/tmp/cache/assets/D21/6B0/sprockets%2F9e242803fe56d6305274ff7e6487deda +0 -0
- data/test/dummy/tmp/cache/assets/D22/980/sprockets%2Fce6aa94ad2bc107104c0540f62c5128c +0 -0
- data/test/dummy/tmp/cache/assets/D29/380/sprockets%2F92f1a0450bc4bea3364a07be42b4f645 +0 -0
- data/test/dummy/tmp/cache/assets/D3E/380/sprockets%2F434d98c8380bb9daf43810155aaf68ba +0 -0
- data/test/dummy/tmp/cache/assets/D66/940/sprockets%2F6151175b6ad4f9bab0c7e2b508e7b70f +0 -0
- data/test/dummy/tmp/cache/assets/D69/670/sprockets%2Fc6b4a05846fd1b98fe9252ecdd1601c0 +0 -0
- data/test/dummy/tmp/cache/assets/D69/710/sprockets%2Ff67078d4b979a58c97feede196f6b385 +0 -0
- data/test/dummy/tmp/cache/assets/D90/B30/sprockets%2Fe03fe93eb7fe888c9d21ee62816596ff +0 -0
- data/test/dummy/tmp/cache/assets/D95/C40/sprockets%2F09cb0a274209abf0391cbfce6ee67b82 +0 -0
- data/test/dummy/tmp/cache/assets/D9B/A30/sprockets%2Fc3436b3fe5da7c2456f26e2ae36da6c5 +0 -0
- data/test/dummy/tmp/cache/assets/D9F/400/sprockets%2F7f60332f86073dc8ed80b4c2a9dfcbe1 +0 -0
- data/test/dummy/tmp/cache/assets/DAE/8C0/sprockets%2Fa9b8f7bc5ca2efe658a13d7f4609c729 +0 -0
- data/test/dummy/tmp/cache/assets/DB3/0C0/sprockets%2F689fb998e2a7add3e00db88df254c87a +0 -0
- data/test/dummy/tmp/cache/assets/DD4/440/sprockets%2Fa33d646ac00d8bc87a4a496af6eed96f +0 -0
- data/test/dummy/tmp/cache/assets/DDB/890/sprockets%2F5ed566ca9fafd1b82373ffea2a8d8681 +0 -0
- data/test/dummy/tmp/cache/assets/E5A/C40/sprockets%2F164cfa0fd9eb1ec1acdfaa278c83e9c5 +0 -0
- data/vendor/assets/javascripts/vt100.js +0 -4408
- data/vendor/assets/stylesheets/vt100.css +0 -272
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: dbc0a729da56cc72ec280e4c61dff38133b54626
|
|
4
|
+
data.tar.gz: 3a3879f62b9fe309ce47a160d9d978ebc7c184d5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9f6d3fcc41bcb977ea4a45e5c1d8efa71d4c6af467c3f6b16105f2a6e8d69ce1fa3db0a72fe384b3811ed5c06ae7ea805e0f6722df3f28ae32938fc7211fe4a1
|
|
7
|
+
data.tar.gz: 94dcde582093e9ea37ef3999949acdb6a683122063fec5b97c3476de66dd8c32bfe5d94c973dae82a8881cad940b66a514119807d664f70265205eeb61850f4f
|
data/README.markdown
CHANGED
data/Rakefile
CHANGED
|
@@ -25,7 +25,7 @@ Bundler::GemHelper.install_tasks if defined? Bundler::GemHelper
|
|
|
25
25
|
namespace :docker do
|
|
26
26
|
task :sync do
|
|
27
27
|
Dir.chdir(EXPANDED_CWD) do
|
|
28
|
-
sh
|
|
28
|
+
sh 'git fetch && git reset --hard origin/master', verbose: false
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
|
@@ -1,3 +1,177 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
//= require web-console
|
|
2
|
+
|
|
3
|
+
var AJAXTransport = (function(WebConsole) {
|
|
4
|
+
|
|
5
|
+
var inherits = WebConsole.inherits;
|
|
6
|
+
var EventEmitter = WebConsole.EventEmitter;
|
|
7
|
+
|
|
8
|
+
// Use an IE friendly implementation of XMLHttpRequest.
|
|
9
|
+
XHR = (function() {
|
|
10
|
+
try {
|
|
11
|
+
return XMLHttpRequest;
|
|
12
|
+
} catch (e) {
|
|
13
|
+
return function() {
|
|
14
|
+
return new ActiveXObject('Microsoft.XMLHTTP');
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}).call(this);
|
|
18
|
+
|
|
19
|
+
var AJAXTransport = function(options) {
|
|
20
|
+
EventEmitter.call(this);
|
|
21
|
+
options || (options = {});
|
|
22
|
+
|
|
23
|
+
this.url = (typeof options.url === 'string') ? {
|
|
24
|
+
input: options.url,
|
|
25
|
+
pendingOutput: options.url,
|
|
26
|
+
configuration: options.url
|
|
27
|
+
} : options.url;
|
|
28
|
+
|
|
29
|
+
this.pendingInput = '';
|
|
30
|
+
|
|
31
|
+
this.on('input', this.sendInput);
|
|
32
|
+
this.on('configuration', this.sendConfiguration);
|
|
33
|
+
this.once('initialization', function(cols, rows) {
|
|
34
|
+
this.emit('configuration', cols, rows);
|
|
35
|
+
this.pollForPendingOutput();
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
inherits(AJAXTransport, EventEmitter);
|
|
40
|
+
|
|
41
|
+
// Shorthand for creating XHR requests.
|
|
42
|
+
AJAXTransport.prototype.createRequest = function(method, url, options) {
|
|
43
|
+
options || (options = {});
|
|
44
|
+
|
|
45
|
+
var request = new XHR();
|
|
46
|
+
request.open(method, url);
|
|
47
|
+
|
|
48
|
+
if (typeof options.form === 'object') {
|
|
49
|
+
var content = [], form = options.form;
|
|
50
|
+
|
|
51
|
+
for (var key in form) {
|
|
52
|
+
var value = form[key];
|
|
53
|
+
content.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
var formMimeType = 'application/x-www-form-urlencoded; charset=utf-8';
|
|
57
|
+
request.setRequestHeader('Content-Type', formMimeType);
|
|
58
|
+
request.data = content.join('&');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return request;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
AJAXTransport.prototype.pollForPendingOutput = function() {
|
|
65
|
+
var request = this.createRequest('GET', this.url.pendingOutput);
|
|
66
|
+
|
|
67
|
+
var self = this;
|
|
68
|
+
request.onreadystatechange = function() {
|
|
69
|
+
if (request.readyState === 4) {
|
|
70
|
+
if (request.status === 200) {
|
|
71
|
+
self.emit('pendingOutput', request.responseText);
|
|
72
|
+
self.pollForPendingOutput();
|
|
73
|
+
} else {
|
|
74
|
+
self.emit('disconnect', request);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
request.send(null);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// Send the input to the server.
|
|
83
|
+
//
|
|
84
|
+
// Each key press is encoded to an intermediate format, before it is sent to
|
|
85
|
+
// the server.
|
|
86
|
+
//
|
|
87
|
+
// WebConsole#keysPressed is an alias for WebConsole#sendInput.
|
|
88
|
+
AJAXTransport.prototype.sendInput = function(input) {
|
|
89
|
+
input || (input = '');
|
|
90
|
+
|
|
91
|
+
if (this.disconnected) return;
|
|
92
|
+
if (this.sendingInput) return this.pendingInput += input;
|
|
93
|
+
|
|
94
|
+
// Indicate that we are starting to send input.
|
|
95
|
+
this.sendingInput = true;
|
|
96
|
+
|
|
97
|
+
var request = this.createRequest('PUT', this.url.input, {
|
|
98
|
+
form: { input: this.pendingInput + input }
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Clear the pending input.
|
|
102
|
+
this.pendingInput = '';
|
|
103
|
+
|
|
104
|
+
var self = this;
|
|
105
|
+
request.onreadystatechange = function() {
|
|
106
|
+
if (request.readyState === 4) {
|
|
107
|
+
self.sendingInput = false;
|
|
108
|
+
if (self.pendingInput) self.sendInput();
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
request.send(request.data);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// Send the terminal configuration to the server.
|
|
116
|
+
//
|
|
117
|
+
// Right now by configuration, we understand the terminal widht and terminal
|
|
118
|
+
// height.
|
|
119
|
+
//
|
|
120
|
+
// WebConsole#resized is an alias for WebConsole#sendconfiguration.
|
|
121
|
+
AJAXTransport.prototype.sendConfiguration = function(cols, rows) {
|
|
122
|
+
if (this.disconnected) return;
|
|
123
|
+
|
|
124
|
+
var request = this.createRequest('PUT', this.url.configuration, {
|
|
125
|
+
form: { width: cols, height: rows }
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// Just send the configuration and don't care about any output.
|
|
129
|
+
request.send(request.data);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
return AJAXTransport;
|
|
133
|
+
|
|
134
|
+
}).call(this, WebConsole);
|
|
135
|
+
|
|
136
|
+
window.addEventListener('load', function() {
|
|
137
|
+
var geometry = calculateFitScreenGeometry();
|
|
138
|
+
config.terminal.cols = geometry[0];
|
|
139
|
+
config.terminal.rows = geometry[1];
|
|
140
|
+
|
|
141
|
+
var terminal = window.terminal = new WebConsole.Terminal(config.terminal);
|
|
142
|
+
|
|
143
|
+
terminal.on('data', function(data) {
|
|
144
|
+
transport.emit('input', data);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
var transport = new AJAXTransport(config.transport);
|
|
148
|
+
|
|
149
|
+
transport.on('pendingOutput', function(response) {
|
|
150
|
+
var json = JSON.parse(response);
|
|
151
|
+
if (json.output) terminal.write(json.output);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
transport.on('disconnect', function() {
|
|
155
|
+
terminal.destroy();
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
transport.emit('initialization', terminal.cols, terminal.rows);
|
|
159
|
+
|
|
160
|
+
// Utilities
|
|
161
|
+
// ---------
|
|
162
|
+
|
|
163
|
+
function calculateFitScreenGeometry() {
|
|
164
|
+
// Currently, resizing term.js is broken. E.g. opening vi causes it to go
|
|
165
|
+
// back to 80x24 and fail with off-by-one error. Other stuff, like chip8
|
|
166
|
+
// are rendered incorrectly and so on.
|
|
167
|
+
//
|
|
168
|
+
// To work around it, create a temporary terminal, just so we can get the
|
|
169
|
+
// best dimensions for the screen.
|
|
170
|
+
var temporary = new WebConsole.Terminal;
|
|
171
|
+
try {
|
|
172
|
+
return temporary.fitScreen();
|
|
173
|
+
} finally {
|
|
174
|
+
temporary.destroy();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<% WebConsole.config.style.instance_eval do %>
|
|
2
|
+
body { color: <%= colors.foreground %>; background: <%= colors.background %>; margin: 0; padding: 0; }
|
|
3
|
+
|
|
4
|
+
.terminal { float: left; overflow: hidden; font: <%= font %>; }
|
|
5
|
+
.terminal-cursor { color: <%= colors.background %>; background: <%= colors.foreground %>; }
|
|
6
|
+
<% end %>
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
module WebConsole
|
|
2
2
|
class ApplicationController < ActionController::Base
|
|
3
|
-
|
|
4
|
-
# Alias before_filter to before_action for Rails 3 compatibility.
|
|
5
|
-
alias :before_action :before_filter unless defined?(before_filter)
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
before_action :prevent_unauthorized_requests!
|
|
3
|
+
before_filter :prevent_unauthorized_requests!
|
|
9
4
|
|
|
10
5
|
private
|
|
11
6
|
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
var config = {
|
|
3
|
+
terminal: {
|
|
4
|
+
colors: <%= raw WebConsole.config.style.colors.to_json %>
|
|
5
|
+
},
|
|
6
|
+
|
|
7
|
+
transport: {
|
|
8
|
+
url: {
|
|
9
|
+
input: "<%= web_console.input_console_session_path(@console_session) %>",
|
|
10
|
+
pendingOutput: "<%= web_console.pending_output_console_session_path(@console_session) %>",
|
|
11
|
+
configuration: "<%= web_console.configuration_console_session_path(@console_session) %>"
|
|
12
|
+
}
|
|
7
13
|
}
|
|
8
14
|
};
|
|
9
15
|
</script>
|
|
File without changes
|
|
@@ -1,202 +1,41 @@
|
|
|
1
|
-
//= require
|
|
1
|
+
//= require term
|
|
2
2
|
|
|
3
|
-
(function() {
|
|
4
|
-
|
|
5
|
-
// Store utilities in an underscore-like object.
|
|
6
|
-
var _ = {
|
|
7
|
-
// Simple prototypical inheritence helper.
|
|
8
|
-
//
|
|
9
|
-
// Forces `cls` to inherit from `base` prototype.
|
|
10
|
-
inherits: function(cls, base) {
|
|
11
|
-
var constructor = _.noop();
|
|
12
|
-
constructor.prototype = base.prototype;
|
|
13
|
-
cls.prototype = new constructor();
|
|
14
|
-
cls.prototype.constructor = cls;
|
|
15
|
-
},
|
|
16
|
-
|
|
17
|
-
// Factory for empty functions.
|
|
18
|
-
noop: function() {
|
|
19
|
-
return function() {};
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
// Binds a function to an explicit context.
|
|
23
|
-
bind: Function.prototype.bind ? function(func, context) {
|
|
24
|
-
return func.bind(context);
|
|
25
|
-
} : function(func, context) {
|
|
26
|
-
return function() {
|
|
27
|
-
return func.apply(context, arguments);
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
};
|
|
3
|
+
;(function(BaseTerminal) {
|
|
31
4
|
|
|
32
5
|
// Expose the main WebConsole namespace.
|
|
33
6
|
var WebConsole = this.WebConsole = {};
|
|
34
7
|
|
|
35
|
-
//
|
|
36
|
-
WebConsole.
|
|
37
|
-
|
|
38
|
-
return XMLHttpRequest;
|
|
39
|
-
} catch (e) {
|
|
40
|
-
var constructor = function() {
|
|
41
|
-
return new ActiveXObject('Microsoft.XMLHTTP');
|
|
42
|
-
};
|
|
8
|
+
// Follow term.js example and expose inherits and EventEmitter.
|
|
9
|
+
var inherits = WebConsole.inherits = BaseTerminal.inherits;
|
|
10
|
+
var EventEmitter = WebConsole.EventEmitter = BaseTerminal.EventEmitter;
|
|
43
11
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
constructor.HEADERS_RECEIVED = 2;
|
|
48
|
-
constructor.LOADING = 3;
|
|
49
|
-
constructor.DONE = 3;
|
|
50
|
-
return constructor;
|
|
12
|
+
var Terminal = WebConsole.Terminal = function(options) {
|
|
13
|
+
if (typeof options === 'number') {
|
|
14
|
+
return BaseTerminal.apply(this, arguments);
|
|
51
15
|
}
|
|
52
|
-
}).call(this);
|
|
53
|
-
|
|
54
|
-
WebConsole.Terminal = function(options) {
|
|
55
|
-
options || (options = {});
|
|
56
|
-
|
|
57
|
-
if (typeof options.url === 'string') {
|
|
58
|
-
this.url = {
|
|
59
|
-
input: options.url,
|
|
60
|
-
pendingOutput: options.url,
|
|
61
|
-
configuration: options.url
|
|
62
|
-
};
|
|
63
|
-
} else {
|
|
64
|
-
this.url = options.url;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
this.disableAudio = true;
|
|
68
16
|
|
|
69
|
-
|
|
17
|
+
BaseTerminal.call(this, options || (options = {}));
|
|
70
18
|
|
|
71
|
-
this.
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
// Inherit from VT100.
|
|
75
|
-
_.inherits(WebConsole.Terminal, VT100);
|
|
76
|
-
|
|
77
|
-
// Try to be minimalistic and disable the context menu.
|
|
78
|
-
WebConsole.Terminal.prototype.showContextMenu = _.noop();
|
|
79
|
-
|
|
80
|
-
// Don't show the current size on resize.
|
|
81
|
-
WebConsole.Terminal.prototype.showCurrentSize = _.noop();
|
|
82
|
-
|
|
83
|
-
// Shorthand for creating XHR requests.
|
|
84
|
-
WebConsole.Terminal.prototype.createRequest = function(method, url, options) {
|
|
85
|
-
options || (options = {});
|
|
19
|
+
this.open();
|
|
86
20
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (typeof options.form === 'object') {
|
|
91
|
-
var content = [], form = options.form;
|
|
92
|
-
|
|
93
|
-
for (var key in form) {
|
|
94
|
-
var value = form[key];
|
|
95
|
-
content.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
var formMimeType = 'application/x-www-form-urlencoded; charset=utf-8';
|
|
99
|
-
request.setRequestHeader('Content-Type', formMimeType);
|
|
100
|
-
request.data = content.join('&');
|
|
21
|
+
if (!(options.rows || options.cols) || !options.geometry) {
|
|
22
|
+
this.fitScreen();
|
|
101
23
|
}
|
|
102
|
-
|
|
103
|
-
return request;
|
|
104
24
|
};
|
|
105
25
|
|
|
106
|
-
WebConsole.Terminal
|
|
107
|
-
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
WebConsole.Terminal.prototype.feedPendingInput = function(input) {
|
|
111
|
-
(this.pendingInput === void 0) && (this.pendingInput = '');
|
|
112
|
-
this.pendingInput += input;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
WebConsole.Terminal.prototype.requestPendingOutput = function() {
|
|
116
|
-
var request = this.createRequest('GET', this.url.pendingOutput);
|
|
117
|
-
|
|
118
|
-
request.onreadystatechange = _.bind(function() {
|
|
119
|
-
var response;
|
|
120
|
-
|
|
121
|
-
if (request.readyState === WebConsole.XHR.DONE) {
|
|
122
|
-
if (request.status === 200) {
|
|
123
|
-
response = JSON.parse(request.responseText);
|
|
124
|
-
if (response.output) {
|
|
125
|
-
this.vt100(unescape(encodeURIComponent(response.output)));
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
this.requestPendingOutput();
|
|
129
|
-
} else {
|
|
130
|
-
try {
|
|
131
|
-
// Try to parse the error if it is a JSON.
|
|
132
|
-
response = JSON.parse(request.responseText);
|
|
133
|
-
} catch(e) {
|
|
134
|
-
// No luck with that, but it's not a big deal.
|
|
135
|
-
}
|
|
136
|
-
this.disconnect(response && response.error);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}, this);
|
|
140
|
-
|
|
141
|
-
request.send(null);
|
|
142
|
-
};
|
|
26
|
+
// Make WebConsole.Terminal inherit from BaseTerminal (term.js).
|
|
27
|
+
inherits(Terminal, BaseTerminal);
|
|
143
28
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
// the server.
|
|
148
|
-
//
|
|
149
|
-
// WebConsole#keysPressed is an alias for WebConsole#sendInput.
|
|
150
|
-
WebConsole.Terminal.prototype.sendInput =
|
|
151
|
-
WebConsole.Terminal.prototype.keysPressed = function(input) {
|
|
152
|
-
input || (input = '');
|
|
29
|
+
Terminal.prototype.fitScreen = function() {
|
|
30
|
+
var width = Math.floor(this.element.clientWidth / this.cols);
|
|
31
|
+
var height = Math.floor(this.element.clientHeight / this.rows);
|
|
153
32
|
|
|
154
|
-
|
|
155
|
-
|
|
33
|
+
var rows = Math.floor(window.innerHeight / height);
|
|
34
|
+
var cols = Math.floor(this.parent.clientWidth / width);
|
|
156
35
|
|
|
157
|
-
|
|
158
|
-
this.sendingInput = true;
|
|
159
|
-
|
|
160
|
-
var request = this.createRequest('PUT', this.url.input, {
|
|
161
|
-
form: { input: (this.pendingInput || '') + input }
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
// Clear the pending input.
|
|
165
|
-
this.clearPendingInput();
|
|
166
|
-
|
|
167
|
-
request.onreadystatechange = _.bind(function() {
|
|
168
|
-
if (request.readyState === WebConsole.XHR.DONE) {
|
|
169
|
-
this.sendingInput = false;
|
|
170
|
-
if (this.pendingInput) this.sendInput();
|
|
171
|
-
}
|
|
172
|
-
}, this);
|
|
173
|
-
|
|
174
|
-
request.send(request.data);
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
// Send the terminal configuration to the server.
|
|
178
|
-
//
|
|
179
|
-
// Right now by configuration, we understand the terminal widht and terminal
|
|
180
|
-
// height.
|
|
181
|
-
//
|
|
182
|
-
// WebConsole#resized is an alias for WebConsole#sendconfiguration.
|
|
183
|
-
WebConsole.Terminal.prototype.sendConfiguration =
|
|
184
|
-
WebConsole.Terminal.prototype.resized = function() {
|
|
185
|
-
if (this.disconnected) return;
|
|
186
|
-
|
|
187
|
-
var request = this.createRequest('PUT', this.url.configuration, {
|
|
188
|
-
form: { width: this.terminalWidth, height: this.terminalHeight }
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
// Just send the configuration and don't care about any output.
|
|
192
|
-
request.send(request.data);
|
|
193
|
-
};
|
|
36
|
+
this.resize(cols, rows);
|
|
194
37
|
|
|
195
|
-
|
|
196
|
-
WebConsole.Terminal.prototype.disconnect = function(message) {
|
|
197
|
-
this.disconnected = true;
|
|
198
|
-
if (this.cursorX > 0) this.vt100('\r\n');
|
|
199
|
-
this.vt100(message || 'Disconnected');
|
|
38
|
+
return [cols, rows];
|
|
200
39
|
};
|
|
201
40
|
|
|
202
|
-
}).call(this);
|
|
41
|
+
}).call(this, Terminal);
|