diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index b7ece1e66..ecc6b48b0 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -1,8 +1,8 @@ /* These CSS rules are included in both the outer and inner ACE iframe. Also see inner.css, included only in the inner one. */ -html { cursor: text; } /* in Safari, produces text cursor for whole doc (inc. below body) */ -span { cursor: auto; } +#innerdocbody html { cursor: text; } /* in Safari, produces text cursor for whole doc (inc. below body) */ +#innerdocbody span { cursor: auto; } ::selection { background: #acf; @@ -11,18 +11,18 @@ span { cursor: auto; } background: #acf; } -a { +#innerdocbody a { cursor: pointer !important; white-space:pre-wrap; } -ul, ol, li { +#innerdocbody ul, #innerdocbody ol, #innerdocbody li { padding: 0; margin: 0; } -ul { margin-left: 1.5em; } -ul ul { margin-left: 0 !important; } +#innerdocbody ul { margin-left: 1.5em; } +#innerdocbody ul ul { margin-left: 0 !important; } ul.list-bullet1 { margin-left: 1.5em; } ul.list-bullet2 { margin-left: 3em; } ul.list-bullet3 { margin-left: 4.5em; } @@ -80,21 +80,19 @@ ul.list-indent6, ul.list-indent7, ul.list-indent8, ul.list-indent9, ul.list-inde ul.list-indent11, ul.list-indent12, ul.list-indent13, ul.list-indent14, ul.list-indent15, ul.list-indent16 { list-style-type: none; } -body { - margin: 0; - white-space: nowrap; - word-wrap: normal; -} - #outerdocbody { background-color: #fff; } -body.grayedout { background-color: #eee !important } + +#innerdocbody.grayedout { background-color: #eee !important } #innerdocbody { font-size: 12px; /* overridden by body.style */ font-family:Arial, sans-serif; /* overridden by body.style */ line-height: 16px; /* overridden by body.style */ + margin: 0; + white-space: nowrap; + word-wrap: normal; } body.doesWrap { @@ -119,11 +117,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 */; - overflow: hidden; + position: absolute; + top: 8px; /* 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..44697cad2 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; } @@ -57,6 +54,9 @@ a img { width: 100%; white-space: nowrap; height: 32px; + position:fixed; + top:0; + z-index:9; } .toolbar ul { position: absolute; @@ -217,13 +217,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; @@ -539,7 +532,7 @@ table#otheruserstable { } #chatbox { - position: absolute; + position: fixed; bottom: 0px; right: 20px; width: 180px; @@ -554,6 +547,12 @@ table#otheruserstable { border-top-left-radius: 5px; border-top-right-radius: 5px; display: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } #chattext { background-color: white; diff --git a/src/static/js/ace.js b/src/static/js/ace.js index e08036fa9..375bb43ac 100644 --- a/src/static/js/ace.js +++ b/src/static/js/ace.js @@ -163,7 +163,6 @@ define(['ep_etherpad-lite/static/js/pluginfw/hooks', 'underscore'], function (ho editor.init = function(containerId, initialCode, doneFunc) { - editor.importText(initialCode); info.onEditorReady = function() @@ -173,124 +172,11 @@ define(['ep_etherpad-lite/static/js/pluginfw/hooks', 'underscore'], function (ho doneFunc(); }; - (function() - { - var doctype = ""; - - var iframeHTML = []; - - iframeHTML.push(doctype); - iframeHTML.push(""); - - var includedCSS = ["../static/css/iframe_editor.css", - "../static/css/pad.css", - "../static/custom/pad.css"] - - var additionalCSS = _(hooks.callAll("aceEditorCSS")).map(function(path){ return '../static/plugins/' + path }); - includedCSS = includedCSS.concat(additionalCSS); - - pushStyleTagsFor(iframeHTML, includedCSS); - - iframeHTML.push(''); - iframeHTML.push(scriptTag('\n\ - require.setRootURI("../javascripts/src");\n\ - require.setLibraryURI("../javascripts/lib");\n\ - require.setGlobalKeyPath("require");\n\ - ')); - - iframeHTML.push(''); - - iframeHTML.push(scriptTag('\n\ - var pathComponents = parent.parent.location.pathname.split("/");\n\ - var baseURL = pathComponents.slice(0,pathComponents.length-2).join("/") + "/";\n\ - requirejs.config({\n\ - baseUrl: baseURL + "static/plugins",\n\ - paths: {underscore: baseURL + "static/plugins/underscore/underscore"}\n\ - });\n\ - \n\ - requirejs(["ep_etherpad-lite/static/js/rjquery", "ep_etherpad-lite/static/js/pluginfw/client_plugins", "ep_etherpad-lite/static/js/ace2_inner"], function (j, plugins, Ace2Inner) {\n\ - jQuery = $ = window.jQuery = window.$ = j; // Expose jQuery #HACK\n\ - \n\ - plugins.adoptPluginsFromAncestorsOf(window, function () {\n\ - var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");\n\ - hooks.plugins = plugins;\n\ - \n\ - plugins.ensure(function () {\n\ - Ace2Inner.init();\n\ - });\n\ - });\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 = [ - "../static/css/iframe_editor.css", - "../static/css/pad.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(); - })(); + requirejs(["ep_etherpad-lite/static/js/ace2_inner"], function (Ace2Inner) { + 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 f8c2565ea..4bf46d9a9 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -44,7 +44,7 @@ var isNodeText = Ace2Common.isNodeText, htmlPrettyEscape = Ace2Common.htmlPrettyEscape, noop = Ace2Common.noop; -function Ace2Inner(){ +function Ace2Inner(editorInfo){ var makeChangesetTracker = require('./changesettracker').makeChangesetTracker; var colorutils = require('./colorutils').colorutils; @@ -77,13 +77,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; @@ -374,7 +370,7 @@ function Ace2Inner(){ if (currentCallStack) { - console.error("Can't enter callstack " + type + ", already in " + currentCallStack.type); + console.log("Can't enter callstack " + type + ", already in " + currentCallStack.type); } var profiling = false; @@ -475,6 +471,7 @@ function Ace2Inner(){ //console.log("Just did action for: "+type); cleanExit = true; } + /* catch (e) { caughtErrors.push( @@ -485,6 +482,7 @@ function Ace2Inner(){ dmesg(e.toString()); throw e; } +*/ finally { var cs = currentCallStack; @@ -958,7 +956,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); @@ -3264,7 +3262,7 @@ function Ace2Inner(){ function getViewPortTopBottom() { var theTop = getScrollY(); - var doc = outerWin.document; + var doc = window.document; var height = doc.documentElement.clientHeight; return { top: theTop, @@ -3340,10 +3338,6 @@ function Ace2Inner(){ evt.preventDefault(); } } - //hide the dropdownso - if(window.parent.parent.padeditbar){ // required in case its in an iframe should probably use parent.. See Issue 327 https://github.com/ether/etherpad-lite/issues/327 - window.parent.parent.padeditbar.toggleDropDown("none"); - } } function doReturnKey() @@ -3637,15 +3631,15 @@ function Ace2Inner(){ }else{ var lineHeight = myselection.focusNode.offsetHeight; // line height of blank lines } - var heightOfChatIcon = parent.parent.$('#chaticon').height(); // height of the chat icon button + var heightOfChatIcon = $('#chaticon').height(); // height of the chat icon button lineHeight = (lineHeight *2) + heightOfChatIcon; var viewport = getViewPortTopBottom(); var viewportHeight = viewport.bottom - viewport.top - lineHeight; var relCaretOffsetTop = caretOffsetTop - viewport.top; // relative Caret Offset Top to viewport if (viewportHeight < relCaretOffsetTop){ - parent.parent.$("#chaticon").css("opacity",".3"); // make chaticon opacity low when user types near it + $("#chaticon").css("opacity",".3"); // make chaticon opacity low when user types near it }else{ - parent.parent.$("#chaticon").css("opacity","1"); // make chaticon opacity back to full (so fully visible) + $("#chaticon").css("opacity","1"); // make chaticon opacity back to full (so fully visible) } //dmesg("keyevent type: "+type+", which: "+which); @@ -3696,7 +3690,7 @@ function Ace2Inner(){ // Note that while most editors use Alt F10 this is not desirable // As ubuntu cannot use Alt F10.... // Focus on the editbar. -- TODO: Move Focus back to previous state (we know it so we can use it) - var firstEditbarElement = parent.parent.$('#editbar').children("ul").first().children().first().children().first().children().first(); + var firstEditbarElement = $('#editbar').children("ul").first().children().first().children().first().children().first(); $(this).blur(); firstEditbarElement.focus(); evt.preventDefault(); @@ -3704,8 +3698,8 @@ function Ace2Inner(){ if ((!specialHandled) && altKey && keyCode == 67){ // Alt c focuses on the Chat window $(this).blur(); - parent.parent.chat.show(); - parent.parent.chat.focus(); + window.chat.show(); + window.chat.focus(); evt.preventDefault(); } if ((!specialHandled) && evt.ctrlKey && shiftKey && keyCode == 50 && type === "keydown"){ @@ -3744,13 +3738,13 @@ function Ace2Inner(){ } else{ // Known authors info, both current and historical - var padAuthors = parent.parent.pad.userList(); + var padAuthors = window.pad.userList(); var authorObj = {}; authors.forEach(function(authorId){ padAuthors.forEach(function(padAuthor){ // If the person doing the lookup is the author.. if(padAuthor.userId === authorId){ - if(parent.parent.clientVars.userId === authorId){ + if(window.clientVars.userId === authorId){ authorObj = { name: "Me" } @@ -3775,7 +3769,7 @@ function Ace2Inner(){ var authorString = "The authors of this line are " + authorNames.join(" & "); } - parent.parent.$.gritter.add({ + $.gritter.add({ // (string | mandatory) the heading of the notification title: 'Line Authors', // (string | mandatory) the text inside the notification @@ -3810,19 +3804,19 @@ function Ace2Inner(){ //scrollSelectionIntoView(); scheduler.setTimeout(function() { - outerWin.scrollBy(-100, 0); + window.scrollBy(-100, 0); }, 0); specialHandled = true; } if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "s" && (evt.metaKey || evt.ctrlKey) && !evt.altKey) /* Do a saved revision on ctrl S */ { evt.preventDefault(); - var originalBackground = parent.parent.$('#revisionlink').css("background") - parent.parent.$('#revisionlink').css({"background":"lightyellow"}); + var originalBackground = $('#revisionlink').css("background") + $('#revisionlink').css({"background":"lightyellow"}); scheduler.setTimeout(function(){ - parent.parent.$('#revisionlink').css({"background":originalBackground}); + $('#revisionlink').css({"background":originalBackground}); }, 1000); - parent.parent.pad.collabClient.sendMessage({"type":"SAVE_REVISION"}); /* The parent.parent part of this is BAD and I feel bad.. It may break something */ + window.pad.collabClient.sendMessage({"type":"SAVE_REVISION"}); /* The parent.parent part of this is BAD and I feel bad.. It may break something */ specialHandled = true; } if ((!specialHandled) && isTypeForSpecialKey && keyCode == 9 && !(evt.metaKey || evt.ctrlKey)) @@ -4722,6 +4716,7 @@ function Ace2Inner(){ function fixView() { + //return; // TODO: look into this later // calling this method repeatedly should be fast if (getInnerWidth() === 0 || getInnerHeight() === 0) { @@ -4741,7 +4736,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++) @@ -4753,11 +4748,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) { @@ -4767,8 +4762,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) @@ -4793,7 +4788,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(); @@ -4803,8 +4798,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 { @@ -4834,17 +4829,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 = []; @@ -5078,7 +5073,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; @@ -5087,7 +5082,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; @@ -5096,7 +5091,7 @@ function Ace2Inner(){ function getInnerHeight() { - var win = outerWin; + var win = window; var odoc = win.document; var h; if (browser.opera) h = win.innerHeight; @@ -5110,7 +5105,7 @@ function Ace2Inner(){ function getInnerWidth() { - var win = outerWin; + var win = window; var odoc = win.document; return odoc.documentElement.clientWidth; } @@ -5120,8 +5115,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); @@ -5137,8 +5132,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; @@ -5332,7 +5327,7 @@ function Ace2Inner(){ { lineNumbersShown = 1; sideDiv.innerHTML = '
1
'; - sideDivInner = outerWin.document.getElementById("sidedivinner"); + sideDivInner = window.document.getElementById("sidedivinner"); } function updateLineNumbers() @@ -5342,7 +5337,7 @@ function Ace2Inner(){ //update height of all current line numbers var a = sideDivInner.firstChild; - var b = doc.body.firstChild; + var b = innerdocbody.firstChild; var n = 0; if (currentCallStack && currentCallStack.domClean) @@ -5378,8 +5373,9 @@ function Ace2Inner(){ if (newNumLines != lineNumbersShown) { var container = sideDivInner; - var odoc = outerWin.document; + var odoc = window.document; var fragment = odoc.createDocumentFragment(); + while (lineNumbersShown < newNumLines) { lineNumbersShown++; @@ -5458,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; @@ -5467,8 +5463,8 @@ function Ace2Inner(){ } -exports.init = function () { - var editor = new Ace2Inner() +exports.init = function (editorInfo) { + var editor = new Ace2Inner(editorInfo) editor.init(); }; diff --git a/src/static/js/changesettracker.js b/src/static/js/changesettracker.js index fe362c4b7..e1e1c3f8d 100644 --- a/src/static/js/changesettracker.js +++ b/src/static/js/changesettracker.js @@ -173,7 +173,7 @@ function makeChangesetTracker(scheduler, apool, aceCallbacksProvider) } // Get my authorID - var authorId = parent.parent.pad.myUserInfo.userId; + var authorId = window.pad.myUserInfo.userId; // Sanitize authorship // We need to replace all author attribs with thisSession.author, in case they copy/pasted or otherwise inserted other peoples changes diff --git a/src/static/js/chat.js b/src/static/js/chat.js index 2a76cbde5..555781d5e 100644 --- a/src/static/js/chat.js +++ b/src/static/js/chat.js @@ -237,8 +237,8 @@ define([ if (evt.altKey && evt.which == 67){ // Alt c focuses on the Chat window $(this).blur(); - parent.parent.chat.show(); - parent.parent.chat.focus(); + window.chat.show(); + window.chat.focus(); evt.preventDefault(); } }); diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index a3257dfaf..15165642e 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -294,7 +294,7 @@ define([ if (newRev != (rev + 1)) { - parent.parent.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (rev + 1)); + console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (oldRev + 1)); // setChannelState("DISCONNECTED", "badmessage_newchanges"); return; } @@ -318,7 +318,7 @@ define([ if (newRev != (rev + 1)) { - parent.parent.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1)); + console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1)); // setChannelState("DISCONNECTED", "badmessage_acceptcommit"); return; } @@ -343,6 +343,9 @@ define([ setStateIdle(); handleUserChanges(); } + console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1)); + // setChannelState("DISCONNECTED", "badmessage_acceptcommit"); + return; } else if (msg.type == "USER_NEWINFO") { diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 5bd8d662d..181688216 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -276,7 +276,7 @@ define([ pad._afterHandshake(); initalized = true; - $("body").addClass(clientVars.readonly ? "readonly" : "readwrite") + $("#innerdocbody").addClass(clientVars.readonly ? "readonly" : "readwrite") padeditor.ace.callWithAce(function (ace) { ace.ace_setEditable(!clientVars.readonly); diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index ff687e7e8..8acecadf2 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -338,7 +338,7 @@ define([ } }else{ // Focus on the editbar :) - var firstEditbarElement = parent.parent.$('#editbar').children("ul").first().children().first().children().first().children().first(); + var firstEditbarElement = $('#editbar').children("ul").first().children().first().children().first().children().first(); $(this).blur(); firstEditbarElement.focus(); evt.preventDefault(); diff --git a/src/templates/pad.html b/src/templates/pad.html index 8766d774d..47c84a635 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