관련 지식
chrome, extension

크롬 확장플러그인의 툴바 버튼을 클릭했을때 팝업 메뉴가 나오는 기능을 만들어보겠습니다. 디자인을 예쁘게 입히면 PushBullet 같이 채팅 기능도 만들수 있지만, 저는 불가능하므로 간단하게 버튼만 추가하도록 하겠습니다.

manifest.json 작성

먼저 manifest.json 을 만들거나 또는 수정해야 합니다.

  1. {
  2. "name": "yjh-tools",
  3. "version": "1.0.0",
  4. "manifest_version": 2,
  5. "description": "내꺼",
  6. "background": {
  7. "scripts": [
  8. "background.js"
  9. ],
  10. "persistent": true
  11. },
  12. "browser_action": {
  13. "default_title": "내꺼",
  14. "default_popup" : "popup/popup.html"
  15. },
  16. "permissions": [
  17. "background",
  18. "tabs",
  19. "https://*/*",
  20. "http://*/*"
  21. ]
  22. }

여러 값이 있지만 툴바 팝업을 위해 가장 중요한건은 browser_action의 default_popup 항목입니다. 버튼을 클릭하면 해당 속성에 정의된 HTML을 화면에 보여주게 됩니다.

팝업 HTML 생성

HTML은 웹 개발자라면 누구나 만드실수 있을것입니다. 따라서 별다른 설명이 필요없지만 한가지 주의점이 있습니다.

  1. <!DOCTYPE html>
  2. <html lang="ko" xml:lang="ko">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <style>
  8. .menu { width:130px;}
  9. .menu button { width:100%; }
  10. </style>
  11. <script src="popup.js"></script>
  12. </head>
  13. <body>
  14. <div class="menu">
  15. <button id="getimage">이미지추출</button>
  16. <button id="youtube">유튜브 다운로드</button>
  17. </div>
  18. <script>
  19. // 인라인 스크립트는 사용불가
  20. </script>
  21. </body>
  22. </html>

짧은 javascript 코드의 경우 편의상 인라인 스크립트로 작성할수도 있는데, 크롬 확장프로그램에서 인라인 스크립트는 보안상의 이유로 사용할수 없습니다.

따라서 반드시 <script src="popup.js"></script> 와 같이 스크립트 파일을 로딩하는 형태로 만들어야 합니다.

버튼 클릭시 화면 컨트롤

팝업 HTML에서 버튼 이벤트를 추가하고 디자인을 컨트롤하는건 늘 개발하던 방법과 크게 다르지 않습니다. 그런데 팝업 화면에서 버튼을 클릭했을때, 크롬의 탭화면에서 실행중인 사이트의 화면을 조작하고 싶을때도 있습니다. 크롬에서 제공하는 executeScript() 함수를 사용하면 됩니다.

  1. js 파일 실행
    보통 manifest.json 파일에서 로딩하는 background.js 에서 사용하던 executeScript() 함수지만 이 함수는 팝업 HTML에서도 여전히 사용 가능합니다.

    1. chrome.tabs.executeScript(null, {
    2. file : 'JS파일'
    3. }, function() {
    4. window.close();
    5. });

    세번째 파라미터는 executeScript() 함수 종료후 호출되는 콜백함수 이므로 팝업창을 닫는 코드를 넣을수 있습니다.

  2. js 코드 실행
    매우 간단한 스크립트 한줄을 실행하기 위해 .js 파일을 만드는것은 상당히 비효율적입니다. 이럴땐 코드를 실행할수도 있습니다.

    1. chrome.tabs.executeScript(null, {
    2. code:"console.log('run script');"
    3. }, function() {
    4. window.close();
    5. });

    동일한 함수에서 두번째 파라미터만 다르게 설정하면 됩니다. 매우 간단하죠?

위 두가지 방식 모두, 현재 보고있는 탭화면의 HTML에서 자바스크립트가 실행됩니다.

최종 샘플

manifest.json)

  1. {
  2. "name": "yjh-tools",
  3. "version": "1.0.0",
  4. "manifest_version": 2,
  5. "description": "내꺼",
  6. "background": {
  7. "scripts": [
  8. "background.js"
  9. ],
  10. "persistent": true
  11. },
  12. "browser_action": {
  13. "default_title": "내꺼",
  14. "default_popup" : "popup/popup.html"
  15. },
  16. "permissions": [
  17. "background",
  18. "tabs",
  19. "https://*/*",
  20. "http://*/*"
  21. ]
  22. }

popup.html)

  1. <!DOCTYPE html>
  2. <html lang="ko" xml:lang="ko">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <style>
  8. .menu { width:130px;}
  9. .menu button { width:100%; }
  10. </style>
  11. <script src="popup.js"></script>
  12. </head>
  13. <body>
  14. <div class="menu">
  15. <button id="getimage">이미지추출</button>
  16. <button id="youtube">유튜브 다운로드</button>
  17. </div>
  18. </body>
  19. </html>

popup.js)

  1. 'use strict';
  2. function getimage() {
  3. chrome.tabs.executeScript(null, {
  4. file : 'getimage.js'
  5. }, function() {
  6. window.close();
  7. });
  8. }
  9. function youtube() {
  10. chrome.tabs.executeScript(null, {
  11. file : 'youtube/response.js'
  12. }, function(obj) {
  13. chrome.tabs.executeScript(null, {
  14. code:"document.querySelector('#downloadstation a').click();"
  15. }, function() {
  16. window.close();
  17. });
  18. });
  19. }
  20. document.addEventListener('DOMContentLoaded', function () {
  21. var btns = document.querySelectorAll('button');
  22. for (var i = 0; i < btns.length; i++) {
  23. let btn = btns[i];
  24. if(btn.id == "getimage") {
  25. btn.addEventListener('click', getimage);
  26. }
  27. else if(btn.id == "youtube") {
  28. btn.addEventListener('click', youtube);
  29. }
  30. }
  31. });