Archive for the ‘Firefox’ Category

Mozilla Vision 2012 Conference Day アウトラインメモ

Mozilla Vision 2012 – Conference Day

Mozilla Vision 2012 Conference Dayに参加してきたので、その時のメモです。(いつも通り正確性は保証されません)

NewImage

Read the rest of this entry »

Mozilla 勉強会@東京 6thのアウトラインメモ

2011年10月1日に行われたMozilla 勉強会@東京 6thのメモ

イベントのページ: Mozilla 勉強会@東京 6th
Twitterのまとめ: Mozilla 勉強会@東京 6th – Togetter

  • 14:30 – 15:00: 開場、発表者準備
  • 15:00 – 15:10: Opening

自己紹介の流れ。

■15:10 – 15:50: Firefox for Developers – 開発者ツール&セキュリティ編
Firefox開発者ツール – Web Console
  • コマンドの補完

Inspector

  • DOM Inspectorみたいなもの
  • 要素を調査するツール
  • Style Inspector(開発中)
CSS Doctor
  • CSSの間違いとか
ScrachPad
  • エディタ
  • 選択行のコードだけを実行できたりする。
GCLI
  • ubiquityみたいな感じの
  • CUIとGUI
Source Map
  • CoffeeScriptのような変換コードと元コードをマッピングしたたものを作る
  • 変換前の言語
Tilt
  • DOMマップを3D化するアドオン
about:Firefox
セキュリティとプライバシーの話
Same Origin Policy
Content Security Policy
  • 次世代のセキュリティポリシー
    • XSSの攻撃防止
  • コンテンツ種別で読み込み制御
    • 画像やCSSやJSなども制御できるようにする
  • Webkitではほぼ開発されてる
  • デフォルトセキュリティポリシーがいろいろ強化される
  • CSPの使い方
    • X-Content-Security-PolicyのHTTPレスポンスヘッダを送信
    • HTMLのメタタグは書き換えできたりするものだからヘッダーで
    • Apache でCSPの設定
  • CSP対応に移行する
    • JS,CSSは外部ファイルに
    • evalを使わない
    • ポリシー違反レポートでどこがおかしいのかも確認できる
      • ヘッダーでレポートを報告するURLを指定してログを残せる
    • CSPブックマークレットもある

HTTP Strict Transport Security

  • HTTPSでの接続を要求するヘッダ
X-Frame-Options
  • クリックジャッキングとか
Cross-Origin Resource Sharing
  • クロスドメインでの読み込み許可
  • 他のドメインから読み込まれてもいい場合の設定
  • XHR2とか
ユーザ追跡拒否ヘッダ
  • Do-Not-Trackヘッダ
    • ブラウザ側でサイトに通知する
    • IE,Safariも対応
    • Chromeだけ非対応
  • 受け取ったらユーザー追跡をしない
■15:50 – 16:30: Pano って拡張機能 teramako
Panorama
  • Firefox4から導入された
  • タブグループを管理するビュー
    • アクティブなタブグループの切り替え
タブの種類
  • ピン止めタブ(AppTab)
  • グループの属するタブ
  • グループに属さないタブ(Firefox7で廃止)
Pano できること
  • グループの作成/削除
  • グループ名の変更
  • D&D操作
実装の仕組み
  • panoramade上で起こったイベントを拾ってビューを作ってる
    • tabopenなど
    • 起こらないイベントは上書きして起こす
  • 基本的にはビュー
頑張った所
  • アイコンはSVG
    • いろいろな場所で使われてる
    • 使いまわしたい -> SVGで作る
  • SVG
    • ベクターなので拡大縮小できる
    • ファイルサイズも小さい
  • about:addonsでアイコンが表示されてない
    • アイコンのサイズが指定されてなかった
    • SVG内にサイズの指定した
  • タブ、Panoramaから発生するDOM Eventを拾う
    • Panoramaから発生しないEvent
      • グループが作成された
      • グループから削除された
      • グループから移動した
    • 取れないEventは無理やり発行させる
      • Gropuが作成されたときに起きるイベントを上書きする
  • GroupItems.registerの上書き
    • 元関数を実行
    • DOM Eventを発行
    • コールバックシステムに関数を登録してDOM Eventを発行させる
