MOBILE-3645 iframe: Migrate JS files for iframes
parent
16be1a94fe
commit
4543bf3b83
|
@ -0,0 +1,42 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
var url = location.href;
|
||||||
|
|
||||||
|
if (!url.match(/^https?:\/\//i) || !url.match(/\/webservice\/recaptcha\.php/i)) {
|
||||||
|
// Not the recaptcha script, stop.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define recaptcha callbacks.
|
||||||
|
window.recaptchacallback = function(value) {
|
||||||
|
window.parent.postMessage({
|
||||||
|
environment: 'moodleapp',
|
||||||
|
context: 'recaptcha',
|
||||||
|
action: 'callback',
|
||||||
|
frameUrl: location.href,
|
||||||
|
value: value,
|
||||||
|
}, '*');
|
||||||
|
};
|
||||||
|
|
||||||
|
window.recaptchaexpiredcallback = function() {
|
||||||
|
window.parent.postMessage({
|
||||||
|
environment: 'moodleapp',
|
||||||
|
context: 'recaptcha',
|
||||||
|
action: 'expired',
|
||||||
|
frameUrl: location.href,
|
||||||
|
}, '*');
|
||||||
|
};
|
||||||
|
})();
|
|
@ -0,0 +1,210 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
var url = location.href;
|
||||||
|
|
||||||
|
if (url.match(/^moodleappfs:\/\/localhost/i) || !url.match(/^[a-z0-9]+:\/\//i)) {
|
||||||
|
// Same domain as the app, stop.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Redefine window.open.
|
||||||
|
window.open = function(url, name, specs) {
|
||||||
|
if (name == '_self') {
|
||||||
|
// Link should be loaded in the same frame.
|
||||||
|
location.href = toAbsolute(url);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
getRootWindow(window).postMessage({
|
||||||
|
environment: 'moodleapp',
|
||||||
|
context: 'iframe',
|
||||||
|
action: 'window_open',
|
||||||
|
frameUrl: location.href,
|
||||||
|
url: url,
|
||||||
|
name: name,
|
||||||
|
specs: specs,
|
||||||
|
}, '*');
|
||||||
|
};
|
||||||
|
|
||||||
|
// Handle link clicks.
|
||||||
|
document.addEventListener('click', (event) => {
|
||||||
|
if (event.defaultPrevented) {
|
||||||
|
// Event already prevented by some other code.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the link being clicked.
|
||||||
|
var el = event.target;
|
||||||
|
while (el && (el.tagName !== 'A' && el.tagName !== 'a')) {
|
||||||
|
el = el.parentElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!el || el.treated) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add click listener to the link, this way if the iframe has added a listener to the link it will be executed first.
|
||||||
|
el.treated = true;
|
||||||
|
el.addEventListener('click', function(event) {
|
||||||
|
linkClicked(el, event);
|
||||||
|
});
|
||||||
|
}, {
|
||||||
|
capture: true // Use capture to fix this listener not called if the element clicked is too deep in the DOM.
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Concatenate two paths, adding a slash between them if needed.
|
||||||
|
*
|
||||||
|
* @param leftPath Left path.
|
||||||
|
* @param rightPath Right path.
|
||||||
|
* @return Concatenated path.
|
||||||
|
*/
|
||||||
|
function concatenatePaths(leftPath, rightPath) {
|
||||||
|
if (!leftPath) {
|
||||||
|
return rightPath;
|
||||||
|
} else if (!rightPath) {
|
||||||
|
return leftPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
var lastCharLeft = leftPath.slice(-1);
|
||||||
|
var firstCharRight = rightPath.charAt(0);
|
||||||
|
|
||||||
|
if (lastCharLeft === '/' && firstCharRight === '/') {
|
||||||
|
return leftPath + rightPath.substr(1);
|
||||||
|
} else if (lastCharLeft !== '/' && firstCharRight !== '/') {
|
||||||
|
return leftPath + '/' + rightPath;
|
||||||
|
} else {
|
||||||
|
return leftPath + rightPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the root window.
|
||||||
|
*
|
||||||
|
* @param win Current window to check.
|
||||||
|
* @return Root window.
|
||||||
|
*/
|
||||||
|
function getRootWindow(win) {
|
||||||
|
if (win.parent === win) {
|
||||||
|
return win;
|
||||||
|
}
|
||||||
|
|
||||||
|
return getRootWindow(win.parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the scheme from a URL.
|
||||||
|
*
|
||||||
|
* @param url URL to treat.
|
||||||
|
* @return Scheme, undefined if no scheme found.
|
||||||
|
*/
|
||||||
|
function getUrlScheme(url) {
|
||||||
|
if (!url) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var matches = url.match(/^([a-z][a-z0-9+\-.]*):/);
|
||||||
|
if (matches && matches[1]) {
|
||||||
|
return matches[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a URL is absolute.
|
||||||
|
*
|
||||||
|
* @param url URL to treat.
|
||||||
|
* @return Whether it's absolute.
|
||||||
|
*/
|
||||||
|
function isAbsoluteUrl(url) {
|
||||||
|
return /^[^:]{2,}:\/\//i.test(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether a URL scheme belongs to a local file.
|
||||||
|
*
|
||||||
|
* @param scheme Scheme to check.
|
||||||
|
* @return Whether the scheme belongs to a local file.
|
||||||
|
*/
|
||||||
|
function isLocalFileUrlScheme(scheme) {
|
||||||
|
if (scheme) {
|
||||||
|
scheme = scheme.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
return scheme == 'cdvfile' ||
|
||||||
|
scheme == 'file' ||
|
||||||
|
scheme == 'filesystem' ||
|
||||||
|
scheme == 'moodleappfs';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle a click on an anchor element.
|
||||||
|
*
|
||||||
|
* @param link Anchor element clicked.
|
||||||
|
* @param event Click event.
|
||||||
|
*/
|
||||||
|
function linkClicked(link, event) {
|
||||||
|
if (event.defaultPrevented) {
|
||||||
|
// Event already prevented by some other code.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var linkScheme = getUrlScheme(link.href);
|
||||||
|
var pageScheme = getUrlScheme(location.href);
|
||||||
|
var isTargetSelf = !link.target || link.target == '_self';
|
||||||
|
|
||||||
|
if (!link.href || linkScheme == 'javascript') {
|
||||||
|
// Links with no URL and Javascript links are ignored.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
if (isTargetSelf && (isLocalFileUrlScheme(linkScheme) || !isLocalFileUrlScheme(pageScheme))) {
|
||||||
|
// Link should be loaded in the same frame. Don't do it if link is online and frame is local.
|
||||||
|
location.href = toAbsolute(link.href);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
getRootWindow(window).postMessage({
|
||||||
|
environment: 'moodleapp',
|
||||||
|
context: 'iframe',
|
||||||
|
action: 'link_clicked',
|
||||||
|
frameUrl: location.href,
|
||||||
|
link: {href: link.href, target: link.target},
|
||||||
|
}, '*');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a URL to an absolute URL if needed using the frame src.
|
||||||
|
*
|
||||||
|
* @param url URL to convert.
|
||||||
|
* @return Absolute URL.
|
||||||
|
*/
|
||||||
|
function toAbsolute(url) {
|
||||||
|
if (isAbsoluteUrl(url)) {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
// It's a relative URL, use the frame src to create the full URL.
|
||||||
|
var pathToDir = location.href.substring(0, location.href.lastIndexOf('/'));
|
||||||
|
|
||||||
|
return concatenatePaths(pathToDir, url);
|
||||||
|
}
|
||||||
|
})();
|
Loading…
Reference in New Issue