Forums before death by AOL, social media and spammers... "We can't have nice things"
|    alt.os.linux    |    Getting to be as bloated as Windows!    |    107,822 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 107,822 of 107,822    |
|    Hank Rogers to Maria Sophia    |
|    =?UTF-8?Q?Re:_Tutorial:_Firefox_right=e2    |
|    24 Feb 26 20:11:21    |
   
   XPost: alt.comp.software.firefox, alt.comp.os.windows-10   
   From: Hank@nospam.invalid   
      
   Maria Sophia wrote on 2/24/2026 4:51 PM:   
   > Maria Sophia wrote:   
   >> As far as I've been able to ascertain by testing, no GUI program will   
   >> ever   
   >> appear on a Windows desktop when launched from a Firefox native host on   
   >> Windows, but, it should still work on Linux.   
   >   
   > Voila!   
   > Success at last!   
   >   
   > The native host runs inside a restricted, non-interactive Windows session.   
   > Unfortunately, we've learned that Windows-GUI programs apparently cannot   
   > appear from that session, but file I/O works perfectly.   
   >   
   > So the example file-based-change-detector below is a natural fit.   
   >   
   > Once I stopped fighting that one immovable Windows-GUI wall, a whole   
   > landscape of genuinely useful, practical, even elegant but non-GUI   
   > possibilities open up for our first working Firefox extension.   
   > Let's write a simple webpage-change detector instead. It will tell us if   
   > a web page has Changed or NotChanged.   
   >   
   > Overview:   
   > a. We'll keep everything in the Firefox home directory, as before   
   > C:\app\browser\firefox\openwithgvim\*.{js,bat,json,py,log,reg}   
   > b. And create a subdirectory to watch if web pages have been changed.   
   > C:\app\browser\firefox\openwithgvim\pagewatch\{report.txt,last.html}   
   > c. Inside pagewatch, the Python host will maintain:   
   > i. last.html, the last version of the page   
   > ii. report.txt, the human-readable "changed / not changed" result   
   > iii. (optional) snapshots/, if we ever want to archive versions   
   > This keeps everything tidy and avoids clutter   
   >   
   > The logic will be simple because this is to be an example extension.   
   > A. If last.html does not exist:   
   > Write the new HTML to last.html   
   > Write a report saying: FIRST RUN - baseline saved   
   > Return { ok: true, changed: true }   
   > B. If last.html does exist:   
   > Read it   
   > Compare it to the new HTML (simple string comparison)   
   > C. If identical:   
   > Write: NO CHANGE   
   > Return { ok: true, changed: false }   
   > D. If different:   
   > Write:   
   > CHANGED   
   > Old length: ####   
   > New length: ####   
   > Timestamp: ...   
   > Overwrite last.html with the new HTML   
   > Return { ok: true, changed: true }   
   > E. In testing, I had to add code to overcome file locks gracefully.   
   >   
   > Here is every step of the test procedure:   
   > 1. Start Firefox   
   > 2. Click your bookmark for about:debugging#/runtime/this-firefox   
   > 3. Click "Load Temporary Add-on..."   
   > 4. Select C:\app\browser\firefox\openwithgvim\manifest.json   
   > 5. Open a local file file:///C:/data/amazon/vine/vine.htm   
   > 6. Rightclick in white space on that local file   
   > 7. Select "Open page source in gVim" (we never changed it)   
   > 8. Check the pagewatch report file for status   
   > C:\> type C:\app\browser\firefox\openwithgvim\pagewatch\report.txt   
   > NO CHANGE   
   > URL: file:///C:/data/amazon/vine/vine.htm   
   > Timestamp: 2026-02-24 16:34:02   
   > Length: 53565 bytes   
   > 9. Edit the source (Control+U or rightclick > View page source   
   > Change something & refresh the page Note that ViewPageSource is an   
   > edit due to these settings:   
   > about:config > view_source.editor   
   > view_source.editor.external = true   
   > view_source.editor.path = C:\app\editor\txt\vi\gvim.exe   
   > 10. Check the pagewatch report file for status   
   > C:\> type C:\app\browser\firefox\openwithgvim\pagewatch\report.txt   
   > CHANGED   
   > URL: file:///C:/data/sys/apppath/vistuff/vine.htm   
   > Timestamp: 2026-02-24 16:39:30   
   > Old length: 53565 bytes   
   > New length: 53541 bytes   
   >   
   > The only file that changed was the python native messaging host script.   
   > =====< cut below for gvim_host.py >=====   
   > import sys   
   > import struct   
   > import json   
   > import os   
   > from datetime import datetime   
   >   
   > # Base directory for everything   
   > BASE_DIR = r"C:\app\browser\firefox\openwithgvim"   
   > WATCH_DIR = os.path.join(BASE_DIR, "pagewatch")   
   >   
   > LAST_FILE = os.path.join(WATCH_DIR, "last.html")   
   > REPORT_FILE = os.path.join(WATCH_DIR, "report.txt")   
   >   
   > DEBUG_LOG = os.path.join(BASE_DIR, "host_debug.log")   
   > ERR_LOG = os.path.join(BASE_DIR, "host_stderr.log")   
   >   
   >   
   > def log(msg):   
   > """Write debug messages to stderr log, but never crash if the file   
   > is locked."""   
   > try:   
   > with open(ERR_LOG, "a", encoding="utf-8") as f:   
   > f.write(str(msg) + "\n")   
   > except Exception:   
   > # Windows sometimes locks files; logging must never kill the   
   host   
   > pass   
   >   
   >   
   > def ensure_directories():   
   > """Create the pagewatch directory if missing."""   
   > if not os.path.exists(WATCH_DIR):   
   > os.makedirs(WATCH_DIR, exist_ok=True)   
   >   
   >   
   > def read_message():   
   > """Read a native message from Firefox."""   
   > raw_length = sys.stdin.buffer.read(4)   
   > if not raw_length:   
   > log("No length header, stdin closed")   
   > return None   
   >   
   > length = struct.unpack(" data = sys.stdin.buffer.read(length).decode("utf-8")   
   > return json.loads(data)   
   >   
   >   
   > def send_message(msg):   
   > """Send a native message back to Firefox."""   
   > encoded = json.dumps(msg).encode("utf-8")   
   > sys.stdout.buffer.write(struct.pack(" sys.stdout.buffer.write(encoded)   
   > sys.stdout.buffer.flush()   
   >   
   >   
   > def write_report(text):   
   > """Write a human-readable report."""   
   > try:   
   > with open(REPORT_FILE, "w", encoding="utf-8") as f:   
   > f.write(text)   
   > except Exception as e:   
   > log(f"Failed to write report: {e}")   
   >   
   >   
   > def main():   
   > ensure_directories()   
   >   
   > while True:   
   > msg = read_message()   
   > if msg is None:   
   > break   
   >   
   > html = msg.get("html", "")   
   > url = msg.get("url", "")   
   >   
   > timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")   
   >   
   > # FIRST RUN - no last.html exists   
   > if not os.path.exists(LAST_FILE):   
   > try:   
   > with open(LAST_FILE, "w", encoding="utf-8")   
   as f:   
   > f.write(html)   
   > except Exception as e:   
      
   [continued in next message]   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca