Total: Today: Yesterday:
연구소/Chrome Extension | 2016. 4. 4. 16:11 | Posted by 자수씨

본 포스트는 크롬 익스텐션 개발자 페이지(https://developer.chrome.com/extensions/overview)를 토대로 작성되었습니다.


그냥 공부하는 차원에서 개발자스러운 번역 중...



페이지 간 통신


익스텐션 안에 있는 HTML 페이지들은 종종 통신을 필요로 한다. 익스텐션의 모든 페이지들은 같은 프로세스의 같은 스레드에서 수행되기 때문에 페이지들은 다른 페이지의 함수를 직접 호출할 수 있다.



익스텐션 안에 있는 페이지를 찾는다면 chrome.extension 의 getViews() 나 getBackgroundPage() 를 사용한다. 일단 페이지는 익스텐션 안에서 다른 페이지의 참조를 가지며, 첫 페이지는 다른 페이지의 함수를 호출할 수 있고, 다른 페이지의 DOM 을 조종할 수 있다.




데이터 저장 및 익명 모드(시크릿 모드?)


익스텐션은 HTML5 web storage API(localStorage 와 같은) 나 서버에 데이터 저장을 요청하는 방식으로 데이터를 저장할 수 있다. 언제라도 저장하기를 원한다면 익명모드의 창으로 부터를 첫번째로 고려해야 한다. 기본적으로 익스텐션은 익명의 윈도우에서 실행되지 않는다. 사용자의 기대에 의해 익명의 브라우저에서 필요할 수 있음을 고려해야 한다.



익명 모드는 윈도우가 아무런 흔적을 남기지 않음을 보장한다. 익명의 윈도우에서 데이터를 다룰 때 이것을 보장하기 위해 최선을 다해야 한다. 예를 들어 익스텐션이 일반적으로 브라우징 히스토리를 남긴다면 익명의 윈도우에서는 히스토리를 저장하지 않도록 해야한다. 반면에 익스텐션의 설정은 익명이건 아니건 간에 저장할 수 있어야 한다.



익명의 모드를 감지하려면 tabs.Tab 이나 windows.Window 객체의 incognito 프로퍼티를 체크한다.



### javascript

function saveTabData(tab, data) {

  if (tab.incognito) {

    chrome.runtime.getBackgroundPage(function(bgPage) {

      bgPage[tab.url] = data;      // 메모리에만 저장

    });

  } else {

    localStorage[tab.url] = data;  // 로컬데이터에 저장

  }

}




기본적인 것들은 슭 훑어봤으니 간단한 예제 만들러 갑니다//

연구소/Chrome Extension | 2016. 4. 4. 15:10 | Posted by 자수씨

본 포스트는 크롬 익스텐션 개발자 페이지(https://developer.chrome.com/extensions/overview)를 토대로 작성되었습니다.


그냥 공부하는 차원에서 개발자스러운 번역 중...



chrome.* API 사용하기


추가적으로 모든 API 들은 웹 페이지와 앱에서 사용할 수 있고, 브라우저와 밀접한 상호작용이 가능한 크롬 API 를 사용할 수 있다. 예를 들어 익스텐션이나 앱은 window.open() 메소드를 이용하여 새 창을 열지만 익스텐션은 크롬 API (tabs.create)를 대신 사용할 수 있다.



비동기 vs. 동기 방식


대부분의 chrome.* API 들은 비동기적(즉시 리턴하지 않고 연산이 끝날 때까지 기다리지 않음)이다. 연산에 대한 결과를 필요로 하면 콜백함수를 통해 결과를 넘길 수 있다. 콜백은 메소드 리턴 후에 실행된다. 비동기 메소드의 시그니쳐의 예는 다음과 같다.


chrome.tab.create(object createProperties, function callback)



다른 chrome.* 메소드들은 동기적이다. 동기 메소드는 메소드가 끝나기 전까지는 리턴하지 않기 때문에 콜백이 필요하지 않다. 종종 동기 메소드는 리턴 타입을 갖는다.


string chrome.runtime.getURL()


이 메소드는 동기적으로 반환하기 때문에 콜백이 없고 string 리턴 타입을 갖는다.




예: 콜백 사용하기


현재 선택된 탭에 새로운 URL 을 탐색하기 원한다면, 현재 탭 아이디를 확보(tabs.query 사용)하고 탭이 새로운 URL 로 이동(tabs.update 사용)하도록 한다.



만약 query() 가 동기적이였다면 아래와 같이 작성했을 것이다.


// 이 코드는 동작하지 않음

var tab = chrome.tabs.query({'active': true}); // 잘못됨!!

chrome.tabs.update(tab.id, {url:newUrl});

someOtherFunction();



query() 는 비동기적이기 때문에 이러한 접근방식은 옳지 않다. 작업이 완료될 때까지 기다리지 않고 리턴되고, 어떠한 값도 반환하지 않는다. query() 의 시그니처에는 callback 이라는 파라미터가 비동기적으로 선언되어있다.


chrome.tabs.query(object queryInfo, fcuntion callback);



앞서 작성된 코드를 해결하기 위해 콜백 파라미터를 반드시 사용해야 한다. 아래의 코드는 query()에서 콜백 함수를 통해 결과를 얻고 update() 를 부르는 것을 보여준다.


// 이 코드는 정상동작 함

chrome.tabs.query({'active': true}, function(tabs) {

  chrome.tabs.update(tabs[0].id, {url: newUrl});

});

someOtherFunction();



위의 예에서 코드는 다음 순서로 실행된다. 1, 4, 2. query() 에 정의된 콜백 함수는 오직 현재 선택된 탭이 사용가능할 때만 호출된다. 게다가 update() 도 비동기적이지만 update 에 결과가 없기 때문에 콜백을 사용하지는 않는다.



자세한 정보는 chrome.* API docs 를 참고하기 바란다.









연구소/Chrome Extension | 2016. 4. 2. 02:00 | Posted by 자수씨

본 포스트는 크롬 익스텐션 개발자 페이지(https://developer.chrome.com/extensions/overview)를 토대로 작성되었습니다.


그냥 공부하는 차원에서 개발자스러운 번역 중...



아키텍쳐


많은 익스텐션들은 메인로직을 담당하는 보이지않는 페이지(invisible page), 백그라운드 페이지(background page)를 가지고 있다. 또한 UI 를 표현하는 다른 페이지를 포함시킬 수 있다. 만약 사용자가 로드한 웹 페이지(익스텐션에 포함된 페이지가 아닌)와 인터렉션이 필요하다면 컨텐츠 스크립트(content script) 를 사용해야만 한다.




백그라운드 페이지 (The background page)


backgroud.html 에 정의되는 백그라운드 페이지(background page)는 익스텐션의 행위를 제어하는 자바스크립트 코드가 포함될 수 있다. 두 가지 타입의 백그라운드 페이지가 있는데, 영속 백그라운드 페이지(persistent background pages)이벤트 페이지(event pages)이다. 영속 백그라운드 페이지는 그 이름과 같이 항상 열려져 있다. 이벤트 페이지는 필요에 의해 열리거나 닫힌다. 백그라운드 페이지에서 사용할 필요가 없을 때는 이벤트 페이지를 사용할 것을 권한다.



이벤트 페이지백그라운드 페이지의 상세한 내용을 참고하길 바란다.




UI 페이지 (UI pages)


익스텐션에는 UI 표현을 위한 일반적인 HTML 페이지들이 포함된다. 예를 들어, 브라우저 액션이 팝업을 가지고 있다면 이것은 HTML 파일로 구현된다. 어떤 익스텐션은 커스터마이징을 위해 옵션 페이지(options pages)를 가질 수 있다. 다른 타입의 특수 페이지는 오버라이드 페이지(override page)이다. 마지막으로 tabs.create 나 window.open() 을 이용하여 익스텐션 내에 있는 HTML 파일을 표시할 수 있다.



익스텐션 내에 있는 HTML 페이지는 다른 DOM에 완벽하게 접근할 수 있으며, 함수 호출도 가능하다.



아래 그림은 브라우저 액션 팝업의 아키텍쳐를 보여준다. 팝업의 컨텐츠는 HTML 파일(popup.html)로 정의된 웹페이지이다. 이 익스텐션 또한 백그라운드 페이지(background.html)에서 발생한다. 팝업은 백그라운드 페이지에 중복 코드를 필요로 하지 않는다. 팝업은 백그라운드 페이지에서 함수로 호출할 수 있기 때문이다.





A browser window containing a browser action that's displaying a popup. The popup's HTML file (popup.html) can communicate with the extension's background page (background.html).



자세한 내용은 브라우저 액션(Browser Actions), 옵션(Options), 오버라이드 페이지(Override Pages)페이지 간 커뮤니케이션(Communication between pages)를 참고하길 바란다.




컨텐츠 스크립트 (Content scripts)


익스텐션이 웹페이지와 인터렉션을 필요로 한다면 컨텐츠 스크립트(content scripts)를 필요로 한다. 컨텐츠 스크립트는 자바스크립트로 이루어졌으며 브라우저 상의 페이지에 로드되어 실행된다. 컨텐츠 스크립트는 로드된 페이지의 스크립트의 일부라고 생각하면 된다. (익스텐션의 부분은 아님)



컨텐츠 스크립트는 웹 페이지의 상세를 읽을 수 있고 페이지를 변경할 수 있다. 아래의 그림과 같이 컨텐츠 스크립트는 웹 페이지의 DOM 을 읽고 변경할 수 있다. 그러나 익스텐션의 백그라운 페이지는 변경할 수 없다.




A browser window with a browser action (controlled by background.html) and a content script (controlled by contentscript.js).



컨텐츠 스크립트는 익스텐션과 완벽하게 차단되지 않는다. 컨텐츠 스크립트는 아래의 그림과 같이 익스텐션과 메시지를 주고받을 수 있다. 예를 들어 컨텐츠 스크립트가 웹 페이지의 RSS feed 를 발견할 때마다 메시지를 보낼 수도 있다. 또는 백그라운드 페이지가 브라우저 페이지의 변화를 컨텐츠 스크립트에 문의하여 메시지를 받을 수도 있다.




Like the previous figure, but showing more of the parent extension's files, as well as a communication path between the content script and the parent extension.



좀 더 상세한 정보는 컨텐츠 스크립트(Contents Scripts)를 참고하길 바란다.











연구소/Chrome Extension | 2016. 4. 1. 20:09 | Posted by 자수씨

본 포스트는 크롬 익스텐션 개발자 페이지(https://developer.chrome.com/extensions/overview)를 토대로 작성되었습니다.


그냥 공부하는 차원에서 개발자스러운 번역 중...


파일


각 익스텐션은 다음의 파일들을 가지고 있다.

  • manifest file
  • 하나 이상의 HTML files (익스텐션이 테마가 아닐 경우)
  • 옵션: 하나 이상의 JavaScript files
  • 옵션: 확장에 필요로하는 파일들 (이미지 같은)

익스텐션에 작업을 하는 동안에는 모든 파일들을 단일 폴더에 넣는다. 익스텐션을 배포할 때는 특수한 ZIP 파일(.crx 확장자를 갖는)로 컨텐츠 폴더를 패치징한다. 크롬 개발자 대시보드를 통해 익스텐션을 업로드하면, .crx 파일이 생성된다. 배포에 대한 자세한 사항은 호스팅 항목을 참조한다.




파일 참조


익스텐션에는 아무파일이나 넣을 수 있지만, 어떻게 사용할 수 있을까? 대개, 그냥 평범한 HTML 페이지에 상대 주소(URL)을 이용하여 파일을 참조할 수 있다. 아래는 images 폴더 안에 있는 파일 이름이 myimage.png 를 참조하는 예제이다.


<img src="images/myimage.png">



크롬 디버거를 이용하면 익스텐션 안에 있는 모든 파일들을 절대 주소(URL)로 접근이 가능하다.


chrome-extension://<extensionID>/<pathToFile>


URL 에서 <extensionID> 는 익스텐션 시스템에서 각 익스텐션마다 생성된 고유의 식별자이다. "chrome://extensions" 에 접속하면 로드된 모든 익스텐션의 ID 를 확인할 수 있다. <pathToFile> 은 익스텐션의 최상위 폴더에서 부터의 위치(상대주소)이다.



개발 중(패키징 전)에는 익스텐션 아이디가 변경될 수 있다. 특별하게 압축이 해제된 익스텐션의 아이디는 다른 디렉토리에서 로드하게 되면 변경될 수 있다. 개발 중에 ID 가 필요하다면 하드코딩을 막기위해 "@@extension_id" 라는 사전정의된 메시지를 이용할 수 있다.



익스텐션을 패키징 할 때(일반적으로 대시보드에 업로드 시), 익스텐션은 영속적인 ID 를 가지게 되며, 이 ID 는 익스텐션이 업데이트 되더라도 동일하게 유지된다. 한번 생성된 ID 는 영속적이며, "@@extension_id" 를 통해 실제 ID 를 사용할 수 있다.




The manifest file


manifest 파일은 "manifest.json" 에 작성되며, 대부분 중요한 파일과 익스텐션이 할 수 있는 범위와 같은 정보를 제공한다. "google.com" 의 정보를 사용하는 브라우저 액션에 대한 일반적인 manifest 파일의 예는 아래와 같다.


{

  "name": "My Extension",

  "version": "2.1",

  "description": "Gets information from Google.",

  "icons": { "128": "icon_128.png" },

  "background": {

    "persistent": false,

    "scripts": ["bg.js"]

  },

  "permissions": ["http://*.google.com/", "https://*.google.com/"],

  "browser_action": {

    "default_title": "",

    "default_icon": "icon_19.png",

    "default_popup": "popup.html"

  }

}



자세한 내용은 Manifest 파일을 참고하길 바란다.






연구소/Chrome Extension | 2016. 4. 1. 17:31 | Posted by 자수씨

본 포스트는 크롬 익스텐션 개발자 페이지(https://developer.chrome.com/extensions/overview)를 토대로 작성되었습니다.


그냥 공부하는 차원에서 개발자스러운 번역 중...


기본


익스텐션은 HTML, CSS, 자바스크립트, 이미지와 필요한 파일들로 이루어진 압축파일로 구글 크롬 브라우저에 기능을 추가해준다. 익스텐션은 본질적으로 웹 페이지와 페이지들이 사용할 수 있는 모든 API(브라우저에서 제공하는 XMLHttpRequest, JSON, HTML5)를 사용할 수 있다.



익스텐션은 웹페이지나 컨텐츠 스크립트나 cross-origin XMLHttpRequests(크로스 도메인 리퀘스트?) 간의 상호연동을 가능하게 한다. 익스텐션은 또한 북마크나 탭과 같은 브라우저의 기능과도 상호연동이 가능하다.



익스텐션 UI


많은 익스텐션(크롬 앱은 아님)은 크롬 브라우저에 브라우저 액션페이지 액션의 형식으로 UI 를 추가한다. 각 익스텐션은 오로지 단 하나의 브라우저 액션이나 페이지 액션을 가질 수 있다. 익스텐션이 대부분 페이지에 관련이 있을 때 브라우저 액션을 선택하며, 페이지에 의해 아이콘을 활성/비활성할 때는 페이지 액션을 선택한다.


screenshotscreenshotscreenshot
구글 메일 체커 익스텐션은 브라우저 액션을 사용한다.맵피 익스텐션은 페이지 액션과 컨텐츠 스크립트를 사용한다. (웹페이지에 코드를 인젝션)

셋 페이지 컬러 익스텐션의 기능은 클릭했을 때 팝업을 보여준다.

익스텐션(크롬 앱)은 크롬 컨텍스트 메뉴, 옵션 페이지 제공, 컨텐츠 스트립트를 이용하여 다른 방식의 UI 를 제공할 수 있다.