web-console 3.6.2 → 3.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f09465d00b163545199aecc34e9f36d967cbfbeede260077e185a535a90c0640
4
- data.tar.gz: 84b14845dd1dcce1fcbb644d64a5b3aca5532c8fae0a8b6062d73bce5c5cb7af
3
+ metadata.gz: 1e0540ac7a81a49deaad0b10cd764ca4d02ca2e9a630ef6d775051dec6e5ef55
4
+ data.tar.gz: 80352b0d87ea7718cd08597c159d67edbafb2e5f9e46f674f48d1011a7118fc1
5
5
  SHA512:
6
- metadata.gz: f746e8ce11d5da555297a72a3015bbe73d5f5e2133162fbee9da4e42127f3dd8aced4f80f5f1decfd20e14266a999b626a29d94e213fc114b8735dbd66e15de2
7
- data.tar.gz: 2060ce124965f5daee3a3f46f3827842bd3efd3996a71a16a82071b0c85b064051619ba69c1f916c7b70d657b29cd94c2e00ce9253ba32da367f98f0bd57e811
6
+ metadata.gz: e954cedb636a015d9cb86ddc60e4e97e44f61df6d7eaac89144c2b7b39207883117186c81420d2e90719f42d9acc6d397842f6750600b04681db47093c4e506a
7
+ data.tar.gz: c091ef07d8462544f8f8367143a5b1ef8579a901cb1cfd88e463a2a37e3955f8c769f7a3206b2b4da442db27c3743a5e86ce9c69f82a6f954d1301d4e7629055
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## master (unreleased)
4
4
 
