var original = {
open: XMLHttpRequest.prototype.open,
send: XMLHttpRequest.prototype.send
};
XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
console.log('Инициируется запрос:', method, url);
return original.open.call(this, method, url, async, user, password);
};
XMLHttpRequest.prototype.send = function (data) {
console.log('Отправляются данные:', data);
return original.send.call(this, data);
};
function wait(milliseconds) {
return new Promise(resolve => setTimeout(resolve, milliseconds));
}
const stream = new ReadableStream({
async start(controller) {
await wait(1000);
controller.enqueue('This ');
await wait(1000);
controller.enqueue('is ');
await wait(1000);
controller.enqueue('a ');
await wait(1000);
controller.enqueue('slow ');
await wait(1000);
controller.enqueue('request.');
controller.close();
},
}).pipeThrough(new TextEncoderStream());
fetch(url, {
method: 'POST',
headers: {'Content-Type': 'text/plain'},
body: stream,
duplex: 'half',
});
Чтобы уменьшить нагрузку от фоновых вкладок, браузеры устанавливают минимальную задержку таймаута для таймеров в неактивных вкладках.
Особенности реализации здесь зависят от браузера:
- Firefox Desktop и Chrome имеют минимальное время ожидания 1 секунду для неактивных вкладок.
- Firefox для Android имеет минимальный таймаут 15 минут для неактивных вкладок и может полностью их выгрузить.
- Firefox не блокирует неактивные вкладки, если вкладка содержит AudioContext.
dom.min_background_timeout_value 1000
dom.min_background_timeout_value_without_budget_throttling 1000
<form class="row justify-content-center">
<div class="col-8">
<label for="inputPassword2" class="visually-hidden">URL</label>
<input type="text" class="form-control" id="inputUrl" placeholder="Url">
</div>
<div class="col-auto">
<button type="submit" class="btn btn-primary mb-3">Open</button>
</div>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
$(function() {
$('form').submit(function() {
event.preventDefault();
$('body').html('<iframe src="'+$('#inputUrl').val()+'"></iframe>')
});
});
</script>
async function primer() {
var testDataVal = await $.ajax({
url: 'https://site.com/script.php',
method: 'POST',
dataType: 'JSON',
data: { text: 'test' }
});
console.log(testDataVal);
}
primer(); // Запускаем пример
// Установка обработчика для проксирования некоторых исходящих запросов:
browser.proxy.onRequest.addListener(proxySetter, { urls: [ '<all_urls>' ] });
когда перевожу из base64 в blob
<img src="data:image/gif;base64,R0lGODlhDQAMANUAAFRVVtHd74S192aZzHqVuLq0rvf39+zr6bXI4qizwufdz5WhsmSt/5rC+r3Ezm1zeJiSjmum8tzm9bvZ/6bB5a6qpn+t5dvVzZK88+v8/7vg/7DJ4P/99V5gY8zMzObm5ofD/6zQ/3Fua8fX69fm+vDy9OPi4czh/4SXrJLC/////+7u7Wmt/87f9oG2/5Oku5mZmf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUUADEALAAAAAANAAwAAAZTwJhwSIwhDsUixZEkWhLNYeQVjYUYBIVKSCKeGIOCymCISTATISsCu5RKW1VAkHKBUBDToRxTcUYNGhsdFR8GW0IqJS0ZDyIrh0kqCwBIVR4eTUEAOw==" />
(function() {
var deferred_original = jQuery.Deferred;
jQuery.Deferred = function() {
var callbacks = [];
var callbacks_original = jQuery.Callbacks;
jQuery.Callbacks = function() {
var callback = callbacks_original.apply(this, arguments);
callbacks.push(callback);
return callback;
}
var deferred = deferred_original.apply(this, arguments);
deferred.callbacks = jQuery(callbacks);
jQuery.Callbacks = callbacks_original;
return deferred;
}
})();
// Проверка:
var deferred = $.Deferred();
var callback = function(n) {
console.log('Test ' +n);
}
deferred.progress(callback);
deferred.notify(1);
// Команда ниже успешно удалит обработчик прогресса:
deferred.callbacks.each(function(n, c) { c.remove(callback); });
deferred.notify(2);