起動速度の改良
  • 起動時のスクリプトは最小限
    • 必要なときにロードさせる
    • mozUSSubScriptLoaderの使用
  • 必要なときに取得
    • getterの使用
  • 速い読み込み
    • Firefox8 から mozUSSubScriptLoader もキャッシュされる
実装方法
  • 最初の読み込みは必要最小限
    • 40行ほど
    • 最初はロードするものを書いておいて、ロードしたときにそれを上書きする
  • getterの使用
    • XPCOMUtil.jsmを使用してgetterを使いやすくする
    • defineLazyGetter
コンテンツの遅延読み込み
  • bartab
    • 起動したときはタブはできるが、ロードはされない
    • タブが選択されたときに初めてロードされる
  • nsISessionStoreが鍵
    • 短いコードで実現する
非アクティブなグループ内に開くには
  • Panoramaとバッテングして上手く行かなった
  • 上手い解決方法が見つからない
    • setTimeoutでぐるぐるー
パネルでD&Dするために
  • パネルをドラッグする前に閉じないようにする
    • noAutohide = true
  • メニューボタンを押したときは閉じない様にする
■16:40 – 17:20: restartless – 再起動不要なアドオンをSDK無しで作るフレームワーク – Piro
Add-on SDKの目的
  • 誰でも開発できるようにする
  • 高機能なアドオンの開発は目的ではなかった
  • 今までのアドオン開発
    • 自由すぎた
    • 敷居高い
    • 何でもできた
  • SDKを使えばある程度制限された状態で簡単作れるようになる
Add-on SDKはGreasemonkeyスクリプトと同じような立ち位置
restartlessの目的
  • 再起動不要なアドオンを今までの開発と同じ方式で作れるように
  • Mozilla特有の事情を必要なのも従来方式
  • 対象も従来の開発者向け
restartlessの使い方
  • main.jsの内容
    • startup()で読み込まれる
    • 専用の名前空間で実行される
    • shutdown()を定義
  • ユーティリティ
    • location.href
    • load関数 = Cu.importと互換
    • require関数
    • existsでファイルの有無を調べる
    • resolve 相対パスの解決
    • EXPORTED_SYMBOLS
    • doAndWait
      • 非同期処理を同期的に扱うときに使用
    • jstimer
    • pref
    • locale
      • 国際化
    • config
    • WindowManager
      • DOMWindowにアクセスする
      • ウィンドウのopenを監視
    • KeyboardShortcut
      • ショートカットの定義
    • jsDefferred
restartlessの利用例
  • ALT
  • back to owner tab
  • Fox Splitter

restartlessのコードリーディング

  • index.rdf
    • bootstrap=”true”で再起動不要と認識される
  • bootstrap.js
    • モジュールのロードとか
  • loader.js
    • ユーティリティとかが定義されている
    • doAndWait
      • スレッドをたててメインループを回す実装
  • main.js
    • 各アドオンのコード
  • module
    • 各ライブラリが入ってるので、削除すれば消える
