ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 새탭을 만든 후 동적 HTML 로 내용 채우기
    chrome extension 2022. 12. 12. 23:27

    새탭을 만들고 보통 URL 을 입력해, URL 전송 내용으로 보통 채운다.

    그러나 나만의 dynamic content 로 채울 수도 있다. 

     

    전체 구조

    • 새탭을 만들면서 URL 을 search.html?query=abc 와 같은 형태로 호출한다.
    • search.js 에서는 URL 을 분석해 query 정보를 얻어내어 search.html 의 iframe src 값을 변경한다.

    search.html 파일

    <html>
    <head>
        <script src="shap_sbs_search.js"></script>
        <style>...</style>
        ...
    </head>
    <body>
    <div class="container">
        <div class="column column-left">
            <iframe id="left" src="#"
                    sandbox="allow-scripts allow-popups allow-forms" style="width: 100%; height: 100vh">
            </iframe>
        </div>
        <div class="column column-right">
            <iframe id="right" src="#"
                    sandbox="allow-scripts allow-popups allow-forms" style="width: 100%; height: 100vh">
            </iframe>
        </div>
    </div>
    </body>
    </html>

     

    search.js 파일

    document.addEventListener("DOMContentLoaded", function () {
        let url = new URL(window.location.href);
        let query = new URLSearchParams(url.search).get("query");
    
        let urlEncodedQuery = encodeURIComponent(query);
    
        const left = document.getElementById("left");
        left.setAttribute("src", "https://search.naver.com/search.naver?query=" + urlEncodedQuery)
    
    
        const right = document.getElementById("right");
        right.setAttribute("src", "https://www.google.com/search?q=" + urlEncodedQuery)
    });

     

    background.js 파일 (scalajs 버전)

    새 탭을 만들면서 URL 을 /search.html?query=abc 로 지정한다.

    object TabUtil {
      def createNewTab(query: String): Future[Tab] = {
        val encodedQuery = js.URIUtils.encodeURIComponent(query)
        val tabProp = TabCreateProperties(active = true, url = s"/search.html?query=$encodedQuery")
        chrome.tabs.Tabs.create(tabProp)
      }
    }
    
    chrome.runtime.Runtime.onMessage.listen { message =>
      message.value.foreach { any =>
        val bgRequest: BgRequest = BgRequest.decode(any.asInstanceOf[String])
        val tabFuture: Future[Tab] = TabUtil.createNewTab(bgRequest.query)
    
        val bgResponse: Future[String] = tabFuture.map { tab =>
          BgResponse(tab.id.get, tab.index, tab.url.get).encode()
        }
        message.response(bgResponse, "failed")
      }
    }

    댓글

Designed by Tistory.