From 57c5f11aaeabd86f7bf9a94f33a06d01b82e3a60 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 16 Oct 2013 14:37:08 +0200 Subject: [PATCH 01/14] [FIX] don't use mutation events if unnecessary Mutation events are synchronous and one is triggered per observed alteration (they're not batched). When doing lots of modifications to the DOM tree, they will add a lot of overhead as (in this case) the event handler will run for *each* added node and it will run during (and slow down) node insertion rather than afterwards. bzr revid: xmo@openerp.com-20131016123708-lx389x0g6xs6zu10 --- addons/website/static/src/js/website.editor.js | 4 ++-- addons/website/static/src/js/website.snippets.js | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js index aef390027c5..a1b8ffdb9ee 100644 --- a/addons/website/static/src/js/website.editor.js +++ b/addons/website/static/src/js/website.editor.js @@ -927,7 +927,7 @@ } - var Observer = window.MutationObserver || window.WebkitMutationObserver || window.JsMutationObserver; + website.Observer = window.MutationObserver || window.WebkitMutationObserver || window.JsMutationObserver; var OBSERVER_CONFIG = { childList: true, attributes: true, @@ -935,7 +935,7 @@ subtree: true, attributeOldValue: true, }; - var observer = new Observer(function (mutations) { + var observer = new website.Observer(function (mutations) { // NOTE: Webkit does not fire DOMAttrModified => webkit browsers // relying on JsMutationObserver shim (Chrome < 18, Safari < 6) // will not mark dirty on attribute changes (@class, img/@src, diff --git a/addons/website/static/src/js/website.snippets.js b/addons/website/static/src/js/website.snippets.js index 5f6d8b5073c..17dd829708f 100644 --- a/addons/website/static/src/js/website.snippets.js +++ b/addons/website/static/src/js/website.snippets.js @@ -45,7 +45,14 @@ /* ----- SNIPPET SELECTOR ---- */ website.snippet = {}; - + var observer = new website.Observer(function (mutations) { + if (!_(mutations).find(function (m) { + return m.type === 'childList' && m.addedNodes.length > 0; + })) { + return; + } + hack_to_add_snippet_id() + }); // puts $el at the same absolute position as $target function hack_to_add_snippet_id () { @@ -80,7 +87,11 @@ this.$active_snipped_id = false; hack_to_add_snippet_id(); this.snippets = []; - $("body").on('DOMNodeInserted', hack_to_add_snippet_id); + + observer.observe(document.body, { + childList: true, + subtree: true, + }); }, dom_filter: function (dom, sibling) { if (typeof dom === "string") { From 1625eb29ae716874761626e31e99c493fb90dcdb Mon Sep 17 00:00:00 2001 From: ddm Date: Wed, 16 Oct 2013 16:39:39 +0200 Subject: [PATCH 02/14] [FIX] SEO metadata saving bzr revid: ddm@openerp.com-20131016143939-v0v1tcopq4zoqgxf --- addons/website/static/src/js/website.seo.js | 52 ++++++++++++++----- addons/website/static/src/xml/website.seo.xml | 3 +- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/addons/website/static/src/js/website.seo.js b/addons/website/static/src/js/website.seo.js index 0d20253290a..4413f628afa 100644 --- a/addons/website/static/src/js/website.seo.js +++ b/addons/website/static/src/js/website.seo.js @@ -241,7 +241,8 @@ return hashIndex >= 0 ? url.substring(0, hashIndex) : url; }, title: function () { - return ($('title').length > 0) && $('title').text() && $('title').text().trim(); + var $title = $('title'); + return ($title.length > 0) && $title.text() && $title.text().trim(); }, changeTitle: function (title) { // TODO create tag if missing @@ -250,7 +251,7 @@ }, description: function () { var $description = $('meta[name=description]'); - return ($description.length > 0) && $description.attr('value') && $description.attr('value').trim(); + return ($description.length > 0) && ($description.attr('value') && $description.attr('value').trim()); }, changeDescription: function (description) { // TODO create tag if missing @@ -331,13 +332,13 @@ $modal.find('.js_seo_page_url').text(htmlPage.url()); $modal.find('input[name=seo_page_title]').val(htmlPage.title()); $modal.find('textarea[name=seo_page_description]').val(htmlPage.description()); - self.suggestImprovements(); - self.imageList = new website.seo.ImageList(self, { page: htmlPage }); - if (htmlPage.images().length === 0) { - $modal.find('.js_image_section').remove(); - } else { - self.imageList.appendTo($modal.find('.js_seo_image_list')); - } + // self.suggestImprovements(); + // self.imageList = new website.seo.ImageList(self, { page: htmlPage }); + // if (htmlPage.images().length === 0) { + // $modal.find('.js_image_section').remove(); + // } else { + // self.imageList.appendTo($modal.find('.js_seo_image_list')); + // } self.keywordList = new website.seo.KeywordList(self, { page: htmlPage }); self.keywordList.on('list-full', self, function () { $modal.find('input[name=seo_page_keywords]') @@ -356,8 +357,26 @@ self.keywordList.add(word); }); self.keywordList.appendTo($modal.find('.js_seo_keywords_list')); + self.disableUnsavableFields(); $modal.modal(); }, + disableUnsavableFields: function () { + var $modal = this.$el; + this.loadMetaData().then(function (data) { + var canEditTitle = data && ('website_meta_title' in data); + var canEditDescription = data && ('website_meta_description' in data); + var canEditKeywords = data && ('website_meta_keywords' in data); + if (!canEditTitle) { + $modal.find('input[name=seo_page_title]').attr('disabled', true); + } + if (!canEditDescription) { + $modal.find('textarea[name=seo_page_description]').attr('disabled', true); + } + if (!canEditTitle && !canEditDescription && !canEditKeywords) { + $modal.find('button[data-action=update]').attr('disabled', true); + } + }); + }, suggestImprovements: function () { var tips = []; var self = this; @@ -397,11 +416,16 @@ }, update: function () { var self = this; - var data = { - website_meta_title: self.htmlPage.title(), - website_meta_description: self.htmlPage.description(), - website_meta_keywords: self.keywordList.keywords().join(", "), - }; + var data = {}; + if (!this.htmlPage.isTitleEditable()) { + data.website_meta_title = self.htmlPage.title(); + } + if (!this.htmlPage.isDescriptionEditable()) { + data.website_meta_description = self.htmlPage.description(); + } + if (!this.htmlPage.isKeywordsEditable()) { + data.website_meta_keywords = self.keywordList.keywords().join(", "); + } self.saveMetaData(data).then(function () { self.$el.modal('hide'); }); diff --git a/addons/website/static/src/xml/website.seo.xml b/addons/website/static/src/xml/website.seo.xml index 96a38a75d32..580779283ad 100644 --- a/addons/website/static/src/xml/website.seo.xml +++ b/addons/website/static/src/xml/website.seo.xml @@ -48,12 +48,13 @@ + + -->