74 lines
2.5 KiB
Swift
74 lines
2.5 KiB
Swift
//
|
|
// FindElementsAtPointJS.swift
|
|
// flutter_inappwebview
|
|
//
|
|
// Created by Lorenzo Pichilli on 16/02/21.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
let FIND_ELEMENTS_AT_POINT_JS_PLUGIN_SCRIPT_GROUP_NAME = "IN_APP_WEBVIEW_FIND_ELEMENTS_AT_POINT_JS_PLUGIN_SCRIPT"
|
|
|
|
let FIND_ELEMENTS_AT_POINT_JS_PLUGIN_SCRIPT = PluginScript(
|
|
groupName: FIND_ELEMENTS_AT_POINT_JS_PLUGIN_SCRIPT_GROUP_NAME,
|
|
source: FIND_ELEMENTS_AT_POINT_JS_SOURCE,
|
|
injectionTime: .atDocumentStart,
|
|
forMainFrameOnly: true,
|
|
requiredInAllContentWorlds: false,
|
|
messageHandlerNames: [])
|
|
|
|
/**
|
|
https://developer.android.com/reference/android/webkit/WebView.HitTestResult
|
|
*/
|
|
let FIND_ELEMENTS_AT_POINT_JS_SOURCE = """
|
|
window.\(JAVASCRIPT_BRIDGE_NAME)._findElementsAtPoint = function(x, y) {
|
|
var hitTestResultType = {
|
|
UNKNOWN_TYPE: 0,
|
|
PHONE_TYPE: 2,
|
|
GEO_TYPE: 3,
|
|
EMAIL_TYPE: 4,
|
|
IMAGE_TYPE: 5,
|
|
SRC_ANCHOR_TYPE: 7,
|
|
SRC_IMAGE_ANCHOR_TYPE: 8,
|
|
EDIT_TEXT_TYPE: 9
|
|
};
|
|
var element = document.elementFromPoint(x, y);
|
|
var data = {
|
|
type: 0,
|
|
extra: null
|
|
};
|
|
while (element) {
|
|
if (element.tagName === 'IMG' && element.src) {
|
|
if (element.parentNode && element.parentNode.tagName === 'A' && element.parentNode.href) {
|
|
data.type = hitTestResultType.SRC_IMAGE_ANCHOR_TYPE;
|
|
} else {
|
|
data.type = hitTestResultType.IMAGE_TYPE;
|
|
}
|
|
data.extra = element.src;
|
|
break;
|
|
} else if (element.tagName === 'A' && element.href) {
|
|
if (element.href.indexOf('mailto:') === 0) {
|
|
data.type = hitTestResultType.EMAIL_TYPE;
|
|
data.extra = element.href.replace('mailto:', '');
|
|
} else if (element.href.indexOf('tel:') === 0) {
|
|
data.type = hitTestResultType.PHONE_TYPE;
|
|
data.extra = element.href.replace('tel:', '');
|
|
} else if (element.href.indexOf('geo:') === 0) {
|
|
data.type = hitTestResultType.GEO_TYPE;
|
|
data.extra = element.href.replace('geo:', '');
|
|
} else {
|
|
data.type = hitTestResultType.SRC_ANCHOR_TYPE;
|
|
data.extra = element.href;
|
|
}
|
|
break;
|
|
} else if (
|
|
(element.tagName === 'INPUT' && ['text', 'email', 'password', 'number', 'search', 'tel', 'url'].indexOf(element.type) >= 0) ||
|
|
element.tagName === 'TEXTAREA') {
|
|
data.type = hitTestResultType.EDIT_TEXT_TYPE
|
|
}
|
|
element = element.parentNode;
|
|
}
|
|
return data;
|
|
}
|
|
"""
|