web-console-rails3 0.3.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- 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);
|