[Áöµð³ÝÄÚ¸®¾Æ]ÆÄÀÌ¾îÆø½ºÀÇ °¡Àå Å« ÀåÁ¡ °¡¿îµ¥ Çϳª´Â ¡®È®Àå±â´É¡¯ÀÌ´Ù. ¿©±â¼´Â ÀÌ È®Àå±â´ÉÀÌ ¾î¶»°Ô ¸¸µé¾îÁö´ÂÁö ±¸Á¶¿Í Á¦ÀÛ ¹æ¹ýÀ» °£·«ÇÏ°Ô »ìÆì º¸°í, LiveLines¶ó´Â ÆÄÀÌ¾îÆø½º¿ë RSS È®Àå±â´ÉÀ» Á÷Á¢ °³¹ßÇØ º»´Ù. ¶ÇÇÑ À¥ Ç¥ÁØ ±â¼ú¿¡ Ãæ½ÇÇÑ °³¹ß Ç÷§Æû¿¡¼ ½ÇÇàµÇ´Â µ¶¸³ÀûÀÎ °æ·® ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î¼ È®Àå±â´ÉÀ» ÀçÁ¶¸íÇØ º»´Ù.
ÈçÈ÷ »ç¿ëÇÏ´Â ³ëÆ® ÆÐµå, °è»ê±â °°Àº ÇÁ·Î±×·¥À» °³¹ßÇÏ·Á¸é C/C++¸¦ ÀÍÈ÷°Å³ª ¾î·Á¿î °³¹ß µµ±¸¸¦ »ç¿ëÇØ¾ß ÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ƯÈ÷ À¥ ºê¶ó¿ìÀúÀÇ ºÎ°¡ ±â´É °³¹ß¿¡ »ç¿ëµÇ´Â ÀÀ¿ë ¾ÖÇø®ÄÉÀ̼Ç(rich internet application)Àº ÀÎÅÍ³Ý ÀͽºÇ÷η¯ Áß½ÉÀÇ ¾×ƼºêX ±â¼ú¿¡ ±¹ÇѵŠÀü¹® ÇÁ·Î±×·¡¸Ó°¡ ¾Æ´Ï¸é °³¹ßÇϱⰡ ¸¸¸¸Ä¡ ¾Ê¾Ò´Ù.
¹Ý¸é ÆÄÀÌ¾îÆø½º¿¡¼ ºÎ°¡ ±â´ÉÀ» Á¦°øÇÒ ¼ö ÀÖ´Â È®Àå±â´É(extensions)Àº À¥À» ±¸¼ºÇÏ´Â ±âº» Áö½Ä°ú Ç¥ÁØ À¥ ±â¼ú ¸î °¡Áö¸¸ ÀÍÈ÷¸é °£´ÜÇÏ°Ô ¸¸µé ¼ö ÀÖ´Ù. È®Àå±â´ÉÀÇ ¼Ò½º´Â ¾ÐÃุ Ç®¸é ÅØ½ºÆ® ¿¡µðÅÍ·Î ¹Ù·Î ¿¾î º¼ ¼ö ÀÖ°í, °¡º±°í Å©±â°¡ ÀÛ¾Æ ½±°Ô ´Ù¿î·ÎµåÇØ ¼³Ä¡, »ç¿ëÇÒ ¼ö ÀÖ°í, ¹öÀüÀÌ ¾÷±×·¹À̵åµÇ¸é ¾÷µ¥ÀÌÆ®µµ ÀÚµ¿À¸·Î Áö¿øÇÑ´Ù.
½ÇÁ¦·Î HTML, CSS, ÀÚ¹Ù ½ºÅ©¸³Æ® µî ÅØ½ºÆ® ±â¹ÝÀÇ °£°áÇϸ鼵µ ÀÌÇØÇϱ⠽¬¿î À¥ ÀúÀÛ ¹æ¹ýÀº À¥À» ¼ºÀå½ÃŰ´Â µ¥ ¿øµ¿·ÂÀ̾ú´Ù. °£ÆíÇÑ °³¹ß°ú »ç¿ë¹ý¿¡ ºñÇØ ¸Å¿ì °·ÂÇÑ ±â´ÉÀ» Áö¿øÇØ ÀÀ¿ë ¹üÀ§°¡ Åø¹Ù¿Í °Ë»ö ±â´É, À¥ »çÀÌÆ® Áö¿ø µîÀ» ¸ðµÎ ¸Á¶óÇϰí ÀÖ´Ù.
È®Àå±â´ÉÀÇ ±¸Á¶ ¶â¾îº¸±â
È®Àå±â´ÉÀ» ±¸¼ºÇÏ´Â ¿ä¼Ò´Â <¸®½ºÆ® 1>°ú °°´Ù. ÀϹÝÀûÀ¸·Î CSS, ÀÚ¹Ù ½ºÅ©¸³Æ®¸¦ ºñ·ÔÇØ XML ±â¹Ý À¯Àú ÀÎÅÍÆäÀ̽º ±¸Çö ¾ð¾îÀÎ XUL, ÀÚ·á¿Í ³»¿ë ±¸Á¶¸¦ ¼³¸íÇÏ´Â À¥ Ç¥ÁØÀÎ RDF·Î ±¸¼ºµÇ¸ç, ¿©±â¿¡ ¿ÜºÎ ¶óÀ̺귯¸®¿Í ¿¬°áÀ» ´ã´çÇÏ´Â XPCOM°ú ³×Æ®¿öÅ© ¿¬°áÀ» À§ÇÑ SOAP, XML-RPC, XMLHTTP µîÀ» Áö¿øÇÑ´Ù. ½ÉÁö¾î ÆÄÀ̽ã(Python), ÆÞ(Perl), ·çºñ(Ruby)°°Àº ½ºÅ©¸³Æ® ¾ð¾î¿¡ ´ëÇÑ ¹ÙÀεùµµ Áö¿øÇÑ´Ù.
| <¸®½ºÆ® 1> È®Àå ±â´ÉÀÇ ±âº» ±¸Á¶ | | | |
name.xpi (È®Àå±â´É ¼³Ä¡ ÆÄÀÏ Æ÷¸ËÀ¸·Î ÀϹÝÀûÀ¸·Î ZIP Æ÷¸ËÀ» »ç¿ëÇÑ´Ù)
/chrome (À¯Àú ÀÎÅÍÆäÀ̽º¿Í ±â´ÉÀ» ´ãÀº µð·ºÅ丮)
name.jar (content, skin, localeÀ» ´ãÀº ÆÄÀÏ, ZIP Æ÷¸ËÀ» »ç¿ëÇÑ´Ù)
/content
contents.rdf (È®Àå±â´ÉÀÇ Á¤º¸¸¦ ºê¶ó¿ìÀú¿¡ Á¦°øÇÏ´Â ¼³¸íÀ» ´ãÀº XML ÆÄÀÏ)
nameOverlay.js (¾×¼Ç°ú ±â´ÉÀ» ±¸ÇöÇÏ´Â ÀÚ¹Ù ½ºÅ©¸³Æ® ÆÄÀÏ)
nameOverlay.xul (À©µµ¿ì¿Í µµ±¸ ¸ðÀ½ µî À¯Àú ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÏ´Â XMLÆÄÀÏ)
/skin
/classic
/name
anything.png (È®Àå±â´É¿¡¼ »ç¿ëÇÏ´Â ±×¸² ÆÄÀÏ)
contents.rdf
/locale
/ko-KR
name.dtd (XUL¿¡¼ »ç¿ëµÇ´Â ¸Þ½ÃÁö Ç¥ÁØ, utf-8À¸·Î ÀÎÄÚµù)
name.properties (js ÆÄÀÏ¿¡¼ »ç¿ëµÇ´Â ¸Þ½ÃÁö Ç¥ÁØ, À¯´ÏÄÚµå \uXXXX·Î ÀÎÄÚµù)
/components
name.dll, name.so (¿ÜºÎ ±â´É ¿¬µ¿½Ã ÇÊ¿äÇÑ ¶óÀ̺귯¸® ÆÄÀÏ)
name.js (¿ÜºÎ ±â´É ¿¬µ¿½Ã ÇÊ¿äÇÑ ÀÚ¹Ù ½ºÅ©¸³Æ® ÆÄÀÏ)
/defaults
/preferences
name.js (È®Àå±â´É¿¡¼ »ç¿ëÇÏ´Â ±âº» ¼³Á¤ ÆÄÀÏ)
name.ext
install.js(0.8-)
(name.jar µîÀ» Ãß°¡ÇÏ´Â ¼³Ä¡ ÆÄÀÏ, ¸ðÁú¶ó 1.x À̻󿡼 ¼³Ä¡ °¡´É)
install.rdf (0.9+) (GUID, name, version, description µîÀ» Æ÷ÇÔÇÏ´Â ¼³Ä¡ ÆÄÀÏ)
| |
 |
È®Àå±â´ÉÀÇ µð·ºÅ丮 ±¸Á¶´Â ¸ðÁú¶ó³ª ÆÄÀÌ¾îÆø½º ºê¶ó¿ìÀúÀÇ °Í°ú °ÅÀÇ ¶È°°´Ù. ºê¶ó¿ìÀú ³»¿¡ ÀÖ´Â °Íó·³ UI ¿ä¼Ò(content), ½ºÅ² ȤÀº Å׸¶¿Í °°Àº ¿Ü¾ç(skin), ´Ù±¹¾î Áö¿ø(locale) µîÀ¸·Î ³ª´²Áö´Â µð·ºÅ丮¿¡ ÀÖ´Â ÆÄÀϵéÀ» ¸ð¾Æ¼ XPI¶ó´Â ¾ÐÃà ÆÄÀÏ ÇüÅ·ΠÁ¦°øµÈ´Ù. ¿©±â¿¡ È®Àå±â´ÉÀÇ °¢ µð·ºÅ丮 ³»¿ëÀ» ¼³¸íÇÏ´Â RDF ÆÄÀϰú ¼³Ä¡ ÆÄÀÏ µîÀÌ Ãß°¡µÅ ÀÖ´Ù. ½ÇÁ¦·Î ÆÄÀÌ¾îÆø½º ÇÁ·Î±×·¥ Æú´õÀÇ chrome/browser.xpi °°Àº ÇÁ·Î±×·¥À» À©Áý µîÀ¸·Î Ç®¾îº¸¸é ÀÌ·¯ÇÑ ±¸Á¶¿Í ¶È°°ÀÌ ±¸¼ºµÇ¾î ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. À̰ÍÀº È®Àå±â´Éµµ ¸ðÁú¶óÀÇ °øÅë °³¹ß Ç÷§ÆûÀ» ±âÃÊ·Î Çϰí Àֱ⠶§¹®ÀÌ´Ù.
È®Àå±â´ÉÀÇ Àüü ±¸Á¶¸¦ ¼³¸íÇÏ´Â RDF
È®Àå±â´ÉÀ» ¸¸µå´Â ù¹øÂ° ´Ü°è´Â <¸®½ºÆ® 1>°ú °°Àº µð·ºÅ丮 ±¸Á¶¸¦ ±¸¼ºÇÏ´Â °ÍÀÌ´Ù. (¸¶Áö¸·¿¡ ¸¸µé±âµµ ÇÏÁö¸¸) À̸¦ ¼³¸íÇÏ´Â °ÍÀÌ ¹Ù·Î <¸®½ºÆ® 2>ÀÇ install.rdf ÆÄÀÏÀÌ´Ù
| <¸®½ºÆ® 2> È®Àå±â´ÉÀÇ Àüü ±¸Á¶¸¦ ¼³¸íÇÏ´Â RDF | | | |
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:creator>Seokchan Yun</em:creator>
<em:description>Very simple extension sample.</em:description>
<em:homepageURL>http://www.test.com/firefox/</em:homepageURL>
<em:id>{65b3130e-8513-41b6-8ea8-43dbd9cc0b12}</em:id>
<em:name>Simple Extension</em:name>
<em:version>0.1</em:version>
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>0.8</em:minVersion>
<em:maxVersion>1.0+</em:maxVersion>
</Description>
</em:targetApplication>
<em:file>
<Description about="urn:mozilla:extension:file:simple.jar">
<em:package>content/</em:package>
</Description>
</em:file>
</Description>
</RDF>
| |
 |
