Beim Teilen aus Safari greift ein JS-Preprocessing-File (GetPageHTML.js) das gerenderte outerHTML der bereits zustimmenden Seite und legt es im neuen SharedHTMLStore (App-Group, keyed auf SHA-256(url)) ab. Die App schickt dieses HTML bei der Extraktion an /extract/preview mit — das umgeht Cookie-/Pur-Wände, die der anonyme Server-Fetch sonst extrahiert (gleicher Bypass wie das Web-Bookmarklet). - SharedHTMLStore: put/peek/remove/prune, 4,9M-Char-Cap (API-Limit), 7-Tage-TTL. HTML wird erst nach erfolgreicher Extraktion verworfen, damit ein 401/502-Retry (enrich-Sweep) es erneut nutzen kann. - ShareViewController (iOS + macOS): liest das Property-List-Result, legt HTML ab, enqueued die URL wie bisher. - project.yml: NSExtensionJavaScriptPreprocessingFile + WebPage-Activation + JS-Resource + SharedHTMLStore.swift in beide Extension-Targets. - PagetaAPI.extractPreview(url:html:) + enrichArticle konsultiert den Store. Greift nur beim Teilen aus Safari (Web-Page-Kontext); nackte URL-Shares fallen sauber auf den URL-Pfad zurück. iOS+macOS BUILD SUCCEEDED, 41/41 Tests grün (3 neue für SharedHTMLStore). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
40 lines
1.2 KiB
JavaScript
40 lines
1.2 KiB
JavaScript
/*
|
|
* JavaScript-Preprocessing für die Pageta-ShareExtension.
|
|
*
|
|
* Safari führt `run()` aus, BEVOR das Share-Sheet erscheint, im Kontext der
|
|
* aktuellen — bereits zustimmenden — Seite. Wir reichen das gerenderte
|
|
* `outerHTML` an die Extension durch (Key `html` im
|
|
* `NSExtensionJavaScriptPreprocessingResultsKey`-Dictionary). Die App
|
|
* schickt es an `/extract/preview`, was Cookie-/Consent-Wände umgeht, die
|
|
* der anonyme Server-Fetch sonst extrahieren würde.
|
|
*
|
|
* Greift nur, wenn die Extension aus Safari (Web-Page-Kontext) geteilt wird.
|
|
* Bei nackten URL-Shares (Messages etc.) gibt es kein HTML — die App fällt
|
|
* dann auf den URL-Pfad zurück.
|
|
*
|
|
* Cap auf 4 900 000 Zeichen: pageta-api lehnt html > 5 000 000 mit 400 ab.
|
|
*/
|
|
var GetPageHTML = function () {};
|
|
|
|
GetPageHTML.prototype = {
|
|
run: function (args) {
|
|
var MAX = 4900000;
|
|
var html = '';
|
|
try {
|
|
html = document.documentElement.outerHTML || '';
|
|
} catch (e) {
|
|
html = '';
|
|
}
|
|
if (html.length > MAX) {
|
|
html = html.substring(0, MAX);
|
|
}
|
|
args.completionFunction({
|
|
html: html,
|
|
url: document.URL,
|
|
title: document.title,
|
|
});
|
|
},
|
|
finalize: function (args) {},
|
|
};
|
|
|
|
var ExtensionPreprocessingJS = new GetPageHTML();
|