Re[5]: Ой, чего с JavaScript-то деется...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 04.03.07 12:25
Оценка: +1
Здравствуйте, c-smile, Вы писали:

AVK>>Не совсем такое же. Я предлагаю вобще никаких ограничений на сам язык не накладывать в стандарте. Ну или сделать отдельный стандарт.


CS>Сложно. Ибо байткод зело языко-ориентирован.


На платформе CLR есть и эйфель, и F#, и классические С# и C++. Для целей написания скриптов более чем.
... << RSDN@Home 1.2.0 alpha rev. 675 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[8]: Ой, чего с JavaScript-то деется...
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.03.07 15:53
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Это кто-то другой неадекватен.


Гы-гы.

CS> Я лично пользую IE6 ибо это объективно лучший движок.


Ты? И что? А я пользуюсь IE7 на додной машине и IE6 на другой. IE7 в использовании удобнее. С точке зрения скорости работы мне они оба фиолетовы. Я разницы не замечаю.

CS>Вот таблица упорядоченная по времени на рендеринг CSS.


Да плевать подавляющему большинству народа на какие-то там цифорки. Ты совершенно не адекватен.

IE7 будет на подавляющем большинстве компьютеров просто потом что он идет во всех апдэйтах и ставится с новыми версиями ОС.

Так что это буквально дело времени.

Если в IE7 есть ошибка, и она будет напрягать хоть немного заметную долю аудитории, то глюк вычистят и выпустят патч. Тольк и всего. Так что я вообще не понимаю твоих "обличительных речей".

Еще раз повтор, ты совершенно неадекватно воспринимаешь реальность.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Ой, чего с JavaScript-то деется...
От: Cyberax Марс  
Дата: 04.03.07 16:16
Оценка: +1
VladD2 wrote:
> Если в IE7 есть ошибка, и она будет напрягать хоть немного заметную долю
> аудитории, то глюк вычистят и выпустят патч. Тольк и всего. Так что я
> вообще не понимаю твоих "обличительных речей".
У меня стоит IE7, я им пользуюсь для тестирования. Это такая $#%^$*#$# —
тормозит и глючит даже на простых страницах. Даже IE6 был лучше.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[5]: Тормозная презентация?
От: Lloyd Россия  
Дата: 04.03.07 16:17
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>В IE7 смотрим небось?


В IE7 она нормально показывается.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Ой, чего с JavaScript-то деется...
От: c-smile Канада http://terrainformatica.com
Дата: 04.03.07 19:28
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, c-smile, Вы писали:


AVK>>>Не совсем такое же. Я предлагаю вобще никаких ограничений на сам язык не накладывать в стандарте. Ну или сделать отдельный стандарт.


CS>>Сложно. Ибо байткод зело языко-ориентирован.


AVK>На платформе CLR есть и эйфель, и F#, и классические С# и C++. Для целей написания скриптов более чем.


CLR байткод не подходит для эффективной имплементации скриптовых языков. Операции с typeless типами например достаточно накладны.
Да и вообще... bytecode скриптового языка компактнее по количеству комманд и с другой стороны более ёмок что-ли.
Например у меня команда BC_OUTPUT делает вывод аккумулятора в stdout (нужно для PHP alike processing).
Можно было бы её разложить на три BC_GREF/stdout, BC_LIT/println, BC_CALL но это в три раза медленнее.
И такая специфика есть у каждого языка.
Re[9]: Ой, чего с JavaScript-то деется...
От: c-smile Канада http://terrainformatica.com
Дата: 04.03.07 19:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, c-smile, Вы писали:


CS>>Это кто-то другой неадекватен.


VD>Гы-гы.


CS>> Я лично пользую IE6 ибо это объективно лучший движок.


VD>Ты? И что? А я пользуюсь IE7 на додной машине и IE6 на другой. IE7 в использовании удобнее. С точке зрения скорости работы мне они оба фиолетовы. Я разницы не замечаю.