<description> ºÎºÐ¿¡´Â È®Àå±â´É¿¡ ´ëÇÑ Á¦ÀÛÀÚ, ¹èÆ÷ URL, ÇÁ·Î±×·¥¸í, ¹öÀü µî ±âº» ¼³¸íÀÌ ´ã±â´Âµ¥, ÀÌ °¡¿îµ¥ <em:id> ºÎºÐÀº È®Àå±â´ÉÀ» °íÀ¯ÇÏ°Ô ³ªÅ¸³»´Â Ŭ·¡½º ¾ÆÀ̵𸦠Àû¾î¾ß ÇÑ´Ù. ÀÌ Å¬·¡½º ¾ÆÀ̵ð´Â Guidgen(
www.microsoft.com/downloads/details.aspx?FamilyId=94551F58-484F-4A8C-BB39-ADB270833AFC)À̶ó´Â ÇÁ·Î±×·¥À» »ç¿ëÇÏ¸é µÈ´Ù. <em:targetApplication>¿¡´Â ÆÄÀÌ¾îÆø½º¿¡ ´ëÇÑ ±âº» Á¤º¸°¡ µé¾î°£´Ù. ¼³Ä¡µÉ ÇÁ·Î±×·¥ÀÌ ÆÄÀÌ¾îÆø½ºÀÎÁö ½ã´õ¹öµåÀÎÁö¿¡ µû¶ó¼ Ŭ·¡½º ¾ÆÀ̵ð¿Í ¹öÀü Á¤º¸¸¦ ³Ö¾î ÁÖ¸é µÈ´Ù. ¸¶Áö¸·À¸·Î <em:file> ºÎºÐ¿¡¼ ¼³Ä¡µÉ chrome µð·ºÅ丮ÀÇ jar ÆÄÀϸíÀ» ³Ö¾î ÁØ´Ù.
ÀÌÁ¦ °¢ µð·ºÅ丮¿¡ Æ÷Ç﵃ Á¤º¸¸¦ ±â¼úÇÏ´Â RDF ÆÄÀÏÀÎ contents.rdf ÆÄÀÏ¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. contents.rdf ÆÄÀÏÀº ÆÄÀÏÀÌ Æ÷ÇԵǾî ÀÖ´Â ¸ðµç µð·ºÅ丮¿¡ ¼³Ä¡µÇ´Â °ÍÀÌ ±âº»ÀÌ´Ù.
| <¸®½ºÆ® 3> µð·ºÅ丮¿¡ Æ÷Ç﵃ Á¤º¸¸¦ ±â¼úÇÏ´Â contents.rdf | | | |
<?xml version="1.0"?>
<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:chrome="http://www.mozilla.org/rdf/chrome#">
<RDF:Seq about="urn:mozilla:package:root">
<RDF:li resource="urn:mozilla:package:simple"/>
</RDF:Seq>
<RDF:Description about="urn:mozilla:package:simple"
chrome:extension="true"
chrome:name="simple"/>
<RDF:Seq about="urn:mozilla:overlays">
<RDF:li resource="chrome://browser/content/browser.xul"/>
</RDF:Seq>
<RDF:Seq about="chrome://browser/content/browser.xul">
<RDF:li>chrome://simple/content/simpleOverlay.xul</RDF:li>
</RDF:Seq>
</RDF:RDF>
| |
 |
<¸®½ºÆ® 3>ó·³ ÇÁ·Î±×·¥ ÆÐŰÁö¿¡ ´ëÇÑ Á¤º¸¿Í È®Àå±â´É¿¡¼ óÀ½À¸·Î ½ÇÇàÇÒ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ÀÌ ¶§ »ç¿ëÇÏ´Â chrome:// ÇÁ·ÎÅäÄÝÀº È®Àå±â´ÉÀÌ »ç¿ëÇÒ ÆÄÀÏÀÇ À§Ä¡¸¦ ÁöÁ¤ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ ±â¼úÇÏ¸é ÆÄÀÏÀÇ ½ÇÁ¦ °æ·Î´Â È®Àå±â´É ÆÄÀÏÀÎ simple.xpi ³»ÀÇ chrome µð·ºÅ丮ÀÇ simple.jar¿¡ ÀÖ´Â content/simpleOverlay.xul°¡ µÈ´Ù.
<RDF:li>chrome://simple/content/simpleOverlay.xul</RDF:li>
À¯Àú ÀÎÅÍÆäÀ̽º¿Í ±â´É ±¸Çö
½ÇÁ¦ ºê¶ó¿ìÀú¿¡¼ Ç¥ÇöµÇ´Â À¯Àú ÀÎÅÍÆäÀ̽º´Â XUL·Î Ç¥ÇöÇÑ´Ù. XUL°ú ÀÚ¹Ù ½ºÅ©¸³Æ®ÀÇ ¼ÂÆ®·Î ±¸¼ºµÇ´Âµ¥, <¸®½ºÆ® 4>°¡ ¹Ù·Î simple.xul ÆÄÀÏ ¿¹Á¦ÀÌ´Ù.
¿©±â¿¡´Â <ȸé 1>ó·³ ¿À¸¥ÂÊ ¹öưÀ» Ŭ¸¯ÇßÀ» ¶§ ³ªÅ¸³ª´Â ¸Þ´º¿Í ºê¶ó¿ìÀúÀÇ µµ±¸(tool) ¸Þ´º¿¡ °¢°¢ ¡®Hello, wolrd!¡¯¶ó´Â ¸Þ´º¸¦ Ãß°¡ÇÏ´Â ³»¿ëÀÌ µé¾î ÀÖ°í, ÀÌ ¸Þ´º¸¦ Ŭ¸¯Çϸé simpleOverlay.js ÆÄÀÏ ¾È¿¡ ÀÖ´Â hello() ÇÔ¼ö¸¦ ½ÇÇàÇϵµ·Ï µÅ ÀÖ´Ù. Simple.js ÆÄÀÏ¿¡´Â ´ÙÀ½°ú °°Àº °£´ÜÇÑ Äڵ尡 µé¾î ÀÖ´Ù. hello() ÇÔ¼ö´Â Hello, world!¶ó´Â ±ÛÀÚ¸¦ °æ°íâ ÇüÅ·Πȸ鿡 ¶ç¿öÁÖ´Â ¿ªÇÒÀ» ÇÑ´Ù.
function hello() {
alert("Hello, world!");
}
 |
| <ȸé 1> simpleOverlay.xulÀ» ½ÇÇàÇÑ °æ¿ìÀÇ UI Ç¥½Ã |
| <¸®½ºÆ® 4> À¯Àú ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â XUL ÆÄÀÏ | | | |
<?xml version="1.0"?>
<overlay id="helloworldOverlay"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
// ±â´ÉÀ» ±¸ÇöÇÒ ÀÚ¹Ù ½ºÅ©¸³Æ® ÆÄÀÏ ÀÎÅ©·çµå
<script type="application/x-javascript" src="chrome://simple/content/simpleOverlay.js"></script>
// ¿À¸¥ÂÊ ¹öư Ŭ¸¯½Ã ³ª¿À´Â ¸Þ´º
<popup id="contentAreaContextMenu">
<menuitem id="helloworld" label="Hello, world!" accesskey="H"
insertafter="context-stop" oncommand="hello();"/>
</popup>
// Tool ¸Þ´º¿¡ ³ªÅ¸³ª´Â ¸Þ´º
<menupopup id="menu_ToolsPopup">
<menuitem insertafter="devToolsSeparator" label="Hello, world!" accesskey="H" oncommand="hello();" />
</menupopup>
</overlay>
| |
 |
¸¸¾à XUL ÆÄÀÏ ³»¿¡ ÀÖ´Â ¿ä¼Ò¿¡ ½ºÅ¸ÀÏÀ» »ç¿ëÇÏ·Á¸é CSS ¼Ó¼º ȤÀº CSS ÆÄÀÏÀ» ÀÌ¿ëÇÏ¸é µÈ´Ù. ´ÙÀ½Àº skin/classic/simple ¹Ø¿¡¼ CSS ÆÄÀÏÀ» ã´Â °æ¿ì´Ù.
<?xml-stylesheet href="chrome://simple/skin/simple.css"
type="text/css"?>
CSS ÆÄÀÏ¿¡ ÀÖ´Â ¼Ó¼ºÀ» »ç¿ëÇϰųª ¹Ù·Î ½ºÅ¸ÀÏ ¼Ó¼ºÀ» »ç¿ëÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÏ¸é µÈ´Ù. ¿©±â¼ º¼¼ö ÀÖµíÀÌ class="url"À̶ó´Â ¼Ó¼ºÀ» simple.css¿¡¼ ãÀ» ¼ö ÀÖÀ¸¸ç, style="font-weight: bold;"¶ó´Â ±¸¹®À» ³Ö¾î Á÷Á¢ ½ºÅ¸ÀÏÀ» ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù. ±×¸²À» Ç¥ÇöÇÏ°í ½ÍÀ¸¸é skin/classic/simple/hello.png¿¡¼ ÆÄÀÏÀ» Àоî¿Â´Ù.
<window title="Hello, World Title">
<vbox>
<text value="Created By:" style="font-weight: bold;"/>
<text value="Tester" class="url"
onclick="window.open('http://hello.com'); window.close();"/>
</vbox>
<spring flex="1"/>
<image src="chrome://simple/skin/hello.png"/>
</window>
¸¸¾à hello, world °°Àº ¹®±¸¸¦ ¡°¾È³ç¡±, ¡°ª³ªóªËªÁªÏ¡±À̶ó´Â ´Ù±¹¾î·Î Ç¥ÇöÇϰíÀÚ ÇÑ´Ù¸é localeÀ̶ó´Â µð·ºÅ丮¸¦ »ç¿ëÇÑ´Ù. locale¿¡ ¡®¾ð¾îÄÚµå-±¹°¡Äڵ塯 ÇüÅÂÀÇ µð·ºÅ丮¸¦ ¸¸µé°í »ç¿ëÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. ¿¹¸¦ µé¾î Çѱ¹Àº ko-KR, ¹Ì±¹Àº en-US, ÀϺ»Àº ja-JP µîÀÌ´Ù. ÀÌ ¶§ ¸ðÁú¶ó³ª ÆÄÀÌ¾î Æø½º´Â ºê¶ó¿ìÀúÀÇ ¾ð¾î ¹öÀü ȤÀº »ç¿ëÀÚ°¡ ¼³Á¤ÇÑ ¾ð¾î locale¿¡ µû¶ó ´Ù¸¥ ¾ð¾î·Î ¸Þ½ÃÁö¸¦ Ç¥½ÃÇÏ°Ô µÈ´Ù.
locale¿¡ ¸Þ½ÃÁö¸¦ Ç¥ÇöÇÏ´Â ÆÄÀÏÀº °¢±¹ ¾ð¾î¸¦ Á¦´ë·Î Ç¥ÇöÇϱâ À§ÇØ À¯´ÏÄڵ带 »ç¿ëÇØ¾ß ÇÑ´Ù. XUL¿¡¼ »ç¿ëµÇ´Â ¸Þ½ÃÁö Ç¥ÁØÀÎ .dtd ÆÄÀÏÀº ¹®ÀÚ ÀÎÄÚµùÀ» BOM Äڵ尡 µé¾î ÀÖÁö ¾Ê´Â UTF-8·Î ¼³Á¤ÇØ¾ß Çϸç, properties ÆÄÀÏÀº À¯´ÏÄÚµå Ç¥Çö¹æ½ÄÀ» \uXXXX·Î ¼³Á¤ÇÑ ÈÄ ÀúÀåÇØ¾ß ÇÑ´Ù(À©µµ¿ìÀÇ ³ëÆ® ÆÐµå´Â UTF-8 ÀÎÄÚµù¿¡ BOMÀÌ Æ÷ÇԵǹǷΠÁÖÀÇÇØ¾ß ÇÑ´Ù. Unired ¹®¼ ÆíÁý±â¸¦ »ç¿ëÇÏ´Â °ÍÀ» ±ÇÇÑ´Ù).
<!ENTITY hello.title "Hello, World Title">
<!ENTITY hello.createdby "Created By">
¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ simple.dtd ÆÄÀÏÀÌ Á¸ÀçÇÑ´Ù°í °¡Á¤ÇØ º¸ÀÚ.
<!DOCTYPE dialog SYSTEM "chrome://simple/locale/simple.dtd">
<window title="&hello.title;">
<vbox>
<text value="&hello.createby" style="font-weight: bold;"/>
</vbox>
</window>
ÀÌÁ¦ Contents Æú´õ ¾Æ·¡ÀÇ contents, skin, locale µîÀÇ ÆÄÀϵéÀ» simple.jar·Î ¹°í install.rdf¿Í ¾ÐÃàÇØ simpe.xpi·Î ¸¸µå´Â °ÍÀ¸·Î, ¿À¸¥ÂÊ Å¬¸¯ ¸Þ´º¿¡ Hello world âÀ» ¶ç¿ì´Â °£´ÜÇÑ È®Àå±â´ÉÀ» ¿Ï¼ºÇÒ ¼ö ÀÖ´Ù.
¸¶Áö¸· °úÁ¤Àº ¼³Ä¡ ½ºÅ©¸³Æ®´Ù. ¸ðÁú¶ó 1.x ¹öÀü°ú ÆÄÀÌ¾îÆø½º 0.8 ÀÌÇÏ ¹öÀüÀº RDF ±â¹ÝÀÇ ¼³Ä¡ ½ºÅ©¸³Æ®¸¦ ÀÌ¿ëÇÏÁö ¾Ê°í <¸®½ºÆ® 4>¿Í °°ÀÌ ÀÚ¹Ù ½ºÅ©¸³Æ® ±â¹ÝÀÇ XPInstall ±â´ÉÀ» »ç¿ëÇÑ´Ù.
| <¸®½ºÆ® 5> ÀÚ¹Ù ½ºÅ©¸³Æ® ±â¹ÝÀÇ XPInstall | | | |
// XpiInstaller
const APP_NAME = "http://test.com/";
const APP_CHROME_NAME = "simpletest";
const APP_CHROME_FILE = "simpletest.jar";
const APP_AUTHOR = "Seokchan Yun";
const APP_VERSION = "0.1";
const ERR_INSTALL = "¼³Ä¡°¡ ¿Ï·áµÇÁö ¸øÇß½À´Ï´Ù.";
// init
initInstall(APP_NAME, APP_CHROME_NAME, APP_VERSION, 0);
// set up package folder and folder flag
var folder = getFolder("Profile", "Chrome");
var folderFlag = PROFILE_CHROME;
var existsInApplication = File.exists(getFolder(getFolder("Chrome"), APP_CHROME_FILE));
setPackageFolder(folder);
// add package
ret = addFile(APP_AUTHOR, APP_VERSION, "chrome/"+APP_CHROME_FILE, folder, null);
// register chrome if installation successful
if (ret == SUCCESS) {
folder = getFolder(folder, APP_CHROME_FILE);
registerChrome(CONTENT | folderFlag, folder, "content/");
registerChrome(LOCALE | folderFlag, folder, "locale/");
registerChrome(SKIN | folderFlag, folder, "skin/");
ret = performInstall();
// If the install failed
if(ret != SUCCESS && ret != REBOOT_NEEDED) {
alert(ERR_INSTALL + "\n" + ret);
cancelInstall(ret);
}
} else {
alert(ERR_INSTALL + "\n" + ret);
cancelInstall(ret);
}
alert('È®Àå±â´É ¼³Ä¡°¡ ¿Ï·áµÇ¾ú½À´Ï´Ù. ºê¶ó¿ìÀú¸¦ Àç½ÃÀÛ ÇϽʽÿÀ.');
| |
 |
 | È®Àå±â´ÉÀ» À§ÇÑ ¸î °¡Áö ÆÁ |  | |  | |
