Tom Adler’s blog

oauth за и против opensource

Вчера в комментах к недавнему посту Давида Мзареуляна обсудили один неприятный, и, видимо, неустранимый недостаток OAuth:

Если имеется мегапопулярное открытое приложение, и злое приложение начинает использовать тот же секрет/ключ, обманывая доверчивых пользователей, и портя их данные, сервер может либо забанить ключ вообще (нехорошо: страдают юзеры популярного приложения), либо для этого конкретного ключа показывать огромное предупреждение «злое приложение Х испортит ваши данные», но надёжной защиты всё равно нет. Она возможна только в случае веб-приложений, что нам доказано примером hd-dvd aacs.

Вообще, вряд ли эту проблему можно считать недостатком технологии — она призвана решать другую задачу, и неплохо справляется со своим делом. Однако минус есть минус. Впрочем, спам тоже неискореним.

Зато сегодня пришла другая радостная новость: у спецификации OAuth появилась лицензия, и это окончательно гарантирует свободу технологии. Почему радость? Дело в том, что зачастую стандарты создаются сформированными под них структурами, которые сразу учитывают вопросы лицензирования. Однако в случае слабо связанных сообществ, работающих над стандартом (например, OpenID или OAuth), лицензирование — менее запланированный и зачастую более трудоёмкий процесс. Сейчас он завершён, ура : )

,

засахаренный script

Недавно Джон Резиг описал в статье «Degrading Script Tags» любопытную идею: использовать содержимое тега script, подключающего внешний файл. У этого подхода два плюса: во-первых, становится возможно писать только один тег вместо двух, а во-вторых, текст «второго» скрипта не выполнится, если почему-то не загружен файл. Это сразу же пригодилось и Андрею Сумину для его библиотеки. А вот мне хочется покритиковать такой подход.

Во-первых, название «Degrading Script Tags» и предполагаемое поведение противоречит привычному веб-разработчикам смыслу «деградирующих элементов», тому, как обычно в html используется содержимое специфических тегов. Насколько я помню, если почему-то не проинициализировался object, то его содержимое будет отображено, чтобы пользователь мог прочитать что-нибудь в духе «установите такой-то плагин для просмотра». А в предлагаемом подходе всё работает наоборот — содержимое выполнится, только если файл загружен успешно.

Во-вторых, эта вещь срабатывает для каждого файла по отдельности. То есть, в каждом внешнем скрипте, от которого мы хотим такого поведения, нам нужно прописывать те же самые две строчки инициализации.

И в-третьих, вызов document.getElementsByTagName — не такая уж дешёвая операция, это я как неоднократно пострадавший за производительность яваскрипта говорю : ) А вызывать её для нескольких скриптов по очереди ещё хуже.

В общем, экономия одного тега — это просто смешной аргумент, а ради проверки на загруженность файла выписывать такие кренделя не стоит. Хотя на первый взгляд идея привлекательная, не спорю.

,

псевдокласс :target

недавно с удивлением обнаружил, что :target нормально работает во всех трёх браузерах. Только вместо <a name="xxx"> нужно ссылаться на id элемента. Особенно интересно сочетать это с техникой yellow fade, причём всё можно сделать на чистом css. Идея в том, чтобы ставить фоном у целевого элемента анимированный незацикленный гиф. Кстати, первым это описал Brian Suda на Think Vitamin.

:target { background-image: url('yellow-fade.gif'); }

Правда, как обычно, пришлось выдавать гуманитарную помощь обозревателю, причём он даже сопротивлялся, но в итоге всё закончилось хорошо. Проблема возникла из-за известной «фичи» ИЕ, когда document.getElementById ищет не только по id, но ещё и по name. А поскольку мы любим graceful degradation, то для старичков и параноиков нужно параллельно с id="xxx" иметь еще и якорь <a name="xxx", который мешается при поиске целевого элемента. Но банальное размещение якоря внутри элемента, а не перед ним, решает проблему.

var target, previous;
document.observe('click', function(event){
    var element = event.element(),
        href = element.readAttribute('href');

    if (!href || !href.startsWith('#')) return;

    previous && previous.removeClassName('pseudo-class-target');

    target = $(href.substring(1)); 
    if (!target) return;

    target.addClassName('pseudo-class-target');
    previous = target;
});

конечно, неплохо бы ещё подсвечивать цель при переходе по ссылке с внешнего документа, но это сойдёт за домашнее задание : )

, , ,

…и там им не хватает кислорода

в связи с обещанной в очередном фаерфоксе поддержкой тега video подумалось вот что. В старом html был универсальный тег object, который предлагалось использовать для всего, едва ли не для картинок даже. Ну да, конечно, всё есть объект. Только вот механизм этот не особо прижился. Его используют, но знаете ли вы хоть одного человека, который написал его своими руками без копипаста? И вообще эта мысль про объекты очень похожа на любимое детище архитектурных астронавтов. Хорошо, что она остается в прошлом.

update: ссылка в тему — Flash embed test suite, поиск работающих методов встраивания флеша в страницы

xmpp → browser

сегодня я значительно продвинулся в своей недавней задумке трансляции джаббер-конференций в браузер

оценить можно, зайдя оперой сюда: https://arty.name:15432/ — это talks@conference.jabber.ru

остальным браузерам надеюсь соорудить маленький флешовый драйвер будущего