Где-то я это слышал уже... "а зато душа у нея красивая"...

CS>>Вот таблица упорядоченная по времени на рендеринг CSS.


VD>Да плевать подавляющему большинству народа на какие-то там цифорки. Ты совершенно не адекватен.


Это у тебя мантра такая "Ты совершенно не адекватен"?

VD>IE7 будет на подавляющем большинстве компьютеров просто потом что он идет во всех апдэйтах и ставится с новыми версиями ОС.


Ты логи сайта давно смотрел? Особенно статистику по броузерам?

VD>Так что это буквально дело времени.


VD>Если в IE7 есть ошибка, и она будет напрягать хоть немного заметную долю аудитории, то глюк вычистят и выпустят патч. Тольк и всего. Так что я вообще не понимаю твоих "обличительных речей".


VD>Еще раз повтор, ты совершенно неадекватно воспринимаешь реальность.


Влад, я не пойму, тебе потрындеть просто хочется или как? О чем вся эта лирика?

Тормоза броузера просекаются на первом же stress test. Если кто-то не исполнил этот элементарный
стресс тест перед выпуском то это значит что никому не нужно было или все согласились "ну и фиг с ним".
О чем я и говорил собственно.
Re[7]: Ой, чего с JavaScript-то деется...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 04.03.07 20:43
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>CLR байткод не подходит для эффективной имплементации скриптовых языков.


Я думаю, "неэффективный" JScript.NET сделает по производительности оригинальный JScript как котенка. Если есть иные данные — велкам.

CS>Да и вообще... bytecode скриптового языка компактнее по количеству комманд и с другой стороны более ёмок что-ли.


Я сейчас не хочу обсуждать гипотетическую виртуальную машину скриптового языка vs CLR. Речь о другом. CLR был приведен исключительно в качестве иллюстрации того, что даже строго типизированная VM оказывается способна выполнять очень широкий спектр языков. В случае интерпретируемой VM этого достичь будет только проще.
... << RSDN@Home 1.2.0 alpha rev. 675 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[8]: Ой, чего с JavaScript-то деется...
От: c-smile Канада http://terrainformatica.com
Дата: 05.03.07 05:05
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, c-smile, Вы писали:


CS>>CLR байткод не подходит для эффективной имплементации скриптовых языков.


AVK>Я думаю, "неэффективный" JScript.NET сделает по производительности оригинальный JScript как котенка. Если есть иные данные — велкам.


Может да, а может нет.

Если код сугубо typeless то выигрыша в том что это в .NET мало.
typless value как я понимаю в CLR будет выглядеть как ссылка на объект а все возможные
типы/знначения это boxed конструкции. Ожидать особой эффективности от такого решения сложно.
Это и расход памяти и работа для GC на пустом месте ну и скорость работы с виртуальным функциями.

Я могу ошибаться по поводу эффективного способа представления discriminated union (a.k.a. variant) в .net
поэтому буду признателен если кто подскажет верный путь.


CS>>Да и вообще... bytecode скриптового языка компактнее по количеству комманд и с другой стороны более ёмок что-ли.


AVK>Я сейчас не хочу обсуждать гипотетическую виртуальную машину скриптового языка vs CLR. Речь о другом. CLR был приведен исключительно в качестве иллюстрации того, что даже строго типизированная VM оказывается способна выполнять очень широкий спектр языков. В случае интерпретируемой VM этого достичь будет только проще.


Да наверное можно было бы за основу взять WMLScript спецификацию и сделать на её основе нечто.
Если все бы согласились с предлагаемой архитектурой VM которая жестко вшита в bytecode.
Re[7]: Ой, чего с JavaScript-то деется...
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.03.07 06:10
Оценка:
Здравствуйте, AndrewVK, Вы писали:
AVK>IE8 сейчас уже разрабатывается. Я в свое время накатал им довольно объемистую телегу насчет того, что я там увидеть желаю.
У нее случайно публичного статуса нет, чтобы мы проголосовали?

