>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Проверка расширений волидатором мозиллы перед заливкой http://forum.mozilla-russia.org/viewtopic.php?id=57395 |
Magneto > 13-12-2012 14:35:43 |
При заливке расширения на Мозиллу (https://addons.mozilla.org/ru/firefox/) оно проходит автоматическое тестирование. Выделить код Код:nsRDS.uniqueName = (function () { var uniqueA, uniqueB, uniqueC; return { methodA : function () { uniqueA = 'test A'; uniqueA += ' string'; console.log(uniqueA); }, methodB : function () { uniqueB = 'test B'; uniqueB += ' 3333'; console.log(uniqueB); }, methodC : function () { uniqueC = 'test C'; uniqueC += ' ----'; console.log(uniqueC); }, methodABC : function () { console.log(uniqueA + ' @@ ' + uniqueB + ' @@ ' + uniqueC); } }; }()); мы получим ответ что переменные: uniqueA, uniqueB, uniqueC - являются глобальными. Но это не так, переменные находятся в scope анонимной функции. Кто как поступает в данной ситуации? |
Почемучкин > 16-12-2012 00:23:30 |
А ты попробуй описывать функции вне описания объекта. Наверное их парсер не рассчитан на такие сложности. |
hydrolizer > 16-12-2012 07:42:54 |
Magneto Выделить код Код:nsRDS.uniqueName = (function () { var uniqueA, uniqueB, uniqueC; Components.classes["@mozilla.org/consoleservice;1"] .getService(Components.interfaces.nsIConsoleService) .logStringMessage(this); return { methodA : function () { uniqueA = 'test A'; uniqueA += ' string'; console.log(uniqueA); }, methodB : function () { uniqueB = 'test B'; uniqueB += ' 3333'; console.log(uniqueB); }, methodC : function () { uniqueC = 'test C'; uniqueC += ' ----'; console.log(uniqueC); }, methodABC : function () { console.log(uniqueA + ' @@ ' + uniqueB + ' @@ ' + uniqueC); } }; }()); - в консоль при загрузке скрипта будет выведено [object ChromeWindow]. А на АМО нервно относятся к таким инжектам. Выделить код Код:if (typeof(somefoo)=="undefined") { var somefoo= { lib$: function() { Components.utils.import("resource://myextension/utils/NSMediator.jsm",this); // модуль namespace-медиатора // Объявление нужных глобальных свойств, импорт модулей Object.defineProperty(this, "Cc", {get: function(){ return Components.classes; }}); Object.defineProperty(this, "Ci", {get: function(){ return Components.interfaces; }}); Object.defineProperty(this, "Cu", {get: function(){ return Components.utils; }}); Object.defineProperty(this, "moduleId", {get: function(){ return "[somefoo.lib]"; }}); Components.utils.import("resource://gre/modules/Services.jsm", this); Components.utils.import("resource://gre/modules/Dict.jsm", this); } }; somefoo.lib$.prototype= { toString: function(){ return this.moduleId}, // прочие функции глобального назначения }; } if (typeof(somefoo.lib)=="undefined") somefoo.lib=new somefoo.lib$(); и оверлейно-оконный прикладной код: Выделить код Код:somefoo.lib.someExtensionMediator.NS(function() { with(somefoo.lib) var module= { toString: function() { return "[somefoo.overlay]"; }, // и далее прикладная логика }; Object.defineProperty(this,"module",{get: function() {return module;}}); }, "overlay"); // строковый идентификатор неймспейса Вроде как при последней загрузке на АМО их валидатор мне ничего не пенял про namespace pollution. |