https://github.com/niutech/showModalDialog
// ==UserScript==// @name ShowModalDialog Polyfill// @namespace undefined// @version 0.0.2// @description https://github.com/niutech/showModalDialog// @include *// @grant unsafeWindow// @license Apache 2.0// ==/UserScript==(function(window) {window.spawn = window.spawn || function(gen) {function continuer(verb, arg) {var r###lt;try {r###lt = generator[verb](arg);} catch (err) {return Promise.reject(err);}if (r###lt.done) {return r###lt.value;} else {return Promise.resolve(r###lt.value).then(onFulfilled, onRejected);}}var generator = gen();var onFulfilled = continuer.bind(continuer, 'next');var onRejected = continuer.bind(continuer, 'throw');return onFulfilled();};window.showModalDialog = window.showModalDialog || function(url, arg, opt) {url = url || ''; //URL of a dialogarg = arg || null; //arguments to a dialogopt = opt || 'dialogWidth:300px;dialogHeight:200px'; //options: dialogTop;dialogLeft;dialogWidth;dialogHeight or CSS stylesvar caller = showModalDialog.caller.toString();var dialog = document.body.appendChild(document.createElement('dialog'));dialog.setAttribute('style', opt.replace(/dialog/gi, ''));dialog.innerHTML = '<a href="#" id="dialog-close" style="position: absolute; top: 0; right: 4px; font-size: 20px; color: #000; text-decoration: none; outline: none;">×</a><iframe id="dialog-body" src="' + url + '" style="border: 0; width: 100%; height: 100%;"></iframe>';document.getElementById('dialog-body').contentWindow.dialogArguments = arg;document.getElementById('dialog-close').addEventListener('click', function(e) {e.preventDefault();dialog.close();});dialog.showModal();//if using yieldif(caller.indexOf('yield') >= 0) {return new Promise(function(resolve, reject) {dialog.addEventListener('close', function() {var returnValue = document.getElementById('dialog-body').contentWindow.returnValue;document.body.removeChild(dialog);resolve(returnValue);});});}//if using evalvar isNext = false;var nextStmts = caller.split('\n').filter(function(stmt) {if(isNext || stmt.indexOf('showModalDialog(') >= 0)return isNext = true;return false;});dialog.addEventListener('close', function() {var returnValue = document.getElementById('dialog-body').contentWindow.returnValue;document.body.removeChild(dialog);nextStmts[0] = nextStmts[0].replace(/(window\.)?showModalDialog\(.*\)/g, JSON.stringify(returnValue));eval('{\n' + nextStmts.join('\n'));});throw 'Execution stopped until showModalDialog is closed';};})(unsafeWindow);