Skip to content

Instantly share code, notes, and snippets.

@teramako
Created February 22, 2010 06:30
Show Gist options
  • Save teramako/310864 to your computer and use it in GitHub Desktop.
Save teramako/310864 to your computer and use it in GitHub Desktop.

chrome://browser/content/browser.xul

<tabbrowser ... onclick="return contentAreaClick(event, false);"/>

chrome://browser/content/browser.js

contentAreaClick (event, fieldNormalClicks)

クリックしたノードがlinkNodeある場合、以下の条件に当てはまるなら、 loadURI(url, null, postData.value, false) を実行。

  • event.button == 0 // 左クリック
  • Ctrl, Shift, Alt, Meta のいずれもを押していない
  • fieldNormalClicks が true かつ、a.targetが無い、または "_content" か "_main" である場合
    • 以下の条件に当てはまる場合は return true
      • href属性値がない
      • onclick属性値がある
      • href属性値が "javascript:" から始まっている
      • href属性値が "data:" から始まっている
    • (面倒だ省略)

そうでない場合以外の場合、handleLinkClick(event, wrapper.href, linkNode) を実行

通常クリック時はこのメソッドでは処理されない(_fieldNormalClicks_がfalseであるため)

loadURI (uri, referrer, postData, allowThirdPartyFixup)

gBrowser.loadURIWithFlags(uri, flags, referrer, null, postData);

handleLinkClick (event, href, linkNode)

  • 左クリックの場合
    • Ctrl: openNewTabWith(href, doc, null, event, false)
    • Shift + Alt: loadURI(href, null, null, false)
    • Shift:openNewWindowWith(href, doc, null, false)
    • Alt: saveURL( ... )
  • 中ボタンの場合
    • preference: browser.tabs.opentabfor.middleclick が true の場合
      openNewTabWith(href, doc, null, event, false)
    • そうでない場合
      openNewWindowWith(href, doc, null, false)

通常クリック時の挙動

JavaScriptレベルでは追えないと思われる。ワザとErrorを発生させてスタックを追うと、 chrome://browser/content/browser.js:4161gBrowser.loadOneTab メソッドを 実行していることが分かる。

引数は(a target="_blank")

  1. null
  2. [object XPCNativeWrapper]
  3. 3
  4. 2

これは nsBrowserAccess.prototype.openURI つまり、 window.browserDOMWindow.openURI である。

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