クマーなひとときv2

雑多なメモ。twitterで書ききれないもの等。

VimFxから画面上の要素を取得する

Issue投げたやつ。
最初質問した時点では、browser console と web console を勘違いしてました。

マニュアルにも追記されたため、もう勘違いする人も出ないはず(白目

後、config.js 内部で content オブジェクトにアクセスするのは「terrible hack」らしい(e10s環境)
これも全然気付いてなかったので、マニュアルに従い、frame.jsと組み合わせた。

コード

最終的に上手くいったコードが以下。
以前の記事で書いた「選択文字列をGoogle翻訳」の処理を変えただけですねこれ。

config.js

vimfx.addCommand({
  name: 'copy_ex',
  description: 'c_"# <title>\\n<URL>"でURLコピー',
  category: 'location',
}, ({vim}) => {
  let url = vim.window.gBrowser.selectedBrowser.currentURI.spec
  // ここで指定してはいけない。frame.jsで取得した値を使用すること。
  // let title = vim.window.content.document.getElementById("ja").innerHTML 
  vimfx.send(vim, 'getElementById', {id: 'ja'}, title => {
    let fmt = "# "+title+"\n"+url
    gClipboardHelper.copyString(fmt)
    vim.notify("Copied String: " + fmt)
  })
})

frame.js

// 指定IDの文字列を返す
vimfx.listen('getElementById', ({id}, callback) => {
  let elem = content.document.getElementById(id)
  let title =
    (elem != null) ? elem.innerHTML
                   : content.document.title
  callback(title)
})

指定したIDが存在するならそのIDの内容をコピー、
存在しなければページのタイトルをコピーする。


これでまた少し便利になった。