MOBILE-3320 lint: Fix linting in iframe service

main
Noel De Martin 2020-10-08 17:08:11 +02:00
parent eed59972a8
commit 6369fb8e2a
1 changed files with 42 additions and 23 deletions

View File

@ -13,9 +13,10 @@
// limitations under the License. // limitations under the License.
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { NavController } from '@ionic/angular';
import { WKUserScriptWindow, WKUserScriptInjectionTime } from 'cordova-plugin-wkuserscript'; import { WKUserScriptWindow, WKUserScriptInjectionTime } from 'cordova-plugin-wkuserscript';
import { CoreApp, CoreAppProvider } from '@services/app'; import { CoreApp } from '@services/app';
import { CoreFile } from '@services/file'; import { CoreFile } from '@services/file';
import { CoreFileHelper } from '@services/file-helper'; import { CoreFileHelper } from '@services/file-helper';
import { CoreSites } from '@services/sites'; import { CoreSites } from '@services/sites';
@ -24,17 +25,26 @@ import { CoreTextUtils } from '@services/utils/text';
import { CoreUrlUtils } from '@services/utils/url'; import { CoreUrlUtils } from '@services/utils/url';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { makeSingleton, Translate, Network, Platform, NgZone } from '@singletons/core.singletons'; import { makeSingleton, Network, Platform, NgZone } from '@singletons/core.singletons';
import { CoreLogger } from '@singletons/logger'; import { CoreLogger } from '@singletons/logger';
import { CoreUrl } from '@singletons/url'; import { CoreUrl } from '@singletons/url';
import { CoreWindow } from '@singletons/window'; import { CoreWindow } from '@singletons/window';
/**
* Possible types of frame elements.
*/
type CoreFrameElement = (HTMLIFrameElement | HTMLFrameElement | HTMLObjectElement | HTMLEmbedElement) & {
window?: Window;
getWindow?(): Window;
};
/* /*
* "Utils" service with helper functions for iframes, embed and similar. * "Utils" service with helper functions for iframes, embed and similar.
*/ */
@Injectable() @Injectable()
export class CoreIframeUtilsProvider { export class CoreIframeUtilsProvider {
static FRAME_TAGS = ['iframe', 'frame', 'object', 'embed'];
static readonly FRAME_TAGS = ['iframe', 'frame', 'object', 'embed'];
protected logger: CoreLogger; protected logger: CoreLogger;
@ -50,7 +60,7 @@ export class CoreIframeUtilsProvider {
const linksPath = CoreTextUtils.instance.concatenatePaths(wwwPath, 'assets/js/iframe-treat-links.js'); const linksPath = CoreTextUtils.instance.concatenatePaths(wwwPath, 'assets/js/iframe-treat-links.js');
const recaptchaPath = CoreTextUtils.instance.concatenatePaths(wwwPath, 'assets/js/iframe-recaptcha.js'); const recaptchaPath = CoreTextUtils.instance.concatenatePaths(wwwPath, 'assets/js/iframe-recaptcha.js');
win.WKUserScript.addScript({id: 'CoreIframeUtilsLinksScript', file: linksPath}); win.WKUserScript.addScript({ id: 'CoreIframeUtilsLinksScript', file: linksPath });
win.WKUserScript.addScript({ win.WKUserScript.addScript({
id: 'CoreIframeUtilsRecaptchaScript', id: 'CoreIframeUtilsRecaptchaScript',
file: recaptchaPath, file: recaptchaPath,
@ -70,8 +80,8 @@ export class CoreIframeUtilsProvider {
* @param isSubframe Whether it's a frame inside another frame. * @param isSubframe Whether it's a frame inside another frame.
* @return True if frame is online and the app is offline, false otherwise. * @return True if frame is online and the app is offline, false otherwise.
*/ */
checkOnlineFrameInOffline(element: any, isSubframe?: boolean): boolean { checkOnlineFrameInOffline(element: CoreFrameElement, isSubframe?: boolean): boolean {
const src = element.src || element.data; const src = 'src' in element ? element.src : element.data;
if (src && src != 'about:blank' && !CoreUrlUtils.instance.isLocalFileUrl(src) && !CoreApp.instance.isOnline()) { if (src && src != 'about:blank' && !CoreUrlUtils.instance.isLocalFileUrl(src) && !CoreApp.instance.isOnline()) {
if (element.classList.contains('core-iframe-offline-disabled')) { if (element.classList.contains('core-iframe-offline-disabled')) {
@ -86,8 +96,6 @@ export class CoreIframeUtilsProvider {
div.setAttribute('padding', ''); div.setAttribute('padding', '');
div.classList.add('core-iframe-offline-warning'); div.classList.add('core-iframe-offline-warning');
const site = CoreSites.instance.getCurrentSite();
const username = site ? site.getInfo().username : undefined;
// @todo Handle link // @todo Handle link
// Add a class to specify that the iframe is hidden. // Add a class to specify that the iframe is hidden.
@ -112,8 +120,13 @@ export class CoreIframeUtilsProvider {
return true; return true;
} else if (element.classList.contains('core-iframe-offline-disabled')) { } else if (element.classList.contains('core-iframe-offline-disabled')) {
// Reload the frame. // Reload the frame.
element.src = element.src; if ('src' in element) {
element.data = element.data; // eslint-disable-next-line no-self-assign
element.src = element.src;
} else {
// eslint-disable-next-line no-self-assign
element.data = element.data;
}
// Remove the warning and show the iframe // Remove the warning and show the iframe
CoreDomUtils.instance.removeElement(element.parentElement, 'div.core-iframe-offline-warning'); CoreDomUtils.instance.removeElement(element.parentElement, 'div.core-iframe-offline-warning');
@ -134,12 +147,14 @@ export class CoreIframeUtilsProvider {
* @param element Element to treat (iframe, embed, ...). * @param element Element to treat (iframe, embed, ...).
* @return Window and Document. * @return Window and Document.
*/ */
getContentWindowAndDocument(element: any): { window: Window, document: Document } { getContentWindowAndDocument(element: CoreFrameElement): { window: Window; document: Document } {
let contentWindow: Window = element.contentWindow; let contentWindow: Window = 'contentWindow' in element ? element.contentWindow : undefined;
let contentDocument: Document; let contentDocument: Document;
try { try {
contentDocument = element.contentDocument || (contentWindow && contentWindow.document); contentDocument = 'contentDocument' in element && element.contentDocument
? element.contentDocument
: contentWindow && contentWindow.document;
} catch (ex) { } catch (ex) {
// Ignore errors. // Ignore errors.
} }
@ -149,7 +164,7 @@ export class CoreIframeUtilsProvider {
contentWindow = contentDocument.defaultView; contentWindow = contentDocument.defaultView;
} }
if (!contentWindow && element.getSVGDocument) { if (!contentWindow && 'getSVGDocument' in element) {
// It's probably an <embed>. Try to get the window and the document. // It's probably an <embed>. Try to get the window and the document.
try { try {
contentDocument = element.getSVGDocument(); contentDocument = element.getSVGDocument();
@ -202,10 +217,11 @@ export class CoreIframeUtilsProvider {
* @param contentDocument The document of the element contents. * @param contentDocument The document of the element contents.
* @param navCtrl NavController to use if a link can be opened in the app. * @param navCtrl NavController to use if a link can be opened in the app.
*/ */
redefineWindowOpen(element: any, contentWindow: Window, contentDocument: Document, navCtrl?: any): void { redefineWindowOpen(element: CoreFrameElement, contentWindow: Window, contentDocument: Document,
navCtrl?: NavController): void {
if (contentWindow) { if (contentWindow) {
// Intercept window.open. // Intercept window.open.
(<any> contentWindow).open = (url: string, name: string): Window => { contentWindow.open = (url: string, name: string): Window => {
this.windowOpen(url, name, element, navCtrl); this.windowOpen(url, name, element, navCtrl);
return null; return null;
@ -216,7 +232,7 @@ export class CoreIframeUtilsProvider {
// Search sub frames. // Search sub frames.
CoreIframeUtilsProvider.FRAME_TAGS.forEach((tag) => { CoreIframeUtilsProvider.FRAME_TAGS.forEach((tag) => {
const elements = Array.from(contentDocument.querySelectorAll(tag)); const elements = Array.from(contentDocument.querySelectorAll(tag));
elements.forEach((subElement) => { elements.forEach((subElement: CoreFrameElement) => {
this.treatFrame(subElement, true, navCtrl); this.treatFrame(subElement, true, navCtrl);
}); });
}); });
@ -231,7 +247,7 @@ export class CoreIframeUtilsProvider {
* @param isSubframe Whether it's a frame inside another frame. * @param isSubframe Whether it's a frame inside another frame.
* @param navCtrl NavController to use if a link can be opened in the app. * @param navCtrl NavController to use if a link can be opened in the app.
*/ */
treatFrame(element: any, isSubframe?: boolean, navCtrl?: any): void { treatFrame(element: CoreFrameElement, isSubframe?: boolean, navCtrl?: NavController): void {
if (element) { if (element) {
this.checkOnlineFrameInOffline(element, isSubframe); this.checkOnlineFrameInOffline(element, isSubframe);
@ -266,7 +282,7 @@ export class CoreIframeUtilsProvider {
* @param element Element to treat (iframe, embed, ...). * @param element Element to treat (iframe, embed, ...).
* @param contentDocument The document of the element contents. * @param contentDocument The document of the element contents.
*/ */
treatFrameLinks(element: any, contentDocument: Document): void { treatFrameLinks(element: CoreFrameElement, contentDocument: Document): void {
if (!contentDocument) { if (!contentDocument) {
return; return;
} }
@ -292,7 +308,7 @@ export class CoreIframeUtilsProvider {
link.treated = true; link.treated = true;
link.addEventListener('click', this.linkClicked.bind(this, link, element)); link.addEventListener('click', this.linkClicked.bind(this, link, element));
}, { }, {
capture: true // Use capture to fix this listener not called if the element clicked is too deep in the DOM. capture: true, // Use capture to fix this listener not called if the element clicked is too deep in the DOM.
}); });
} }
@ -305,11 +321,13 @@ export class CoreIframeUtilsProvider {
* @param navCtrl NavController to use if a link can be opened in the app. * @param navCtrl NavController to use if a link can be opened in the app.
* @return Promise resolved when done. * @return Promise resolved when done.
*/ */
protected async windowOpen(url: string, name: string, element?: any, navCtrl?: any): Promise<void> { protected async windowOpen(url: string, name: string, element?: CoreFrameElement, navCtrl?: NavController): Promise<void> {
const scheme = CoreUrlUtils.instance.getUrlScheme(url); const scheme = CoreUrlUtils.instance.getUrlScheme(url);
if (!scheme) { if (!scheme) {
// It's a relative URL, use the frame src to create the full URL. // It's a relative URL, use the frame src to create the full URL.
const src = element && (element.src || element.data); const src = element
? ('src' in element ? element.src : element.data)
: null;
if (src) { if (src) {
const dirAndFile = CoreFile.instance.getFileAndDirectoryFromPath(src); const dirAndFile = CoreFile.instance.getFileAndDirectoryFromPath(src);
if (dirAndFile.directory) { if (dirAndFile.directory) {
@ -372,7 +390,7 @@ export class CoreIframeUtilsProvider {
* @param event Click event. * @param event Click event.
* @return Promise resolved when done. * @return Promise resolved when done.
*/ */
protected async linkClicked(link: {href: string, target?: string}, element?: HTMLFrameElement | HTMLObjectElement, protected async linkClicked(link: {href: string; target?: string}, element?: HTMLFrameElement | HTMLObjectElement,
event?: Event): Promise<void> { event?: Event): Promise<void> {
if (event && event.defaultPrevented) { if (event && event.defaultPrevented) {
// Event already prevented by some other code. // Event already prevented by some other code.
@ -438,6 +456,7 @@ export class CoreIframeUtilsProvider {
} }
} }
} }
} }
export class CoreIframeUtils extends makeSingleton(CoreIframeUtilsProvider) {} export class CoreIframeUtils extends makeSingleton(CoreIframeUtilsProvider) {}