k08045kk / CopyTabTitleUrl

MIT License
88 stars 10 forks source link

コンテンツスクリプト設定があると特定のサイトで処理が止まる #66

Closed k08045kk closed 8 months ago

k08045kk commented 9 months ago

[Enable content script for active tab] を有効にすると特定のサイトで処理が停止する。 選択文字列なしで再現する。 await がいつまでたっても戻ってこない。

await chrome.scripting.executeScript({target:allFrames:true})
k08045kk commented 9 months ago

タイムアウト(150ms)を設定することで暫定対応とする。 (150ms に特に意味はない。人間が認識できるかできないかの瀬戸際で、最低限の処理時間を考慮した結果) エラー時は、 ${pageError} にエラー内容を合わせて出力する。

${pagePrompt} には、タイムアウトを設定しません。 ${pagePrompt} は、メインフレームで動作しますが問題を起こす可能性があります。

オプションも追加する。無効時は、メインフレーム以外の選択文字列の取得ができなくなる。 [Enable content script for all frames 🧪]

k08045kk commented 9 months ago

事前に問題を検出することは難しい?

const frames = await chrome.webNavigation.getAllFrames({tabId:tab.id});
console.log(frames);

で事前に <iframe loading="lazy"> を取得できない。存在しないことになっている。

[...document.querySelectorAll("frame,iframe")]
.map(frame => frame.contentWindow.document || frame.contentDocument)
.map(doc => doc.URL)

だと CORS エラーが発生することがある。

k08045kk commented 8 months ago

次のコードで本件を回避できる。

chrome.scripting.executeScript({target:{allFrames:true}, injectImmediately:true})

iframe で document_idle まで待機してスクリプトを挿入していた。 iframe で document_start? でスクリプトを挿入することで対応する。