ブラウザ枠のurlを非同期で判定できる必要No.11342
こみやんま さん 23/05/16 17:04
 
browserpanecommand などで開いた ブラウザ枠が、
ちゃんと実行中のスクリプトが想定するURL
(もっともいうと管理状態下にある)、
ということを判定する手段が非同期の中にも必要だと思います。


以前 western さんも言っていたのは、
browser***系に何か送る度にトークン
「GUIDなり数値なり」が返ってきて、それを橋渡しにしていく、みたいなのを例に上
げていました。
(ようするにトークンが ハンドル 兼 状態遷移 みたいになっている)


そこまでするかどうかは別として、

完全ではないとしても、一番お手軽に判定できるのは、

```
browserpaneurl
```

が非同期対応、もしくは、

```
browserpanecommand の get プロパティの中に url があり、取得できる
```

というもので、

url が想定と食い違ったら、browsre*** 系を自分の判断で見送ってもらう、
(なり、JavaScriptのTickまでも止めるなり)
というものです。

例えば、1つ前の投稿であげた HttpListenerSample の例。

https://github.com/komiyamma/hm_http_listener_sample/blob/main/HttpListenerSample/bin/Release/HttpListenerSample.mac
 


これはやってしまいがちで、
(サンプルに従って作成するとこんな風に考えがちだから)
しかし、重大な欠陥がここにはあって、

browserpanecommand(
    {
        ...
        url: target_html_file + `?port=${port}`,
        ...
    }
);

で、ブラウザ枠に表示したはいいけれど、(表示の確認もしたとして)

その後、hidemaru.setIntervalで、Tickを作成し、毎秒javascriptをブラウザ枠に送
信しているけれども、
「これ本当に target_html_file が表示されてるの?」という重大な部分が抜けてい
ます。

Tick内 {
    // この時、URLは本当に上のものが維持されているの?
    // という問題があります。

 browserpanecommand(
     {
         target: target_browser,
         url: `javascript:updateFetch()`,
     }
 );
}


このサンプルではその判定がされていないため、
「同じファイルが開かれている」限り、「ブラウザ枠のURLが変化してしまってい
た」としても、
かまわずにupdateFetch()を実行してしまいます。


一番お手軽な束縛方法は、やや浅い判定ではあるものの、
(難しすぎるとプログラミング熟練者しか使えない問題もあるので)

```
let browser_url = browserpanecommand( { get: "url" } );

if (browser_url.includes(target_html_file)) {
 browserpanecommand(
     {
         target: target_browser,
         url: `javascript:updateFetch()`,
     }
 );
   
}
```

みたいに書いて、少なくとも自分の想定するURLかどうかで判定するというものです。
(自分が想定するURLの変化範囲かどうかなど)

安全策として、上のHttpListernerSampleのようにちゃんとした判定が出来ていない
スクリプト用に」

updateFetchではなく、function HmHttpListenerSample_updateFetch()
といったように、他者と被らない一意性が感じられる関数名にしておくで自衛するこ
とも
大切でしょう。
(他者が意図せずブックマークレットでトリガーを引きにくい名前 = 他マクロが付け
ていないハズの関数名)


このような「同じファイル」だけど「ブラウザ枠だけ変わる」ということは
今後当然起きてくるかと思います。

例えば、「aaa.md」という同一ファイルに対して、
Aさんが作った、「Markdownリアルタイムプレビューブラウザ枠を使う」マクロ&JSを
実行 ⇒ ブラウザ枠:file:///C:/bbb/tempA.html
Bさんが作った、「マークダウンファイルを裏でphpが解釈して読み込んでhttpで表
示」マクロ&JS ⇒ ブラウザ枠:http://localhost:7533/

ブラウザで表示しているものの場合、リンクなどがある性質上、
一旦リンクを踏んで別URLに行ったものの、すぐに戻ってくる、
などもあるので、別URLに行ったからといって、
なかなか 監視 Tick 自体を安易に閉じてしまうというわけにも
いきにくくで難儀なんですよねー。

[ ]
RE:11342 ブラウザ枠のurlを非同期で判定No.11343
秀丸担当 さん 23/05/16 17:50
 
URLの取得は非同期の関数の中から取得できる方法があるような気がしていたのです
が、確かにありませんでした。
少なくともbrowserpanecommandからはできるようにします。

何としても他と競合しないものを作る場合は、レンダリング枠を使ったほうがいいと
思います。
というかそのために作ったのがレンダリング枠でした。
でも個別なので、共通でしたいとなると厄介かもしれませんが、共通ブラウザ枠でそ
こまでは目指さないでおこうと思います。

[ ]
RE:11343 ブラウザ枠のurlを非同期で判定No.11344
こみやんま さん 23/05/16 18:27
 
file プロトコルの時は、renderpane でもいいのですが、
http://localhost の時が... と思っていましたが、
今試してみたら renderpane でも http://localhost は動作しますね。

これって仕様でしょうか。

(ヘルプにfile:// て書いてあったからファイルプロトコルしか動かんと思いこんで
いました...)

[ ]
RE:11344 ブラウザ枠のurlを非同期で判定No.11346
秀丸担当 さん 23/05/17 09:03
 
レンダリング枠でも、localhostはできました。
すみません。
そういうこともヘルプに書いておこうと思います。

[ ]