рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ Habr├й рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, FireBreath NPAPI [1] рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдФрд░ ActiveX рдирд┐рдпрдВрддреНрд░рдг рд╣реЛрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкреНрд▓рдЧ-рдЗрди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рд╣реИ, рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдкреНрд▓рдЧ-рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛: рдЧреЗрдХреЛ / рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕, Google рдХреНрд░реЛрдо, рдРрдкреНрдкрд▓ рд╕рдлрд╛рд░реА, рдУрдкреЗрд░рд╛, рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ 6, 7, рдФрд░ 8ред
рдпрд╣ рдврд╛рдВрдЪрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдерд╛: рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рд╡реЗрдм тАЛтАЛрдПрдкреНрд▓рд┐рдХреЗрд╢рди) рдиреЗ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓ рдХреЛ рд╕реАрдзреЗ рдкреНрд░рд┐рдВрдЯрд░ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛ рдкреЙрд▓рд┐рд╕реА рдФрд░ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рдПрдкреНрд▓реЗрдЯ + рдХреЗ рдЕрдиреНрдп рдЫреЛрдЯреЗ рдмрдЧреЛрдВ рдХреЗ рд╕реНрдерд┐рд░ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдХрд┐рд╕реА рддрд░рд╣ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдлреЛрдХрд╕ рдПрдкреНрд▓реЗрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдпрд╛ рдкреНрд░рд┐рдВрдЯрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдмреНрд░рд╛рдЙрдЬрд░ рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдирд╛ред рд╢рд╛рдпрдж рдпрд╣ рд╕рд┐рд░реНрдл рдХреБрдЯрд┐рд▓ рд╣рд╛рде рд╣реЛред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкреНрд░реЗрд╕ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдерд╛ред
рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдПрдкреНрд▓реЗрдЯ рдФрд░ рдкреНрд░рд┐рдВрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЬрд▓реНрджреА рдФрд░ рдордЬрд╝рдмреВрддреА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдпреЗрдЧрд╛ред рджрд░рдЕрд╕рд▓, рдореБрджреНрд░рдг рдЕрдм рдПрдХ рд╣реА рдЬрд╛рд╡рд╛ рдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрд╛рд╡рд╛ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЗ рдмреАрдЪ рдЗрдВрдЯрд░реЗрдХреНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкрд░рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд▓рдЧрдЗрди рд╣реИред
рдЕрдм рдПрдХ рд╕рд░рд▓ "рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ" рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦреЗрдВ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦ рджреЗрдЧрд╛ред
Firebreath рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
- FireBreath рд╡реЗрдмрд╕рд╛рдЗрдЯ [2] рд╕реЗ Git рдпрд╛ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ FireBreath рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:
git clone git://github.com/firebreath/FireBreath.git -b firebreath-1.5 firebreath-1.5
- рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП Firebreath рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рдПрдХ рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкрд╛рдпрдерди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
python fbgen.py
fbgen.py рд╣рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд╛рдо рдФрд░ рд╡рд┐рд╡рд░рдг) рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗрдЧрд╛ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ / рдкреНрд▓рдЧрдЗрди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкреНрд▓рдЧрдЗрди рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛ рджреЗрдЧрд╛ред рдЕрдЧрд▓рд╛, рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдХрд░рддреЗ рд╕рдордп рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ:
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))
рдкреНрд▓рдЧрдЗрди рд╡рд┐рдзрд╛рдирд╕рднрд╛
рд╣рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
- рд╕реАрдПрдордХреЗ рд╕рдВрд╕реНрдХрд░рдг 2.8
- libgtk2.0-рджреЗрд╡
- Git
рдЙрдмрдВрдЯреВ / рдбреЗрдмрд┐рдпрди рдкрд░, рдЖрдк рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
apt-get install cmake libgtk2.0-dev git
- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ FireBreath рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ prepmake.sh рдЪрд▓рд╛рдХрд░ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
- рдмрд┐рд▓реНрдб рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдореЗрдХ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
рдХреА рд╢реБрд░реВрдЖрдд
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, npreadFile.so рдлрд╝рд╛рдЗрд▓ рдмрд┐рд▓реНрдб / рдмрд┐рди / рд░реАрдбрдлрд╝рд╛рдЗрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдХреЙрдкреА ~ / /mozilla / рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдХреНрд░реЛрдо рдФрд░ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдЗрд╕реЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдмрд┐рд▓реНрдб / рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ / рд░реАрдбрдлрд╝рд╛рдЗрд▓ / рдЬреАрди / FBControl.htm рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ
рдкреЗрдЬ рдХрд╣реЗрдЧрд╛ рдХрд┐ рдкреНрд▓рдЧрдЗрди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЛрдб рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЕрдм рдЖрдк рдЗрд╕реЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
plugin().write('Hello');
рдФрд░ рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓ /home/alex/log.txt рдХреЛ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рдореЗрдВ "рд╣реИрд▓реЛ" рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрджрд┐ рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдХреБрдЫ рднрд╛рд░реА рд╕рдВрдЪрд╛рд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА, рдЖрдк рдЦреБрд╢ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдПрдХ рддрд░рдл рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред FireBreathред
рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ FireBreath рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдкреНрд▓рдЧрдЗрди Google Chome, Mozilla Firefox рдФрд░ IE8 рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдУрдкреЗрд░рд╛, рд╕рдлрд╛рд░реА рдФрд░ IE6-7 рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
рд╕рдВрджрд░реНрдн:
1)
en.wikipedia.org/wiki/NPAPI2)
www.firebreath.org