39
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

KaggleでもMouse Dictionaryを使えるようにする

Last updated at Posted at 2019-01-15

Mouse DictionaryとKaggleと私

Mouse Dictionaryを、Kagglerな方々の一部で便利に使っていただいているようでした。

一方で、Kaggleのサイトの一部でMouse Dictionaryが反応しないという問題があるようでした(Notebook上の文章とか)

そこで今回は、Mouse DictionaryをKaggleのサイト上コンテンツ全般に対して使用できるようしてみました。

結論だけ知りたい

このChrome拡張をインストールしてください。

Mouse Dictionary本体も必要です

Mouse Dictionary Kaggle supportのソースコード

背景を知りたい

なぜKaggleで使えなかったのか

iframeのせいです。

Kaggleが https://www.kaggle.com/ で、一部コンテンツの中身がiframeになっていて https://www.kaggleusercontent.com/ にあります。

拡張とはいえJavaScriptなので、クロスオリジンなiframe内のコンテンツをMouse Dictionary側に渡すことは、ストレートにはできません。

解決案1(採用せず)

もっとも簡単な解決案として、Mouse Dictionary自身が各iframe内にmousemoveなどのイベントを仕込み、そのイベントから取得したコンテンツを都度Mouse Dictionary本体側に渡す、という方法があります。

iframe内JS → Mouse Dictionary拡張のJS → トップレベルドキュメントのJS → Mouse Dictionary小窓の更新

みたいな流れですね。

このようなデータのやり取りは、メッセージ送受信する拡張の仕組みで実現することができます。詳しくはこちらを御覧ください。

Message Passing:
https://developer.chrome.com/extensions/messaging

しかしひとつ問題があります。クロスオリジンなiframe内にイベントを仕込んでメッセージ送受信をするためには、Mouse Dictionaryのパーミッションを追加する必要があるという点です。

これを、

"permissions": ["storage", "unlimitedStorage", "activeTab"],

こんな感じにする必要があります。

"permissions": ["storage", "unlimitedStorage", "activeTab", "https://www.kaggleusercontent.com/*"],

大多数のユーザにとって関係のないパーミッションを追加するのは、あまりうまい手とはいえません。また、拡張のアップデートの際にパーミッションが追加されていると、ユーザが明示的に許可しないとMouse Dictionaryが使用できなくなってしまいます。セキュリティ面でもユーザ体験面でも、よろしくありません。

また、将来Kaggleのページ構成が変わってしまったときに、Mouse Dictionary本体を追従する必要が出てくるかもしれません。Web上の1サイトに過ぎないKaggleを、Mouse Dictionaryが特別扱いして対応し続けないといけないのも、変な話です。

解決案2(採用)

ということで、Mouse Dictionary本体にパーミッションを追加しないで済む、別の案を考える必要がありました。

ここでは、別の拡張(Kaggle support)を、Mouse Dictionaryの追加機能的に提供する仕組みにしてみます。Kaggle利用者だけがこれをインストールすればいいので、Mouse Dictionary側のパーミッションを追加する必要はありません。Mouse Dictionaryのインストールだけで完結しないのは面倒ですが、まあ仕方がありません。

仕組みとしては、iframe内のマウスカーソル下コンテンツ取得は、Kaggle supportにまかせます。Kaggle supportは、Mouse Dictionary側にデータを送信して、小窓内のコンテンツを更新してもらいます。

拡張から拡張へのデータのやりとりには、Cross-extension messagingという仕組みを利用します。

(おおまかな仕組み図)

image.png


これでKaggleのiframe上でもMouse Dictionaryが反応するようになりました。

Kaggle supportをインストールするときに下記のようなことを訊かれるのは、これがどうしても必要なパーミッションであるためです。上図を見るとご理解いただけるのではないかと思います。

image.png

このやり方であれば、もし仮にKaggleのページ構成が変わってしまっても、Mouse Dictionary本体には影響はなく、Kaggle supportの方だけ変更すれば追従できそうです。

謝辞

私はKagglerではないので、Kaggle利用者的にいい感じに動いているかの確認は、かえるるるさんにご協力いただきました。ありがとうございます。

39
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?