| È®Àå±â´ÉÀ» Àß ¸¸µé±â À§ÇÑ °¡Àå ÃÖÀûÀÇ ¹æ¹ýÀº ±âÁ¸ÀÇ È®Àå±â´ÉÀ» Àß ºÐ¼®ÇØ ³ª¸¸ÀÇ ºñ¹ýÀ» ½×¾Æ °¡´Â °ÍÀÌ´Ù. ¸ðÁú¶ó ¾÷µ¥ÀÌÆ®(update.mozilla.org)³ª ÇÑ±Û È®Àå±â´É »çÀÌÆ® (update.mozilla.or.kr)¸¦ ÂüÁ¶Çϸé ÁÁÀº È®Àå±â´ÉÀ» ãÀ» ¼ö ÀÖ´Ù. ¿©±â¼´Â È®Àå±â´ÉÀ» ¸¸µé ¶§ ¾Ë¾Æ µÎ¸é ÁÁÀº ¸î °¡Áö ÆÁÀ» ¼Ò°³ÇÑ´Ù.
¡ß ¸¸µé¾îÁø È®Àå±â´ÉÀ» ¹èÆ÷ÇÒ ¶§ XPI¶ó´Â ÆÄÀÏ Æ÷¸ËÀ» °¡Áö°í Àֱ⠶§¹®¿¡ ´Ù¸¥ À̸§À¸·Î ÀúÀåÀ» ÇÏ´Â ´Ù¿î·Îµå âÀÌ ¶ã ¶§°¡ ÀÖ´Ù. ÀÌ·² ¶§´Â »ç¿ëÇÏ´Â À¥ ¼¹ö¿¡ XPI¿¡ ´ëÇÑ mime-typeÀ» Á¤ÇØ ÁÙ Çʿ䰡 ÀÖ´Ù. ¸¸¾à À¥ ¼¹ö°¡ ¾ÆÆÄÄ¡¶ó¸é ´ÙÀ½°ú °°´Ù.
AddType application/x-xpinstall .xpi
¡ß È®Àå±â´ÉÀ» ÀϺΠ¼öÁ¤ÇÑ ÈÄ °è¼ÓÇØ¼ XPI¸¦ ¸¸µå´Â °ÍÀº ¸Å¿ì ¹ø°Å·Î¿î ÀÏÀÌ´Ù. ÀÌ ¶§´Â 7-zip(www.7-zip.org)À̶ó´Â ¾ÐÃà ÇÁ·Î±×·¥À» ±âÃÊ·Î ÇÏ´Â ¹èÄ¡ ÆÄÀÏÀ» ÀÌ¿ëÇÏ¸é Æí¸®ÇÏ´Ù. ¾Æ·¡´Â makexpi.bat ÆÄÀÏÀÇ ³»¿ëÀÌ´Ù.
set x=%cd%
md build\chrome
cd chrome
7z a -tzip "%x%.jar" * -r -mx=0
move "%x%.jar" ..\build\chrome
cd ..
copy install.* build
cd build
7z a -tzip "%x%.xpi" * -r -mx=9
move "%x%.xpi" ..\
cd ..
rd build /s/q
¡ß install.rdf¸¦ ¸¸µå´Â ÀÛ¾÷ ¿ª½Ã ¹ø°Å·Ó´Ù. ÀÚµ¿À¸·Î install.rdf¸¦ ¸¸µé¾î ÁÖ´Â À¥ »çÀÌÆ® (ted.mielczarek.org/code/mozilla/ffinstall/index.html)¸¦ ÀÌ¿ëÇÏ¸é Æí¸®ÇÏ´Ù.
¡ß È®Àå±â´ÉÀ» °³¹ßÇϴµ¥ Æí¸®ÇÑ È®Àå±â´É(?)µµ ÀÖ´Ù. Extension Developer's ExtensionµéÀ» ÀÌ¿ëÇÏ¸é ½Ç½Ã°£À¸·Î XULÀ» ÆíÁýÇØ È®ÀÎÇÒ ¼ö ÀÖ°í ÀÚ¹Ù ½ºÅ©¸³Æ® ±â´ÉÀ» ±¸ÇöÇϰųª install.rdf¸¦ ÀÚµ¿À¸·Î »ý¼ºÇÏ´Â ±â´É µî ´Ù¾çÇÑ È®Àå±â´ÉÀ» ¸¸³ª º¼ ¼ö ÀÖ´Ù(ted.mielczarek.org/code/mozilla/extensiondev/index.html)
| | | | | |
| |
| |
| È®Àå±â´É°ú ÇÔ²² ºê¶ó¿ìÀúÀÇ ¿Ü¾çÀ» ÀÚÀ¯ÀÚÀç·Î ¹Ù²ãÁÖ´Â Å׸¶ ±â´É ¿ª½Ã ÆÄÀÌ¾îÆø½ºÀÇ ÁÖ¿ä ±â´É Áß ÇϳªÀÌ´Ù. ±Í¿©¿î ÀÏ¹Ý Å׸¶ºÎÅÍ Ãʱ⠳ݽºÄÉÀÌÇÁ Å׸¶, ÀÎÅÍ³Ý ÀͽºÇ÷η¯ Å׸¶±îÁö ¸Å¿ì ´Ù¾çÇÑ Á¾·ùÀÇ Å׸¶µéÀÌ ¸ðÁú¶ó ¾÷µ¥ÀÌÆ® »çÀÌÆ®¿¡ Á¸ÀçÇÑ´Ù.
Å׸¶¸¦ °³¹ßÇÏ´Â °Íµµ ¿ø¸®´Â È®Àå±â´É°ú µ¿ÀÏÇÏ´Ù. ±×·¯³ª È®Àå±â´ÉÀÌ ±âÁ¸ ºê¶ó¿ìÀú ±â´É¿¡ »õ·Î¿î ±â´ÉÀ» Ãß°¡ÇÏ´Â °ÍÀ̶ó¸é Å׸¶´Â ±âÁ¸ ºê¶ó¿ìÀúÀÇ ¿Ü¾ç¸¸À» º¯°æÇÏ´Â °ÍÀ̹ǷΠµð·ºÅ丮 ±¸Á¶¿Í ¿Ü¾ç º¯°æ ¹æ¹ýÀÌ Á¶±Ý ´Ù¸¦ »ÓÀÌ´Ù.
Å׸¶ ¼³Ä¡¸¦ À§ÇÑ xpi ÆÄÀÏÀ» Ç®¾î º¸¸é È®Àå±â´É°ú ¶È°°Àº ±¸Á¶·Î µÇ¾î ÀÖ°í ½ÇÁ¦·Î È®Àå±â´É°ú °°Àº ÇüÅ·ΠÇÁ·ÎÇÊ Æú´õ¿¡ ÀúÀåµÈ´Ù. ½ÇÁ¦ ¿Ü¾ç Á¤º¸°¡ µé¾î ÀÖ´Â jar ÆÄÀÏÀ» ¿¾î º¸¸é browser, communicator, global °°Àº µð·ºÅ丮°¡ ÀÖ°í ±× ¾È¿¡ ÁÖ·Î css ÆÄÀϰú ±×¸² ÆÄÀÏÀÌ ÀÖ´Ù. ÆÄÀÌ¾îÆø½º ºê¶ó¿ìÀúÀÇ ¸ðµç ¸Þ´º¿Í Ç׸ñ°ú ¿Ü¾çÀº ¸ðµÎ css·Î ½ºÅ¸ÀÏ Á¤Àǰ¡ µÇ¾î ÀÖÀ¸¸ç À̸¦ ¾à°£¸¸ º¯°æÇÏ¸é ½±°Ô ³ª¸¸ÀÇ Å׸¶¸¦ ¸¸µé ¼ö ÀÖ´Ù.
| | | | | |
| |
½ÇÀü! LiveLines È®Àå±â´É °³¹ß
LiveLines´Â ÆÄÀÌ¾îÆø½ºÀÇ ¶óÀÌºê ºÏ¸¶Å©(Live Bookmark) ¹öưÀÇ ±â´ÉÀ» ¼öÁ¤ÇØ »ç¿ëÀÚ°¡ ¿øÇÏ´Â ÇÁ·Î±×·¥¿¡ RSS Çǵ带 Ãß°¡ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â È®Àå±â´ÉÀÌ´Ù. ÀÌ È®Àå±â´ÉÀº ÀÌ¹Ì ¹ßÇ¥µÈ °ÍÀÌÁö¸¸ ¿©±â¼ »ìÆìº¸´Â ¼Ò½º´Â ±âÁ¸ÀÇ ¼Ò½º¸¦ ´õ ´ÙµëÀº °ÍÀÌ´Ù.
¶ÇÇÑ º»·¡ ȸ鿡 Ç¥½ÃµÇ´Â ¹®±¸µéÀº ´Ù±¹¾î Áö¿øÀ» À§ÇØ XULÀ̳ª ½ºÅ©¸³Æ® ÆÄÀϰú ºÐ¸®ÇØ locale¿¡ ÀúÀåÇØ¾ß ÇÏÁö¸¸ »ç¿ëÇÏ´Â ¹®±¸°¡ ¸¹Áö ¾Ê±â ¶§¹®¿¡ ¼Ò½º¸¦ ´õ Á÷°üÀûÀ¸·Î ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï ¼Ò½º¿¡ ±×´ë·Î ³Ö¾ú´Ù(¿©±â¿¡ ½Ç¸° ¼Ò½º´Â
www.heygom.com/misc/livelines_src.zip¿¡¼ ±¸ÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ ¼Ò½º·Î ¸¸µé¾îÁø È®Àå±â´ÉÀº
www.heygom.com/misc/livelines_0.3.3_mod.xpi·Î ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù.)
| |
| - RSS : Really Simple SyndicateÀÇ ¾àÀÚ·Î À¥ »çÀÌÆ®¿¡ Á¢¼ÓÇÏÁö ¾Ê°íµµ ÇØ´ç À¥ »çÀÌÆ®ÀÇ ³»¿ëÀ» ¿¶÷ÇÒ ¼ö ÀÖ´Â ±â¼úÀÌ´Ù. ¸ÞÀÏ ¼Ò½ÄÁö°¡ ÁøÈÇÑ ÇüŶó°íµµ º¼ ¼ö ÀÖ´Ù. ±¹³»¿ÜÀÇ ¾ð·Ð »çÀÌÆ®¿Í ºí·Î±×¿¡¼ ½±°Ô ã¾Æº¼ ¼ö Àִµ¥, RSS ±¸µ¶±â¸¦ ÀÌ¿ëÇØ ¿øÇÏ´Â »çÀÌÆ®ÀÇ ÃֽŠ±ÛµéÀ» ½±°Ô ¹Þ¾Æº¼ ¼ö ÀÖ´Ù. RSS´Â XML Çü½ÄÀÇ ÆÄÀÏ·Î ¸¸µé¾îÁö¸ç ÀÌ·± ÆÄÀÏ ÇϳªÇϳª¸¦ ¡®Çǵ塯¶ó°í ÇÑ´Ù.
- ¶óÀÌºê ºÏ¸¶Å© : ÆÄÀÌ¾îÆø½ºÀÇ ºÏ¸¶Å©¸¦ ÅëÇØ RSS¸¦ ±¸µ¶ÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â ±â´ÉÀÌ´Ù. RSS Çǵ带 ¶óÀÌºê ºÏ¸¶Å©·Î Ãß°¡ÇÏ¸é ÆÄÀÌ¾îÆø½ºÀÇ ºÏ¸¶Å©¿¡ ÇØ´ç RSSÀÇ ³»¿ëÀÌ Ç¥½ÃµÈ´Ù.
 | | <ȸé 1> ÆÄÀÌ¾îÆø½º°¡ ±âº»À¸·Î Á¦°øÇÏ´Â ¶óÀÌºê ºÏ¸¶Å© |
