Dactyloidae iOS initial commit

This commit is contained in:
wuggy 2026-06-26 21:04:09 -07:00
commit 7154a0497e
2123 changed files with 197052 additions and 0 deletions

View file

@ -0,0 +1,76 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
(function() {
"use strict";
if (!window.__firefox__) {
Object.defineProperty(window, '__firefox__', {
enumerable: false,
configurable: false,
writable: false,
value: {}
});
}
function MetadataWrapper(metadataparser) {
var dataURIRegex = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
function isDataURI(s) {
return !!s.match(dataURIRegex);
}
function getDataUri(url, callback) {
var image = new Image();
image.onload = function() {
try {
var canvas = document.createElement('canvas');
canvas.width = this.naturalWidth; // or 'width' if you want a special/scaled size
canvas.height = this.naturalHeight; // or 'height' if you want a special/scaled size
canvas.getContext('2d').drawImage(this, 0, 0);
var dataURI = canvas.toDataURL();
callback(dataURI);
} catch (exception) {
callback(false);
}
};
image.src = url;
}
function metadataCallback(metadata) {
window.__firefox__.pageMetadata = metadata;
webkit.messageHandlers.metadataMessageHandler.postMessage(metadata);
}
this.extractMetadata = function() {
var metadata = metadataparser.getMetadata(window.document, document.URL);
var imageURL = metadata["image"];
if (imageURL) {
if (isDataURI(imageURL)) {
metadata["image_data_uri"] = imageURL;
metadataCallback(metadata);
} else {
getDataUri(imageURL, function(dataURI) {
if (dataURI) {
metadata["image_data_uri"] = dataURI;
}
metadataCallback(metadata);
});
}
} else {
metadataCallback(metadata);
}
};
}
Object.defineProperty(window.__firefox__, 'metadata', {
enumerable: false,
configurable: false,
writable: false,
value: Object.freeze(new MetadataWrapper(metadataparser))
});
metadataparser = undefined;
})();

View file

@ -0,0 +1,55 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import Foundation
import Shared
import Storage
import XCGLogger
import WebKit
private let log = Logger.browserLogger
class MetadataParserHelper: TabContentScript {
private weak var tab: Tab?
private let profile: Profile
class func name() -> String {
return "MetadataParserHelper"
}
required init(tab: Tab, profile: Profile) {
self.tab = tab
self.profile = profile
tab.injectUserScriptWith(fileName: "page-metadata-parser")
tab.injectUserScriptWith(fileName: "MetadataHelper")
}
func scriptMessageHandlerName() -> String? {
return "metadataMessageHandler"
}
func userContentController(_ userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
// Get the metadata out of the page-metadata-parser, and into a type safe struct as soon
// as possible.
guard let dict = message.body as? [String: Any],
let tab = self.tab,
let pageURL = tab.url?.displayURL,
let pageMetadata = PageMetadata.fromDictionary(dict) else {
log.debug("Page contains no metadata!")
return
}
let userInfo: [String: Any] = [
"isPrivate": self.tab?.isPrivate ?? true,
"pageMetadata": pageMetadata,
"tabURL": pageURL
]
tab.pageMetadata = pageMetadata
TabEvent.post(.didLoadPageMetadata(pageMetadata), for: tab)
NotificationCenter.default.post(name: NotificationOnPageMetadataFetched, object: nil, userInfo: userInfo)
}
}

File diff suppressed because one or more lines are too long