Embeded SVG, base64, security in Firefox
Любопытство по поводу доступа к chrome://../svg.svg
было отнюдь не праздным: стояла задача добавления определённой SVG-графики в код страницы. Здесь можно провести некие параллели с расширением FlashBlock, где взамен блокируемых flash-объектов создаются элементы с фоновым изображением, источником которого служит файл из каталога расширения (authorware.png, director.png или flash.png). Доступ к таким файлам из контекста страницы разрешён, а вот если создать какой-то объект и указать источником svg-файл, расположенный в каталоге расширения, то ничего путного из этого не выйдет, т.к. доступ к этому файлу будет заблокирован по соображениям безопасности.
Начал смотреть в сторону <canvas>
, но для моей задачи получалось слишком тормозное решение, да и с масштабированием там возникли определённые сложности. И тут я вспомнил про base64…
Создаём шаблон
PHP
<?php
$svg = '<?xml version="1.0" standalone="no"?>'.
'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" '.
'"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">'.
'<svg xmlns="http://www.w3.org/2000/svg"/>';
echo base64_encode($svg);
?>
HTML
<embed id="svg64" type="image/svg+xml" width="100" height="100"
src="data:image/svg+xml;base64,{то, что получили в $svg}"/>"
и дальше этим хозяйством можно рулить через getSVGDocument()
:
JavaScript
var SVGDocument = document.getElementById("svg64").getSVGDocument();
var svg = SVGDocument.documentElement;
svg.setAttribute("width", 100);
svg.setAttribute("height", 100);
alert(new XMLSerializer().serializeToString(SVGDocument));
Пара примеров в архиве (zip, 11kb).
Если выйти за рамки стоящей задачи (имеем дело с расширением), то стоит напомнить, что тэга EMBED
в (X)HTML нет, но обойтись тэгом OBJECT
в данном случае не получится из-за бага 287465 «We should implement the GetSVGDocument interface for HTMLObjectElement». В принципе, никто не мешает обойти валидатор непосредственно в самом JavaScript,.. как обычно.
Самое поганое: при обновлении страниц (Ctrl+R, но не Ctrl+Shift+R) получаю «Permission denied to get property SVGDocument.documentElement» (можно посмотреть на файле svg64test.xhtml). Сижу, матерюсь, понимаю, что мне опять любопытно, да только времени на эти танцы уже нет.
Баловство на закуску:
<img width="64" height="64"
src="javascript:'#define width 4\n#define height 4\n'+
'static char bits[]={0x05,0x0a,0x05,0x0a}'"/>
Categories: dHtml | comments: (3)
Комментарии
1. BOLK 25th September 2005 - 23:41
Это «баловство на закуску» называется XBM :)
Mash:
Ну, я заинтересовался, ага. ;)
2. BOLK 26th September 2005 - 10:34
Ещё в тему XBM :)
http://pear.php.net/package/Image_XBM
3. gray 26th September 2005 - 11:27
Странно.
svg64lion.xhtml нихрена не работает ни в Опере (8.50), ни в Konqueror'е (3.4.2), хотя выковырянный (и пропущенный через base64_decode) svg вполне корректно отображается (как в konqueror'е, так и в inkscape).