- Sage / Habari Xenu : ÆÄÀÌ¾îÆø½º¿¡¼ »ç¿ëÇÒ ¼ö ÀÖ´Â RSS ±¸µ¶±â·Î RSS ¸ñ·ÏÀ» ¼Õ½±°Ô °ü¸®ÇÒ ¼ö ÀÖ°í »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ °£°ÝÀ¸·Î RSS¸¦ ÀÚµ¿À¸·Î °»½ÅÇÒ ¼ö ÀÖ´Â µî ¶óÀÌºê ºÏ¸¶Å©º¸´Ù °·ÂÇÑ ±â´ÉÀ» Á¦°øÇÑ´Ù. RSS Çǵå´Â »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ ºÏ¸¶Å© Æú´õ¿¡ ºÏ¸¶Å© Çü½ÄÀ¸·Î ÀúÀåµÈ´Ù.
 | | <ȸé 2> ÆÄÀÌ¾îÆø½º¿¡¼ »ç¿ëÇÏ´Â RSS ±¸µ¶±â Sage |
- Bloglines(www.bloglines.com) : À¥ ±â¹ÝÀÇ RSS ±¸µ¶±â·Î RSS ¸ñ·ÏÀÌ À¥¿¡ ÀúÀåµÇ±â ¶§¹®¿¡ ¾ðÁ¦ ¾îµð¼µç »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ ÀåÁ¡ÀÌ´Ù. ±¹³»¿¡´Â ºñ½ÁÇÑ ±â´ÉÀ» ÇÏ´Â RSS³Ý(rss.daum.net)ÀÌ ¾ó¸¶ Àü¿¡ ¹®À» ¿¾ú´Ù.
 | | <ȸé 3> À¥ ±â¹ÝÀÇ RSS ±¸µ¶±â Bloglines |
| | | | | |
| |
ÆÄÀÌ¾îÆø½º 1.0ºÎÅÍ´Â RSS¸¦ Á¦°øÇÏ´Â »çÀÌÆ®¿¡ Á¢¼ÓÇÏ¸é »óŸ·´ë ¿À¸¥ÂÊ¿¡ ¶óÀÌºê ºÏ¸¶Å© ¹öư(

)ÀÌ Ç¥½ÃµÇ´Âµ¥ À̰ÍÀ» Ŭ¸¯Çϸé ÇØ´ç »çÀÌÆ®°¡ Á¦°øÇÏ´Â RSS ÇǵåÀÇ ¸ñ·ÏÀÌ ÆË¾÷ ¸Þ´º·Î ³ªÅ¸³´Ù. ¿©±â¼ ¿øÇÏ´Â RSS Çǵ带 ¼±ÅÃÇÏ¸é ¶óÀÌºê ºÏ¸¶Å©·Î Ãß°¡ÇÒ ¼ö ÀÖ´Ù. LiveLines´Â ÀÌ ¹öưÀÇ ±â´ÉÀ» ¼öÁ¤ÇØ ¶óÀÌºê ºÏ¸¶Å© ¿Ü¿¡ »ç¿ëÀÚ°¡ ¿øÇÏ´Â ±¸µ¶±â¿¡ RSS Çǵ带 Ãß°¡ÇÏ´Â ±â´ÉÀ» °®°í ÀÖ´Ù.
¶ÇÇÑ ÀÌ È®Àå±â´É¿¡´Â RSS Çǵå ã±â ±â´ÉÀÌ µé¾î ÀÖ´Ù. ÆÄÀÌ¾îÆø½º´Â HTML ¹®¼ÀÇ <head> ¾È¿¡ <link> ű׸¦ ÅëÇØ ÁöÁ¤µÈ RSS Çǵ常À» ÀνÄÇÑ´Ù. ÇÏÁö¸¸ <link> ű׸¦ »ç¿ëÇÏÁö ¾Ê°í <a> ű׷ΠRSS Çǵ带 ¸µÅ©ÇØ ³õÀº »çÀÌÆ®°¡ ¸¹´Ù. ÀÌ·± »çÀÌÆ®¸¦ À§ÇØ LiveLines´Â <a> ű׷Π¿¬°áµÈ RSS Çǵ带 ã¾Æ³½´Ù.
LiveLinesÀÇ ±âº» Á¤º¸¸¦ ´ãÀº contents.rdf
contents.rdf ÆÄÀÏ¿¡´Â LiveLinesÀÇ ±âº» Á¤º¸°¡ ´ã°Ü ÀÖ´Ù. <¸®½ºÆ® 5>¿¡¼ ´«¿©°Ü º¼ °ÍÀº ±½°Ô Ç¥½ÃµÈ ºÎºÐÀÌ´Ù. À̰ÍÀº ºê¶ó¿ìÀúÀÇ ¼Ò½º ÆÄÀÏ(browser.xul)¿¡ livelines.xulÀ» ¿À¹ö·¹ÀÌ(overlay)ÇÑ´Ù´Â ¼±¾ðÀÌ´Ù. ¿À¹ö·¹ÀÌ´Â ÇÑ ÆÄÀÏ¿¡ ´Ù¸¥ ÆÄÀÏÀ» Àû¿ë½ÃŲ´Ù´Â Àǹ̷Î, ¿©±â¼´Â ¶óÀÌºê ºÏ¸¶Å© ¾ÆÀÌÄÜ¿¡ ´ëÇÑ Á¤º¸°¡ browser.xul¿¡ ±â·ÏµÅ ÀÖ¾î À̰ÍÀ» livelines.xul·Î Á¦¾îÇÒ ¼ö ÀÖµµ·Ï ¿À¹ö·¹ÀÌÇß´Ù.
| <¸®½ºÆ® 6> LiveLines È®Àå±â´ÉÀÇ contents.rdf | | | |
<?xml version="1.0"?>
<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:chrome="http://www.mozilla.org/rdf/chrome#">
<RDF:Seq about="urn:mozilla:package:root">
<RDF:li resource="urn:mozilla:package:livelines"/>
</RDF:Seq>
<RDF:Description about="urn:mozilla:package:livelines"
chrome:displayName="LiveLines 0.3.3"
chrome:author="Gom Kim"
chrome:authorURL="http://heygom.com/extensions"
chrome:name="livelines"
chrome:extension="true"
chrome:description="Add RSS feeds to Bloglines or Sage with the RSS icon on the status bar">
</RDF:Description>
<RDF:Seq about="urn:mozilla:overlays">
<RDF:li resource="chrome://browser/content/browser.xul"/>
</RDF:Seq>
<RDF:Seq about="chrome://browser/content/browser.xul">
<RDF:li>chrome://livelines/content/livelines.xul</RDF:li>
</RDF:Seq>
</RDF:RDF>
| |
 |
¿À¹ö·¹À̸¦ ¼±¾ðÇÒ ¶§´Â ÀÌó·³ ¸ÕÀú ¿À¹ö·¹ÀÌÀÇ ´ë»óÀÌ µÇ´Â ÆÄÀÏ(browser.xul)À» ÁöÁ¤ÇÏ°í ±× ´ÙÀ½¿¡ ÇØ´ç ÆÄÀÏ¿¡ Àû¿ëµÉ ÆÄÀÏ(livelines.xul)À» ÁöÁ¤ÇÑ´Ù. Âü°í·Î browser.xulÀº ÆÄÀÌ¾îÆø½º°¡ ¼³Ä¡µÈ µð·ºÅ丮 /chrome/browser.jar/content/browser¾È¿¡ ÀÖ´Â ÆÄÀÏ·Î ºê¶ó¿ìÀú ÀüüÀÇ »À´ë¸¦ ´ã°í ÀÖ´Ù.
LiveLinesÀÇ ¿À¹ö·¹ÀÌ Á¤º¸¸¦ ´ãÀº livelines.xul
livelines.xul´Â LiveLinesÀÇ ¿À¹ö·¹ÀÌ Á¤º¸¸¦ ´ãÀº ÆÄÀÏÀÌ´Ù. <overlay> ¿ä¼Ò¿¡ ¿À¹ö·¹ÀÌÇÒ ¿ä¼ÒµéÀÌ ´ã°Ü ÀÖ´Ù. ±½Àº ±Û¾¾·Î Ç¥½ÃµÈ ºÎºÐÀÌ ¶óÀÌºê ºÏ¸¶Å© ¹öư¿¡ ´ëÇÑ Á¤ÀÇÀÌ´Ù. <statusbarpanel>¿¡ id°¡ ÁöÁ¤µÅ Àִµ¥ ¸¸¾à ´ë»ó ÆÄÀÏ(browser.xul)¿¡ °°Àº id¸¦ °¡Áø ¿ä¼Ò°¡ ÀÖ´Ù¸é °Å±â¿¡ °ãÃÄÁú °ÍÀ̰í, ±×·¸Áö ¾Ê´Ù¸é »õ·Î¿î <statusbarpanel>·Î Ãß°¡µÉ °ÍÀÌ´Ù.
| <¸®½ºÆ® 7> ¿À¹ö·¹ÀÌ Á¤º¸¸¦ ´ãÀº livelines.xul | | | |
<?xml version="1.0"?>
<overlay id="livelines"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript" src="chrome://livelines/content/livelines.js"/>
<statusbarpanel id="livemark-button" onclick="objLiveLines.doPopup(window._content);">
<menupopup position="1" onpopupshowing="livemarkFillPopup(this);"
oncommand="objLiveLines.addWithLiveLines(window._content, event.target.getAttribute('data'));" />
</statusbarpanel>
</overlay>
| |
 |