■17:20 – 18:00: Lightning Talk
  • アドオン SDK を利用した初めてのアドオン開発– by knagato
    • 初めてアドオン開発する人が対象
    • SDKを使ったアドオン開発を特徴
      • HTMLやJavaScriptなどが中心で、XULやXPCOMなどMozilla特有の機能を使わなくても開発できる
    • 開発環境の種類
      • Add-on BuilderをWeb上での開発
        • 再起動不要なのでその場で試せる
      • Addon SDKを使った開発
        • コマンドラインベース
    • Add-on SDKのチュートリアル
  • Thunderbirdアドオンによるワークフロー開発について– by Nakashima
    • 提案するツール
      • 自分自身でのプロセス改善が可能
      • やり取りの簡略化ができる
    • http://www.p2pwf.com/ に仕様の詳細
  • Forking Secure Login – by saneyuki_s
    • Secure Loginアドオンのフォークの話
      • 現在はメンテナンスアップデートのみになってる
      • 全面改装してる
    • 一部機能の省略
    • レガシーコードの除去
    • doorhanger対応
      • Firefoxに入ってるSSLのポップアップするやつ
  • jQueryで破棄されたrequestAnimationFrameとJSでのアニメーション実装で注意すること – by kyo_ago
    • requestAnimationFrame
      • setIntervalの問題点としてアニメーション向けではない
    • jQuery 1.6から削除された
      • setIntervalとrequestAnimationFrameが衝突してキューがたまる
      • タブがバックグランドにあるときの挙動
  • ES.next WeakMap– by mooz (@stillpedant)
    • WeakMap = 連想配列
    • Firefox6から利用可能
    • {}やObject()と比較して
      • keyにオブジェクトが指定可能
        • ハッシュはkeyに文字列しか指定できない(toStringされてる)
        • WeakMapはkeyにオブジェクトが指定可能
          • オブエジェクトしか指定できない
          • プリミティブ値はエラー
        • オブジェクトの外部拡張
          • DOMノードに独自プロパティは危険
          • ES5ではオブジェクトの拡張がfreezeできる
          • オブジェクト自体は拡張しないで、外部に付加情報を持つ
          • WeakMapを利用する
            • キーとして外部情報をもたせる
      • keyに指定されたオブジェクトを弱く参照
        • CGにたいして
  • Firefox4以降のE4X– by teramako
    • ワイルドカード
      • *が指定子に使える
    • 属性アクセス
      • @が使える
    • Firefox3.6までは上記のものがE4X以外でも使えた
      • Firefox4以降は禁止された
      • ざんねんでしたね

Scriptish v0.1.3の更新内容とGreasemonkeyの互換性について

Scriptishが0.1 -> 0.1.3へとアップデートされたのでそれの更新内容を調べてみる。

- Version 0.1.1 issues
- Version 0.1.2 issues
- Version 0.1.3 issues

に全部載っている事です。
バグとかは面倒なので省いています。結構いろいろあるので気になる人は上のを見ておくといい。

オプション画面の変更

image

Scriptish自体のオプション画面も大きく変更されています。

imageimage

一枚目は主要プロトコルでの動作の設定以外は以前とそこまで変わらないので、問題ないと思います。
二枚目はグローバルのExclude(スクリプトに書かれてるexcludeとは違ってグローバルで動かないURL)の設定がタブに分かれて書きやすくなっています。

image

三枚目が結構重要な変更が入っていて、特にGreasemonkeyスクリプトを書く人はここの設定に注意する必要があります。

☑ユーザスクリプトをキャッシュする

という設定にチェックが入っていると、スクリプトを書き換えてページをリロードしても、すぐには反映しない(キャッシュが使われる)ため、スクリプトを書く人はチェックを外した方がいいと思います。

後は、UIを常に英語にしたり、今までabout:configから直接決めないといけなかったものもGUIから設定できるようになっているみたいです。(全てではないですが)

これ以外にも、パフォーマンスとか内部のバグなど結構改善されてると思います。

Greasemonkeyとの互換性の話

新しいAPIはGreasemonkeyが実装してくれないと互換性はない(fail safeを書くか、分岐するなどで対処)ですが、元々あったGM_openInTabなどは拡張して実装されてるので基本的にGreasemonkeyと互換性があると思います。

ただ、GM_registerMenuCommandはGreasemonkeyでは第一引数にeventオブジェクトが渡されるようになって、

function sayHello(evt) { console.log(evt) }
GM_registerMenuCommand("Hello, world (simple)", sayHello);

