表示しているサイトのコンテンツをブラウザ上で比較的簡単にイジれるChrome拡張機能を作ってみた

表示しているサイトのコンテンツをブラウザ上で比較的簡単にイジれるChrome拡張機能を作ってみた

やりたいこと

閲覧しているサイトの文字を変えて遊んだりしてみたい時、ありますよね。

勿論ChromeのDeveloperモードを使えば実現できるのは知っているのですが、もっと手軽にイジイジしてみたい気がします。

なので右クリックで簡単にイジイジできるChrome拡張機能を作ったのです。

※本稿では拡張機能の基本的な説明(インストール方法など)は割愛しています。

chorme-extension-design-1

(タイプミスはご愛嬌ということで)

manifest.json

{  
  "manifest\_version": 2,  
  "name": "designExtesion",  
  "version": "1.0",  
  "background": {  
    "scripts": \["event.js"\],  
    "persistent": false  
  },  
  "content\_scripts": \[{  
    "matches": \["<all\_urls>"\],  
    "js": \["content.js"\]  
  }\],  
  "permissions": \["activeTab","contextMenus"\]  
}

■ポイント

・backgroundのpersistentをfalseに設定

これにより無駄にevent.jsが常駐するのではなく、何かしら設定したイベント実行時などに発火するようにします。

event.js

// 右クリックのメニューを追加  
chrome.runtime.onInstalled.addListener(function(){  
  chrome.contextMenus.create({  
    id: "designModeExtesion",  
    type: "normal",  
    contexts: \['all'\],  
    "title": "designModeExtesion"  
  });  
});// クリック時の挙動を設定  
chrome.contextMenus.onClicked.addListener(function(){  
  chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {  
    chrome.tabs.sendMessage(tabs\[0\].id, {message: "I want to change to designMode!!"}, function(response) {  
      console.log(response);  
    });  
  });  
});

■ポイント

・CSSやDOM操作などはcontent.jsに寄せる

executeScriptなどを利用すればevent.jsから任意のスクリプトを実行することも可能ですが、難読化するので役割ごとにファイルが分かれている方が良いかと思います。

content.js

chrome.runtime.onMessage.addListener(  
  function(request, sender, sendResponse) {  
    if (request.message == "I want to change to designMode!!") {  
      document.designMode = "on";  
      var elements = document.querySelectorAll('a');  
      elements.forEach(function (element) {  
        element.addEventListener("click", function(event) {  
          event.preventDefault();  
        }, false);  
      });  
      sendResponse({message: "designMode changed!!"});  
    }  
  }  
);

■ポイント

・document.designModeをon!

デフォルトではoffになっているのですが、これをonにセットするとコンテンツをブラウザ上からイジイジできるようになります。

(ブラウザ上で動作するエディタを作ったりする際に用いるっぽいのですが、用途がまだ具体的にイメージできません・・・誰か知っている方いたらご教示いただけると嬉しいです)

・aタグのイベントをpreventDefaultで無効化している

document.designModeをonにした時点から文字をイジイジすることは実現するのですが、aタグが有効なままだとaタグをクリックした際にページ遷移が発生し、折角イジイジしたものがなくなるという哀しい事件が起きます(起きました)。

ので、なんとかしてaタグのイベントを無効化したかったので、最初は下記の記述をしました。

var target = document.getElementsByTagName("body");

// 「要素.style.プロパティ」と指定する際にはプロパティをlowerCamelCaseで記述します  
target\[0\].style.pointerEvents = "none";

しかし、pointer-eventsをnoneにすると、 ポインターが要素を通過してしまい、編集したい場所を指定できない状態になってしまいました。

なので、document内の全てのaタグに対してクリック処理が走らないように書き換えた次第です。

参考URL

https://developer.chrome.com/extensions/runtime

https://developer.chrome.com/extensions/contextMenus

https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events

https://qiita.com/dulltz/items/eada79ee82be34490c2b

https://qiita.com/howdy39/items/9ac0564da56246472fc5

https://stackoverflow.com/questions/16492401/javascript-setting-pointer-events

https://github.com/1000ch/chrome-extension-hands-on/wiki/3.2.%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%95%E3%82%8C%E3%81%9F%E3%82%89ContentScript%E3%81%AB%E4%BC%9D%E3%81%88%E3%82%8B

https://www.eisbahn.jp/yoichiro/2013/02/chrome-extension-event-page.html

こちらからは以上です!