browser.xul¿¡´Â ¶óÀÌºê ºÏ¸¶Å© ¹öư¿¡ ÇØ´çÇÏ´Â ºÎºÐÀÌ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.
<statusbarpanel id="livemark-button" type="menu" class="statusbarpanel-menu-iconic" chromedir="&locale.dir;">
<menupopup onpopupshowing="return livemarkFillPopup(this);"
oncommand="livemarkAddMark(window._content, event.target.getAttribute('data'));" />
</statusbarpanel>
livelines.xul°ú browser.xulÀÇ ³»¿ëÀ» ºñ±³ÇØ º¸¸é, <statusbarpanel>Àº id°¡ °°À¸¹Ç·Î °ãÃÄÁöÁö¸¸ <menupopup>Àº id°¡ ÁöÁ¤µÅ ÀÖÁö ¾Ê¾Æ ¼·Î ¿µÇâÀ» ÁÖ°í ¹ÞÁö ¾Ê°í º°°³ÀÇ ¿ä¼Ò·Î Ãß°¡µÈ´Ù. µû¶ó¼ °ãÃÄÁø(overlay) ÈÄ¿¡´Â ±âÁ¸ÀÇ <statusbarpanel id="livemark-button">ÀÌ ´ÙÀ½°ú °°ÀÌ º¯°æµÈ´Ù. ±½Àº ±Û¾¾·Î µÈ ºÎºÐÀÌ livelines.xulÀÇ ¿µÇâÀ» ¹ÞÀº °ÍÀÌ´Ù.
<statusbarpanel id="livemark-button" type="menu" class="statusbarpanel-menu-iconic" chromedir="&locale.dir;" onclick="objLiveLines.doPopup(window._content);">
<menupopup position="1" onpopupshowing="livemarkFillPopup(this);"
oncommand="objLiveLines.addWithLiveLines(window._content, event.target.getAttribute('data'));" />
<menupopup onpopupshowing="return livemarkFillPopup(this);"
oncommand="livemarkAddMark(window._content, event.target.getAttribute('data'));" />
</statusbarpanel>
¿ø·¡ »õ·Ó°Ô Ãß°¡µÇ´Â ¿ä¼Ò´Â ±âÁ¸ ¿ä¼ÒÀÇ µÚ¿¡ Ãß°¡µÇÁö¸¸ position ¼Ó¼ºÀ» ÁöÁ¤ÇØ livelines.xulÀÇ <menupopup>ÀÌ ±âÁ¸ÀÇ <menupopup>º¸´Ù ¾Õ¿¡ À§Ä¡Çϵµ·Ï Çß´Ù. ÀÌ´Â »ç¿ëÀÚ°¡ <statusbarpanel id="livemark-button">À» Ŭ¸¯ÇÏ¿´À» ¶§ livelines.xulÀÇ <menupopup>ÀÌ ³ªÅ¸³ªµµ·Ï Çϱâ À§Çؼ´Ù. ±âÁ¸ÀÇ <menupopup>¿¡ id°¡ ÁöÁ¤µÅ ÀÖÁö ¾Ê¾Æ livelines.xul°¡ Á¦¾îÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ÀÌ·± Æí¹ýÀ» »ç¿ëÇß´Ù.
°¢ ¿ä¼ÒÀÇ À̺¥Æ®¿¡ ÁöÁ¤µÈ ÇÔ¼öÀÇ ±â´ÉÀº ´ÙÀ½°ú °°´Ù.
¡ß objLiveLines.doPopup : »ç¿ëÀÚ°¡ ¶óÀÌºê ºÏ¸¶Å© ¹öư(<statusbarpanel id="livemark-button">)À» Ŭ¸¯Çϸé ÇØ´ç »çÀÌÆ®ÀÇ RSS ÇÇµå ¸ñ·ÏÀÌ ÆË¾÷ ¸Þ´º(<menupopup>)·Î ³ªÅ¸³ª°í, ¿©±â¼ »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ Çǵ尡 ±¸µ¶±â¿¡ µî·ÏµÇ´Âµ¥, ÀÌ °úÁ¤À» »ý·«ÇÏ°í ¸ñ·ÏÀÇ °¡Àå ù ¹øÂ° Çǵ尡 µî·ÏµÇµµ·Ï ÇÏ´Â ÇÔ¼ö´Ù.
¡ß livemarkFillPopup : À̹ø ¼Ò½º¿¡´Â ÆË¾÷ ¸Þ´ºÀÇ ³»¿ë Áï, ¸Þ´º Ç׸ñ(<menuitem>)ÀÌ Á¤ÀǵǾî ÀÖÁö ¾Ê´Ù. ¼·Î ´Ù¸¥ »çÀÌÆ®¿¡ Á¢¼ÓÇÒ ¶§¸¶´Ù RSS ÇǵåÀÇ Á¤º¸°¡ ´Þ¶óÁö±â ¶§¹®ÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ÆË¾÷ ¸Þ´º°¡ Ç¥½ÃµÉ ¶§ ÇØ´ç »çÀÌÆ®ÀÇ RSS Çǵå Á¤º¸¸¦ ´ãÀº ¸Þ´º Ç׸ñ(<menuitem>)À» ¸¸µç´Ù. ÇØ´ç RSS ÇǵåÀÇ ÁÖ¼Ò´Â <menuitem>ÀÇ data ¼Ó¼º¿¡ ÀúÀåµÈ´Ù. ÀÌ ÇÔ¼ö´Â ÆÄÀÌ¾îÆø½º°¡ Á¦°øÇÏ´Â °ÍÀ¸·Î browser.js(browser.xul°ú °°Àº °æ·Î¿¡ À§Ä¡)¿¡ Á¤ÀǵŠÀÖ´Ù.
¡ß objLiveLines.addWithLiveLines : »ç¿ëÀÚ°¡ RSS Çǵ带 ¼±ÅÃÇϸé(Áï <menuitem> ¿ä¼Ò¸¦ Ŭ¸¯Çϸé) È£ÃâµÇ´Â ÇÔ¼ö·Î ÇÔ¼ö¸í¿¡¼ ¾Ë ¼ö ÀÖµí »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ RSS Çǵ带 »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ ±¸µ¶±â¿¡ µî·ÏÇÑ´Ù.
| <¸®½ºÆ® 8> livelines_setting.xul | | | |
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?>
<dialog xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
onload="objLiveLines.updateOptionDialog();"
ondialogaccept="objLiveLines.setPreferences();"
title="LiveLines ¼³Á¤">
<script type="application/x-javascript" src="chrome://livelines/content/livelines.js"/>
<script type="application/x-javascript">
function setMenu() {
obj = document.getElementById("addto");
// Bloglines¿¡ Ãß°¡Çϱ⸦ ¼±ÅÃÇßÀ» °æ¿ì
// RSS Ãß°¡ ȸéÀ» ¿ °÷À» Á¤ÇÏ´Â ¸Þ´º¸¦ »ç¿ë°¡´É »óÅ·Π¸¸µç´Ù.
if (obj.selectedIndex == 1)
document.getElementById("OpenSubPageIn").disabled = false;
else
document.getElementById("OpenSubPageIn").disabled = true;
// Sage¿¡ Ãß°¡Çϱ⸦ ¼±ÅÃÇßÀ» °æ¿ì,
// ´ëÈ »óÀÚ¸¦ ¿Áö ¿©ºÎ¸¦ °áÁ¤Çϴ üũ»óÀÚ¸¦ »ç¿ë°¡´É »óÅ·Π¸¸µç´Ù.
if (obj.selectedIndex == 2)
document.getElementById("OpenBookmarkWindow_Sage").disabled = false;
else
document.getElementById("OpenBookmarkWindow_Sage").disabled = true;
// Habari Xenu¸¦ ¼±ÅÃÇßÀ» °æ¿ì,
// »óµ¿
if (obj.selectedIndex == 3)
document.getElementById("OpenBookmarkWindow_Xenu").disabled = false;
else
document.getElementById("OpenBookmarkWindow_Xenu").disabled = true;
}
</script>
<vbox>
<groupbox>
<caption label="RSS"/>
<radiogroup id="addto" oncommand="setMenu();">
<radio label="¶óÀÌºê ºÏ¸¶Å©¿¡ Ãß°¡ÇÕ´Ï´Ù." oncommand="setMenu();"/>
<radio label="Bloglines¿¡ Ãß°¡ÇÕ´Ï´Ù." oncommand="setMenu();"/>
<hbox style="margin-left:22px;" align="center">
<label value="RSS Ãß°¡ ȸéÀ»"/>
<menulist id="OpenSubPageIn" disabled="true">
<menupopup>
<menuitem label="ÇöÀç ÅÇ¿¡ ¿±´Ï´Ù." selected="true"/>
<menuitem label="»õ ÅÇ¿¡ ¿±´Ï´Ù."/>
<menuitem label="»õ ÅÇ¿¡ ¿°í Ȱ¼ºÈÇÕ´Ï´Ù."/>
<menuitem label="»õ â¿¡ ¿±´Ï´Ù."/>
</menupopup>
</menulist>
</hbox>
<radio label="Sage¿¡ Ãß°¡ÇÕ´Ï´Ù." oncommand="setMenu();"/>
<checkbox style="margin-left:22px;" disabled="true" id="OpenBookmarkWindow_Sage" label="Æú´õ¸¦ ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ´ëÈ »óÀÚ¸¦ ¿±´Ï´Ù."/>
<radio label="Habari Xenu¿¡ Ãß°¡ÇÕ´Ï´Ù." oncommand="setMenu();"/>
<checkbox style="margin-left:22px;" disabled="true" id="OpenBookmarkWindow_Xenu" label="Æú´õ¸¦ ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ´ëÈ »óÀÚ¸¦ ¿±´Ï´Ù."/>
<radio label="URLÀ» Ŭ¸³º¸µå¿¡ º¹»çÇÕ´Ï´Ù." oncommand="setMenu();"/>
</radiogroup>
</groupbox>
<checkbox
id="FindRSS"
label="<a>·Î ¿¬°áµÈ RSS Çǵ带 ã½À´Ï´Ù."/>
<checkbox
id="PassPopup"
label="¶óÀÌºê ºÏ¸¶Å© ¹öưÀ» ´©¸£¸é ÆË¾÷ ¸Þ´º ¾øÀÌ ¹Ù·Î RSS¸¦ Ãß°¡ÇÕ´Ï´Ù."/>
</vbox>
</dialog>
| |
 |
¼³Á¤Ã¢À» ±¸ÇöÇÏ´Â livelines_setting.xul
livelines_setting.xulÀº LiveLines ¼³Á¤Ã¢ÀÇ XUL ÆÄÀÏÀÌ´Ù. <¸®½ºÆ® 7>°ú °°ÀÌ <dialog> ¿ä¼ÒÀÇ onload À̺¥Æ®¿¡ ÁöÁ¤µÈ ÇÔ¼ö´Â ÀÌ Ã¢ÀÌ ¿·ÈÀ» ¶§ ½ÇÇàµÇ¸ç, ondialogaccept À̺¥Æ®¿¡ ÁöÁ¤µÈ ÇÔ¼ö´Â »ç¿ëÀÚ°¡ È®ÀÎ ¹öưÀ» ´·¶À» ¶§ ½ÇÇàµÈ´Ù. À̵é ÇÔ¼ö´Â livelines.js¿¡ Á¤ÀǵŠÀÖ´Ù.
setMenu ÇÔ¼ö´Â »ç¿ëÀÚ°¡ <groupbox> ¾ÈÀÇ Ç׸ñ(<radio>)À» ¼±ÅÃÇßÀ» ¶§(oncommand) ½ÇÇàµÇ´Âµ¥, »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ Ç׸ñ¿¡ µû¶ó ƯÁ¤ Ç׸ñÀÇ »ç¿ë °¡´É ¿©ºÎ¸¦ º¯°æÇÏ´Â ±â´ÉÀ» ÇÑ´Ù. ¿¹¸¦ µé¾î »ç¿ëÀÚ°¡ ¡®Bloglines¿¡ Ãß°¡ÇÕ´Ï´Ù¡¯¸¦ ¼±ÅÃÇßÀ» °æ¿ì, RSS Ãß°¡ ȸéÀÌ ¿¸± °÷À» ¼±ÅÃÇÏ´Â ¸Þ´º(<menulist id="OpenSubPageIn">)¸¦ »ç¿ëÇÒ ¼ö ÀÖ°Ô ¸¸µç´Ù. »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ Ç׸ñÀÌ ¹«¾ùÀÎÁö´Â <radiogroup id="addto"> ¿ä¼ÒÀÇ selectedIndex °ªÀ¸·Î ¾Ë ¼ö ÀÖ´Ù. <ȸé 4>´Â ½ÇÁ¦ ½ÇÇà ȸéÀÌ´Ù.
 |
