From 9a45c466aed331fdc1b64a0a8c7f6d679a4a6035 Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 11 Apr 2012 13:48:12 +0400 Subject: [PATCH 1/3] use getBoundingClientRect for measuring text size needed because on chrome 17+ line heights can be fractional --- lib/ace/layer/text.js | 40 +++++++++++++++++++++++++++++++++++++--- lib/ace/scrollbar.js | 2 ++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/lib/ace/layer/text.js b/lib/ace/layer/text.js index 6e3509bf..56dab2fa 100644 --- a/lib/ace/layer/text.js +++ b/lib/ace/layer/text.js @@ -103,7 +103,7 @@ var Text = function(parentEl) { lineHeight : 1 }; - this.$measureSizes = function() { + this.$measureSizes = useragent.isIE || useragent.isOldGecko ? function() { var n = 1000; if (!this.$measureNode) { var measureNode = this.$measureNode = dom.createElement("div"); @@ -130,7 +130,6 @@ var Text = function(parentEl) { container = container.parentNode; container.appendChild(measureNode); } - } // Size and width can be null if the editor is not visible or @@ -150,7 +149,42 @@ var Text = function(parentEl) { // Size and width can be null if the editor is not visible or // detached from the document - if (size.width == 0 && size.height == 0) + if (size.width == 0 || size.height == 0) + return null; + + return size; + } + : function() { + if (!this.$measureNode) { + var measureNode = this.$measureNode = dom.createElement("div"); + var style = measureNode.style; + + style.width = style.height = "auto"; + style.left = style.top = -100 + "px"; + + style.visibility = "hidden"; + style.position = "fixed"; + style.overflow = "visible"; + style.whiteSpace = "nowrap"; + + measureNode.innerHTML = "X"; + + var container = this.element.parentNode; + while (!dom.hasCssClass(container, "ace_editor")) + container = container.parentNode; + container.appendChild(measureNode); + } + + var rect = this.$measureNode.getBoundingClientRect(); + + var size = { + height: rect.height, + width: rect.width + }; + + // Size and width can be null if the editor is not visible or + // detached from the document + if (size.width == 0 || size.height == 0) return null; return size; diff --git a/lib/ace/scrollbar.js b/lib/ace/scrollbar.js index 27b83fee..0bc7e675 100644 --- a/lib/ace/scrollbar.js +++ b/lib/ace/scrollbar.js @@ -83,6 +83,8 @@ var ScrollBar = function(parent) { this.inner.style.height = height + "px"; }; + // TODO: on chrome 17+ after for small zoom levels after this function + // this.element.scrollTop != scrollTop which makes page to scroll up. this.setScrollTop = function(scrollTop) { this.element.scrollTop = scrollTop; }; From c0550e0891324f750b4cd9f1c11b1ad9076dcc14 Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 11 Apr 2012 13:49:30 +0400 Subject: [PATCH 2/3] use position="fixed" to not cause problems on rtl sites --- lib/ace/layer/text.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/layer/text.js b/lib/ace/layer/text.js index 56dab2fa..4394aee5 100644 --- a/lib/ace/layer/text.js +++ b/lib/ace/layer/text.js @@ -113,7 +113,7 @@ var Text = function(parentEl) { style.left = style.top = (-n * 40) + "px"; style.visibility = "hidden"; - style.position = "absolute"; + style.position = "fixed"; style.overflow = "visible"; style.whiteSpace = "nowrap"; From 378f161143b6c4dfa77b26135ee735c0a5ae2c8a Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 11 Apr 2012 21:00:15 +0400 Subject: [PATCH 3/3] fix failing test --- lib/ace/layer/text.js | 6 +++++- lib/ace/test/all_browser.js | 12 ++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/ace/layer/text.js b/lib/ace/layer/text.js index 4394aee5..d71417b1 100644 --- a/lib/ace/layer/text.js +++ b/lib/ace/layer/text.js @@ -170,8 +170,12 @@ var Text = function(parentEl) { measureNode.innerHTML = "X"; var container = this.element.parentNode; - while (!dom.hasCssClass(container, "ace_editor")) + while (container && !dom.hasCssClass(container, "ace_editor")) container = container.parentNode; + + if (!container) + return this.$measureNode = null; + container.appendChild(measureNode); } diff --git a/lib/ace/test/all_browser.js b/lib/ace/test/all_browser.js index 90eab310..eefc725b 100644 --- a/lib/ace/test/all_browser.js +++ b/lib/ace/test/all_browser.js @@ -22,21 +22,21 @@ var tests = [ require("ace/layer/text_test"), require("ace/lib/event_emitter_test"), require("ace/mode/coffee/parser_test"), - require("ace/mode/coffee_tokenizer_test"), + require("ace/mode/coffee_highlight_rules_test"), require("ace/mode/coldfusion_test"), require("ace/mode/css_test"), - require("ace/mode/css_tokenizer_test"), + require("ace/mode/css_highlight_rules_test"), require("ace/mode/css_worker"), require("ace/mode/html_test"), - require("ace/mode/html_tokenizer_test"), + require("ace/mode/html_highlight_rules_test"), require("ace/mode/javascript_test"), - require("ace/mode/javascript_tokenizer_test"), + require("ace/mode/javascript_highlight_rules_test"), require("ace/mode/javascript_worker_test"), require("ace/mode/python_test"), - require("ace/mode/ruby_tokenizer_test"), + require("ace/mode/ruby_highlight_rules_test"), require("ace/mode/text_test"), require("ace/mode/xml_test"), - require("ace/mode/xml_tokenizer_test"), + require("ace/mode/xml_highlight_rules_test"), require("ace/mode/folding/cstyle_test"), require("ace/mode/folding/html_test"), require("ace/mode/folding/pythonic_test"),