Index: third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/addons/fit/fit.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/addons/fit/fit.js b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/addons/fit/fit.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..209e0596439168cae8a2a4b1ac2fa169af0bf331 |
--- /dev/null |
+++ b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/addons/fit/fit.js |
@@ -0,0 +1,86 @@ |
+/* |
+ * Fit terminal columns and rows to the dimensions of its |
+ * DOM element. |
+ * |
+ * Approach: |
+ * - Rows: Truncate the division of the terminal parent element height |
+ * by the terminal row height |
+ * |
+ * - Columns: Truncate the division of the terminal parent element width by |
+ * the terminal character width (apply display: inline at the |
+ * terminal row and truncate its width with the current number |
+ * of columns) |
+ */ |
+(function (fit) { |
+ if (typeof exports === 'object' && typeof module === 'object') { |
+ /* |
+ * CommonJS environment |
+ */ |
+ module.exports = fit(require('../../src/xterm')); |
+ } else if (typeof define == 'function') { |
+ /* |
+ * Require.js is available |
+ */ |
+ define(['../../src/xterm'], fit); |
+ } else { |
+ /* |
+ * Plain browser environment |
+ */ |
+ fit(window.Terminal); |
+ } |
+})(function (Xterm) { |
+ /** |
+ * This module provides methods for fitting a terminal's size to a parent container. |
+ * |
+ * @module xterm/addons/fit/fit |
+ */ |
+ var exports = {}; |
+ |
+ exports.proposeGeometry = function (term) { |
+ var parentElementStyle = window.getComputedStyle(term.element.parentElement), |
+ parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height')), |
+ parentElementWidth = parseInt(parentElementStyle.getPropertyValue('width')), |
+ elementStyle = window.getComputedStyle(term.element), |
+ elementPaddingVer = parseInt(elementStyle.getPropertyValue('padding-top')) + parseInt(elementStyle.getPropertyValue('padding-bottom')), |
+ elementPaddingHor = parseInt(elementStyle.getPropertyValue('padding-right')) + parseInt(elementStyle.getPropertyValue('padding-left')), |
+ availableHeight = parentElementHeight - elementPaddingVer, |
+ availableWidth = parentElementWidth - elementPaddingHor, |
+ container = term.rowContainer, |
+ subjectRow = term.rowContainer.firstElementChild, |
+ contentBuffer = subjectRow.innerHTML, |
+ characterHeight, |
+ rows, |
+ characterWidth, |
+ cols, |
+ geometry; |
+ |
+ subjectRow.style.display = 'inline'; |
+ subjectRow.innerHTML = 'W'; // Common character for measuring width, although on monospace |
+ characterWidth = subjectRow.getBoundingClientRect().width; |
+ subjectRow.style.display = ''; // Revert style before calculating height, since they differ. |
+ characterHeight = parseInt(subjectRow.offsetHeight); |
+ subjectRow.innerHTML = contentBuffer; |
+ |
+ rows = parseInt(availableHeight / characterHeight); |
+ cols = parseInt(availableWidth / characterWidth) - 1; |
+ |
+ geometry = {cols: cols, rows: rows}; |
+ return geometry; |
+ }; |
+ |
+ exports.fit = function (term) { |
+ var geometry = exports.proposeGeometry(term); |
+ |
+ term.resize(geometry.cols, geometry.rows); |
+ }; |
+ |
+ Xterm.prototype.proposeGeometry = function () { |
+ return exports.proposeGeometry(this); |
+ }; |
+ |
+ Xterm.prototype.fit = function () { |
+ return exports.fit(this); |
+ }; |
+ |
+ return exports; |
+}); |