| <ȸé 3> LiveLines ¼³Á¤Ã¢ |
| |
// addto ¼³Á¤¿¡ ´ëÇÑ »ó¼ö
const LiveLines_AddtoLivemarks = 0;
const LiveLines_AddtoBloglines = 1;
const LiveLines_AddtoSage = 2;
const LiveLines_AddtoXenu = 3
const LiveLines_CopytoClipboard = 4;
// openSubPageIn ¼³Á¤¿¡ ´ëÇÑ »ó¼ö
const LiveLines_OpenInCurrentWindow = 0;
const LiveLines_OpenInNewTab = 1;
const LiveLines_OpenInNewTabFocused = 2;
const LiveLines_OpenInNewWindow = 3;
var objLiveLines = {
prefService: ¡¦,
getPreferences: function(pref_name,pref_type) { ¡¦ },
checkAnchors4RSS: function(target) { ¡¦ },
addWithLiveLines: function(wincontent,data) { ¡¦ },
addtoSage: function(wincontent,data) { ¡¦ },
addtoXenu: function(wincontent,data) { ¡¦ },
copytoClipboard: function(data) { ¡¦ },
doPopup(wincontent) { ¡¦ },
DirectAdd: function(wincontent) { ¡¦ },
updateOptionDialog: function() { ¡¦ },
setPreferences: function() { ¡¦ }
};
function LiveLines_Init(e) {
objLiveLines.checkAnchors4RSS(e.originalTarget);
}
window.addEventListener("load", LiveLines_Init, true);
| |
 |