Я бы кстати с удовольствием пообсуждал с народом (типа c-smile) вопросы существующих браузеров, чтобы сформировать свое мнение.
У меня лично есть некоторый набор пожеланий, но он довольно-таки размазанный и нечеткий. Потому как существенных изменений ожидать не приходится; а с несущественными мы и сами научились бороться. Даже неумение IE работать с альфаканалом в PNG и то было заборото.
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Ой, чего с JavaScript-то деется...
От: anonymous Россия http://denis.ibaev.name/
Дата: 05.03.07 06:36
Оценка:
Здравствуйте, c-smile, Вы писали:

A>>Мы видим, что стало с IE после уничтожения соперников. Тебе хочется повторения? Я за конкуренцию.

CS>А что с ним собственно стало?

Застой. Развитие прекратилось.
Re[8]: Ой, чего с JavaScript-то деется...
От: anonymous Россия http://denis.ibaev.name/
Дата: 05.03.07 06:52
Оценка:
Здравствуйте, c-smile, Вы писали:

A>>Мы видим, что стало с IE после уничтожения соперников. Тебе хочется повторения? Я за конкуренцию.

CS>Проблема в том что броузеро-строители озабочены нонче сугубо исполнению стандарта.
CS>Задача же создания действительно удобной модели как оказалось ортогональна деятельности
CS>создателей W3C DOM.

Сейчас уже поздно отказываться от существующей модели, поэтому спорить бессмысленно. Да, многим не нравится, но это всё, что у нас есть.

CS>IE своей монополией в свое время ввел DHTML что есть основа всего того чего мы имеем.


+

CS>Сейчас же любое отклонение вызывает битье по пальцам.

CS>Я бы понял если бы механизм разработки сиандартов был более динамичным что-ли тогда можно было бы
CS>ожидать какого-нибудь прогресса. А так...

Что ты понимаешь под более динамичным механизмом разработки стандартов?

CS>Вон WHATWG выдумала XBL и усиленно толкает — зачем оно такое?


Вон Microsoft придумала HTC — аналогичный вопрос. И мне казалость, что XBL придумали в Mozilla, а уж WHATWG получила его от них. Кстати, за него взялить и в W3C, уже есть working draft sXBL aka XBL 2.0.

CS>Т.е. имеем HTML + CSS + JavaScript и этого оказывается мало для того чтобы

CS>свзать класс элементов с обработчиками событий в скрипте — нужно все-таки XML воткнуть туда в виде
CS>еще одного языка. Типа чтобы web developers не скучали.

Ну а как ещё новые поведение и свойства добавлять элементам?
Re[8]: Ой, чего с JavaScript-то деется...
От: anonymous Россия http://denis.ibaev.name/
Дата: 05.03.07 06:54
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Я бы кстати с удовольствием пообсуждал с народом (типа c-smile) вопросы существующих браузеров, чтобы сформировать свое мнение.

S>У меня лично есть некоторый набор пожеланий, но он довольно-таки размазанный и нечеткий.

Так опубликуй этот набор.
Re[7]: Ой, чего с JavaScript-то деется...
От: anonymous Россия http://denis.ibaev.name/
Дата: 05.03.07 06:59
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>CLR байткод не подходит для эффективной имплементации скриптовых языков. Операции с typeless типами например достаточно накладны.


Для скриптовых языков есть виртуальная машина Parrot: http://www.parrotcode.org/
Re[9]: Ой, чего с JavaScript-то деется...
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.03.07 08:43
Оценка: 12 (1) +1
Здравствуйте, anonymous, Вы писали:

A>Так опубликуй этот набор.

