Szukam sposobu, na podpięcie się do przeglądarki i dobranie się do źródła wyświetlanej strony - co w konsekwencji jeszcze nie całkiem mi się nie udało. Padło na stworzenie rozszerzenia do przeglądarki. Firefox oferuje interfejs NPAPI (
http://en.wikipedia.org/wiki/NPAPI) do takie celów. Projekt
FireBreath, umożliwia tworzenie rozszerzeń na różne przeglądarki pod różne systemy. Instalacja frameworka jest bardzo przyjemna.
#wymagana jest wcześniejsza instalacja libgtk
sudo apt-get install libgtk2.0-dev
git clone git://github.com/firebreath/FireBreath.git -b firebreath-1.7 firebreath-1.7
cd firebreath-1.7
# zaciągane są potrzebne biblioteki np. boost
git submodule update --recursive --init
# budowanie przykładów dostarczonych z projektem
./prepmake.sh examples
cd buildex/
make
Autorzy dostarczają także kilka wideo tutoriali, który szybciej pozwalają zapoznać się z architekturą całego projektu.
Mamy też do dyspozycji odpowiednie skrypty, umożliwiające stworzenie szkieletu pod nasz projekt. Autor nawet zaleca, by nie by tworzyć go zupełnie na zewnątrz, a firebreath podpiąć jako submoduł.
cd firebreath-1.7
./fbgen.py
# Plugin Name []: BeruPlugin
# Plugin Identifier [BeruPlugin]:
# Plugin Prefix [BPL]:
# Plugin MIME type [application/x-beruplugin]:
# Plugin Description []: Beru Testing Plugin
# Plugin has no UI [false]:
# Company Name []: NiegodziwyBeru
# Company Identifier [NiegodziwyBeru]:
# Company Domain [niegodziwyberu.com]: nberu.blogspot.com
# Dobrą praktyk jest rozpoczęcie pracy od stworzenia repozytorium
mv projects/BeruPlugin/ ../
cd ../BeruPlugin/
git init .
git add .
git commit -m"Beru Plugin first commit"
# ustawiamy firebreath jako submodułu
git submodule add git://github.com/firebreath/FireBreath.git firebreath
git submodule update --init --recursive
git commit -m"Added firebreath as submodule"
# Budowanie
./firebreath/prepmake.sh . build/
cd build
make
# Kopiowanie naszego rozszerzenie stamtąd zostanie
# automatycznie zaczytany przez Firefoxa
cp bin/BeruPlugin/npBeruPlugin.so ~/.mozilla/plugins/
Wciąż nie wiem, czy możliwe jest dobranie się całego źródła strony. Poniżej mały eksperyment pokazujący możliwości rozszerzenia , czyli pobranie adresu strony, z której został zawołany (
http://www.firebreath.org/display/documentation/Tips+and+Tricks#TipsandTricks-GettingtheURLofthecurrentpage).
void BeruPlugin::onPluginReady()
{
// When this is called, the BrowserHost is attached, the JSAPI object is
// created, and we are ready to interact with the page and such. The
// PluginWindow may or may not have already fire the AttachedEvent at
// this point.
const std::string current_url = m_host->getDOMWindow()->getLocation();
const std::string page_html = m_host->getDOMElement()->getInnerHTML();
std::ofstream f;
f.open("/home/beru/BeruPluginLog.txt", std::ios_base::out | std::ios_base::app);
f << current_url << std::endl;
if (page_html.empty())
f << "Empty content " << std::endl;
else
f << "Content: " << page_html << std::endl;
f << "-------------------------" << std::endl;
f.close();
}
Ładowania rozszerzenia.
<html>
<head>
<title>Test page for object beruplugin</title>
</head>
<object id="player" type="application/x-beruplugin" width="300" height="200">
aaa<i>iii</i></object>
<br/>
<b>Hello world application/x-beruplugin</b>
</html>
I wynik działania:
file:///home/beru/test.html
Content: aaa<i>iii</i>
-------------------------