ブラウザ枠の DOMContentLoaded 判定No.11197
western さん 23/04/06 12:12
 
ブラウザ枠に setbrowserpaneurl でURLを設定して
その後に javascript: スクリプトを実行しようとすると
処理が失敗していた原因がわかりました

ブラウザ枠にURLを設定してから
コンテンツのロードが完了するまでにラグが発生しますが
DOMContentLoaded (必要最低限の構築は終わったよ) を取得できる方法は
ありますでしょうか?
あるいは setbrowserpaneurl を同期(ブロック)処理に修正可能でしょうか?

ブラウザ操作(WebDriver)や WebView2 をスクリプトから操作する系では
URLを設定する命令は、一般的にコンテンツが正常にロードできたか否か
の判定までスクリプトの処理をブロックして、
すぐ次の行から結果をもとに処理を分岐できる同期パターンが多いです

よろしくお願いします

ブラウザ枠からコミュニテックスを利用してみるテスト

[ ]
RE:11197 ブラウザ枠の DOMContentLoaded No.11199
こみやんま さん 23/04/06 16:43
 
setbrowserpaneurl を同期にしちゃうと、
マクロ実行中の時間が必然的に長くなるため、
(最近並列でマクロが実行できるようになったとはいえ、用途的には限定になりやす
く、
 基本は「全秀丸プロセスで1本のマクロ実行中枠」という制限があるので
 「同期マクロ実行中の時間は可能な限り短くなりやすい」仕様が良い)

setbrowserpaneurlの直後に waitしたければwaitできますよ、みたいな関数ですかね
ぇ。
2つの記述が「本当に同じ対象なの?」問題はありますが...

◆案1
setbrowserpaneurl ...

waitfor_browserpane_contentloaded ...    (名前長いねこれ ==)

load状態が複数の段階を考慮するなら

waitfor_browserpane("ロード状態名", ...)   みたいな?

◆案2
一つ一つ作るのめんどいということで、

getbrowserpanestate("知りたい状態名" か 状態番号): number

みたいな関数作って、適当に非同期のTick自分で作ってその中でif判定してください
の方が良いかもしれませんが。

[ ]
RE:11199 ブラウザ枠の DOMContentLoaded No.11200
秀丸担当 さん 23/04/06 16:50
 
同じようなことを考えて、DOMContentLoaded限定だとあれなので、getbrowserpanein
fo("xxxx");を試しに作ろうとしていたら書いてあったので驚きました。
そういう感じの、何か状態取得できる方法を検討します。

[ ]
RE:11200 ブラウザ枠の DOMContentLoaded No.11202
western さん 23/04/06 19:41
 
WebView2 操作は基本が[非同期]APIばかりなので
jsmocde での hidemaru に操作メソッド生やして頂ければ
ブラウザ枠の WebView2 操作に限っては排他なマクロ実行枠を
使わずに好き放題できるようになるはずなので、対応を期待します


編集エディタに直接影響する処理(not [非同期])が発生する場合は
C# の objCtrl.invoke なメインスレッドに移譲のようなロジックで
hidemaru.postExecMacroMemory を適切に使えばよいのだと思います

私は今回敢えて jsmode 使わない秀丸マクロ縛りで各種チャレンジしております

ブラウザ枠でやりたい大本命のマクロは全タブで個別ブラウザ枠&jsmodeが荒ぶる見
込みですが
超軽量軽快が目的で使ってるはずの秀丸エディタで、WebView2 インスタンス立ち上
げまくりで
激しいメモリ消費量を気にせず受け入れる日がくるとは思いもよりませんでしたw

JSモードの搭載、ブラウザ枠の導入計画、本当に嬉しい限りで感謝感激しきりです




イベントハンドラ(リスナ) をブリッジする仕組みを増やすことになると
汎用の AddListener と EventDispatch が使える仕組みをエディタ側に
作り、セキュリティ考慮して複数マクロインスタンスとページ遷移などを
管理と排他する仕組みが必要になるという、ひとつ上の非同期地獄が待ち構えます

WebView2 の状態取得も非同期が何かと多いので、検討に出ている
getbrowserpaneinfo は xmlHttpRequest.readyState プロパティ読み取り
のような単純な値として setTimeout などで定期的に読み取る仕組みの方が無難でし
ょうか
どんな状態を管理しなければいけないかのパターン数がネックですが非同期対応よりは
はるかにマシでしょう

[ ]
RE:11202 ブラウザ枠の DOMContentLoaded No.11203
秀丸担当 さん 23/04/07 17:36
 
