From 556c8746f60875d5fbf3cf78c9cc8977d1398128 Mon Sep 17 00:00:00 2001 From: tophf Date: Sat, 7 Mar 2015 06:07:25 +0300 Subject: [PATCH 01/10] New style edit: search in all code sections --- edit.js | 1 + 1 file changed, 1 insertion(+) diff --git a/edit.js b/edit.js index f775ddc7..0ad4fbbf 100644 --- a/edit.js +++ b/edit.js @@ -284,6 +284,7 @@ function init() { document.getElementById("enabled").checked = true document.title = t("addStyleTitle"); tE("heading", "addStyleTitle"); + setupGlobalSearch(); return; } // This is an edit From 8844b71aab2c72fb2aa5c5ea4ccd960c399a5f0b Mon Sep 17 00:00:00 2001 From: tophf Date: Sun, 8 Mar 2015 07:42:55 +0300 Subject: [PATCH 02/10] Edit style: fix goto next/prev section after deleting one --- edit.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/edit.js b/edit.js index 0ad4fbbf..7aefa068 100644 --- a/edit.js +++ b/edit.js @@ -177,7 +177,12 @@ function removeAppliesTo(event) { } function removeSection(event) { - event.target.parentNode.parentNode.removeChild(event.target.parentNode); + var section = event.target.parentNode; + var cm = section.querySelector(".CodeMirror-wrap"); + if (cm && editors.indexOf(cm.CodeMirror) >= 0) { + editors.splice(editors.indexOf(cm.CodeMirror), 1); + } + section.parentNode.removeChild(section); makeDirty(); } From f654cc734facacc352ae611a45555ebbf7682cfa Mon Sep 17 00:00:00 2001 From: tophf Date: Wed, 11 Mar 2015 03:00:44 +0300 Subject: [PATCH 03/10] Edit style: remember detached window position and size --- edit.js | 6 ++++++ popup.js | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/edit.js b/edit.js index 7aefa068..99c756dc 100644 --- a/edit.js +++ b/edit.js @@ -69,6 +69,12 @@ function makeDirty() { } window.onbeforeunload = function() { + prefs.setPref('windowPosition', { + left: screenLeft, + top: screenTop, + width: outerWidth, + height: outerHeight + }); return dirty || isCodeDirty() ? t('styleChangesNotSaved') : null; } diff --git a/popup.js b/popup.js index 136f3588..97801709 100644 --- a/popup.js +++ b/popup.js @@ -144,7 +144,10 @@ function getId(event) { function openLinkInTabOrWindow(event) { event.preventDefault(); if (prefs.getPref('openEditInWindow', false)) { - chrome.windows.create({url: event.target.href}); + var options = {url: event.target.href} + var wp = prefs.getPref('windowPosition', {}); + for (var k in wp) options[k] = wp[k]; + chrome.windows.create(options); } else { openLink(event); } From c084ea3973b48050fd5311bd68fc8273b0b701ed Mon Sep 17 00:00:00 2001 From: tophf Date: Wed, 11 Mar 2015 00:48:42 +0300 Subject: [PATCH 04/10] Edit style: retain scroll position of window & editor --- edit.js | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/edit.js b/edit.js index 99c756dc..2d82defb 100644 --- a/edit.js +++ b/edit.js @@ -1,5 +1,6 @@ var styleId = null; var dirty = false; +var lockScroll; // ensure the section doesn't jump when clicking selected text var appliesToTemplate = document.createElement("li"); appliesToTemplate.innerHTML = ''; @@ -53,17 +54,53 @@ function setupCodeMirror(textarea) { var section = cm.display.wrapper.parentNode; var bounds = section.getBoundingClientRect(); if ((bounds.bottom > window.innerHeight && bounds.top > 0) || (bounds.top < 0 && bounds.bottom < window.innerHeight)) { - if (bounds.top > window.innerHeight || bounds.top < 0) { - section.scrollIntoView(); + lockScroll = null; + if (bounds.top < 0) { + window.scrollBy(0, bounds.top - 1); } else { window.scrollBy(0, bounds.bottom - window.innerHeight + 1); } + + // prevent possible double fire of selection change event induced by window.scrollBy + var selectionChangeCount = 0, selection; + function beforeSelectionChange(cm, obj) { + if (++selectionChangeCount == 1) { + selection = obj.ranges; + } else { + obj.update(selection); + cm.off("beforeSelectionChange", beforeSelectionChange); + } + } + cm.on("beforeSelectionChange", beforeSelectionChange); + setTimeout(function() { + cm.off("beforeSelectionChange", beforeSelectionChange) + }, 200); } }); + // ensure the section doesn't jump when clicking selected text + cm.on("cursorActivity", function(cm) { + setTimeout(function() { + lockScroll = { + windowScrollY: window.scrollY, + editor: cm, + editorScrollInfo: cm.getScrollInfo() + } + }, 0); + }); + editors.push(cm); } +// ensure the section doesn't jump when clicking selected text +document.addEventListener("scroll", function(e) { + if (lockScroll && lockScroll.windowScrollY != window.scrollY) { + window.scrollTo(0, lockScroll.windowScrollY); + lockScroll.editor.scrollTo(lockScroll.editorScrollInfo.left, lockScroll.editorScrollInfo.top); + lockScroll = null; + } +}); + function makeDirty() { dirty = true; } From 464d3eb30db9b28fb17f22b89bdcc16472b133e4 Mon Sep 17 00:00:00 2001 From: tophf Date: Wed, 11 Mar 2015 23:02:02 +0300 Subject: [PATCH 05/10] Edit style: save on Ctrl-S outside code blocks too --- edit.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/edit.js b/edit.js index 2d82defb..c06e27f9 100644 --- a/edit.js +++ b/edit.js @@ -101,6 +101,13 @@ document.addEventListener("scroll", function(e) { } }); +document.addEventListener("keydown", function(e) { + if (e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey && e.keyCode == 83) { + e.preventDefault(); + save(); + } +}); + function makeDirty() { dirty = true; } From b7fb1f14e1c0f93e6b5acb49e6dceb6ec10c861d Mon Sep 17 00:00:00 2001 From: tophf Date: Wed, 11 Mar 2015 23:04:20 +0300 Subject: [PATCH 06/10] Edit style: warn on losing changes to applies-to fields --- edit.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/edit.js b/edit.js index c06e27f9..6b526039 100644 --- a/edit.js +++ b/edit.js @@ -154,7 +154,7 @@ function addAppliesTo(list, name, value) { e.querySelector("[name=applies-type]").value = name; e.querySelector("[name=applies-value]").value = value; e.querySelector(".remove-applies-to").addEventListener("click", removeAppliesTo, false); - e.querySelector(".applies-value").addEventListener("change", makeDirty, false); + e.querySelector(".applies-value").addEventListener("input", makeDirty, false); e.querySelector(".applies-type").addEventListener("change", makeDirty, false); } else if (showingEverything || list.hasChildNodes()) { e = appliesToTemplate.cloneNode(true); @@ -162,7 +162,7 @@ function addAppliesTo(list, name, value) { e.querySelector("[name=applies-type]").value = list.querySelector("li:last-child [name='applies-type']").value; } e.querySelector(".remove-applies-to").addEventListener("click", removeAppliesTo, false); - e.querySelector(".applies-value").addEventListener("change", makeDirty, false); + e.querySelector(".applies-value").addEventListener("input", makeDirty, false); e.querySelector(".applies-type").addEventListener("change", makeDirty, false); } else { e = appliesToEverythingTemplate.cloneNode(true); From b8c918e502484d9ab8b0c7f1381fdaf99b5ca517 Mon Sep 17 00:00:00 2001 From: tophf Date: Wed, 11 Mar 2015 23:28:54 +0300 Subject: [PATCH 07/10] Mostly mute CSSLint, re-enable gutter marks, hide squiggles Only these rules are enabled: * Parsing Errors * Disallow empty rules * Require use of known properties * Require properties appropriate for display --- codemirror/addon/lint/css-lint.js | 10 ++++++++++ edit.html | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/codemirror/addon/lint/css-lint.js b/codemirror/addon/lint/css-lint.js index 1f61b479..dac31f93 100644 --- a/codemirror/addon/lint/css-lint.js +++ b/codemirror/addon/lint/css-lint.js @@ -18,6 +18,16 @@ CodeMirror.registerHelper("lint", "css", function(text) { var found = []; if (!window.CSSLint) return found; + + var rules = CSSLint.getRules(); + var allowedRules = ["display-property-grouping", "empty-rules", "errors", "known-properties"]; + CSSLint.clearRules(); + rules.forEach(function(rule) { + if (allowedRules.indexOf(rule.id) >= 0) { + CSSLint.addRule(rule); + } + }); + var results = CSSLint.verify(text), messages = results.messages, message = null; for ( var i = 0; i < messages.length; i++) { message = messages[i]; diff --git a/edit.html b/edit.html index 63383e4f..07d2537d 100644 --- a/edit.html +++ b/edit.html @@ -143,8 +143,8 @@ .applies-to img { vertical-align: bottom; } - .CodeMirror-lint-marker-warning { - display: none; + .CodeMirror-lint-mark-warning { + background: none; } @media(max-width:737px) { From 55538f808d583e0f85c6d1ab912c537b5ca9e15f Mon Sep 17 00:00:00 2001 From: tophf Date: Thu, 12 Mar 2015 13:17:59 +0300 Subject: [PATCH 08/10] Edit style: allow adding sections midway, autofocus on manual add --- edit.html | 4 ---- edit.js | 22 ++++++++++++++++------ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/edit.html b/edit.html index 07d2537d..16588c1f 100644 --- a/edit.html +++ b/edit.html @@ -134,10 +134,6 @@ display: none; } #sections > div .add-section { - display: none; - } - #sections > div:last-of-type .add-section { - display: inline; margin-left: 0.4em; } .applies-to img { diff --git a/edit.js b/edit.js index 6b526039..b69031fe 100644 --- a/edit.js +++ b/edit.js @@ -171,11 +171,11 @@ function addAppliesTo(list, name, value) { list.appendChild(e); } -function addSection(section) { +function addSection(event, section) { var div = sectionTemplate.cloneNode(true); div.querySelector(".applies-to-help").addEventListener("click", showAppliesToHelp, false); div.querySelector(".remove-section").addEventListener("click", removeSection, false); - div.querySelector(".add-section").addEventListener("click", function() {addSection()}, false); + div.querySelector(".add-section").addEventListener("click", addSection, false); var appliesTo = div.querySelector(".applies-to-list"); @@ -211,8 +211,18 @@ function addSection(section) { } var sections = document.getElementById("sections"); - sections.appendChild(div); - setupCodeMirror(div.querySelector('.code')); + var section = event ? event.target.parentNode : null; + if (event && section.nextElementSibling) { + sections.insertBefore(div, section.nextElementSibling); + } else { + sections.appendChild(div); + } + var cm = setupCodeMirror(div.querySelector('.code')); + if (section) { + var index = Array.prototype.indexOf.call(sections.children, section); + editors.splice(index, 0, editors.pop()); + cm.focus(); + } } function removeAppliesTo(event) { @@ -334,7 +344,7 @@ function init() { } else if (params["url-prefix"]) { section.urlPrefixes = [params["url-prefix"]]; } - addSection(section); + addSection(null, section); // default to enabled document.getElementById("enabled").checked = true document.title = t("addStyleTitle"); @@ -359,7 +369,7 @@ function initWithStyle(style) { Array.prototype.forEach.call(document.querySelectorAll("#sections > div"), function(div) { div.parentNode.removeChild(div); }); - style.sections.forEach(addSection); + style.sections.forEach(function(section) { addSection(null, section) }); setupGlobalSearch(); } From 0be6f6dfe440339a7e20f5d203722ee0deaab2cd Mon Sep 17 00:00:00 2001 From: tophf Date: Thu, 12 Mar 2015 20:41:06 +0300 Subject: [PATCH 09/10] Edit style: remove CodeMirror's Ctrl-S handler, now redundant --- edit.js | 1 - 1 file changed, 1 deletion(-) diff --git a/edit.js b/edit.js index b69031fe..40a3ec54 100644 --- a/edit.js +++ b/edit.js @@ -16,7 +16,6 @@ sectionTemplate.innerHTML = '