LiveLinesÀÇ ±âº» ±¸Á¶ livelines.js
<¸®½ºÆ® 8>Àº livelines.jsÀÇ ±âº» ±¸Á¶´Ù. <a>·Î ¸µÅ©µÈ RSS Çǵ带 ã±â À§Çؼ´Â À¥ ÆäÀÌÁö°¡ ¿¸± ¶§¸¶´Ù °Ë»ç¸¦ ÇØ¾ß ÇϹǷΠload À̺¥Æ®¿¡ ¸®½º³Ê¸¦ Ãß°¡Çß´Ù. LiveLinesÀÇ ½ÇÁ¦ ±â´ÉÀº °ü¸®¸¦ ½±°Ô ÇÒ ¼ö ÀÖµµ·Ï objLiveLines¿¡ ³Ö¾î µ×´Ù. objLiveLines ³»ºÎ¸¦ »ìÆìº¸¸é, ¸ÕÀú prefService´Â ´ÙÀ½°ú °°ÀÌ ¼³Á¤ °ªÀ» °ü¸®ÇÏ´Â ¿ªÇÒÀ» ¸Ã´Â´Ù.
prefService: Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefService).getBranch('livelines.')
LiveLines°¡ »ç¿ëÇÏ´Â ¼³Á¤µéÀº ´ÙÀ½°ú °°´Ù.
¡ß livelines.addto :Á¤¼ö·Î ±â·ÏµÇ¸ç RSS Çǵ带 µî·ÏÇÒ ±¸µ¶±â(¶óÀÌºê ºÏ¸¶Å©, Bloglines, Sage, Habari Xenu, Ŭ¸³º¸µå º¹»ç)¸¦ °¡¸®Å²´Ù.
¡ß livelines.OpenSubPageIn : Á¤¼ö·Î ±â·ÏµÇ¸ç RSS Çǵ带 Bloglines¿¡ µî·ÏÇÒ °æ¿ì ÇÇµå µî·Ï ÆäÀÌÁö¸¦ ¿ °÷(ÇöÀç ÅÇ, »õ ÅÇ, »õ â)À» °¡¸®Å²´Ù.
¡ß livelines.OpenBookmarkWindow_Sage : °ªÀÌ ÂüÀ̸é RSS Çǵ带 Sage·Î µî·ÏÇÒ ¶§ »ç¿ëÀÚ°¡ ºÏ¸¶Å© Æú´õ¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖµµ·Ï ºÏ¸¶Å© ´ëÈ»óÀÚ¸¦ ¿¬´Ù.
¡ß livelines.OpenBookmarkWindow_Xenu : livelines.OpenBookmarkWindow_Sage¿Í °°Àº ±â´ÉÀ» Çϸç Sage ´ë½Å Habari Xenu¿¡ Àû¿ëµÈ´Ù.
¡ß livelines.PassPopup: °ªÀÌ ÂüÀ̸é RSS Çǵ带 ¼±ÅÃÇÏ´Â ÆË¾÷ ¸Þ´º¸¦ Ç¥½ÃÇÏÁö ¾Ê°í °¡Àå ù ¹øÂ° Çǵ带 ±¸µ¶±â¿¡ µî·ÏÇÑ´Ù.
¡ß livelines.FindRSS : °ªÀÌ ÂüÀ̸é <a>·Î ¿¬°áµÈ RSS Çǵ带 °Ë»öÇÑ´Ù.
ÀÌ·¯ÇÑ ¼³Á¤ °ªµéÀº ÆÄÀÌ¾îÆø½ºÀÇ ¼³Á¤ °ªµé°ú ÇÔ²² ÀúÀåµÇ´Âµ¥ À̸¦ ÀÐ°í ±â·ÏÇÒ ¶§´Â ÆÄÀÌ¾îÆø½º°¡ Á¦°øÇÏ´Â nsIPrefService¸¦ ÀÌ¿ëÇÑ´Ù. LiveLinesÀÇ ¼³Á¤Àº ¸ðµÎ ¡®livelines.¡¯ ¾Æ·¡¿¡ ÀÖÀ¸¹Ç·Î getBranch ¸Þ½îµå·Î ¡®livelines.¡¯·Î ½ÃÀÛÇÏ´Â ¼³Á¤µé¸¸ Àеµ·Ï Çß´Ù. ÀÌó·³ ¼±¾ðÇÏ¸é ¾ÕÀ¸·Î prefService¸¦ ÀÌ¿ëÇØ ¼Õ½±°Ô ¼³Á¤ °ªÀ» °ü¸®ÇÒ ¼ö ÀÖ´Ù.
getPrefernces´Â ÇÊ¿äÇÑ ¼³Á¤ °ªÀ» ÀÐ¾î ¹ÝȯÇÏ´Â ÇÔ¼öÀÌ´Ù. <¸®½ºÆ® 9>ó·³ µÎ °³ÀÇ ÀÎÀÚ¸¦ ¹Þ´Âµ¥ pref_nameÀº ¼³Á¤ÀÇ À̸§, pref_typeÀº ¼³Á¤ °ªÀÇ Çü½Ä(Á¤¼öÇü, ¹®ÀÚÇü, Âü°ÅÁþÇü)ÀÌ´Ù. ¼³Á¤ °ªÀÇ Çü½Ä¿¡ µû¶ó ¼³Á¤ °ªÀ» Àд ¸Þ½îµå(getIntPref, getCharPref, getBoolPref)°¡ ´Ù¸£±â ¶§¹®¿¡ ¹Ýµå½Ã ¼³Á¤ °ªÀÌ ¾î¶² Çü½ÄÀ¸·Î ÀúÀåµÅ ÀÖ´ÂÁö ¾Ë¾Æ¾ß ÇÑ´Ù. ¶Ç Á¸ÀçÇÏÁö ¾Ê´Â ¼³Á¤ °ªÀ» ÀÐÀ¸·Á ÇÏ¸é ¿À·ù°¡ ¹ß»ýÇϹǷΠ¼³Á¤À» Àбâ Àü¿¡´Â prefHasUserValue ¸Þ½îµå·Î ¼³Á¤ÀÇ Á¸Àç ¿©ºÎ¸¦ È®ÀÎÇÒ Çʿ䰡 ÀÖ´Ù.
| <¸®½ºÆ® 10> ÇÊ¿äÇÑ ¼³Á¤ °ªÀ» ÀÐ¾î ¹øÈ¯ÇÏ´Â getPrefernces ÇÔ¼ö | | | |
getPreferences: function(pref_name,pref_type) {
if (this.prefService.prefHasUserValue(pref_name)) {
// ¼³Á¤ÀÌ Á¸ÀçÇϸé Çü½Ä¿¡ µû¶ó °ªÀ» ÀÐÀº ÈÄ ¹ÝȯÇÑ´Ù.
switch (pref_type) {
case 'int':
return this.prefService.getIntPref(pref_name);
case 'bool':
return this.prefService.getBoolPref(pref_name);
}
} else {
// ¼³Á¤ °ªÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é ±âº» °ªÀ» ¹ÝȯÇÑ´Ù.
var pref_value = null;
switch(pref_name) {
case "addto": pref_value = 0; break;
case "OpenSubPageIn": pref_value = 0; break;
case "OpenBookmarkWindow_Sage": pref_value = false; break;
case "OpenBookmarkWindow_Xenu": pref_value = false; break;
case "PassPopup": pref_value = false; break;
case "FindRSS": pref_value = true; break;
}
return pref_value;
}
| |
 |
RSS Çǵå Á¸Àç¿©ºÎ¸¦ È®ÀÎÇÏ´Â checkAnchors4RSS
checkAnchors4RSS´Â À¥ ¹®¼ÀÇ <a>ÀÇ href °ªÀ» °Ë»çÇØ RSS Çǵ尡 Á¸ÀçÇÏ´ÂÁö È®ÀÎÇÏ´Â ÇÔ¼öÀÌ´Ù. <¸®½ºÆ® 10>ó·³ óÀ½¿¡ document.getElementById(¡°livemark-button¡±)¸¦ °Ë»çÇÏ´Â °ÍÀº ¶óÀÌºê ºÏ¸¶Å© ¹öư(<statusbarpanel id=¡°livemark-button¡±>)À» Á¦¾îÇÒ ¼ö ÀÖ´ÂÁö ¾Ë¾Æº¸±â À§ÇؼÀÌ´Ù. LiveLines´Â livemark-buttonÀÇ ±â´ÉÀ» º¯°æÇÏ´Â ¿ªÇÒÀ» ÇϹǷΠÇÔ¼ö°¡ ½ÇÇàµÇ´Â ½ÃÁ¡¿¡¼ livemark-button ¿ä¼Ò¸¦ ãÀ» ¼ö ¾ø´Ù¸é, ´Ù½Ã ¸»ÇØ Á¢±ÙÇÒ ¼ö ¾ø´Ù¸é ´õ ÀÌ»ó ÇÔ¼ö¸¦ ½ÇÇàÇÒ Çʿ䰡 ¾ø±â ¶§¹®ÀÌ´Ù.
| <¸®½ºÆ® 11> checkAnchors4RSS ÇÔ¼ö | | | |
checkAnchors4RSS: function(target) {
// livelines.FindRSS°¡ °ÅÁþ(false)À̸é Áï, RSS Çǵ带 °Ë»çÇÒ Çʿ䰡 ¾øÀ¸¸é ÇÔ¼ö¸¦ ³¡³½´Ù.
if (!this.getPreferences("FindRSS","bool"))
return;
if (!document.getElementById("livemark-button") || !gBrowser) {
return;
}
if (gBrowser.mCurrentBrowser.livemarkLinks)
return;
// HTML ¹®¼ÀÇ <a>¸¦ ã¾Æ anchors¿¡ ¹è¿·Î ÀúÀåÇÑ´Ù.
var anchors = target.getElementsByTagName("a");
// <a>¸¦ ãÁö ¸øÇßÀ¸¸é ÇÔ¼ö ½ÇÇà Áß´Ü
if (anchors.length < 1)
return;
var href = "";
// rssfeeds: ¹ß°ßÇÑ RSS ÇǵåÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇÏ´Â ¹è¿
var rssfeeds = [];
// RSS ÇǵåÀÇ ÁÖ¼Ò´Â ¸Å¿ì ´Ù¾çÇϱ⠶§¹®¿¡ Á¤±ÔÇ¥Çö½ÄÀ» ÀÌ¿ëÇÏ¿© °Ë»çÇÑ´Ù.
var reg_href = new RegExp("(http(s)?:\\/\\/)?([a-zA-Z0-9.]*\\/)*(index.xml|index.rss|index.rdf|\\w*(rss|syndication)\\w*\\.(php|xml|rdf)|\\w*\\.rss|rss\\/\\w*\\.xml)");
// <a>ÀÇ href °ªÀ» reg_href¿¡ ´ëÀÔÇÏ¿© RSS Çǵ带 ã¾Æ³½´Ù.
for(i=0;i < anchors.length; i++) {
href = anchors[i].getAttribute("href");
if (!href)
continue;
if (reg_href.test(href.toLowerCase())) {
isSameRSS = false;
// ¶È°°Àº ÁÖ¼Ò°¡ rssfeeds¿¡ ÀÌ¹Ì ÀúÀåµÇ¾î ÀÖ´ÂÁö ¾Ë¾Æ º»´Ù.
for (j=0;j < rssfeeds.length;j++) {
if (href == rssfeeds[j]) {
isSameRSS=true;
continue;
}
}
// ¶È°°Àº ÁÖ¼Ò°¡ ¾ø´Ù¸é rssfeeds¿¡ Ãß°¡
if (!isSameRSS) {
rssfeeds.push(href);
}
}
}
// HTML ¹®¼ÀÇ <head>¸¦ ã´Â´Ù.
var HTML_head = target.getElementsByTagName("head")[0];
// ¹ß°ßÇÑ RSS Çǵ带 <link> ¿ä¼Ò·Î ¸¸µé¾î HTML ¹®¼ÀÇ <head>¿¡ Ãß°¡ÇÑ´Ù.
for(i=0; i < rssfeeds.length; i++) {
tmpLink = target.createElement("link");
tmpLink.setAttribute("rel","alternate");
tmpLink.setAttribute("type","application/rss+xml");
tmpLink.setAttribute("title","RSS");
tmpLink.setAttribute("href",rssfeeds[i]);
HTML_head.appendChild(tmpLink);
}
}
| |
 |
±× ´ÙÀ½¿¡ gBrowser.mCurrentBrowser.livemarkLinks°¡ Á¸ÀçÇÏ´ÂÁö °Ë»çÇÏ´Â °ÍÀº ÆÄÀÌ¾îÆø½º°¡ ãÀº RSS Çǵå(<link>·Î ¿¬°áµÈ RSS Çǵå)µéÀÇ Á¤º¸°¡ ¿©±â¿¡ ÀúÀåµÇ±â ¶§¹®ÀÌ´Ù. ¶óÀÌºê ºÏ¸¶Å© ¹öưÀ» ´·¶À» ¶§ ³ªÅ¸³ª´Â ÆË¾÷ ¸Þ´ºÀÇ °¢ Ç׸ñ(<menuitem>)Àº ÀÌ °³Ã¼¸¦ ¹ÙÅÁÀ¸·Î ¸¸µé¾îÁø´Ù. ¸¸¾à livemarkLinks°¡ Á¸ÀçÇÑ´Ù¸é ´Ù½Ã RSS Çǵ带 °Ë»çÇÒ Çʿ䰡 ¾øÀ¸¹Ç·Î ÇÔ¼öÀÇ ½ÇÇàÀ» Áß´ÜÇÑ´Ù. Âü°í·Î gBrowser´Â ÅÇ ¸·´ë¿Í ¸ðµç ÅÇÀ» Æ÷ÇÔÇÏ´Â ºê¶ó¿ìÀú âÀ», gBrowser.mCurrentBrowser´Â ÇöÀç ȸ鿡 Ç¥½ÃµÇ´Â ÅÇÀÇ ºê¶ó¿ìÀú âÀ» °¡¸®Å²´Ù. ¸ðµç ÅÇÀº ¼·Î ´Ù¸¥ livemarkLinks °³Ã¼¸¦ °®°í ÀÖ´Ù.
LiveLines°¡ ã¾Æ³½ RSS ÇǵåµéÀÇ ÁÖ¼Ò´Â rssfeeds¿¡ ¹è¿·Î ÀúÀåµÈ´Ù. À̵鵵 ÆÄÀÌ¾îÆø½º°¡ ãÀº RSS Çǵå¿Í µ¿ÀÏÇÏ°Ô Ãë±ÞµÇµµ·Ï livemarkLinks¿¡ rssfeedsÀÇ °ªµéÀ» ³Ö¾îÁà¾ß ÇÏÁö¸¸ ÅÇÀÌ ¹Ù²ð ¶§¸¶´Ù gBrowser.mCurrentBrowser°¡ °¡¸®Å°´Â °³Ã¼°¡ ¹Ù²î¹Ç·Î, gBrowser.mCurrentBrowser.livemarkLinks¿¡ Á÷Á¢ °ªÀ» ³ÖÀ¸¸é ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ÆÄÀÌ¾îÆø½º´Â RSS Çǵ带 ¾Ë¸®´Â <link> ¿ä¼Ò°¡ HTML ¹®¼¿¡ Ãß°¡µÉ ¶§¸¶´Ù ÇØ´ç ÅÇÀÇ livemarkLinks °ªÀ» °»½ÅÇϹǷΠrssfeedsÀÇ °ªÀ» ¹ÙÅÁÀ¸·Î <link> ¿ä¼Ò¸¦ ¸¸µé¾î HTML ¹®¼¿¡ Ãß°¡Çϸé LiveLines°¡ ãÀº RSS ÇǵåÀÇ ÁÖ¼Ò¸¦ °£Á¢ÀûÀ¸·Î livemarkLinks¿¡ µî·ÏÇÒ ¼ö ÀÖ´Ù. <¸®½ºÆ® 10>ÀÇ ¸¶Áö¸· ºÎºÐ¿¡ ÀÖ´Â for ±¸¹®ÀÇ ¿ªÇÒÀÌ ¹Ù·Î À̰ÍÀÌ´Ù.
RSS ÇÇµå ¼±Åýà ½ÇÇàµÇ´Â addWithLiveLines ÇÔ¼ö
addWithLiveLines´Â ¶óÀÌºê ºÏ¸¶Å© ¹öưÀ» ´©¸£¸é ³ªÅ¸³ª´Â ÆË¾÷ ¸Þ´º¿¡¼, ¿øÇÏ´Â RSS Çǵå(<menuitem>)¸¦ ¼±ÅÃÇßÀ» ¶§ ½ÇÇàµÇ´Â ÇÔ¼ö·Î, »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ ±¸µ¶±â¿¡ RSS Çǵ带 µî·ÏÇÏ´Â ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. µÎ °³ÀÇ ÀÎÀÚ¸¦ ³Ñ°Ü ¹Þ´Âµ¥ wincontent´Â Áö±Ý ´Ù·ç°í ÀÖ´Â HTML ¹®¼°¡ Ç¥½ÃµÇ´Â âÀ», data´Â »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ RSS ÇǵåÀÇ ÁÖ¼Ò(<menuitem>ÀÇ data ¼Ó¼º¿¡ ÀúÀåµÈ °ª)¸¦ °¡¸®Å²´Ù. È£ÃâµÇ´Â ÇÔ¼ö Áß livemarkAddMark´Â RSS Çǵ带 ¶óÀÌºê ºÏ¸¶Å©·Î µî·ÏÇÏ´Â ÇÔ¼öÀ̸ç browser.js¿¡ Á¤ÀǵǾî ÀÖ´Ù.
addWithLiveLines: function(wincontent,data) {
switch(this.getPreferences("addto","int")) {
case LiveLines_AddtoLivemarks: livemarkAddMark(wincontent, data); break;
case LiveLines_AddtoBloglines: this.addtoBlogLines(wincontent,data); break;
case LiveLines_AddtoSage: this.addtoSage(wincontent,data); break;
case LiveLines_AddtoXenu: this.addtoXenu(wincontent,data); break;
case LiveLines_CopytoClipboard: this.copytoClipboard(data); break;
}
}
RSS Çǵ带 Bloglines¿¡ Ãß°¡ÇÏ´Â addtoBloglines ÇÔ¼ö
addtoBloglines´Â RSS Çǵ带 Bloglines¿¡ Ãß°¡ÇÏ´Â ÇÔ¼öÀÌ´Ù. Bloglines´Â À¥ ±â¹ÝÀÇ RSS ±¸µ¶±âÀ̱⠶§¹®¿¡ RSS Çǵ带 Ãß°¡ÇÏ·Á¸é Çǵå Ãß°¡ ÆäÀÌÁö¸¦ ÀÌ¿ëÇØ¾ß Çϴµ¥, ±× ÁÖ¼Ò´Â http://www.bloglines.com/sub/ + RSS Çǵå ÁÖ¼Ò(¿¹:
http://www.bloglines.com/sub/http://www.bloglines.com/sub/ http://forums.mozilla.or.kr/rss.php) ÇüŰ¡ µÈ´Ù.
| <¸®½ºÆ® 12> addtoBloglines | | | |
addtoBlogLines: function(wincontent, data) {
// BloglinesÀÇ RSS Çǵå Ãß°¡ ÆäÀÌÁö ÁÖ¼Ò
subURL = "http://www.bloglines.com/sub/"+data;
// livelines.OpenSubPageInÀÇ °ªÀ» Àоî ÁöÁ¤µÈ °÷¿¡ ÆäÀÌÁö¸¦ ¿¬´Ù.
switch(this.getPreferences("OpenSubPageIn","int")) {
// ÇöÀç ÅÇ¿¡ ¿¬´Ù.
case LiveLines_OpenInCurrentWindow: wincontent.document.location.href=subURL; break;
// »õ ÅÇ¿¡ ¿¬´Ù.
case LiveLines_OpenInNewTab: window.getBrowser().addTab(subURL); break;
// »õ ÅÇ¿¡ ¿°í ±× ÅÇÀ» ¼±ÅÃÇÑ´Ù.
case LiveLines_OpenInNewTabFocused: window.getBrowser().selectedTab = window.getBrowser().addTab(subURL); break;
// »õ â¿¡ ¿¬´Ù.
case LiveLines_OpenInNewWindow: window.open(subURL); break;
}
}
| |
 |
Çǵå Ãß°¡ ÆäÀÌÁö´Â ¼³Á¤¿¡ µû¶ó ÇöÀç ÅÇ, »õ ÅÇ, »õ â¿¡ ¿¸°´Ù. ÇöÀç ÅÇ¿¡ ¿©´Â °ÍÀº HTML°ú ¸¶Âù°¡Áö·Î document.location.href °ªÀ» ¹Ù²Ù¾î ÁÖ¸é µÈ´Ù. »õ â¿¡ ¿©´Â °Íµµ HTML¿¡¼Ã³·³ window.openÀ» »ç¿ëÇÑ´Ù. »õ ÅÇÀ» ¸¸µé ¶§´Â ºê¶ó¿ìÀú(gBrowser)ÀÇ addTabÀ» ÀÌ¿ëÇÑ´Ù. getBrowser´Â gBrowser¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö·Î browser.js¿¡ Á¤ÀǵŠÀÖ´Ù. ÀÌ·¸°Ô ¿¸° ÅÇÀÌ ¼±Åõǵµ·Ï ÇÏ·Á¸é ºê¶ó¿ìÀúÀÇ selectedTab °ª¿¡ »õ·Î ¿¬ ÅÇÀÇ À妽º¸¦ ÁöÁ¤ÇØ ÁÖ¸é µÈ´Ù.
ºÏ¸¶Å©·Î Ãß°¡ÇÏ´Â addtoSage ÇÔ¼ö
Sage´Â RSS ÇÇµå ¸ñ·ÏÀ» ºÏ¸¶Å©ÀÇ Æ¯Á¤ Æú´õ(±âº» °ªÀº Sage Feeds)¿¡ ºÏ¸¶Å©ÀÇ ÇüÅ·Πº¸°üÇÑ´Ù. addtoSage ÇÔ¼öÀÇ ¿ªÇÒÀº ±× Æú´õ¸¦ ã¾Æ³» RSS Çǵ带 ºÏ¸¶Å©·Î Ãß°¡ÇÏ´Â °ÍÀÌ´Ù. ºÏ¸¶Å©¸¦ Ãß°¡ÇÒ ¶§´Â nsIBookmarksServiceÀÇ createBookmarkInContainer ¸Þ½îµå¸¦ ÀÌ¿ëÇÑ´Ù.
createBookmarkInContainer°¡ ¹Þ´Â ÀÎÀÚ´Â 7°¡ÁöÀε¥ ºÏ¸¶Å©ÀÇ À̸§, ÁÖ¼Ò, Ű¿öµå, ¼³¸í, ¹®ÀÚ¼³Á¤(charset), Æú´õ, À妽º ¼øÀÌ´Ù. ºÏ¸¶Å©ÀÇ À̸§Àº ÇöÀç ¹®¼ÀÇ Á¦¸ñÀ» ¾²°í, ÁÖ¼Ò´Â data¿¡ RSS ÇǵåÀÇ URLÀÌ ÀúÀåµÇ¾î ÀÖÀ¸´Ï ÀÌ °ªÀ» ¹Ù·Î ¾²¸é µÈ´Ù.
| <¸®½ºÆ® 13> RSS Çǵ带 ºÏ¸¶Å©·Î Ãß°¡ÇÏ´Â sage addtoSage | | | |
addtoSage: function(wincontent,data) {
// SageÀÇ ÇÇµå ¸ñ·ÏÀÌ ÀúÀåµÇ´Â ºÏ¸¶Å© Æú´õÀÇ ID¸¦ Àд´Ù.
try {
sageFolderID = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefService).getBranch("").getCharPref("sage.folder_id");
sageFolderID = RDF.GetResource(sageFolderID);
} catch(e) {
window.alert("Sage°¡ ¹Ù¸£°Ô ¼³Ä¡µÇ¾ú´ÂÁö È®ÀÎÇϼ¼¿ä.");
return;
}
// ºÏ¸¶Å© ´ëÈ»óÀÚ¸¦ ¿°Å³ª ¹Ù·Î Çǵ带 Sage Æú´õ¿¡ µî·ÏÇÑ´Ù.
if (this.getPreferences("OpenBookmarkWindow_Sage","bool")) {
// ºÏ¸¶Å© ´ëÈ»óÀÚ¸¦ ¿¬´Ù. ºÏ¸¶Å© Ãß°¡´Â ´ëÈ»óÀÚ°¡ ¾Ë¾Æ¼ ó¸®ÇÑ´Ù.
openDialog("chrome://browser/content/bookmarks/addBookmark2.xul", "", "centerscreen,chrome,dialog,resizable,dependent", wincontent.document.title,data);
} else {
try {
// ¹Ù·Î ºÏ¸¶Å©¿¡ Ãß°¡ÇÑ´Ù.
BMSVC.createBookmarkInContainer(wincontent.document.title,data,null,"updated",null,null,sageFolderID,null);
} catch(e) {
window.alert("Sage°¡ ¹Ù¸£°Ô ¼³Ä¡µÇ¾ú´ÂÁö È®ÀÎÇϼ¼¿ä.");
}
}
return;
}
| |
 |
