|
2 | 2 |
|
3 | 3 | var oop = require("./lib/oop");
|
4 | 4 | var dom = require("./lib/dom");
|
| 5 | +var lang = require("./lib/lang"); |
5 | 6 | var config = require("./config");
|
6 | 7 | var GutterLayer = require("./layer/gutter").Gutter;
|
7 | 8 | var MarkerLayer = require("./layer/marker").Marker;
|
@@ -157,6 +158,7 @@ var VirtualRenderer = function(container, theme) {
|
157 | 158 |
|
158 | 159 | this.updateCharacterSize();
|
159 | 160 | this.setPadding(4);
|
| 161 | + this.$addResizeObserver(); |
160 | 162 | config.resetOptions(this);
|
161 | 163 | config._signal("renderer", this);
|
162 | 164 | };
|
@@ -344,6 +346,7 @@ var VirtualRenderer = function(container, theme) {
|
344 | 346 | width = el.clientWidth || el.scrollWidth;
|
345 | 347 | var changes = this.$updateCachedSize(force, gutterWidth, width, height);
|
346 | 348 |
|
| 349 | + if (this.$resizeTimer) this.$resizeTimer.cancel(); |
347 | 350 |
|
348 | 351 | if (!this.$size.scrollerHeight || (!width && !height))
|
349 | 352 | return this.resizing = 0;
|
@@ -1799,6 +1802,7 @@ var VirtualRenderer = function(container, theme) {
|
1799 | 1802 | this.$cursorLayer.destroy();
|
1800 | 1803 | this.removeAllListeners();
|
1801 | 1804 | this.container.textContent = "";
|
| 1805 | + this.setOption("useResizeObserver", false); |
1802 | 1806 | };
|
1803 | 1807 |
|
1804 | 1808 | this.$updateCustomScrollbar = function (val) {
|
@@ -1836,10 +1840,42 @@ var VirtualRenderer = function(container, theme) {
|
1836 | 1840 | }
|
1837 | 1841 | };
|
1838 | 1842 |
|
| 1843 | + this.$addResizeObserver = function() { |
| 1844 | + if (!window.ResizeObserver || this.$resizeObserver) return; |
| 1845 | + var self = this; |
| 1846 | + this.$resizeTimer = lang.delayedCall(function() { |
| 1847 | + if (!self.destroyed) self.onResize(); |
| 1848 | + }, 50); |
| 1849 | + this.$resizeObserver = new window.ResizeObserver(function(e) { |
| 1850 | + var w = e[0].contentRect.width; |
| 1851 | + var h = e[0].contentRect.height; |
| 1852 | + if ( |
| 1853 | + Math.abs(self.$size.width - w) > 1 |
| 1854 | + || Math.abs(self.$size.height - h) > 1 |
| 1855 | + ) { |
| 1856 | + self.$resizeTimer.delay(); |
| 1857 | + } else { |
| 1858 | + self.$resizeTimer.cancel(); |
| 1859 | + } |
| 1860 | + }); |
| 1861 | + this.$resizeObserver.observe(this.container); |
| 1862 | + }; |
| 1863 | + |
1839 | 1864 | }).call(VirtualRenderer.prototype);
|
1840 | 1865 |
|
1841 | 1866 |
|
1842 | 1867 | config.defineOptions(VirtualRenderer.prototype, "renderer", {
|
| 1868 | + useResizeObserver: { |
| 1869 | + set: function(value) { |
| 1870 | + if (!value && this.$resizeObserver) { |
| 1871 | + this.$resizeObserver.disconnect(); |
| 1872 | + this.$resizeTimer.cancel(); |
| 1873 | + this.$resizeTimer = this.$resizeObserver = null; |
| 1874 | + } else if (value && !this.$resizeObserver) { |
| 1875 | + this.$addResizeObserver(); |
| 1876 | + } |
| 1877 | + } |
| 1878 | + }, |
1843 | 1879 | animatedScroll: {initialValue: false},
|
1844 | 1880 | showInvisibles: {
|
1845 | 1881 | set: function(value) {
|
|
0 commit comments