119 lines
3.9 KiB
JavaScript
119 lines
3.9 KiB
JavaScript
var __debugKitId,
|
|
__debugKitBaseUrl;
|
|
var elem = document.getElementById('__debug_kit');
|
|
if (elem) {
|
|
__debugKitId = elem.getAttribute('data-id');
|
|
__debugKitBaseUrl = elem.getAttribute('data-url');
|
|
elem = null;
|
|
}
|
|
|
|
(function(win, doc) {
|
|
var iframe;
|
|
var bodyOverflow;
|
|
|
|
var onMessage = function(event) {
|
|
if (event.data === 'collapse') {
|
|
iframe.height = 40;
|
|
iframe.width = 40;
|
|
doc.body.style.overflow = bodyOverflow;
|
|
return;
|
|
}
|
|
if (event.data === 'toolbar') {
|
|
iframe.height = 40;
|
|
iframe.width = '100%';
|
|
doc.body.style.overflow = bodyOverflow;
|
|
return;
|
|
}
|
|
if (event.data === 'expand') {
|
|
iframe.width = '100%';
|
|
iframe.height = '100%';
|
|
doc.body.style.overflow = 'hidden';
|
|
return;
|
|
}
|
|
};
|
|
|
|
var onReady = function() {
|
|
if (!win.__debugKitId) {
|
|
return;
|
|
}
|
|
var body = doc.body;
|
|
|
|
// Cannot use css text, because of CSP compatibility.
|
|
iframe = doc.createElement('iframe');
|
|
iframe.style.position = 'fixed';
|
|
iframe.style.bottom = 0;
|
|
iframe.style.right = 0;
|
|
iframe.style.border = 0;
|
|
iframe.style.outline = 0;
|
|
iframe.style.overflow = 'hidden';
|
|
iframe.style.zIndex = 99999;
|
|
iframe.height = 40;
|
|
iframe.width = 40;
|
|
iframe.src = __debugKitBaseUrl + 'debug-kit/toolbar/' + __debugKitId;
|
|
|
|
body.appendChild(iframe);
|
|
bodyOverflow = body.style.overflow;
|
|
|
|
window.addEventListener('message', onMessage, false);
|
|
};
|
|
|
|
var logAjaxRequest = function(original) {
|
|
return function() {
|
|
if (this.readyState === 4 && this.getResponseHeader('X-DEBUGKIT-ID')) {
|
|
var params = {
|
|
requestId: this.getResponseHeader('X-DEBUGKIT-ID'),
|
|
status: this.status,
|
|
date: new Date,
|
|
method: this._arguments && this._arguments[0],
|
|
url: this._arguments && this._arguments[1],
|
|
type: this.getResponseHeader('Content-Type')
|
|
};
|
|
iframe.contentWindow.postMessage('ajax-completed$$' + JSON.stringify(params), window.location.origin);
|
|
}
|
|
if (original) {
|
|
return original.apply(this, [].slice.call(arguments));
|
|
}
|
|
};
|
|
};
|
|
|
|
var proxyAjaxOpen = function() {
|
|
var proxied = window.XMLHttpRequest.prototype.open;
|
|
window.XMLHttpRequest.prototype.open = function() {
|
|
this._arguments = arguments;
|
|
return proxied.apply(this, [].slice.call(arguments));
|
|
};
|
|
};
|
|
|
|
var proxyAjaxSend = function() {
|
|
var proxied = window.XMLHttpRequest.prototype.send;
|
|
window.XMLHttpRequest.prototype.send = function() {
|
|
this.onreadystatechange = logAjaxRequest(this.onreadystatechange);
|
|
return proxied.apply(this, [].slice.call(arguments));
|
|
};
|
|
};
|
|
|
|
// Bind on ready callbacks to DOMContentLoaded (native js) and turbolinks:load
|
|
// Turbolinks replaces the body and merges the head of an HTML page.
|
|
// Since the body is already loaded (DOMContentLoaded), the event is not triggered.
|
|
if (doc.addEventListener) {
|
|
// This ensures that all event listeners get applied only once.
|
|
if (!window.__debugKitListenersApplied) {
|
|
// The DOMContentLoaded is for all pages that do not have Turbolinks
|
|
doc.addEventListener('DOMContentLoaded', onReady, false);
|
|
doc.addEventListener('DOMContentLoaded', proxyAjaxOpen, false);
|
|
doc.addEventListener('DOMContentLoaded', proxyAjaxSend, false);
|
|
|
|
// turbolinks:load is the alternative DOMContentLoaded Event of Turbolinks
|
|
// https://github.com/turbolinks/turbolinks
|
|
// https://github.com/cakephp/debug_kit/pull/664
|
|
doc.addEventListener('turbolinks:load', onReady, false);
|
|
doc.addEventListener('turbolinks:load', proxyAjaxOpen, false);
|
|
doc.addEventListener('turbolinks:load', proxyAjaxSend, false);
|
|
window.__debugKitListenersApplied = true;
|
|
}
|
|
} else {
|
|
throw new Error('Unable to add event listener for DebugKit. Please use a browser' +
|
|
'that supports addEventListener().');
|
|
}
|
|
}(window, document));
|