From 95f0e7308fc1518920fcf6b3993d9a7288f7ca08 Mon Sep 17 00:00:00 2001 From: nightwing Date: Tue, 30 Jul 2013 00:22:53 +0400 Subject: [PATCH] some more ie7 fixes --- lib/ace/ext/{ie_quirks.js => old_ie.js} | 86 +++++++++++++------ .../ext/{ie_quirks_test.js => old_ie_test.js} | 7 +- lib/ace/ext/searchbox.js | 12 ++- lib/ace/keyboard/textinput.js | 8 +- lib/ace/mode/html_highlight_rules.js | 2 +- 5 files changed, 79 insertions(+), 36 deletions(-) rename lib/ace/ext/{ie_quirks.js => old_ie.js} (52%) rename lib/ace/ext/{ie_quirks_test.js => old_ie_test.js} (89%) diff --git a/lib/ace/ext/ie_quirks.js b/lib/ace/ext/old_ie.js similarity index 52% rename from lib/ace/ext/ie_quirks.js rename to lib/ace/ext/old_ie.js index 8d962c0b..5afd94b0 100644 --- a/lib/ace/ext/ie_quirks.js +++ b/lib/ace/ext/old_ie.js @@ -31,42 +31,76 @@ define(function(require, exports, module) { "use strict"; var MAX_TOKEN_COUNT = 1000; -var useragent = require("../lib/useragent") -var TokenizerModule = require("../tokenizer") +var useragent = require("../lib/useragent"); +var TokenizerModule = require("../tokenizer"); + +function patch(obj, name, regexp, replacement) { + eval("obj['" + name + "']=" + obj[name].toString().replace( + regexp, replacement + )); + console.log(obj[name]+"") +} if (useragent.isIE && useragent.isIE < 10 && window.top.document.compatMode === "BackCompat") useragent.isOldIE = true; +if (typeof document != "undefined" && !document.documentElement.querySelector) { + var qs = function(el, selector) { + if (selector.charAt(0) == ".") { + var classNeme = selector.slice(1); + } else { + var m = selector.match(/(\w+)=(\w+)/); + var attr = m && m[1]; + var attrVal = m && m[2]; + } + for (var i = 0; i < el.all.length; i++) { + var ch = el.all[i]; + if (classNeme) { + if (ch.className.indexOf(classNeme) != -1) + return ch; + } else if (attr) { + if (ch.getAttribute(attr) == attrVal) + return ch; + } + } + }; + var sb = require("./searchbox").SearchBox.prototype; + patch( + sb, "$initElements", + /([^\s=]*).querySelector\((".*?")\)/g, + "qs($1, $2)" + ); +} + var compliantExecNpcg = /()??/.exec("")[1] === undefined; if (compliantExecNpcg) return; - var proto = TokenizerModule.Tokenizer.prototype; -eval("TokenizerModule.Tokenizer = " + - TokenizerModule.Tokenizer.toString().replace( - "ruleRegExps.push(adjustedregex);\n", function(m) { - return m + '\ - if (state[i].next && RegExp(adjustedregex).test(""))\n\ - rule._qre = RegExp(adjustedregex, "g");\n\ - ' - } - ) +TokenizerModule.Tokenizer_orig = TokenizerModule.Tokenizer; +proto.getLineTokens_orig = proto.getLineTokens; + +patch( + TokenizerModule, "Tokenizer", + "ruleRegExps.push(adjustedregex);\n", + function(m) { + return m + '\ + if (state[i].next && RegExp(adjustedregex).test(""))\n\ + rule._qre = RegExp(adjustedregex, "g");\n\ + '; + } ); TokenizerModule.Tokenizer.prototype = proto; -eval("proto.getLineTokens = " + - proto.getLineTokens.toString().replace( - /if \(match\[i \+ 1\] === undefined\)\s*continue;/, - "if (!match[i + 1]) {\n\ - if (value)continue;\n\ - var qre = state[mapping[i]]._qre;\n\ - if (!qre) continue;\n\ - qre.lastIndex = lastIndex;\n\ - if (!qre.exec(line) || qre.lastIndex != lastIndex)\n\ - continue;\n\ - }" - ) +patch( + proto, "getLineTokens", + /if \(match\[i \+ 1\] === undefined\)\s*continue;/, + "if (!match[i + 1]) {\n\ + if (value)continue;\n\ + var qre = state[mapping[i]]._qre;\n\ + if (!qre) continue;\n\ + qre.lastIndex = lastIndex;\n\ + if (!qre.exec(line) || qre.lastIndex != lastIndex)\n\ + continue;\n\ + }" ); - - }); diff --git a/lib/ace/ext/ie_quirks_test.js b/lib/ace/ext/old_ie_test.js similarity index 89% rename from lib/ace/ext/ie_quirks_test.js rename to lib/ace/ext/old_ie_test.js index 1210cc46..f810bb69 100644 --- a/lib/ace/ext/ie_quirks_test.js +++ b/lib/ace/ext/old_ie_test.js @@ -51,8 +51,9 @@ module.exports = { } try { + // break this to emulate old ie RegExp.prototype.exec = brokenExec; - require("./ie_quirks"); + require("./old_ie"); var JavaScriptMode = require("../mode/javascript").Mode; var mode = new JavaScriptMode(); var tokenizer = mode.getTokenizer(); @@ -60,7 +61,11 @@ module.exports = { var tokens = tokenizer.getLineTokens("'juhu'", "start").tokens; assert.equal("string", tokens[0].type); } finally { + // restore modified functions RegExp.prototype.exec = exec; + var module = require("../tokenizer"); + module.Tokenizer = module.Tokenizer_orig; + module.Tokenizer.prototype.getLineTokens = module.Tokenizer.prototype.getLineTokens_orig; } } }; diff --git a/lib/ace/ext/searchbox.js b/lib/ace/ext/searchbox.js index c416b275..fb704d4a 100644 --- a/lib/ace/ext/searchbox.js +++ b/lib/ace/ext/searchbox.js @@ -75,9 +75,7 @@ var SearchBox = function(editor, range, showReplaceForm) { this.editor = editor; }; - this.$init = function() { - var sb = this.element; - + this.$initElements = function(sb) { this.searchBox = sb.querySelector(".ace_search_form"); this.replaceBox = sb.querySelector(".ace_replace_form"); this.searchOptions = sb.querySelector(".ace_search_options"); @@ -86,7 +84,13 @@ var SearchBox = function(editor, range, showReplaceForm) { this.wholeWordOption = sb.querySelector("[action=toggleWholeWords]"); this.searchInput = this.searchBox.querySelector(".ace_search_field"); this.replaceInput = this.replaceBox.querySelector(".ace_search_field"); - + }; + + this.$init = function() { + var sb = this.element; + + this.$initElements(sb); + var _this = this; event.addListener(sb, "mousedown", function(e) { setTimeout(function(){ diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index 79202931..802b9236 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -215,18 +215,18 @@ var TextInput = function(parentNode, host) { if (data) host.onPaste(data); pasted = false; - } else if (data == PLACEHOLDER[0]) { + } else if (data == PLACEHOLDER.charAt(0)) { if (afterContextMenu) host.execCommand("del", {source: "ace"}); } else { if (data.substring(0, 2) == PLACEHOLDER) data = data.substr(2); - else if (data[0] == PLACEHOLDER[0]) + else if (data.charAt(0) == PLACEHOLDER.charAt(0)) data = data.substr(1); - else if (data[data.length - 1] == PLACEHOLDER[0]) + else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0)) data = data.slice(0, -1); // can happen if undo in textarea isn't stopped - if (data[data.length - 1] == PLACEHOLDER[0]) + if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0)) data = data.slice(0, -1); if (data) diff --git a/lib/ace/mode/html_highlight_rules.js b/lib/ace/mode/html_highlight_rules.js index 96e666b0..26bca6df 100644 --- a/lib/ace/mode/html_highlight_rules.js +++ b/lib/ace/mode/html_highlight_rules.js @@ -69,7 +69,7 @@ var HtmlHighlightRules = function() { token : "keyword.operator.separator", regex : "=", push : [{ - include: "space", + include: "space" }, { token : "string", regex : "[^<>='\"`\\s]+",