Pull to refresh

Пишем простой плагин к веб-браузеру используя FireBreath

Reading time3 min
Views8.4K
Как уже писали ранее на Хабре, FireBreath — это фреймворк для разработки кросс-платформенных плагинов, используя технологии NPAPI [1] и ActiveX Control hosts, что позволит использовать плагин в следующих браузерах: Gecko/Firefox, Google Chrome, Apple Safari, Opera, Microsoft Internet Explorer 6, 7, and 8.

Мне пригодился этот фреймворк для следующего: в проекте (веб-приложение) использовался Java-апплет для печати Pdf-файлов напрямую на принтер, но из-за различных проблем с Java Policy и правами, не удалось добиться стабильной работы апплета + различные мелкие баги, как-то захват апплетом фокуса после загрузки или зависание браузера во время печати. Возможно, просто руки кривые. В общем, печать то работала, то нет, и это никого не устраивало.

Как вариант было решено попытаться написать плагин, который позволит избавиться от апплета и печатать файлы быстро и надежно. Собственно, печать осуществляет теперь тот же Java код, переписанный в виде jar файла. Однако прослойкой, которая осуществляет взаимодействие между джавой и клиентским кодом, является плагин браузера.

Теперь напишем простой «считай, ничего не делающий» плагин, который будет писать данные в файла в локальной файловой системе.

Установка Firebreath


  • Скачаем исходники FireBreath с помощью Git или архив с сайта FireBreath[2]:
    git clone git://github.com/firebreath/FireBreath.git -b firebreath-1.5 firebreath-1.5
  • Перейдем в папку со скачанным Firebreath и сгенерируем пустой проект. Для этого нам понадобиться установленный Python:
    python fbgen.py
    fbgen.py спросит у нас некоторые данные о плагине (например, имя и описание) и создаст папку с исходниками плагина в папке projects/pluginName. Далее вывод консоли при выполнении этих операций:

alex@alex-laptop:~$ git clone git://github.com/firebreath/FireBreath.git -b firebreath-1.5 firebreath-1.5
Initialized empty Git repository in /home/alex/firebreath-1.5/.git/
remote: Counting objects: 16089, done.
remote: Compressing objects: 100% (4841/4841), done.
remote: Total 16089 (delta 12322), reused 14495 (delta 11066)
Receiving objects: 100% (16089/16089), 11.28 MiB | 535 KiB/s, done.
Resolving deltas: 100% (12322/12322), done.
alex@alex-laptop:~$ cd firebreath-1.5/
alex@alex-laptop:~/firebreath-1.5$ python fbgen.py
Plugin Name []: readFile
Plugin Identifier [readFile]:
Plugin Prefix [RFI]:
Plugin MIME type [application/x-readfile]:
Plugin Description []:
Invalid syntax: Description must be one or more characters long!
Plugin Description []: Read test.txt from ~ folder
Plugin has no UI [false]:
Company Name []:
Invalid syntax: Name must be at least one character, and may not contain carriage returns.
Company Name []: Takeforce
Company Identifier [Takeforce]:
Company Domain [takeforce.com]:
Done. Files placed in /home/alex/firebreath-1.5/projects/readFile

  • Теперь напишем код, который будет писать данные в файл (например, /home/alex/log.txt). Нам нужно будет внести изменения в код файлов readFileAPI.cpp и readFileAPI.h, которые, как понятно из названия, описывают и реализуют интерфейс плагина:
    Метод, который будет писать в файл (простите мой C++ :)):
    FB::variant readFileAPI::write(const FB::variant& msg)
    {
    	  string message;
    	   if (msg.is_of_type<FB::JSObjectPtr>()) {
            	  message = msg.cast<FB::JSObjectPtr>()->Invoke("ToString", FB::variant_list_of()).convert_cast<std::string > ();
               } else {
    	          message = msg.convert_cast<std::string > ();
               }
    
       	   ofstream myfile;
    	   myfile.open ("/home/alex/log.txt");
    	   myfile << message;
    	   myfile.close();
    	  return msg;
    }

  • Так же допишем сигнатуру метода в .h файл зарегистрируем метод в конструкторе класса:
    registerMethod("write", make_method(this, &readFileAPI::write)); 


Сборка плагина


Нам понадобятся следующие пакеты для работы:
  1. CMake version 2.8
  2. libgtk2.0-dev
  3. Git
В Ubuntu/Debian можно установить с помощью команды:
apt-get install cmake libgtk2.0-dev git
  • Сначала нужно подготовить код для сборки, запустив prepmake.sh в корневой папке FireBreath
  • Создастся папка build, переходим в нее и выполняем команду make.


Внедрение


В результате у нас в папке build/bin/readFile появится файл либы npreadFile.so, который нужно скопировать ~/.mozilla/plugins, где ее смогут найти хром и файрфокс. После этого можно запустить браузер и открыть файл build/projects/readFile/gen/FBControl.htm
Страничка скажет, что плагин успешно загрузился и теперь в консоли можно его испытать — пишем:
plugin().write('Hello');
И смотрим наш файл /home/alex/log.txt, в котором появилось «Hello».

Выводы


Если вам нужно выполнить что-то на клиенте с правами браузера, что не получилось сделать другими способами, или выполнять какие-то тяжелые операции, и при этом, вас устраивает, что на клиентский компьютер нужно будет установить софт, то есть смысл посмотреть в сторону FireBreath.

Я проверил, что плагин, созданный в FireBreath, работает в Google Chome, Mozilla Firefox и IE8 версии. Заявлено так же, что работает в Opera, Safari и IE6-7, но я не проверял.

Ссылки:


1) en.wikipedia.org/wiki/NPAPI
2) www.firebreath.org
Tags:
Hubs:
+49
Comments4

Articles

Change theme settings