¹®Á¦´Â Sage Æú´õÀÇ IDÀÌ´Ù. À̰ÍÀº sage.folder_id ¼³Á¤¿¡ º¸°üµÅ ÀÖÁö¸¸ ÀÏ¹Ý ¹®ÀÚ¿·Î µÇ¾î ÀÖ¾î nsIRDFServiceÀÇ GetResource ¸Þ½îµå¸¦ ÀÌ¿ëÇØ ºÏ¸¶Å©¿¡¼ »ç¿ëÇÏ´Â RDF ¸®¼Ò½º Çü½ÄÀ¸·Î º¯È¯ÇÑ ÈÄ createBookmarkInContainer¿¡ ³Ñ°Ü Áà¾ß ÇÑ´Ù. ³ª¸ÓÁö °ªµéÀº nullÀ» ³Ñ°Üµµ »ó°ü¾ø´Ù. Âü°í·Î BMSVC¿Í RDF´Â °¢°¢ nsIBookmarksService¿Í nsIRDFResourceÀÇ °³Ã¼·Î, bookmarks.js(ÆÄÀÌ¾îÆø½º ¼³Ä¡ µð·ºÅ丮/chrome/browser.jar/content/browser/bookmarks /bookmarks.js)¿¡ Á¤ÀǵǾî ÀÖ´Ù.
Habari Xenu¿¡ Ãß°¡ÇÏ´Â addtoXenu ÇÔ¼ö
addtoXenu´Â Habari Xenu¿¡ RSS Çǵ带 Ãß°¡ÇÏ´Â ÇÔ¼ö·Î extensions. habarixenu.feeds_folder °ªÀ» ÀÌ¿ëÇÏ´Â °ÍÀ» »©¸é addtoSage¿Í Â÷À̰¡ ¾ø´Ù.
| <¸®½ºÆ® 14> Habari Xenu¿¡ RSS Çǵ带 Ãß°¡ÇÏ´Â addtoXenu ÇÔ¼ö | | | |
addtoXenu: function(wincontent,data) {
try {
xenuFolderID = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefService).getBranch("").getCharPref("extensions.habarixenu.feeds_folder");
xenuFolderID = RDF.GetResource(xenuFolderID);
} catch(e) {
window.alert("Habari Xenu°¡ ¹Ù¸£°Ô ¼³Á¤µÇ¾ú´ÂÁö È®ÀÎÇϼ¼¿ä.");
return;
}
if (this.getPreferences("OpenBookmarkWindow_Xenu","bool")) {
openDialog("chrome://browser/content/bookmarks/addBookmark2.xul", "", "centerscreen,chrome,dialog,resizable,dependent", wincontent.document.title,data);
} else {
try {
BMSVC.createBookmarkInContainer(wincontent.document.title,data,null,"updated",null,null,xenuFolderID,null);
} catch(e) {
window.alert("Habari Xenu°¡ ¹Ù¸£°Ô ¼³Á¤µÇ¾ú´ÂÁö È®ÀÎÇϼ¼¿ä.");
}
}
return;
}
| |
 |
RSS Çǵå ÁÖ¼Ò¸¦ º¹»çÇÏ´Â copytoClipboard
copytoClipboard´Â RSS ÇǵåÀÇ ÁÖ¼Ò¸¦ Ŭ¸³º¸µå¿¡ º¹»çÇÏ´Â ÇÔ¼öÀÌ´Ù. À̰ÍÀº XulPlanet(
www.xulplanet.com)ÀÇ Using the Clipboard(
www.xulplanet.com/tutorials/xultu/clipboard.html)¿¡ ¼Ò°³µÈ Äڵ带 ±×´ë·Î »ç¿ëÇÑ °ÍÀ¸·Î ÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº À§ ¹®¼¿¡ Àß ³ªÅ¸³ª ÀÖ´Ù.
| <¸®½ºÆ® 15> copytoClipboard | | | |
copytoClipboard: function(data) {
// feed_url: Ŭ¸³º¸µå¿¡ º¸³¾ Á¤º¸°¡ ÀúÀåµÇ´Â °³Ã¼
var feed_url = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
feed_url.data = data;
// trans: Ŭ¸³º¸µå·Î feed_urlÀ» Àü¼ÛÇÏ´Â µ¥ »ç¿ëµÇ´Â °³Ã¼
var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
// Ŭ¸³º¸µå¿¡ Àü¼ÛµÉ ÀÚ·áÀÇ Á¾·ù¸¦ trans¿¡ ¾Ë¸°´Ù.
trans.addDataFlavor("text/unicode");
// Ŭ¸³º¸µå¿¡ Àü¼ÛµÉ ÀڷḦ trans¿¡ ¾Ë¸°´Ù.
trans.setTransferData("text/unicode",feed_url,data.length*2);
// ½Ã½ºÅÛÀÇ Å¬¸³º¸µå¿Í ¿¬°áµÉ Ŭ¸³º¸µå °³Ã¼¸¦ ¸¸µç´Ù.
var clipid = Components.interfaces.nsIClipboard;
var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(clipid);
// Ŭ¸³º¸µå·Î ÀڷḦ Àü¼ÛÇÑ´Ù.
clip.setData(trans,null,clipid.kGlobalClipboard);
}
| |
 |
doPopup¿Í DirectAdd ÇÔ¼ö
¿ø·¡ ¶óÀÌºê ºÏ¸¶Å© ¹öưÀ» ´©¸£¸é µî·ÏÇÒ RSS Çǵ带 »ç¿ëÀÚ°¡ ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ÆË¾÷ ¸Þ´º°¡ ³ªÅ¸³´Ù. ´ÙÀ½°ú °°Àº doPopup ÇÔ¼ö´Â »ç¿ëÀÚ°¡ ¶óÀÌºê ºÏ¸¶Å© ¹öưÀ» Ŭ¸¯ÇßÀ» ¶§ È£ÃâµÇ´Âµ¥ livelines.PassPopupÀÌ ÂüÀÏ ¶§ ÆË¾÷ ¸Þ´º¸¦ ¼û±â°í RSS ÇÇµå ¸ñ·ÏÀÇ °¡Àå ù ¹øÂ° Ç׸ñÀÌ ¹Ù·Î ±¸µ¶±â¿¡ µî·ÏµÇµµ·Ï ÇÑ´Ù.
doPopup: function(wincontent) {
if (this.getPreferences("PassPopup","bool")) {
// ¿ä¼Ò¸¦ °¨Ãá´Ù.
gLivemarksButton.firstChild.hidePopup();
this.DirectAdd(wincontent);
}
}
¿©±â¼ gLivemarksButtonÀº
¿ä¼Ò¸¦ °¡¸®Å°´Â °ÍÀ¸·Î, browser.js¿¡ ¼±¾ðµÅ ÀÖ´Ù. gLivemarksButtonÀÇ Ã¹ ¹øÂ° ÀÚ³à(firstChild) ¿ä¼Ò´Â livelines.xulÀÇ ¿¡¼ Á¤ÀÇÇÑ ¿ä¼ÒÀÌ´Ù. ÀÌ´Â hidePopup ¸Þ½îµå·Î °£´ÜÈ÷ °¨Ãâ ¼ö ÀÖ´Ù.
DirectAdd ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ livemarkLinks¿¡ ÀúÀåµÈ RSS Çǵå Áß °¡Àå ù ¹øÂ° ÁÖ¼Ò¸¦ addWithLiveLines ÇÔ¼ö·Î ³Ñ±ä´Ù.
DirectAdd: function(wincontent) {
LivemarkLinks = gBrowser.mCurrentBrowser.livemarkLinks;
data = LivemarkLinks[0].href;
this.addWithLiveLines(wincontent,data);
}
¼³Á¤ °ª¿¡ µû¶ó »óŸ¦ º¯°æÇÏ´Â updateOptionDialog
updateOptionDialog ÇÔ¼ö´Â LiveLines ¼³Á¤Ã¢(livelines_setting.xul)ÀÌ ¿¸± ¶§ ¼³Á¤ °ª¿¡ µû¶ó °¢ ¿ä¼ÒµéÀÇ »óŸ¦ º¯°æÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. getPreferences ÇÔ¼ö·Î ¼³Á¤ °ªÀ» Àоî¿À´Â °ÍÀ» »©¸é ¾Õ¿¡¼ ¼³¸íÇÑ setMenu ÇÔ¼ö¿Í ±â´ÉÀÌ ºñ½ÁÇÏ´Ù.
| <¸®½ºÆ® 16> ¼³Á¤ °ª¿¡ µû¶ó °¢ ¿ä¼ÒµéÀÇ »óŸ¦ º¯°æÇÏ´Â updateOptionDialog | | | |
| |