Ну вот например, многие ли знают об атрибутах accept и size для <input type=file>? А они между прочим стандартизованы еще десять лет назад в HTML 3.2. Я был бы не против поддержки этой возможности.
Я также очень бы хотел иметь возможность регистрировать Web Publishing Providers, Image Print Providers и Music Providers в пост-XP системах без правки реестра. Примерно так, как регистрируются Search Provider в IE 7.0. Без этого возможность выглядит совершенно дурацкой: для того, чтобы зарегистировать чисто онлайновый сервис на клиентской машине, пользователь вынужден запускать исполняемый код и оказывать ему офигенное доверие.
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: Ой, чего с JavaScript-то деется...
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.03.07 08:43
Оценка: +1
Здравствуйте, anonymous, Вы писали:
A>Ну а как ещё новые поведение и свойства добавлять элементам?
Через HTML+CSS+JavaScript.
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: Ой, чего с JavaScript-то деется...
От: Mamut Швеция http://dmitriid.com
Дата: 05.03.07 09:12
Оценка:
A>Ну а как ещё новые поведение и свойства добавлять элементам?

Например, вот так:
// http://jquery.com/

// работаем со всеми элементами а на странице

$("a")
    .click(
        function(){alert('Hello, World'); return false;}
    )
    .attr("class", "myclass")


dmitriid.comGitHubLinkedIn
Re[8]: Ой, чего с JavaScript-то деется...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.03.07 09:20
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>У нее случайно публичного статуса нет, чтобы мы проголосовали?


Нет. А тебе что, этот survey не приходил?
А вобще, Ложечкин обещал познакомить с русскими товарищами из IE team, так что у тебя будет возможность рассказать о своих пожеланиях лично.

S>Я бы кстати с удовольствием пообсуждал с народом (типа c-smile) вопросы существующих браузеров, чтобы сформировать свое мнение.


Типа c-smile бессмысленно, бо там речь шла не о фичах движка, а о пользовательских фичах.

S>Даже неумение IE работать с альфаканалом в PNG и то было заборото.


Так починили же в IE7.
... << RSDN@Home 1.2.0 alpha rev. 675>>
AVK Blog
Re[9]: Ой, чего с JavaScript-то деется...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.03.07 09:30
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Может да, а может нет.


Ну то есть ты сам не знаешь, но споришь. Похвально.

CS>Если код сугубо typeless то выигрыша в том что это в .NET мало.


А проигрыша?

CS>типы/знначения это boxed конструкции. Ожидать особой эффективности от такого решения сложно.


Ожидать эффективности от интерпретаторов тоже сложно.

CS>Это и расход памяти и работа для GC на пустом месте ну и скорость работы с виртуальным функциями.


Смешно. Учитывая, как сейчас тормозит JScript на примитивнейших алгоритмах, рассуждать о тормозах вирутальных функций ...

CS>Я могу ошибаться по поводу эффективного способа представления discriminated union (a.k.a. variant) в .net


Есть там FieldOffsetAttribute. Только это все фигня по сравнению с тормозами интерпретаторов. И еще раз тебе напоминаю — CLR приведен в качестве иллюстрации, а не в качестве готового решения.

CS>Если все бы согласились с предлагаемой архитектурой VM которая жестко вшита в bytecode.


Ну с JavaScript же согласились, а это куда более жесткое оганичение.
... << RSDN@Home 1.2.0 alpha rev. 675>>
AVK Blog
Re[10]: Ой, чего с JavaScript-то деется...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.03.07 09:30
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>У меня стоит IE7, я им пользуюсь для тестирования. Это такая $#%^$*#$# —

C>тормозит и глючит даже на простых страницах. Даже IE6 был лучше.

А у меня стоит IE7, и никакого ухудшения по сравнению с IE6 я не заметил.
... << RSDN@Home 1.2.0 alpha rev. 675>>
AVK Blog
Re[10]: Ой, чего с JavaScript-то деется...
От: anonymous Россия http://denis.ibaev.name/
Дата: 05.03.07 09:31
Оценка: :)
Здравствуйте, Mamut, Вы писали:

