From 99a6e2ab8f80d77ea4cf54fd0d1eccd372214348 Mon Sep 17 00:00:00 2001 From: Peter 'Pita' Martischka Date: Sun, 12 Apr 2015 16:37:38 +0100 Subject: [PATCH] remove editor iframes, first step --- src/static/css/iframe_editor.css | 6 +- src/static/css/pad.css | 10 --- src/static/js/ace.js | 125 +------------------------------ src/static/js/ace2_inner.js | 67 ++++++++--------- src/templates/pad.html | 10 ++- 5 files changed, 47 insertions(+), 171 deletions(-) diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index b7ece1e66..5b980e74e 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -119,10 +119,8 @@ body.doesWrap > div{ } #innerdocbody { - padding-top: 1px; /* important for some reason? */ - padding-right: 10px; - padding-bottom: 8px; - padding-left: 1px /* prevents characters from looking chopped off in FF3 -- Removed because it added too much whitespace */; + position: absolute; + top: 8px; overflow: hidden; /* blank 1x1 gif, so that IE8 doesn't consider the body transparent */ background-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==); diff --git a/src/static/css/pad.css b/src/static/css/pad.css index ff8ab5ab7..de314e172 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -16,9 +16,6 @@ body, textarea { font-family: Helvetica, Arial, sans-serif } -iframe { - position: absolute -} .readonly .acl-write { display: none; } @@ -217,13 +214,6 @@ li[data-key=showusers] > a #online_count { bottom: 0px; z-index: 1; } -#editorcontainer iframe { - height: 100%; - width: 100%; - padding: 0; - margin: 0; - left: 0; /* Required for safari fixes RTL */ -} #editorloadingbox { padding-top: 100px; padding-bottom: 100px; diff --git a/src/static/js/ace.js b/src/static/js/ace.js index c446939a3..efae37f0d 100644 --- a/src/static/js/ace.js +++ b/src/static/js/ace.js @@ -200,7 +200,6 @@ function Ace2Editor() editor.init = function(containerId, initialCode, doneFunc) { - editor.importText(initialCode); info.onEditorReady = function() @@ -210,126 +209,10 @@ function Ace2Editor() doneFunc(); }; - (function() - { - var doctype = ""; - - var iframeHTML = []; - - iframeHTML.push(doctype); - iframeHTML.push(""); - - // calls to these functions ($$INCLUDE_...) are replaced when this file is processed - // and compressed, putting the compressed code from the named file directly into the - // source here. - // these lines must conform to a specific format because they are passed by the build script: - var includedCSS = []; - var $$INCLUDE_CSS = function(filename) {includedCSS.push(filename)}; - $$INCLUDE_CSS("../static/css/iframe_editor.css"); - $$INCLUDE_CSS("../static/css/pad.css"); - $$INCLUDE_CSS("../static/custom/pad.css"); - - var additionalCSS = _(hooks.callAll("aceEditorCSS")).map(function(path){ return '../static/plugins/' + path }); - includedCSS = includedCSS.concat(additionalCSS); - - pushStyleTagsFor(iframeHTML, includedCSS); - - if (!Ace2Editor.EMBEDED && Ace2Editor.EMBEDED[KERNEL_SOURCE]) { - // Remotely src'd script tag will not work in IE; it must be embedded, so - // throw an error if it is not. - throw new Error("Require kernel could not be found."); - } - - iframeHTML.push(scriptTag( -Ace2Editor.EMBEDED[KERNEL_SOURCE] + '\n\ -require.setRootURI("../javascripts/src");\n\ -require.setLibraryURI("../javascripts/lib");\n\ -require.setGlobalKeyPath("require");\n\ -\n\ -var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");\n\ -var plugins = require("ep_etherpad-lite/static/js/pluginfw/client_plugins");\n\ -hooks.plugins = plugins;\n\ -plugins.adoptPluginsFromAncestorsOf(window);\n\ -\n\ -$ = jQuery = require("ep_etherpad-lite/static/js/rjquery").jQuery; // Expose jQuery #HACK\n\ -var Ace2Inner = require("ep_etherpad-lite/static/js/ace2_inner");\n\ -\n\ -plugins.ensure(function () {\n\ - Ace2Inner.init();\n\ -});\n\ -')); - - iframeHTML.push(''); - - hooks.callAll("aceInitInnerdocbodyHead", { - iframeHTML: iframeHTML - }); - - iframeHTML.push(' '); - - // Expose myself to global for my child frame. - var thisFunctionsName = "ChildAccessibleAce2Editor"; - (function () {return this}())[thisFunctionsName] = Ace2Editor; - - var outerScript = '\ -editorId = ' + JSON.stringify(info.id) + ';\n\ -editorInfo = parent[' + JSON.stringify(thisFunctionsName) + '].registry[editorId];\n\ -window.onload = function () {\n\ - window.onload = null;\n\ - setTimeout(function () {\n\ - var iframe = document.createElement("IFRAME");\n\ - iframe.name = "ace_inner";\n\ - iframe.title = "pad";\n\ - iframe.scrolling = "no";\n\ - var outerdocbody = document.getElementById("outerdocbody");\n\ - iframe.frameBorder = 0;\n\ - iframe.allowTransparency = true; // for IE\n\ - outerdocbody.insertBefore(iframe, outerdocbody.firstChild);\n\ - iframe.ace_outerWin = window;\n\ - readyFunc = function () {\n\ - editorInfo.onEditorReady();\n\ - readyFunc = null;\n\ - editorInfo = null;\n\ - };\n\ - var doc = iframe.contentWindow.document;\n\ - doc.open();\n\ - var text = (' + JSON.stringify(iframeHTML.join('\n')) + ');\n\ - doc.write(text);\n\ - doc.close();\n\ - }, 0);\n\ -}'; - - var outerHTML = [doctype, ''] - - var includedCSS = []; - var $$INCLUDE_CSS = function(filename) {includedCSS.push(filename)}; - $$INCLUDE_CSS("../static/css/iframe_editor.css"); - $$INCLUDE_CSS("../static/css/pad.css"); - $$INCLUDE_CSS("../static/custom/pad.css"); - - - var additionalCSS = _(hooks.callAll("aceEditorCSS")).map(function(path){ return '../static/plugins/' + path }); - includedCSS = includedCSS.concat(additionalCSS); - - pushStyleTagsFor(outerHTML, includedCSS); - - // bizarrely, in FF2, a file with no "external" dependencies won't finish loading properly - // (throbs busy while typing) - outerHTML.push('', '', scriptTag(outerScript), '
x
'); - - var outerFrame = document.createElement("IFRAME"); - outerFrame.name = "ace_outer"; - outerFrame.frameBorder = 0; // for IE - outerFrame.title = "Ether"; - info.frame = outerFrame; - document.getElementById(containerId).appendChild(outerFrame); - - var editorDocument = outerFrame.contentWindow.document; - - editorDocument.open(); - editorDocument.write(outerHTML.join('')); - editorDocument.close(); - })(); + var Ace2Inner = require("ep_etherpad-lite/static/js/ace2_inner"); + var editorId = info.id; + var editorInfo = Ace2Editor.registry[editorId]; + Ace2Inner.init(editorInfo); }; return editor; diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 555512118..2f3dd9888 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -47,7 +47,7 @@ var isNodeText = Ace2Common.isNodeText, noop = Ace2Common.noop; var hooks = require('./pluginfw/hooks'); -function Ace2Inner(){ +function Ace2Inner(editorInfo){ var makeChangesetTracker = require('./changesettracker').makeChangesetTracker; var colorutils = require('./colorutils').colorutils; @@ -80,13 +80,9 @@ function Ace2Inner(){ var thisAuthor = ''; var disposed = false; - var editorInfo = parent.editorInfo; - - var iframe = window.frameElement; - var outerWin = iframe.ace_outerWin; - iframe.ace_outerWin = null; // prevent IE 6 memory leak - var sideDiv = iframe.nextSibling; - var lineMetricsDiv = sideDiv.nextSibling; + var sideDiv = $('#sidediv')[0]; + var lineMetricsDiv = $('#linemetricsdiv')[0]; + var innerdocbody = $('#innerdocbody')[0]; initLineNumbers(); var outsideKeyDown = noop; @@ -961,7 +957,7 @@ function Ace2Inner(){ setClassPresence(sideDiv, "sidedivhidden", !hasLineNumbers); fixView(); }, - grayedout: setClassPresenceNamed(outerWin.document.body, "grayedout"), + grayedout: setClassPresenceNamed(window.document.body, "grayedout"), dmesg: function(){ dmesg = window.dmesg = value; }, userauthor: function(value){ thisAuthor = String(value); @@ -3263,7 +3259,7 @@ function Ace2Inner(){ function getViewPortTopBottom() { var theTop = getScrollY(); - var doc = outerWin.document; + var doc = window.document; var height = doc.documentElement.clientHeight; return { top: theTop, @@ -3809,7 +3805,7 @@ function Ace2Inner(){ //scrollSelectionIntoView(); scheduler.setTimeout(function() { - outerWin.scrollBy(-100, 0); + window.scrollBy(-100, 0); }, 0); specialHandled = true; } @@ -4721,6 +4717,7 @@ function Ace2Inner(){ function fixView() { + //return; // TODO: look into this later // calling this method repeatedly should be fast if (getInnerWidth() === 0 || getInnerHeight() === 0) { @@ -4740,7 +4737,7 @@ function Ace2Inner(){ if (newSideDivWidth < MIN_LINEDIV_WIDTH) newSideDivWidth = MIN_LINEDIV_WIDTH; iframePadLeft = EDIT_BODY_PADDING_LEFT; if (hasLineNumbers) iframePadLeft += newSideDivWidth + LINE_NUMBER_PADDING_RIGHT; - setIfNecessary(iframe.style, "left", iframePadLeft + "px"); + setIfNecessary(innerdocbody.style, "left", iframePadLeft + "px"); setIfNecessary(sideDiv.style, "width", newSideDivWidth + "px"); for (var i = 0; i < 2; i++) @@ -4752,11 +4749,11 @@ function Ace2Inner(){ if (newHeight < viewHeight) { newHeight = viewHeight; - if (browser.msie) setIfNecessary(outerWin.document.documentElement.style, 'overflowY', 'auto'); + if (browser.msie) setIfNecessary(window.document.documentElement.style, 'overflowY', 'auto'); } else { - if (browser.msie) setIfNecessary(outerWin.document.documentElement.style, 'overflowY', 'scroll'); + if (browser.msie) setIfNecessary(window.document.documentElement.style, 'overflowY', 'scroll'); } if (doesWrap) { @@ -4766,8 +4763,8 @@ function Ace2Inner(){ { if (newWidth < viewWidth) newWidth = viewWidth; } - setIfNecessary(iframe.style, "height", newHeight + "px"); - setIfNecessary(iframe.style, "width", newWidth + "px"); + setIfNecessary(innerdocbody.style, "height", newHeight + "px"); + setIfNecessary(innerdocbody.style, "width", newWidth + "px"); setIfNecessary(sideDiv.style, "height", newHeight + "px"); } if (browser.firefox) @@ -4792,7 +4789,7 @@ function Ace2Inner(){ // if near edge, scroll to edge var scrollX = getScrollX(); var scrollY = getScrollY(); - var win = outerWin; + var win = window; var r = 20; enforceEditability(); @@ -4802,8 +4799,8 @@ function Ace2Inner(){ function getScrollXY() { - var win = outerWin; - var odoc = outerWin.document; + var win = window; + var odoc = window.document; if (typeof(win.pageYOffset) == "number") { return { @@ -4833,17 +4830,17 @@ function Ace2Inner(){ function setScrollX(x) { - outerWin.scrollTo(x, getScrollY()); + window.scrollTo(x, getScrollY()); } function setScrollY(y) { - outerWin.scrollTo(getScrollX(), y); + window.scrollTo(getScrollX(), y); } function setScrollXY(x, y) { - outerWin.scrollTo(x, y); + window.scrollTo(x, y); } var _teardownActions = []; @@ -5077,7 +5074,7 @@ function Ace2Inner(){ function getPageHeight() { - var win = outerWin; + var win = window; var odoc = win.document; if (win.innerHeight && win.scrollMaxY) return win.innerHeight + win.scrollMaxY; else if (odoc.body.scrollHeight > odoc.body.offsetHeight) return odoc.body.scrollHeight; @@ -5086,7 +5083,7 @@ function Ace2Inner(){ function getPageWidth() { - var win = outerWin; + var win = window; var odoc = win.document; if (win.innerWidth && win.scrollMaxX) return win.innerWidth + win.scrollMaxX; else if (odoc.body.scrollWidth > odoc.body.offsetWidth) return odoc.body.scrollWidth; @@ -5095,7 +5092,7 @@ function Ace2Inner(){ function getInnerHeight() { - var win = outerWin; + var win = window; var odoc = win.document; var h; if (browser.opera) h = win.innerHeight; @@ -5109,7 +5106,7 @@ function Ace2Inner(){ function getInnerWidth() { - var win = outerWin; + var win = window; var odoc = win.document; return odoc.documentElement.clientWidth; } @@ -5119,8 +5116,8 @@ function Ace2Inner(){ // requires element (non-text) node; // if node extends above top of viewport or below bottom of viewport (or top of scrollbar), // scroll it the minimum distance needed to be completely in view. - var win = outerWin; - var odoc = outerWin.document; + var win = window; + var odoc = window.document; var distBelowTop = node.offsetTop + iframePadTop - win.scrollY; var distAboveBottom = win.scrollY + getInnerHeight() - (node.offsetTop + iframePadTop + node.offsetHeight); @@ -5136,8 +5133,8 @@ function Ace2Inner(){ function scrollXHorizontallyIntoView(pixelX) { - var win = outerWin; - var odoc = outerWin.document; + var win = window; + var odoc = window.document; pixelX += iframePadLeft; var distInsideLeft = pixelX - win.scrollX; var distInsideRight = win.scrollX + getInnerWidth() - pixelX; @@ -5331,7 +5328,7 @@ function Ace2Inner(){ { lineNumbersShown = 1; sideDiv.innerHTML = '
1
'; - sideDivInner = outerWin.document.getElementById("sidedivinner"); + sideDivInner = window.document.getElementById("sidedivinner"); } function updateLineNumbers() @@ -5377,7 +5374,7 @@ function Ace2Inner(){ if (newNumLines != lineNumbersShown) { var container = sideDivInner; - var odoc = outerWin.document; + var odoc = window.document; var fragment = odoc.createDocumentFragment(); while (lineNumbersShown < newNumLines) { @@ -5457,7 +5454,7 @@ function Ace2Inner(){ scheduler.setTimeout(function() { - parent.readyFunc(); // defined in code that sets up the inner iframe + editorInfo.onEditorReady(); // defined in code that sets up the inner iframe }, 0); isSetUp = true; @@ -5466,7 +5463,7 @@ function Ace2Inner(){ } -exports.init = function () { - var editor = new Ace2Inner() +exports.init = function (editorInfo) { + var editor = new Ace2Inner(editorInfo) editor.init(); }; diff --git a/src/templates/pad.html b/src/templates/pad.html index dd260414e..69479cda9 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -41,6 +41,8 @@ <% e.begin_block("styles"); %> + + <% e.begin_block("customStyles"); %> @@ -100,7 +102,13 @@
-
+
+
+
+
x
+
+
 
+

You need a password to access this pad