いろいろご提案ありがとうございます。
やりだすときりがない感があるので、とりあえずブラウザ枠とは別の分離したもので
情報の取得を可能にするとか考えてみます。
たぶん1点だけでもそういう情報の流れができる部分があれば、いろいろできるよう
になる気がします。

[ ]
RE:11200 ブラウザ枠の DOMContentLoaded No.11206
western さん 23/04/08 08:15
 
jsmode 特有の追加のマクロ命令として

hidemaru.postExecMacroMemory
hidemaru.setTimeout

がありますが、前者に後者を組み合わせた命令を
秀丸マクロの方に追加してはいただけませんでしょうか

機能:指定ミリ秒後に、指定の秀丸マクロ文字列を実行

先の #11199, #11200 のコメントで出てきている
getbrowserpaneinfo 方式で状態を確認する場合でも、
実行枠の排他が発生してしまうマクロにも関わらず
終了せず while sleep ポーリングが必要になってしまいます

postExecMacroMemoryTimer """
if (getbrowserpaneinfo("readyState",2) == 4) {
 setbrowserpaneurl "javascript:onload()", 2;
} else {
 endmacro "repeat"; // 特殊な返り値を渡すことで同じ条件で再度タイマ実行
}
""", 100;

のような記述で、マクロ自体はすぐに完了させて
完了待ちが必要な状態をポーリングで確認できる仕組みが欲しいです

ご検討よろしくお願いします

[ ]
RE:11206 ブラウザ枠の DOMContentLoaded No.11208
秀丸担当 さん 23/04/10 11:15
 
案としてあったgetbrowserpaneinfoですが、やっぱり$a=browserpanecommand($b);み
たいにしようと思います。
取得に限らず、また依存性を低くして他の用途でも使えたらいいです。
例えば
$a=browserpanecommand("get_readyState");
みたいな感じです。

時間差でマクロを実行するのは、hidemaru.setTimeoutはそこそこ効率が良くて、競
合も無いので、できたらこちらのほうがいいです。
もし必要であればpostExecMacroMemoryを介さずに何かできる方向にしたいです。

そもそも的にイベントで動くものがあればいいのですが、現状で、jsmodeで受動的に
動くものがいくつかあります。
hidemaru.setTimeout
hidemaru.runProcess等のstdioのonReadLine等
hidemaru.getFunctionId
このうち、getFunctionIdはカラーマーカーでしか使っていないのですが、window.ch
rome.webview.postMessageをするとして、それで関数IDを指定したらイベント実行み
たいにしてもいいです。
readyStateに限らず、ボタンを押したときでも何でも使えると思います。
かなり難解な記述方法になってしまいますが、イベントで動けば定期的にreadyState
を調べるということもしなくてもできるかもしれません。

[ ]
RE:11208 ブラウザ枠の DOMContentLoaded No.11209
western さん 23/04/10 12:11
 
hidemaru.postExecMacroMemory と hidemaru.setTimeout を組み合わせたマクロ命令
は jsmode ではなく従来の秀丸マクロの中から使いたいという趣旨なのですが、
相当する手段は存在するのでしょうか?

[ ]
RE:11209 ブラウザ枠の DOMContentLoaded No.11210
秀丸担当 さん 23/04/10 18:30
 
従来の秀丸マクロで、時間を指定して実行する方法は無いです。
やるとしたら、js{}は部分だけでも使えるので、マクロを全面的に書き換える必要は
なくて、その部分だけ書けば一応できるのとほぼ同じになると思います。
例:
js{function checkComplete(){hidemaru.postExecMacroMemory("""
  question "completed?";
  if(result!=false){
    //OK
  } else {
    //retry
    js{hidemaru.setTimeout(checkComplete,100);}
  }
  """);}}

js{checkComplete();}

endmacro;

[ ]
RE:11210 ブラウザ枠の DOMContentLoaded No.11211
western さん 23/04/10 19:59
 
jsmodeを使わずが、今の取り組みのカギなので
1行でも使ってしまうなら全てjsの方が手っ取り早くはあります

既にjsmodeのhidemaruオブジェクトに生やしている内部実装を
従来のマクロの命令としてに持ってくるのは難しいのでしょうか

ご教示ありがとうございました

[ ]
RE:11211 ブラウザ枠の DOMContentLoaded No.11212
秀丸担当 さん 23/04/11 10:59
 
>既にjsmodeのhidemaruオブジェクトに生やしている内部実装を
>従来のマクロの命令としてに持ってくるのは難しいのでしょうか

一部のgetselectedtextなど逆輸入して持ってきているものもありますが、全部のメ
ソッドが従来のマクロとして使えるようにはなっていないです。
特に、非同期関係のものを従来のマクロにするのは非常に難しいです。
すみません。

[ ]