[[TableOfContents]] = ì°¸ì—¬ìž = [김준ì„] = 프로그램 목ì = * í¬ë¡¬ì€ 아시다시피 Plug-inì„ ì„¤ì¹˜í• ìˆ˜ 있다 extension programì´ë¼ê³ ë„ í•˜ëŠ”ê²ƒ ê°™ì€ë° ë 쉽게 만들수 있는것 같다. ë…¼ë¬¸ì„ ì‚´íŽ´ë³´ëŠ”ë° ì‚¬ì „ê¸°ëŠ¥ì„ ì“°ê¸°ìœ„í•´ 마우스를 ì˜¬ë ¸ì§€ë§Œ ì‹¤í–‰ì´ ë˜ì§€ 않았다.. 화난다=ã…‚= 그래서 ì‚´ì§ ì‚´íŽ´ë³´ë‹ˆ .json확장ìžë„ ë³´ì´ëŠ”것 같지만 ë¬¸ë²•ë„ ê°„ë‹¨í•˜ê³ CSS와 HTML. DOM형ì‹ì˜ ë¬¸ì„œêµ¬ì¡°ë„ íŒŒì•…í•˜ê³ ìžˆìœ¼ë‹ˆ ì–´ë µì§€ ì•Šì„것 같았다. 그래서 간단히 네ì´ë²„ ë§í¬ë¥¼ ê¸ì–´ì™€ HTML element분ì„ì„ í†µí•´ Naverì‚¬ì „ì„ í•˜ëŠ” Plug-inì„ ë§Œë“¤ì–´ë³¼ê¹Œ 한다. = 프로그램 ì¼ì§€ = == ì²˜ìŒ ì‹œìž‘í•´ë³´ìž == === 기본기 === í¬ë¡¬ì˜ ê°œë°œìž API주소는 지금 사ì´íŠ¸ ì´ì „ì„ í•˜ê³ ìžˆëŠ”ë° ë§¨ì•žì— codeê°€ developerë¡œ ì´ì „하는것 같았다. 여튼 indexì˜ ì£¼ì†ŒëŠ” 다ìŒê³¼ 같다. http://code.google.com/chrome/extensions/index.html Tutorialì„ ì§„í–‰í•˜ë©´ 다ìŒê³¼ 같다. http://code.google.com/chrome/extensions/getstarted.html ê·¸ëŸ°ë° ì´ê±° í™•ìž¥ì€ ì–´ë–»ê²Œ 실행시켜보ëƒë©´ '''Chrome브ë¼ìš°ì €ì—ì„œ í™˜ê²½ì„¤ì •(우측ìƒë‹¨ì— ë Œì¹˜ëª¨ì–‘) -> ë„구 -> 확장프로그램 -> 우측ìƒë‹¨ ê°œë°œìž ëª¨ë“œ Check -> ì••ì¶•í•´ì œëœ í™•ìž¥í”„ë¡œê·¸ëž¨ 로드''' 를 하면 ë‚´ ì»´í“¨í„°ì— ìžˆëŠ” í”ŒëŸ¬ê·¸ì¸ í´ë” 째로 올릴수 있다. === íŠœí† ë¦¬ì–¼ ë”°ë¼í•´ë³´ê¸° === flickrì—ì„œ permissionì„ ë°›ì•„ ì‚¬ì§„ì„ ê¸ì–´ì˜¤ëŠ” 플러그ì¸ì„ 만드는것 같다. 파ì¼êµ¬ì„±ì€ HTMLì•ˆì— ìŠ¤íƒ€ì¼ì„ ì 용하는 CSS. AJAX, Javascript를 ì´ìš©í•˜ì—¬ (AJAXì˜ ì •ì˜ë¥¼ ì•Œì•„ë³´ì•„ì•¼ê² ë‹¤ ) ë‚´ìš©ì„ êµ¬ì„±í•œë‹¤. jsonì„ í†µí•´ ë˜ í•˜ëŠ”ê±´ê°€. í¥ë¯¸ë¡êµ°. Wikipedia JSON : http://ko.wikipedia.org/wiki/JSON ì˜ì–´ë¡œ 보는게 ë” ìžì„¸í•˜ì§€ë§Œ ë‚œ í•œêµì¸ì´ë¼. 간단히 ë§í•˜ìžë©´ ì¸í„°ë„·ì—ì„œ ìžë£Œë¥¼ ì£¼ê³ ë°›ì„ë•Œ ê·¸ ìžë£Œí˜•ì‹ì„ ì •ì˜í•˜ëŠ” 문서ì¸ë° javascriptêµ¬ë¬¸ì„ ì‚¬ìš©í•˜ëŠ” 파ì¼ì´ë‹¤. xml보다 webì—ì„œ 효과ì ì´ê¸° ë•Œë¬¸ì— webìƒì—ì„œ ì“°ì¸ë‹¤ê³ 한다. 좋ì€ê±° 배우네. Wikipedia Ajax : http://ko.wikipedia.org/wiki/Ajax Ajax는 비ë™ê¸°ì‹ìœ¼ë¡œ ë°ì´í„°ë¥¼ ì£¼ê³ ë°›ê¸° 위해 (A는 Asyncronous) HTMLê³¼ CSS ë™ì ì •ë³´ 표시를 위한 ë™ì 언어와 DOM문서형 구조를 가진 XML, jsonë§Œì´ Ajax를 뜻하는 ê²ƒì´ ì•„ë‹ˆë¼ ì´ëŸ° 조합으로 ì´ë£¨ì–´ì§„ 비ë™ê¸° 웹 어플리케ì´ì…˜ ê¸°ë²•ì„ ëœ»í•œë‹¤. ë 여기까지 ìš©ì–´ì •ë¦¬ ë¬ë‚˜. ìž ì´ì œ ë”°ë¼í•´ë³´ìž. * ë”°ë¼í•˜ë‹¤ê°€ 실수한ì : manifest.json파ì¼ì„ menifest.jsonì´ë¼ í•´ì„œ updateê°€ 안ë¨. jsonì •ì˜í• ë•Œ ë‹¤ìŒ element를 위해 , 를 ë¶™ì—¬ì•¼í•˜ëŠ”ë° ì•ˆë¶™ì—¬ì„œ ì—러. ê·¸ë ‡ì§€ë§Œ 나머지는 복붙해서 잘 ê°€ì ¸ì˜´. === 작성 ì˜ˆì œ === * popup.js {{{ // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var req = new XMLHttpRequest(); req.open( "GET", "http://api.flickr.com/services/rest/?" + "method=flickr.photos.search&" + "api_key=90485e931f687a9b9c2a66bf58a3861a&" + "text=hello%20world&" + "safe_search=1&" + // 1 is "safe" "content_type=1&" + // 1 is "photos only" "sort=relevance&" + // another good one is "interestingness-desc" "per_page=20", true); req.onload = showPhotos; req.send(null); function showPhotos() { var photos = req.responseXML.getElementsByTagName("photo"); for (var i = 0, photo; photo = photos[i]; i++) { var img = document.createElement("image"); img.src = constructImageURL(photo); document.body.appendChild(img); } } // See: http://www.flickr.com/services/api/misc.urls.html function constructImageURL(photo) { return "http://farm" + photo.getAttribute("farm") + ".static.flickr.com/" + photo.getAttribute("server") + "/" + photo.getAttribute("id") + "_" + photo.getAttribute("secret") + "_s.jpg"; } }}} * popup.html {{{ <!doctype html> <html> <head> <title>Getting Started Extension's Popup</title> <style> body { min-width:357px; overflow-x:hidden; } img { margin:5px; border:2px solid black; vertical-align:middle; width:75px; height:75px; } </style> <!-- JavaScript and HTML must be in separate files for security. --> <script src="popup.js"></script> </head> <body> </body> </html> }}} * manifest.json {{{ { "name": "My First Extension", "version": "1.0", "manifest_version": 2, "description": "The first extension that I made.", "browser_action": { "default_icon": "icon.png", "default_popup": "popup.html" }, "permissions": [ "http://api.flickr.com/" ] } }}} === ë‚´ê°€ ì›í•˜ëŠ”것 === * 마우스를 ì˜¬ë¦¬ê³ ëª‡ì´ˆê°€ 지나면 Text를 ì½ì–´ì„œ ìž‘ì€ íŒì—…ì°½ì„ ë„움 - 3순위 * í…스트를 ë”블í´ë¦í•˜ë©´ íŒì—…ì´ ìžë™ì—´ë¦¬ë©´ì„œ ì‚¬ì „ì„ ë„워줌 - 1순위 === í´ë¦í•˜ë©´ íŒì—…ì°½ ë„우기 구현 === * window.open함수를 ì´ìš©í•˜ì—¬ body를 '''ë”블''' í´ë¦í•˜ë©´ 새로운 íŒì—…ì°½ì„ ë„운다. * index.html {{{ <html> <head> <script language="javascript"> <!-- function na_open_window(name, url, left, top, width, height, toolbar, menubar, statusbar, scrollbar, resizable) { toolbar_str = toolbar ? 'yes' : 'no'; menubar_str = menubar ? 'yes' : 'no'; statusbar_str = statusbar ? 'yes' : 'no'; scrollbar_str = scrollbar ? 'yes' : 'no'; resizable_str = resizable ? 'yes' : 'no'; window.open(url, name, 'left='+left+',top='+top+',width='+width+',height='+height +',toolbar='+toolbar_str+',menubar=' +menubar_str+',status='+statusbar_str+',scrollbars='+scrollbar_str +',resizable='+resizable_str); } // --> </script> </head> <body ondblclick = "na_open_window('win', 'popup.html', 50, 100, 100, 30, 0, 0, 0, 0, 0)"> </body> </html> }}} * ìœ„ì˜ na-open_window는 ìž„ì˜ë¡œ ë§Œë“ í•¨ìˆ˜ê¸´í•œë° status_bar나 기타 스í¬ë¡¤ì´ 가능하지 ì•Šì€ popupì„ ë§Œë“¤ê³ ìžˆë‹¤. 0ì€ false니까. * javascriptì˜ ë‹¤ë¥¸ ì˜ˆì œë¥¼ 확ì¸í•˜ë‹ˆ document.body.ondblclick = 함수명 ì„ ìž‘ì„±í•˜ë©´ ë˜‘ê°™ì´ ìž‘ë™ë˜ëŠ”ê²ƒì„ í™•ì¸í–ˆë‹¤. * popup.html {{{ <html> Hello World! </html> }}} === Google Chrome extension Sample === ==== History 지워주는 extension ==== * 충격과 ê³µí¬ë‹¤. 구글ì—ì„œ ì œê³µí•´ì¤€ Sampleì´ ìž˜ëª»ë˜ìžˆì–´ì„œ í•œì°¸ì„ í•´ë©¨ë‹¤. {{{ { "name" : "BrowsingData API: Basics", "version" : "1.1", "description" : "A trivial usage example.", "permissions": [ "browsingData" ], "browser_action": { "default_icon": "icon.png", "default_popup": "popup.html" //ì´ê²Œ 그냥 popup으로 ë˜ìžˆì—ˆë‹¤. browser_actionì„ ë³´ë‹ˆ default_popupì„ í•´ì•¼ì§€ action iconì„ ëˆŒë €ì„ë•Œ popupì´ ëœ¬ë‹¤. }, "manifest_version": 2 } }}} ==== Contents policy security ==== * '''ì´ê±´ 매우 ê°•ì¡°ë˜ì–´ì•¼í•œë‹¤.''' * ë§í¬ : http://code.google.com/chrome/extensions/contentSecurityPolicy.html * inline script를 cross script attackì„ ë°©ì§€í•˜ê¸° 위해 htmlê³¼ contents를 분리 ì‹œí‚¨ë‹¤ê³ ì¨ìžˆë‹¤. ì´ ë§ì— 따르면 inline으로 작성ë˜ì–´ì„œ ëŒì•„가는 javascript는 ëª¨ë‘ .js파ì¼ë¡œ 빼서 만들어야한다. <div OnClick="func()">와 ê°™ì€ html íƒœê·¸ì•ˆì˜ inline ì´ë²¤íŠ¸ attachë„ ì•ˆë˜ê¸° ë•Œë¬¸ì— documentì˜ ì¿¼ë¦¬ë¥¼ ë‚ ë¦¬ë˜ê°€ element를 찾아서 document.addEventListener 함수를 통해 event를 받아 functionì´ ì—°ê²°ë˜ê²Œ 해야한다. ì•„ ì´ê±° 힘드네. ë¼ëŠ” ìƒê°ì´ 들었다. == 헤메는 것 == * Chrome extentionì˜ overview를 ì½ì–´ë³´ì•˜ëŠ”ë° ë‹¤ì–‘í•œ ê¸°ëŠ¥ì„ ì§€ì›í•œë‹¤. ê·¸ì¤‘ì— extentionì—ì„œ 기본으로 ì œê³µí•˜ëŠ” background.htmlì´ë¼ëŠ”ê²ƒì´ ìžˆëŠ”ë° ì´ê²ƒì´ extention기능으로 ë„£ì–´ë†“ì€ script를 ëª¨ë‘ í¬í•¨í•˜ê³ ë©”ì¸ íŽ˜ì´ì§€ ë°‘ë‹¨ì— backgroundì—ì„œ 계ì†ëŒì•„가면서 ì´ë²¤íŠ¸ 체킹ì´ë‚˜ ë°ì´íƒ€ 처리를 해주는것 같았다. ì•„ì§ë„ ì •í™•ížˆ ëª¨ë¥´ê² ë‹¤ - 2012/7/3 * 그래서.. 샘플코드를 ì°¾ê³ permissionì„ ì°¾ë‹¤ê°€ manifest.json파ì¼ì—ì„œ background를 ì„¤ì •í•˜ëŠ”ê²ƒì„ ì°¾ì•˜ë‹¤ {{{ "background": { "scripts": ["background.js"] }, "permissions": [ "tabs", "http://*/*" ], }}} ì¡°ê¸ˆë” ì°¾ì•„ë³´ìž ----------------------------------- [2012년활ë™ì§€ë„]