Merge pull request #1562 from albertgasset/MOBILE-2650

Mobile 2650
main
Juan Leyva 2018-10-15 14:17:07 +02:00 committed by GitHub
commit b06478ad4f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 55 deletions

View File

@ -519,6 +519,8 @@ export class CoreFormatTextDirective implements OnChanges {
// Replace video tag by the iframe. // Replace video tag by the iframe.
video.parentNode.replaceChild(iframe, video); video.parentNode.replaceChild(iframe, video);
this.iframeUtils.treatFrame(iframe);
} }
/** /**
@ -554,7 +556,7 @@ export class CoreFormatTextDirective implements OnChanges {
* *
* @param {HTMLIFrameElement} iframe Iframe to treat. * @param {HTMLIFrameElement} iframe Iframe to treat.
* @param {CoreSite} site Site instance. * @param {CoreSite} site Site instance.
* @param {Boolean} canTreatVimeo Whether Vimeo videos can be treated in the site. * @param {boolean} canTreatVimeo Whether Vimeo videos can be treated in the site.
*/ */
protected treatIframe(iframe: HTMLIFrameElement, site: CoreSite, canTreatVimeo: boolean): void { protected treatIframe(iframe: HTMLIFrameElement, site: CoreSite, canTreatVimeo: boolean): void {
const src = iframe.src, const src = iframe.src,
@ -571,8 +573,9 @@ export class CoreFormatTextDirective implements OnChanges {
}); });
return; return;
}
} else if (src && canTreatVimeo) { if (src && canTreatVimeo) {
// Check if it's a Vimeo video. If it is, use the wsplayer script instead to make restricted videos work. // Check if it's a Vimeo video. If it is, use the wsplayer script instead to make restricted videos work.
const matches = iframe.src.match(/https?:\/\/player\.vimeo\.com\/video\/([0-9]+)/); const matches = iframe.src.match(/https?:\/\/player\.vimeo\.com\/video\/([0-9]+)/);
if (matches && matches[1]) { if (matches && matches[1]) {
@ -620,8 +623,6 @@ export class CoreFormatTextDirective implements OnChanges {
} }
}); });
} }
return;
} }
} }

View File

@ -102,12 +102,12 @@ export class CoreIframeUtilsProvider {
} else { } else {
this.logger.warn('Cannot get iframe dir path to open relative url', url, element); this.logger.warn('Cannot get iframe dir path to open relative url', url, element);
return new Window(); // Return new Window object. return null;
} }
} else { } else {
this.logger.warn('Cannot get iframe src to open relative url', url, element); this.logger.warn('Cannot get iframe src to open relative url', url, element);
return new Window(); // Return new Window object. return null;
} }
} }
@ -126,7 +126,8 @@ export class CoreIframeUtilsProvider {
} }
} }
return new Window(); // Return new Window object. // We cannot create new Window objects directly, return null which is a valid return value for Window.open().
return null;
}; };
} }
@ -183,55 +184,49 @@ export class CoreIframeUtilsProvider {
return; return;
} }
const links = Array.from(contentDocument.querySelectorAll('a')); contentDocument.addEventListener('click', (event) => {
links.forEach((el: HTMLAnchorElement) => { if (event.defaultPrevented) {
const href = el.href; // Event already prevented by some other code.
// Check that href is not null.
if (href) {
const scheme = this.urlUtils.getUrlScheme(href);
if (scheme && scheme == 'javascript') {
// Javascript links should be treated by the iframe's Javascript.
// There's nothing to be done with these links, so they'll be ignored.
return; return;
} else if (scheme && scheme != 'file' && scheme != 'filesystem') { }
// Find the link being clicked.
let el = <Element> event.target;
while (el && el.tagName !== 'A') {
el = el.parentElement;
}
if (!el || el.tagName !== 'A') {
return;
}
const link = <HTMLAnchorElement> el;
const scheme = this.urlUtils.getUrlScheme(link.href);
if (!link.href || (scheme && scheme == 'javascript')) {
// Links with no URL and Javascript links are ignored.
return;
}
if (scheme && scheme != 'file' && scheme != 'filesystem') {
// Scheme suggests it's an external resource, open it in browser. // Scheme suggests it's an external resource, open it in browser.
el.addEventListener('click', (e) => { event.preventDefault();
// If the link's already prevented by SCORM JS then we won't open it in browser.
if (!e.defaultPrevented) {
e.preventDefault();
if (!this.sitesProvider.isLoggedIn()) { if (!this.sitesProvider.isLoggedIn()) {
this.utils.openInBrowser(href); this.utils.openInBrowser(link.href);
} else { } else {
this.sitesProvider.getCurrentSite().openInBrowserWithAutoLoginIfSameSite(href); this.sitesProvider.getCurrentSite().openInBrowserWithAutoLoginIfSameSite(link.href);
} }
} } else if (link.target == '_parent' || link.target == '_top' || link.target == '_blank') {
});
} else if (el.target == '_parent' || el.target == '_top' || el.target == '_blank') {
// Opening links with _parent, _top or _blank can break the app. We'll open it in InAppBrowser. // Opening links with _parent, _top or _blank can break the app. We'll open it in InAppBrowser.
el.addEventListener('click', (e) => { event.preventDefault();
// If the link's already prevented by SCORM JS then we won't open it in InAppBrowser. this.utils.openFile(link.href).catch((error) => {
if (!e.defaultPrevented) {
e.preventDefault();
this.utils.openFile(href).catch((error) => {
this.domUtils.showErrorModal(error); this.domUtils.showErrorModal(error);
}); });
} } else if (this.platform.is('ios') && (!link.target || link.target == '_self')) {
});
} else if (this.platform.is('ios') && (!el.target || el.target == '_self')) {
// In cordova ios 4.1.0 links inside iframes stopped working. We'll manually treat them. // In cordova ios 4.1.0 links inside iframes stopped working. We'll manually treat them.
el.addEventListener('click', (e) => { event.preventDefault();
// If the link's already prevented by SCORM JS then we won't treat it.
if (!e.defaultPrevented) {
if (element.tagName.toLowerCase() == 'object') { if (element.tagName.toLowerCase() == 'object') {
e.preventDefault(); element.setAttribute('data', link.href);
element.setAttribute('data', href);
} else { } else {
e.preventDefault(); element.setAttribute('src', link.href);
element.setAttribute('src', href);
}
}
});
} }
} }
}); });