のようなコードがScriptishではundefinedで、Greasemonkeyで動かすとなぜかイベントオブジェクトが入るようになり互換性がちょっとないです。(これはGreasemonkeyが勝手に壊した感じです)

function sayHello(evt) { console.log(evt) }
GM_registerMenuCommand("Hello, world (simple)", function(){
sayHello();
});

そのため、Scriptish、Greasemonkeyどちらでも安全に動くようにするには、明示的に無名関数などを使った方が良いでしょう。

後、外部コンテンツを読み込む系のGreasemonkeyやブラウザ拡張を作る際の注意事項などの対策(Full Feedのものが行ってるタイプ)として、GM_xhrで取得したコンテンツを自前でフィルターするのをベタに書くと速度的な問題が発生したりするので、そういう時はScriptishにあるGM_safeHTMLParser APIを使用するのが良いでしょう。
自前で書いても工夫すれば実用的な速度にはなるが、用意されているものを使うのが楽という意味で。

また、まだ入っていませんが、Scriptish 2.0でGM_xpath – GitHubというXPathのAPIが入るようなので楽しみ。

Greasemonkeyにとどまる意義はあまり見つける事ができませんが、Scriptitshに移行する意義は見つける事ができるような感じの状態です。
Scriptish作者のErik VoldさんはGreasemonkeyに対してさよならと言ってるので、これから少しずつ差が出てくるような気がします。

これからGreasemonkeyスクリプト実行環境がどうなるのかはまだ何ともいえませんが、とりあえず私はScriptishを中心に使っていきます。

Re:ブラウザの最新情報を知るために、Web開発者が読んでおくべきブログ

ブラウザの最新情報を知るために、Web開発者が読んでおくべきブログの内容を更新した。

などを追加して更新しました。

後、alice0775さんのブログの内容(というかスクリプト群)がalice0775′s Profile – GitHubに移行していました。

gistページにraw masterへのリンクを追加するGreasemonkey

gistに置いたファイルの最新版を常に参照するraw masterなURLが最近変更されたり、昔使えた方法が使えなくなっています。