5
+ ## 3.7.0
6
+
7
+ * [#263](https://github.com/rails/web-console/pull/263) Show binding changes ([@causztic])
8
+ * [#258](https://github.com/rails/web-console/pull/258) Support Ctrl-A, Ctrl-W and Ctrl-U ([@gsamokovarov])
9
+ * [#257](https://github.com/rails/web-console/pull/257) Always try to keep the console underneath the website content ([@gsamokovarov])
10
+
5
11
  ## 3.6.2
6
12
 
7
13
  * [#255](https://github.com/rails/web-console/pull/255) Fix the truncated HTML body, because of wrong Content-Length header ([@timomeh])
@@ -131,3 +137,4 @@ go to 3.1.0 instead.
131
137
  [@ybart]: https://github.com/ybart
132
138
  [@fl0l0u]: https://github.com/fl0l0u
133
139
  [@timomeh]: https://github.com/timomeh
140
+ [@causztic]: https://github.com/causztic
@@ -94,7 +94,7 @@ messages like the following is printed in the server logs:
94
94
  > Cannot render console from 192.168.1.133! Allowed networks:
95
95
  > 127.0.0.0/127.255.255.255, ::1
96
96
 
97
- If you don't wanna see this message anymore, set this option to `false`:
97
+ If you don't want to see this message anymore, set this option to `false`:
98
98
 
99
99
  ```ruby
100
100
  Rails.application.configure do
@@ -104,7 +104,7 @@ end
104
104
 
105
105
  ### config.web_console.template_paths
106
106
 
107
- If you wanna style the console yourself, you can place `style.css` at a
107
+ If you want to style the console yourself, you can place `style.css` at a
108
108
  directory pointed by `config.web_console.template_paths`:
109
109
 
110
110
  ```ruby
@@ -113,13 +113,13 @@ Rails.application.configure do
113
113
  end
114
114
  ```
115
115
 
116
- You may wanna check the [templates] folder at the source tree for the files you
116
+ You may want to check the [templates] folder at the source tree for the files you
117
117
  may override.
118
118
 
119
119
  ### config.web_console.mount_point
120
120
 
121
121
  Usually the middleware of _Web Console_ is mounted at `/__web_console`.
122
- If you wanna change the path for some reasons, you can specify it
122
+ If you want to change the path for some reasons, you can specify it
123
123
  by `config.web_console.mount_point`:
124
124
 
125
125
  ```ruby
@@ -137,7 +137,7 @@ bundled with _Web Console_.
137
137
 
138
138
  If you miss this feature, check out [rvt].
139
139
 
140
- ### Why I constantly get unavailable session errors?
140
+ ### Why do I constantly get unavailable session errors?
141
141
 
142
142
  All of _Web Console_ sessions are stored in memory. If you happen to run on a
143
143
  multi-process server (like Unicorn) you may get unavailable session errors
@@ -146,12 +146,17 @@ different worker (process) that doesn't have the desired session in memory.
146
146
  To avoid that, if you use such servers in development, configure them so they
147
147
  server requests only out of one process.
148
148
 
149
+ #### Passenger
150
+
151
+ Enable sticky sessions for [Passenger on Nginx] or [Passenger on Apache] to
152
+ prevent unavailable session errors.
153
+
149
154
  ### How to inspect local and instance variables?
150
155
 
151
156
  The interactive console executes Ruby code. Invoking `instance_variables` and
152
157
  `local_variables` will give you what you want.
153
158
 
154
- ### Why does console only appear on error pages but not when I call it?
159
+ ### Why does the console only appear on error pages but not when I call it?
155
160
 
156
161
  This can be happening if you are using `Rack::Deflater`. Be sure that
157
162
  `WebConsole::Middleware` is used after `Rack::Deflater`. The easiest way to do
@@ -163,7 +168,7 @@ Rails.application.configure do
163
168
  end
164
169
  ```
165
170
 
166
- ### Why I'm getting an undefined method `web_console`?
171
+ ### Why am I getting an undefined method `web_console`?
167
172
 
168
173
  Make sure your configuration lives in `config/environments/development.rb`.
169
174
 
@@ -183,3 +188,5 @@ Make sure your configuration lives in `config/environments/development.rb`.
183
188
  [templates]: https://github.com/rails/web-console/tree/master/lib/web_console/templates
184
189
  [rvt]: https://github.com/gsamokovarov/rvt
185
190
  [contributors]: https://github.com/rails/web-console/graphs/contributors
191
+ [Passenger on Nginx]: https://www.phusionpassenger.com/library/config/nginx/reference/#passengerstickysessions
192
+ [Passenger on Apache]: https://www.phusionpassenger.com/library/config/apache/reference/#passengerstickysessions
@@ -603,6 +603,12 @@ REPLConsole.prototype.writeError = function(output) {
603
603
  return consoleMessage;
604
604
  };
605
605
 
606
+ REPLConsole.prototype.writeNotification = function(output) {
607
+ var consoleMessage = this.writeOutput(output);
608
+ addClass(consoleMessage, "notification-message");
609
+ return consoleMessage;
610
+ };
611
+
606
612
  REPLConsole.prototype.onEnterKey = function() {
607
613
  var input = this._input;
608
614
 
@@ -654,57 +660,85 @@ REPLConsole.prototype.onKeyDown = function(ev) {
654
660
  }
655
661
 
656
662
  switch (ev.keyCode) {
657
- case 69:
658
- // Ctrl-E
663
+ case 65: // Ctrl-A
664
+ if (ev.ctrlKey) {
665
+ this.setInput(this._input, 0);
666
+ ev.preventDefault();
667
+ }
668
+ break;
669
+
670
+ case 69: // Ctrl-E
659
671
  if (ev.ctrlKey) {
660
672
  this.onTabKey();
661
673
  ev.preventDefault();
662
674
  }
663
675
  break;
664
- case 9:
665
- // Tab
676
+
677
+ case 87: // Ctrl-W
678
+ if (ev.ctrlKey) {
679
+ this.deleteWord();
680
+ ev.preventDefault();
681
+ }
682
+ break;
683
+
684
+ case 85: // Ctrl-U
685
+ if (ev.ctrlKey) {
686
+ this.deleteLine();
687
+ ev.preventDefault();
688
+ }
689
+ break;
690
+
691
+ case 69: // Ctrl-E
692
+ if (ev.ctrlKey) {
693
+ this.onTabKey();
694
+ ev.preventDefault();
695
+ }
696
+ break;
697
+
698
+ case 80: // Ctrl-P
699
+ if (! ev.ctrlKey) break;
700
+
701
+ case 78: // Ctrl-N
702
+ if (! ev.ctrlKey) break;
703
+
704
+ case 9: // Tab
666
705
  this.onTabKey();
667
706
  ev.preventDefault();
668
707
  break;
669
- case 13:
670
- // Enter key
708
+
709
+ case 13: // Enter key
671
710
  this.onEnterKey();
672
711
  ev.preventDefault();
673
712
  break;
674
- case 80:
675
- // Ctrl-P
676
- if (! ev.ctrlKey) break;
677
- case 38:
678
- // Up arrow
713
+
714
+ case 38: // Up arrow
679
715
  this.onNavigateHistory(-1);
680
716
  ev.preventDefault();
681
717
  break;
682
- case 78:
683
- // Ctrl-N
684
- if (! ev.ctrlKey) break;
685
- case 40:
686
- // Down arrow
718
+
719
+ case 40: // Down arrow
687
720
  this.onNavigateHistory(1);
688
721
  ev.preventDefault();
689
722
  break;
690
- case 37:
691
- // Left arrow
723
+
724
+ case 37: // Left arrow
692
725
  var caretPos = this._caretPos > 0 ? this._caretPos - 1 : this._caretPos;
693
726
  this.setInput(this._input, caretPos);
694
727
  ev.preventDefault();
695
728
  break;
696
- case 39:
697
- // Right arrow
729
+
730
+ case 39: // Right arrow
698
731
  var length = this._input.length;
699
732
  var caretPos = this._caretPos < length ? this._caretPos + 1 : this._caretPos;
700
733
  this.setInput(this._input, caretPos);
701
734
  ev.preventDefault();
702
735
  break;
703
- case 8:
704
- // Delete
736
+
737
+ case 8: // Delete
705
738
  this.deleteAtCurrent();
706
739
  ev.preventDefault();
707
740
  break;
741
+
708
742
  default:
709
743
  break;
710
744
  }
@@ -757,6 +791,47 @@ REPLConsole.prototype.deleteAtCurrent = function() {
757
791
  }
758
792
  };
759
793
 
794
+ /**
795
+ * Deletes the current line.
796
+ */
797
+ REPLConsole.prototype.deleteLine = function() {
798
+ if (this._caretPos > 0) {
799
+ this.setInput("", 0);
800
+
801
+ if (!this._input) {
802
+ this.autocomplete && this.autocomplete.cancel();
803
+ this.autocomplete = false;
804
+ }
805
+ }
806
+ };
807
+
808
+ /**
809
+ * Deletes the current word.
810
+ */
811
+ REPLConsole.prototype.deleteWord = function() {
812
+ if (this._caretPos > 0) {
813
+ var i = 1, current = this._caretPos;
814
+ while (this._input[current - i++] == " ");
815
+
816
+ var deleteIndex = 0;
817
+ for (; current - i > 0; i++) {
818
+ if (this._input[current - i] == " ") {
819
+ deleteIndex = current - i;
820
+ break;
821
+ }
822
+ }
823
+
824
+ var before = this._input.substring(0, deleteIndex);
825
+ var after = this._input.substring(current, this._input.length);
826
+ this.setInput(before + after, deleteIndex);
827
+
828
+ if (!this._input) {
829
+ this.autocomplete && this.autocomplete.cancel();
830
+ this.autocomplete = false;
831
+ }
832
+ }
833
+ };
834
+
760
835
  /**
761
836
  * Insert a character at the current position.
762
837
  */
@@ -795,11 +870,16 @@ REPLConsole.prototype.scrollToBottom = function() {
795
870
  this.outer.scrollTop = this.outer.scrollHeight;
796
871
  };
797
872
 
798
- // Change the binding of the console
873
+ // Change the binding of the console.
799
874
  REPLConsole.prototype.switchBindingTo = function(frameId, callback) {
800
875
  var url = this.getSessionUrl('trace');
801
876
  var params = "frame_id=" + encodeURIComponent(frameId);
802
- postRequest(url, params, callback);
877
+
878
+ var _this = this;
879
+ postRequest(url, params, function() {
880
+ var text = "Context has changed to: " + callback();
881
+ _this.writeNotification(text);
882
+ });
803
883
  };
804
884
 
805
885
  /**
@@ -11,12 +11,9 @@ for (var i = 0; i < traceFrames.length; i++) {
11
11
 
12
12
  // Change the binding of the console.
13
13
  changeBinding(frameId, function() {
14
- if (selectedFrame) {
15
- selectedFrame.className = selectedFrame.className.replace("selected", "");
16
- }
17
-
18
- target.className += " selected";
14
+ // Rails already handles toggling the select class
19
15
  selectedFrame = target;
16
+ return target.innerHTML;
20
17
  });
21
18
 
22
19
  // Change the extracted source code
@@ -24,6 +21,7 @@ for (var i = 0; i < traceFrames.length; i++) {
24
21
  });
25
22
  }
26
23
 
24
+ // Change the binding of the current session and prompt the user.
27
25
  function changeBinding(frameId, callback) {
28
26
  REPLConsole.currentSession.switchBindingTo(frameId, callback);
29
27
  }
@@ -6,3 +6,7 @@
6
6
  <% only_on_error_page do %>
7
7
  <%= render_javascript 'error_page' %>
8
8
  <% end %>
9
+
10
+ <% only_on_regular_page do %>
11
+ <%= render_javascript 'regular_page' %>
12
+ <% end %>
@@ -0,0 +1,24 @@
1
+ // Push the error page body upwards the size of the console.
2
+ document.addEventListener('DOMContentLoaded', function() {
3
+ var consoleElement = document.getElementById('console');
4
+ var resizerElement = consoleElement.getElementsByClassName('resizer')[0];
5
+ var bodyElement = document.body;
6
+
7
+ function setBodyElementBottomMargin(pixels) {
8
+ bodyElement.style.marginBottom = pixels + 'px';
9
+ }
10
+
11
+ var currentConsoleElementHeight = consoleElement.offsetHeight;
12
+ setBodyElementBottomMargin(currentConsoleElementHeight);
13
+
14
+ resizerElement.addEventListener('mousedown', function(event) {
15
+ function recordConsoleElementHeight(event) {
16
+ resizerElement.removeEventListener('mouseup', recordConsoleElementHeight);
17
+
18
+ var currentConsoleElementHeight = consoleElement.offsetHeight;
19
+ setBodyElementBottomMargin(currentConsoleElementHeight);
20
+ }
21
+
22
+ resizerElement.addEventListener('mouseup', recordConsoleElementHeight);
23
+ });
24
+ });
@@ -10,7 +10,8 @@
10
10
  .console .console-inner { font-family: monospace; font-size: 11px; width: 100%; height: 100%; overflow: none; background: #333; }
11
11
  .console .console-prompt-box { color: #FFF; }
12
12
  .console .console-message { color: #1AD027; margin: 0; border: 0; white-space: pre-wrap; background-color: #333; padding: 0; }
13
- .console .console-message.error-message { color: #fc9; }
13
+ .console .console-message.error-message { color: #FC9; }
14
+ .console .console-message.notification-message { color: #99F; }
14
15
  .console .console-message.auto-complete { word-break: break-all; }
15
16
  .console .console-message.auto-complete .keyword { margin-right: 11px; }
16
17
  .console .console-message.auto-complete .keyword.selected { background: #FFF; color: #000; }
@@ -21,8 +22,8 @@
21
22
  .console .resizer { background: #333; width: 100%; height: 4px; cursor: ns-resize; }
22
23
  .console .console-actions { padding-right: 3px; }
23
24
  .console .console-actions .button { float: left; }
24
- .console .button { cursor: pointer; border-radius: 1px; font-family: monospace; font-size: 13px; width: 14px; height: 14px; line-height: 14px; text-align: center; color: #ccc; }
25
- .console .button:hover { background: #666; color: #fff; }
25
+ .console .button { cursor: pointer; border-radius: 1px; font-family: monospace; font-size: 13px; width: 14px; height: 14px; line-height: 14px; text-align: center; color: #CCC; }
26
+ .console .button:hover { background: #666; color: #FFF; }
26
27
  .console .button.close-button:hover { background: #966; }
27
28
  .console .clipboard { height: 0px; padding: 0px; margin: 0px; width: 0px; margin-left: -1000px; }
28
29
  .console .console-prompt-label { display: inline; color: #FFF; background: none repeat scroll 0% 0% #333; border: 0; padding: 0; }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WebConsole
4
- VERSION = "3.6.2"
4
+ VERSION = "3.7.0"
5
5
  end
@@ -10,6 +10,11 @@ module WebConsole
10
10
  yield if Thread.current[:__web_console_exception].present?
11
11
  end
12
12
 
13
+ # Execute a block only on regular, non-error, pages.
14
+ def only_on_regular_page(*args)
15
+ yield if Thread.current[:__web_console_binding].present?
16
+ end
17
+
13
18
  # Render JavaScript inside a script tag and a closure.
14
19
  #
15
20
  # This one lets write JavaScript that will automatically get wrapped in a
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: web-console
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.2
4
+ version: 3.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charlie Somerville
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2018-04-29 00:00:00.000000000 Z
14
+ date: 2018-09-02 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: railties
@@ -108,6 +108,7 @@ files:
108
108
  - lib/web_console/templates/layouts/inlined_string.erb
109
109
  - lib/web_console/templates/layouts/javascript.erb
110
110
  - lib/web_console/templates/main.js.erb
111
+ - lib/web_console/templates/regular_page.js.erb
111
112
  - lib/web_console/templates/style.css.erb
112
113
  - lib/web_console/testing/erb_precompiler.rb
113
114
  - lib/web_console/testing/fake_middleware.rb
@@ -136,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
137
  version: '0'
137
138
  requirements: []
138
139
  rubyforge_project:
139
- rubygems_version: 2.7.3
140
+ rubygems_version: 2.7.6
140
141
  signing_key:
141
142
  specification_version: 4
142
143
  summary: A debugging tool for your Ruby on Rails applications.