Я — эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.
// ==Userscript==
// @name Make Consultant base works
// @namespace http://bolknote.ru/
// @description Make Consultant base works in non-IE browsers.
// @include http://base.consultant.ru/*
// @version 1.0
// @licence MIT
// ==/UserScript==
(function(){
/* TODO
saveCard — это behavior userData, сделать эмуляцию
VBArray — одна из переменных использует этот специфический массив
isBaseVisible, ForEachRow — убрать заглушку, сделать нормальную функцию
showModalDialog — дописать с передачей параметров (например, через window.name)
*/
document.addEventListener('load', function (e) {
showModalDialog = window.open;
return true;
}, false);
DOMParser.prototype.loadXML = function (text) {
return this.parseFromString(text,"text/xml")
}
opera.addEventListener('BeforeScript',
function(e){
if (e.element.getAttribute('for')) {
var script = e.element.text
var id = e.element.getAttribute('for')
var ev = e.element.getAttribute('event')
e.element.text = ''
document.addEventListener('load', new Function('',
'document.getElementById("' + id +
'").attachEvent("' + ev +
'", function () {'+ script + '})'
))
}
var repl = {
'document\\.body\\.attachEvent' : 'document.attachEvent',
'document\\.all\\.fieldsXML\\.XMLDocument\\.transformNode': 'document.transformNode',
'document\\.all' : 'document.getElementsByTagName("*")',
'document\\.frames\\(' : 'document.getElementsByTagName("iframe").item(',
'\\.XMLDocument\\.text' : '.textContent',
'document\\.body' : 'document.documentElement',
'\\.parentElement' : '.parentNode',
'\\.XMLDocument\\.documentElement': '',
'\\.XMLDocument' : '',
'basesRow\\.all\\.basesTable' : 'document.getElementById("basesTable")',
'\\.all\\.tags\\(' : '.getElementsByTagName(',
'\\.all\\.([^\\.;\\s]+)' : '.getElementById("$1")',
'\\.all\\(' : '.getElementById(',
'\\w+\\.getElementById' : 'document.getElementById',
'p\\.type\\.' : 'p.getAttribute("type").',
'\\.isEnabled\\s*=([^;]+)' : '.setAttribute("isEnabled", $1)',
'\\.isEnabled' : '.getAttribute("isEnabled")',
'(\\w+)\\.loadXML' : '$1=$1.loadXML',
}
for (var re in repl) {
e.element.text = e.element.text.replace(new RegExp(re, 'g'), repl[re])
}
}
,false);
opera.defineMagicFunction('writeInsertion', function () {});
opera.defineMagicFunction('getBasesTable', function (a, b, tDivRow) {
var basesRow = tDivRow && tDivRow.id ? document.getElementById("bases_" + tDivRow.id) : null;
return basesRow == null ? null : document.getElementById('basesTable');
})
opera.defineMagicFunction('forEachRow', function (a, b) { return true })
opera.defineMagicFunction('createXMLStylesheet', function (a, b, url) {
var r = new XMLHttpRequest()
r.open('GET', url, false)
r.send(null)
if (r.status == 200) {
var xml = new DOMParser()
return xml.parseFromString(r.responseText, "text/xml")
}
return null
})
opera.defineMagicFunction('isBaseVisible', function (a, b, code) {
return true
})
HTMLElement.prototype.transformNode = XMLDocument.prototype.transformNode = function (style) {
var xsltProcessor=new XSLTProcessor();
xsltProcessor.importStylesheet(style);
if (typeof this == 'HTMLElement') {
var resultDocument = (new DOMParser()).parseFromString(this.innerHTML, 'text/xml');
} else {
var resultDocument = xsltProcessor.transformToDocument(this);
}
var xmls = new XMLSerializer();
return xmls.serializeToString(resultDocument);
}
HTMLHtmlElement.prototype.selectSingleNode = HTMLInputElement.prototype.selectSingleNode = function (path) {
var xpe = new XPathEvaluator();
var nsResolver = xpe.createNSResolver(this.ownerDocument == null ? this.documentElement : this.ownerDocument.documentElement);
var results = xpe.evaluate(path,this,nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE, null);
return results.singleNodeValue;
}
ActiveXObject = function (str) {
return new ({
'Microsoft.XMLDOM': DOMParser,
'Microsoft.XMLHTTP': XMLHttpRequest,
'Scripting.Dictionary': Array,
})[str]
}
})()
Кстати, «Опере» нужно не забыть сказать, чтобы она маскировалась под Internet Explorer (правая клавиша мыши, «Настройки сайта», закладка «Сеть»).
bolk (bolknote.ru)
26 октября 2009, 13:14,
ответ предназначен j-raf.livejournal.com:
kildor (kildor.ya.ru)
27 октября 2009, 08:35
bolk (bolknote.ru)
27 октября 2009, 12:20,
ответ предназначен kildor (kildor.ya.ru):
Ной (sad-wind.ya.ru)
5 ноября 2009, 19:36
с XSLT в IE нестандартноНе знаю, входит ли API для XSLT преобразований в стандарты, но его хотя бы можно эмулировать. В отличие от disable-output-escaping в Firefox =(
Ной (sad-wind.ya.ru)
5 ноября 2009, 20:00
протолкнуть параметры в небезопасные функции через callback функцийЯ юзал такую фишку на Microsoft Imagine Cup в номинации Visual Gaming. Суть была в написании библиотеки AI, управляющей командой роботов. Неприятность была в том, что симулятор давал управление AI только каждые 4 "такта", хотя некоторые действия вроде (постройки робота) занимали всего один. Использование тредов было запрещено и нельзя было перейти к слудующему ходу, не отдав управление обратно в программу-вимулятор. Было найдена такая лазейка: при некорректном ходе в лог добавлялась запись об ошибке. И у этого лога был callback, на который и был успешно повешен вызов AI. Строился даже специальный робот, который всегда делал некорректные ходы, обеспечивая вызовы AI каждый такт.
bolk (bolknote.ru)
6 ноября 2009, 19:37,
ответ предназначен Ной (sad-wind.ya.ru):
Не знаю, входит ли API для XSLT преобразований в стандарты, но его хотя бы можно эмулировать. В отличие от disable-output-escaping в Firefox =(Да, в стандартах есть API для XSLT.
j-raf.livejournal.com (j-raf.livejournal.com)
Если бы ты разместил ссылку на скрипт, а не его текст, установка с помошью нового UJS менеджера сильно упростилась бы.26 октября 2009, 12:37