詳細は以下を参考に

  • Gist の raw ファイルの URL が変わった: 「わ」の日記もどき
  • 以前はURLに.txtとつければよかったので、特に何もしなくても不便はしなかったのですが、2011年6月15日現在はraw masterなURLへのURLにするにはちょっと書き換える量が多いのでGreasemonkeyを書きました。

    gistのページのファイル名の横にraw master URLへのリンクを追加するGreasemonkeyです。
    Scriptishの場合は、リンクをクリックするだけでクリップボードにURLをコピーします。

    2011-06-14-ss1

  • gist: raw master URL for Greasemonkey
  • この仕様変更により、Greasemonkeyで.txtでrequireしてたりするスクリプトは新しくインストールすると死んでいると思うので確認が必要になるかもしれません。

    Firebugを使ったページロード解析(Net panelの読み方)

    Software is hard | Page load analysis using Firebug の記事を元に書いています。
    January 18th, 2010に書かれた時点での例を使用しているため、現在のブラウザでは若干挙動が違うかもしれません。
    また、著者のJan Odvarkoさんに翻訳許可は頂いていますが、翻訳というより意訳や自分の理解のために書いていたので、いろいろ書き加えたりしています。
    Net panel(ネットパネル)について理解したいと思って書いたので、Net Panel自体の解説記事Software is hard | Introduction to Firebug: Net Panelも一緒に読むといいかもしれません。

    翻訳許可のメールをわずか15分で返してくれた著者のJan Odvarkoさんに感謝を。
    Thnak you, Jan Odvarko.

    Read the rest of this entry »

    JavaScriptリファレンスを高速検索するKeySnailプラグイン

    JSReferenceというFIrefoxアドオンであるKeySnail上で動くプラグインの紹介

    このプラグインはChemr-jsのように先にリファレンスサイトのインデックスのキャッシュを作っておいて、複数のリファレンスからまとめて検索をすることができるプラグインです。

    動画だと対応サイトが少ないですが、現在は以下のサイトに対応しています。
    (最新の対応サイトリストはJSReference at master from azu/KeySnail-Plugins – GitHubを参照してください)

    ECMAScriptの仕様書、MDCのドキュメント、jQueryのAPIドキュメント、IEのJavaScriptリファレンスなどを同時に引けるので結構便利です。image

    対応サイトもSITEINFO的なものを書けば増やせるので、JSReference at master from azu/KeySnail-Plugins – GitHubを参考に見てみるといいです。

    プラグインをインストールするとプラグインマネージャーにドキュメントが表示されるので、そこに使い方が書いてありますが簡単に説明すると二つのコマンドが追加されます。

    JsReferrence-open-promptJsReferrenceで検索を開始する
    JsReferrence-reIndexJsReferrenceのインデックスを作り直す

    このコマンドをKeySnailの設定メニューや_keysnail.jsファイルに直接書き込むなどでショートカットに割り当てて使います。

    image
    設定画面の場合

    key.setGlobalKey(['C-b', 'j'], function (ev, arg) {
        ext.exec("JsReferrence-open-prompt", arg, ev);
    }, 'JsReferrenceのプロンプトを開く', true);
    key.setGlobalKey(['C-b', 'r'], function (ev, arg) {
        ext.exec("JsReferrence-reIndex", arg, ev);
    }, 'JsReferrenceののインデックスを作り直す', true);
    _keysnail.jsファイルに書き込まれる内容。
    これらのコマンドは引数を受け取ることができて、ドメイン(上のリストで書かれているes5.github.comといったサイトの固有なもの)を配列で渡すことで、それぞれそれらのサイトを対象にした動作になります。
    デフォルトだとすべてのサイトを対象するので、ドメインを指定したものを_keysnail.jsで複数のショートカットに割り当てれば、グループに分別でプロンプトから検索するなども可能です。
    // 二つのサイトを候補にする - JavaScript
    key.setGlobalKey(['C-b', 'l'], function (ev, arg) {
        ext.exec("JsReferrence-open-prompt", ["developer.mozilla.org", "www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/"], ev);
    }, 'JsReferrenceのプロンプトを開く', true);
    // msdn.microsoft.comのインデックスだけを再構築する
    key.setGlobalKey(['C-b', 'r'], function (ev, arg) {
        ext.exec("JsReferrence-reIndex", ["msdn.microsoft.com"], ev);
    }, 'JsReferrenceのプロンプトを開く', true);
    また、これはKeySnailの設定になりますが、Customizing (Japanese) – GitHubを読んで、プロンプトの設定をしてC-Enterで連続的にサイトを開くなどできるようにするととても便利になります。
    KeySnailのプロンプトはとてもできがいいので、前から言っていますがこれのためだけにKeySnailを使うのもありだと思います。PluginのHatebnailのはてなブックマーク検索やすべてのタブからGrep検索する事ができるFindなどはものすごくプロンプトと相性がいいです。
    リファレンスは何度も見ると思うので、この部分を早くできるようになるとストレスが減ってとてもいいので是非試してみてください。

    JavaScriptでAmazonからASINを取得する方法など

    一つの方法はinput要素から取得する方法

    document.getElementById("ASIN").value

    Amazonはページ中のhiddenなinput要素にASINを持たせてるのでこういう手が取れる。

    <input id="ASIN" type="hidden" value="4253196519" name="ASIN">

    ページの構造が変わったらダメだけど、結構昔からこの部分は変わってないので意外と安定しているかもしれない。
    amazon.comだと構造が違うものがあって、Amazon.com: Buried Prey eBook: John Sandford: Kindle StoreのようにKindle Storeだとページ構造が違ってID=ASINがない代わりに次のようなものがある。

    <input type="hidden" value="B004LRPGPC" name="ASIN.0">
    なので、inputを取得する場合は次のような形になる。
    var ASIN = document.getElementById("ASIN") || document.getElementsByName("ASIN.0")[0];

    もう一つの方法はwindowオブジェクトのプロパティから取得する方法

    (2011年6月5日現在だと)

    window.sitbAsin;
    にASINの数値が入っている。(ちょっとできるタイミングが特殊な気がするから扱いにくいかも)
    これはAmazon側のJavaScriptが生やしているので、ページのちょっとした構造の変化では変わらないと思うけど使うライブラリを変えたりJavaScriptが大きく変わると変更されることがある。
    以前はwindow.productTagsに入っていた。

    最後はURLからASIN部分を切り出す方法

    URLにはASINが入ってるはずなので、ページに構造の変化には強いけど、少しパースが面倒なところがある。
    どのようなURLがあるかを把握する必要があるので、条件分けなども必要になる。
    まあASINのフォーマットは\w{10}と決まっているので、ある程度安定するのかもしれない。

    ついでに、replaceStateを使ってリロードなしでAmazonのURLを/dp/ASINだけの短いURLにするGreasemonkey書いた。

    Gihubのcanonicalを除去するGreasemonkey

    最近、Gihubのレポジトリでlink rel="canonical"が、treeのその時一番新しいものを示すようになっていて、そのためブックマークが分散したり、気持ち悪いURLを知らない間に登録していたりします。

    なので、link rel="canonical"のタグを削除するGreasemonkeyを書いてみました。

    何でこんな仕様なのか意味不明なので、いずれは元に戻って欲しいです。(このGreasemonkeyは一応、仕様が変わったかどうかかもチェックしてます)

    Githubはhisotyオブジェクトを使って動的にURLを書き換えてるのは知ってる人多いと思いますが、link rel="canonicalもそれにあわせて動的に書き換えています。
    $.attrで書き換えてるだけなので、link要素を削除してもエラーは特にでないようになっています。

    link rel="canonicalはあった方がうれしいと思ってたけど、あると困るケースに遭遇したのは初めて。

    adblock++からadblock#へ移行する

    危険な広告を除去するのにAdblock++を使用していましたが、Firefox5では動かないようなので(ネイティブなものはバージョン毎にコンパイルする必要があるとかないとか)代替として、adblock#.uc.jsを使ってみることにしてみました。

    adblock#.uc.jsにはadblock系リスト変換君.htmlというadblock++形式などから変換できるものが入ってますが、さすがニッチなadblock++からadblock#への変換はないようなので書いてみました。
    (今思えばadblock系リスト変換君.htmlを拡張すればよかったかも…)

    必要なもの

    以下のコードをFirebugのコンソール上で実行

    adblockDataの部分は自分のabout:configからextensions.adblock++.filter_array の値に差し替えてください。
    最後のcopy関数以外は別にFirebugに依存しているわけじゃないので、他の環境でも少し書き換えれば動作すると思います(MITライセンスなのでご自由に)
    変換したものはクリップボードに入るので、後はadblock#.uc.js Filter Managerを開いて、入力欄にペーストして”追加”のボタンを押せばフィルターを移行できると思います。

    Adblock++はフィルタにコンテンツの種類を設定できるのですが、adblock#.uc.jsは対応していないのでそれ系のフィルターは自動で外されます。また既にdisableなフィルターも外されます。
    正規表現周りは元々使ってないので、ちゃんと動作するかは微妙です。
    一応、Readmeに従って下記の処理には対応させたつもりです。

    ただし,「/ads/」のように前後に「/」が付く物は正規表現フィルタと誤認識されるのを防ぐため,「*/ads/*」と表記する.

    プロフィール: azu(アズ)
    Firefoxの事やソフトウェアの紹介や使い道、Greasemonkeyの作成
    • OS:Windows Vista, 7
    • ブラウザ:Firefox
    • Twitterのアカウントはこちら
    • azu_re
    • メールアドレス(Twitterの方が確実)
    • info@ドメイン名
    リンク