A>>Ну а как ещё новые поведение и свойства добавлять элементам?

M>Например, вот так:
M>
M>$("a")
M>    .click(
M>        function(){alert('Hello, World'); return false;}
M>    )
M>    .attr("class", "myclass")
M>


Атрибут это не свойство (хотя в MS так не думают). Да и свойсво click ты не добавил, а изменил его значение.

А как тебе такое? Правда это не HTML, а XUL. (Извиняюсь, за большой кусок кода, посто это один рально работающий binding.)
    <binding id="my-button"
            extends="chrome://global/content/bindings/toolbarbutton.xml#toolbarbutton-image">
        <implementation implements="nsIObserver">
            <constructor><![CDATA[
                // Initialize data source.
                var name = Components
                        .classes['@mozilla.org/network/io-service;1']
                        .getService(Components.interfaces.nsIIOService)
                        .getProtocolHandler("file")
                        .QueryInterface(Components.interfaces.nsIFileProtocolHandler)
                        .getURLSpecFromFile(this.dataFile);

                this.dataSource = this.rdfService.GetDataSourceBlocking(name);

                // Initialize current search engine.
                setTimeout(function(aThis) { aThis.searchEngine = aThis.searchBar.currentEngine; }, 0, this);

                // Add "browser-search-engine-modified" notification observer.
                Components
                        .classes["@mozilla.org/observer-service;1"]
                        .getService(Components.interfaces.nsIObserverService)
                        .addObserver(this, "browser-search-engine-modified", false);
            ]]></constructor>
            <field name="rdfService" readonly="true">Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService)</field>
            <field name="rdfContainerUtils" readonly="true">Components.classes["@mozilla.org/rdf/container-utils;1"].getService(Components.interfaces.nsIRDFContainerUtils)</field>
            <field name="dataSource">null</field>
            <property name="dataFile">
                <getter><![CDATA[
                    var file = Components
                            .classes["@mozilla.org/file/directory_service;1"]
                            .getService(Components.interfaces.nsIProperties)
                            .get("ProfD", Components.interfaces.nsIFile);

                    file.append("site-search.rdf");
                    if (!file.exists()) {
                        var data = "<?xml version=\"1.0\"?>\n" +
                            "<RDF:RDF xmlns:SS=\"http://dionys.pp.ru/SS-rdf#\"\n" +
                            "         xmlns:NC=\"http://home.netscape.com/NC-rdf#\"\n" +
                            "         xmlns:RDF=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n" +
                            "  <!-- Empty -->\n" +
                            "</RDF:RDF>\n";
                        var stream = Components
                                .classes["@mozilla.org/network/file-output-stream;1"]
                                .createInstance(Components.interfaces.nsIFileOutputStream);
                        try
                        {
                            file.create(file.NORMAL_FILE_TYPE, 0666);
                            stream.init(file, 2, 0x200, 0);
                            stream.write(data, data.length);
                            stream.close();
                        }
                        catch (exception)
                        {
                            return null;
                        }
                    }
                    return file;
                ]]></getter>
            </property>
            <field name="searchBar" readonly="true">document.getElementById("searchbar")</field>
            <field name="searchRule">null</field>
            <property name="searchEngine"
                    onget="return this.searchBar.currentEngine;">
                <setter><![CDATA[
                    this.disabled = true;
                    this.searchRule = null;

                    var engines = this.rdfContainerUtils
                            .MakeSeq(this.dataSource, this.rdfService.GetResource("urn:root:engines"))
                            .GetElements();

                    while (engines.hasMoreElements())
                    {
                        var resource = engines.getNext();
                        var name = this.dataSource.GetTarget(resource, this.rdfService.GetResource("http://dionys.pp.ru/SS-rdf#name"), true);

                        if (name)
                        {
                            name = name.QueryInterface(Components.interfaces.nsIRDFLiteral)
                            if (name.Value == val.wrappedJSObject.name)
                            {
                                this.disabled = false;

                                var rule = { query : null, params : [] };
                                var query = this.dataSource.GetTarget(resource, this.rdfService.GetResource("http://dionys.pp.ru/SS-rdf#query"), true);
                                var params = this.dataSource.GetTargets(resource, this.rdfService.GetResource("http://dionys.pp.ru/SS-rdf#param"), true);

                                if (query instanceof Components.interfaces.nsIRDFLiteral)
                                    rule.query = query.Value;
                                while (params.hasMoreElements())
                                {
                                    var param = params.getNext();
                                    var name = this.dataSource.GetTarget(param, this.rdfService.GetResource("http://dionys.pp.ru/SS-rdf#name"), true);
                                    var value = this.dataSource.GetTarget(param, this.rdfService.GetResource("http://dionys.pp.ru/SS-rdf#value"), true);

                                    if (name instanceof Components.interfaces.nsIRDFLiteral && value instanceof Components.interfaces.nsIRDFLiteral)
                                        rule.params.push({ name : name.Value, value : value.Value });
                                }
                                this.searchRule = rule;
                                break;
                            }
                        }
                    }
                    return val;
                ]]></setter>
            </property>
            <method name="observe">
                <parameter name="aEngine"/>
                <parameter name="aTopic"/>
                <parameter name="aVerb"/>
                <body><![CDATA[
                    if (aTopic == "browser-search-engine-modified" && aVerb == "engine-current")
                        this.searchEngine = aEngine;
                ]]></body>
            </method>
            <method name="handleSearchCommand">
                <parameter name="aEvent"/>
                <body><![CDATA[
                    var textbox = this.searchBar.textbox;
                    var value = textbox.value;

                    if (this.searchBar.getAttribute("empty") == "true")
                        value = "";
                    if (value)
                        textbox._formHistSvc.addEntry(textbox.getAttribute("autocompletesearchparam"), value);

                    var tab = (aEvent.button == 1) || (aEvent.altKey ^ textbox._prefBranch.getBoolPref("browser.search.openintab"));

                    if (value && this.searchRule)
                    {
                        var browser = getBrowser();

                        // On "about:blank" location.host raises exception.
                        try
                        {
                            var host = browser.selectedBrowser.contentWindow.location.host;

                            if (host)
                            {
                                var regexp = /\{site\}/ig;
                
                                if (this.searchRule.query)
                                    value += " " + this.searchRule.query.replace(regexp, host);

                                var submission = this.searchEngine.getSubmission(value, null);
                                var uri = null;
                                var data = null;

                                  if (submission)
                                  {
                                    uri = submission.uri.spec;
                                    data = submission.postData;
                                }
                                if (uri)
                                    for (var i = 0; i < this.searchRule.params.length; i++)
                                        uri += "&"  + this.searchRule.params[i].name + "=" + this.searchRule.params[i].value.replace(regexp, host);
                                if (tab)
                                {
                                    content.focus();
                                    browser.loadOneTab(uri, null, null, data, false, false);
                                    if (gURLBar)
                                        gURLBar.value = uri;
                                }
                                else
                                    loadURI(uri, null, data, false);
                                content.focus();
                            }
                        }
                        catch (exception) {    }
                    }
                    else
                        this.searchBar.doSearch(value, tab);
                ]]></body>
            </method>
        </implementation>
        <handlers>
            <handler event="click"><![CDATA[
                if (event.button == 1)
                    this.handleSearchCommand(event);
                event.stopPropagation();
            ]]></handler>
            <handler event="command"><![CDATA[
                this.handleSearchCommand(event);
                event.stopPropagation();
            ]]></handler>
        </handlers>
    </binding>


Теперь у нашей кнопки (здесь опитывается кнопка панели инструментов), есть свой конструктор, свои поля (в том числе и read only) и свои методы. А кроме того она ещё и реализует интерфейс nsIObserver, т. е. способна работать обсервером.