Створення кросбраузерної оболонки для скриптів користувача

Здрастуйте, шановні читачі. Постів про скрипти (userscripts) було на хабрі чимало, проте, вони тільки показували, як ними користуватися. А в роботі юзерскриптів досить багато кросбраузерних несумісностей (як і в будь-якій області браузерного js). Природно, можна встановити різні доповнення для різних браузерів, проте, у разі написання скрипта для кінцевого користувача, доведеться супроводжувати його величезним readme по установці компонентів для забезпечення нормальної його роботи. Що особисто мене, та й вас, думаю, теж, не дуже влаштовує.

У цій статті мова вестиметься про три браузери: Mozilla Firefox (з встановленим GreaseMonkey), Google Chrome, Opera. Метою статті є «заготівля», яка дозволить скрипту користувача працювати однаковим чином у всіх перерахованих браузерах. Реалізація GM API не розглядатиметься, т.к. Таких вже сотні. Передбачається, що читач вже знайомий із загальними правилами написання юзерскриптів (якщо ні, рекомендую спочатку прочитати іншу статтю).

І безпосередньо до теми. Почнемо з директив. Несумісностей тут кілька: по-перше, в опері підтримується лише @include, а в хромі - лише @match. Firefox підтримує і те, й інше. Відповідно потрібно вказати обидві директиви (раптово). По-друге, для підтримки unsafeWindow у firefox потрібна директива @unwrap. Не уточнюватиму, що перед використанням unsafeWindow потрібно сильно подумати, чи це так так правда. Отже, початкова частина нашої заготовки виглядає приблизно так:

Плюс у Chrome директива @match має св-во відвалюватися, тому незайвим буде дописати на початок рядок типу такий:

Тепер поговоримо про область видимості. У Google Chrome користувацькі скрипти завждивиконуються в окремій області видимості - тоді як в опері, навпаки, вони нахабно виконуються прямо посеред сторінки, загрожуючи знищенням усім глобальним змінним. Тому для безпеки непогано додати додаткове замикання:

Отже, зрештою наша заготовка виглядатиме так: