Skip to content

Instantly share code, notes, and snippets.

@noromanba
Last active June 25, 2022 12:29
Show Gist options
  • Save noromanba/7015739 to your computer and use it in GitHub Desktop.
Save noromanba/7015739 to your computer and use it in GitHub Desktop.
Hatena::Let LOADER history and issue (ja)

Hatena::LetのLOADERと文字数制限・セキュリティ制約の歴史

LOADERとは

簡単な解説

  • はてなのサーバにスクリプト本体が置かれる
  • ブックマークレットには呼び出しコードだけが書かれている
  • サイトにscript要素を追加して実行(サイトコンテキスト)

歴史

推測入り

黎明期

mixed content 問題

  • https既定(固定)のサイトが増加
  • httpsでhttpからのリソースロードがブロックされるように
  • 各ブラウザのセキュリティ強化 Chrome 20台中後半〜 その後Firefoxも
  • Hatena::Letのロード元はhttp (https不可)
  • ユニークかつ強力な機能 「Debuglet」がhttpsでは機能しなくなった
  • LOADER経由だと暗黙的に実行されない
  • なるべくLOADER回避して使えるようにしていた

少し前まで

  • もうすぐ消えるIE8の時点で2000+前後文字数利用できる
  • モバイルの事情はわからない
  • LOADER制約緩くなるといいですね、と思っていた

仕様変更

http://space.hatena.ne.jp/~/14217943783080792432/14217943783080792434/36

  • 既存含む全スクリプトが一律LOADER経由になった。回避のため短く書くのは無意味に
  • window.open()の挙動やhttpsで動かす為にLOADER回避したい
  • @javascript_url でLOADERの抑制が可能に(javascript:コンテキスト)

一律LOADER経由で何が起きるか

  • javascript:-contextで動いていた短いコードもsite-contextになる
  • コードの挙動が変わる、httpsで動かなくなる

e.g. タブを開くコード

  • タブが開くはずの window.open() がサイトコンテキストになると
  • ポップアップになってしまう e.g. Chrome(mium)
  • ポップアップブロッカーに引っかかる e.g. Firefox
/*
 * @title open new tab/window
 * @description assert open new tab/window or pop-up
 * @include http://*
 * @contributor noromanba
 * @license CC0 Univ PD http://creativecommons.org/publicdomain/zero/1.0/
 */

(function () {
    window.open('about:blank');
})();
javascript:"http%3A%2F%2Flet.st-hatelabo.com%2Fnoromanba%2Flet%2FhJmcuLLwxJ0z.bookmarklet.js%20%28arg%29".replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28"script"%29%3Bs.charset%3D"utf-8"%3Bs.src%3Durl%2B"%3Fs%3D"%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B

http://let.hatelabo.jp/noromanba/let/hJmcuLLwxJ0z

@javascript_url

  • LOADERの介入を回避する為に @javascript_url というアノテーションが出来た
  • 従来どおりLOADERを通さなくなる
  • @require や長大コードでは未検証
/*
 * @title open new tab/window w/ @javascript_url
 * @description assert open new tab/window or pop-up
 * @include http://*
 * @contributor noromanba
 * @license CC0 Univ PD http://creativecommons.org/publicdomain/zero/1.0/
 * @javascript_url
 */

(function () {
    window.open('about:blank');
})();
javascript:%28function%28%29%7Bwindow.open%28%27about%3Ablank%27%29%3B%7D%29%28%29%3B%0D

http://let.hatelabo.jp/noromanba/let/hJmcuLO05-5F

LOADER問題回避方法

手元でやってる

  • httpsで使いたい
  • mixed content ブロックの回避
  • 自発的なクリックだと認識させたい
  • window.open() など

手動でjavascript:-context化

  1. 適当なブックマークを編集
  2. Packedなコードをコピペ
  3. javascript: を先頭に付ける
  • ただし、元々LOADER経由の場合はそのままでは動かない場合あり
  • @require してる場合
  • LOADERのPackコードがセミコロン抜けなのでエラーになる。逐一手動補完する必要あり

c.f.

一律LOADER化は 良い/悪い のか

@javascript_url も実験段階

@javascript_url (実験的)

このフィールドが指定されていると、無名関数に入れて外部 JavaScript ファイルとして読み込むのではなく、できるだけコードを短縮して javascript: URL に直接埋め込みます。

正しく扱えるコードの長さはブラウザーにより異なります。また、 構文によってはただしく短縮できないことがあります。

この機能は実験的なものであり、将来的に変更または削除する可能性があります。

http://let.hatelabo.jp/help

提案

可能なら

極力LOADERは避けたい

  • 長いスクリプトのLOADER化する判定が直ってほしい
  • 根本的に直るとうれしい
  • LOADER化される文字数が2000+〜 になるとうれしい
  • 一律LOADER化は過去の遺産が死んでしまう場合がある
  • 新しく使う・普通に使う人に負担がかからないのがいちばんよい
  • window.open() などよく使われているのでハマリそう
  • @javascript_url に気づけるか

mixed content ブロック問題の解決

極論

目安箱


c.f.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment