mirror of
https://github.com/modernw/App-Installer-For-Windows-8.x-Reset.git
synced 2026-04-11 17:57:19 +10:00
550 lines
27 KiB
HTML
550 lines
27 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
|
|
<head>
|
|
<title>App Installer Settings</title>
|
|
<meta charset="UTF-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<script type="text/javascript" src="../js/module.js"></script>
|
|
<script type="text/javascript" src="../js/polyfill-ie.js"></script>
|
|
<link rel="stylesheet" href="../libs/winjs/2.0/css/ui-light.css" id="winjs-style">
|
|
<script type="text/javascript" src="../libs/winjs/1.0/js/base.js"></script>
|
|
<script type="text/javascript" src="../libs/winjs/1.0/js/ui.js"></script>
|
|
<script src="../libs/markdown.js"></script>
|
|
<script type="text/javascript" src="../js/color.js"></script>
|
|
<script type="text/javascript" src="../js/promise.js"></script>
|
|
<script type="text/javascript" src="../js/bridge.js"></script>
|
|
<script type="text/javascript" src="../js/dpimodes.js"></script>
|
|
<script type="text/javascript" src="../js/resources.js"></script>
|
|
<script type="text/javascript" src="../js/animation.js"></script>
|
|
<link rel="stylesheet" href="../fonts/fonts.css">
|
|
<script type="text/javascript" src="../js/event.js"></script>
|
|
<script type="text/javascript" src="../js/tileback.js"></script>
|
|
<script type="text/javascript" src="../js/load.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="../libs/msgbox/contentdlg.css">
|
|
<script type="text/javascript" src="../libs/msgbox/contentdlg.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="../libs/msgbox/msgbox.css">
|
|
<script type="text/javascript" src="../libs/msgbox/msgbox.js"></script>
|
|
<script type="text/javascript" src="../js/init.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="page.css">
|
|
<link rel="stylesheet" type="text/css" href="subpage.css">
|
|
<script type="text/javascript" src="appinstaller/preinit.js"></script>
|
|
<script type="text/javascript" src="appinstaller/initsame.js"></script>
|
|
<style>
|
|
.section .block {
|
|
width: 100%;
|
|
height: auto;
|
|
box-sizing: border-box;
|
|
position: relative;
|
|
transition: all 0.5s cubic-bezier(0.1, 0.9, 0.2, 1);
|
|
overflow-x: hidden;
|
|
overflow-y: hidden;
|
|
/* background-color: blanchedalmond; */
|
|
}
|
|
|
|
.pagesection .section {
|
|
position: relative;
|
|
height: auto;
|
|
}
|
|
|
|
.pagesection .section.padding {
|
|
padding: 0 60px;
|
|
}
|
|
|
|
.pagesection .section.padding:first-child {
|
|
padding-top: 44px;
|
|
}
|
|
|
|
.pagesection .section.padding:last-child {
|
|
padding-bottom: 44px;
|
|
}
|
|
|
|
#check-update-block {
|
|
height: 50px;
|
|
}
|
|
|
|
#check-update-block progress {
|
|
min-width: 180px;
|
|
width: 100%;
|
|
max-width: 60%;
|
|
transition: all 0.5s cubic-bezier(0.1, 0.9, 0.2, 1);
|
|
}
|
|
|
|
#check-update-block progress[value] {
|
|
width: 280px;
|
|
}
|
|
|
|
#newversion-details {
|
|
height: auto;
|
|
overflow-y: auto;
|
|
-ms-overflow-style: -ms-autohiding-scrollbar;
|
|
width: 100%;
|
|
}
|
|
|
|
#newversion-desc {
|
|
/*white-space: pre-wrap;*/
|
|
white-space: normal;
|
|
}
|
|
|
|
#newversion-desc img {
|
|
width: 100%;
|
|
}
|
|
|
|
#check-update:disabled {
|
|
display: none;
|
|
}
|
|
|
|
#loading-amine {
|
|
display: none;
|
|
opacity: 0;
|
|
font-family: Setup;
|
|
}
|
|
|
|
#loading-amine[data-start-loading] {
|
|
display: inline;
|
|
opacity: 1;
|
|
margin-right: 3px;
|
|
}
|
|
</style>
|
|
<script>
|
|
window.parseVersion = function(version) {
|
|
var arr = version.split(".");
|
|
var major = parseInt(arr[0]);
|
|
var minor = parseInt(arr[1]);
|
|
var build = parseInt(arr[2]);
|
|
var revision = parseInt(arr[3]);
|
|
return {
|
|
major: major,
|
|
minor: minor,
|
|
build: build,
|
|
revision: revision
|
|
};
|
|
};
|
|
window.compareVersion = function(verl, verr) {
|
|
if (typeof verl == "string") verl = parseVersion(verl);
|
|
if (typeof verr == "string") verr = parseVersion(verr);
|
|
var ret = verl.major - verr.major;
|
|
if (ret == 0) {
|
|
ret = verl.minor - verr.minor;
|
|
}
|
|
if (ret == 0) {
|
|
ret = verl.build - verr.build;
|
|
}
|
|
if (ret == 0) {
|
|
ret = verl.revision - verr.revision;
|
|
}
|
|
return ret;
|
|
};
|
|
window.equalVersion = function(verl, verr) {
|
|
if (typeof verl == "string") verl = parseVersion(verl);
|
|
if (typeof verr == "string") verr = parseVersion(verr);
|
|
return verl.major == verr.major && verl.minor == verr.minor && verl.build == verr.build && verl.revision == verr.revision;
|
|
};
|
|
window.stringifyVersion = function(version) {
|
|
return version.major + "." + version.minor + "." + version.build + "." + version.revision;
|
|
};
|
|
</script>
|
|
<script>
|
|
(function(global) {
|
|
"use strict";
|
|
var jsdownloadAsync = Bridge.External.Download;
|
|
|
|
function downloadAsync(url, fileName, completeCallback, errorCallback, progressCallback) {
|
|
function downloadProgress(p) {
|
|
if (progressCallback) progressCallback(JSON.parse(p || "{}"));
|
|
}
|
|
|
|
function downloadComplete(c) {
|
|
if (completeCallback) completeCallback(JSON.parse(c || "{}"));
|
|
}
|
|
|
|
function downloadError(e) {
|
|
if (errorCallback) errorCallback(JSON.parse(e || "{}"));
|
|
}
|
|
jsdownloadAsync.workAsync(url, fileName, downloadComplete, downloadError, downloadProgress);
|
|
}
|
|
global.downloadFile = function(url, fileName) {
|
|
return new WinJS.Promise(function(resolve, reject, progress) {
|
|
downloadAsync(
|
|
url,
|
|
fileName,
|
|
resolve,
|
|
reject,
|
|
progress
|
|
);
|
|
});
|
|
};
|
|
var process = Bridge.External.Process;
|
|
global.createProcessAsync = function(cmdline, filepath, wndshow, runpath) {
|
|
return new WinJS.Promise(function(resolve, reject) {
|
|
var callback = resolve || reject;
|
|
process.runAsync(cmdline, filepath, wndshow, runpath, callback);
|
|
});
|
|
};
|
|
global.createProcess = function(cmdline, filepath, wndshow, wait, runpath) {
|
|
return process.run(cmdline, filepath, wndshow, wait, runpath);
|
|
};
|
|
global.wndDisplayMode = {
|
|
hide: 0, // SW_HIDE
|
|
showNormal: 1, // SW_SHOWNORMAL / SW_NORMAL
|
|
showMinimized: 2, // SW_SHOWMINIMIZED
|
|
showMaximized: 3, // SW_SHOWMAXIMIZED
|
|
showNoActivate: 4, // SW_SHOWNOACTIVATE
|
|
show: 5, // SW_SHOW
|
|
minimize: 6, // SW_MINIMIZE
|
|
showMinNoActivate: 7, // SW_SHOWMINNOACTIVE
|
|
showNA: 8, // SW_SHOWNA
|
|
restore: 9, // SW_RESTORE
|
|
showDefault: 10, // SW_SHOWDEFAULT
|
|
forceMinimize: 11 // SW_FORCEMINIMIZE
|
|
};
|
|
|
|
})(this);
|
|
</script>
|
|
<script>
|
|
function formatBytesSize(bytes) {
|
|
if (isNaN(bytes) || bytes < 0) return "0 B";
|
|
|
|
var units = ["B", "KB", "MB", "GB", "TB", "PB"];
|
|
var i = 0;
|
|
var num = bytes;
|
|
|
|
while (num >= 1024 && i < units.length - 1) {
|
|
num = num / 1024;
|
|
i++;
|
|
}
|
|
|
|
// 保留 2 位小数,整数不显示小数
|
|
if (num >= 100) num = Math.round(num);
|
|
else if (num >= 10) num = Math.round(num * 10) / 10;
|
|
else num = Math.round(num * 100) / 100;
|
|
|
|
return num + " " + units[i];
|
|
}
|
|
|
|
function formatBytesTransmissionSpeed(bps) {
|
|
if (isNaN(bps) || bps < 0) return "0 B/s";
|
|
|
|
var units = ["B/s", "KB/s", "MB/s", "GB/s", "TB/s"];
|
|
var i = 0;
|
|
var num = bps;
|
|
|
|
while (num >= 1024 && i < units.length - 1) {
|
|
num = num / 1024;
|
|
i++;
|
|
}
|
|
|
|
if (num >= 100) num = Math.round(num);
|
|
else if (num >= 10) num = Math.round(num * 10) / 10;
|
|
else num = Math.round(num * 100) / 100;
|
|
|
|
return num + " " + units[i];
|
|
}
|
|
</script>
|
|
<script>
|
|
try {
|
|
window.parent.setItemHighlight("update");
|
|
} catch (e) {}
|
|
</script>
|
|
<script>
|
|
if (typeof window.parent.setDisabledForOperation === "undefined") {
|
|
window.parent.setDisabledForOperation = function() {};
|
|
}
|
|
if (typeof window.parent.setItemHighlight === "undefined") {
|
|
window.parent.setItemHighlight = function() {};
|
|
}
|
|
</script>
|
|
<script type="text/javascript" src="updateinit.js"></script>
|
|
</head>
|
|
|
|
<body>
|
|
<div class="pagecontainer full pagesection" style="overflow-y: auto; background-color: white;">
|
|
<div class="section padding">
|
|
<h2 id="section-title" data-res-fromfile="publicRes (103)"></h2>
|
|
<p id="section-desc" style="white-space: pre-wrap;" data-res-fromfile="publicRes (105)"></p>
|
|
<p style="white-space: pre-wrap;"><span data-res-fromfile="publicRes (104)"></span>	<span id="current-version"></span></p>
|
|
<script>
|
|
try {
|
|
var storage = Bridge.External.Storage;
|
|
var path = storage.path;
|
|
var versionFilePath = path.combine(path.root, "version");
|
|
var versionFile = storage.getFile(versionFilePath);
|
|
window.currver = versionFile.content;
|
|
} catch (e) {
|
|
window.currver = "0.0.0.1";
|
|
}
|
|
document.getElementById("current-version").textContent = window.currver;
|
|
</script>
|
|
</div>
|
|
<div class="section padding" style="">
|
|
<div class="block" id="check-update-block" style="height: 0px;">
|
|
<span id="loading-amine"></span><span id="check-update-text" data-res-fromfile="publicRes (106)"></span><br>
|
|
<progress id="progress" min="0" max="100"></progress>
|
|
<a target="_blank" id="doc-link" data-res-fromfile="publicRes (107)"></a>
|
|
</div>
|
|
</div>
|
|
<div class="section padding" style="margin: 10px 0;"><button id="check-update" data-action="check" data-res-fromfile="publicRes (115)"></button></div>
|
|
<div class="section padding" style="display: none; overflow-y: auto; height: 0px; transition: all 0.5s cubic-bezier(0.1, 0.9, 0.2, 1); margin-top: 20px;">
|
|
<h2 data-res-fromfile="publicRes (108)"></h2><br>
|
|
<div class="block" id="newversion-details">
|
|
<h3 id="newversion-title"><span data-res-fromfile="publicRes (109)"></span>: <span id="newversion-version"></span></h3>
|
|
<span id="newversion-releasedate"></span><br>
|
|
<a id="newversion-url" target="_blank" data-res-fromfile="publicRes (110)"></a><br>
|
|
<span data-res-fromfile="publicRes (111)"></span>:
|
|
<a id="newversion-desc-showall-hide" data-res-fromfile="publicRes (122)"></a>
|
|
<div id="newversion-desc" style="font-weight: normal; font-size: 10pt;"></div>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
(function() {
|
|
var eutils = Windows.UI.Event.Util;
|
|
var monitor = Windows.UI.Event.Monitor;
|
|
var section = document.querySelector(".pagesection .section").parentNode;
|
|
var checkUpdateBtn = document.getElementById("check-update");
|
|
var checkUpdateBlock = document.getElementById("check-update-block");
|
|
var progress = document.querySelector("#check-update-block progress");
|
|
var checkUpdateText = document.getElementById("check-update-text");
|
|
var docLink = document.getElementById("doc-link");
|
|
var currentVersion = document.getElementById("current-version");
|
|
var newVersionBlock = document.getElementById("newversion-details");
|
|
var newVersionTitle = document.getElementById("newversion-title");
|
|
var newVersionVersion = document.getElementById("newversion-version");
|
|
var newVersionReleaseDate = document.getElementById("newversion-releasedate");
|
|
var newVersionUrl = document.getElementById("newversion-url");
|
|
var newVersionDesc = document.getElementById("newversion-desc");
|
|
var newVersionDescShowOrHide = document.getElementById("newversion-desc-showall-hide");
|
|
var checkUpdateLoading = document.getElementById("loading-amine");
|
|
var stopProcess = false;
|
|
var tbpFlags = {
|
|
error: 4,
|
|
indeterminate: 1,
|
|
noProgress: 0,
|
|
normal: 2,
|
|
paused: 8
|
|
};
|
|
|
|
function newVersionBlockSizeChanged() {
|
|
if (stopProcess) return;
|
|
var parentSection = newVersionBlock.parentNode;
|
|
var sectionHeight = parentSection.parentNode.offsetHeight;
|
|
var newHeight = sectionHeight - parentSection.getBoundingClientRect().top;
|
|
parentSection.setAttribute("data-height", newHeight);
|
|
if (parentSection.hasAttribute("data-showall") == true) {
|
|
parentSection.style.height = "auto";
|
|
} else {
|
|
parentSection.style.height = newHeight + "px";
|
|
}
|
|
}
|
|
stopProcess = true;
|
|
var debunced_resize = debounce(newVersionBlockSizeChanged, 500);
|
|
eutils.addEvent(newVersionDescShowOrHide, "click", function() {
|
|
var parentSection = newVersionBlock.parentNode;
|
|
if (parentSection.hasAttribute("data-showall") == true) {
|
|
parentSection.removeAttribute("data-showall");
|
|
newVersionDescShowOrHide.textContent = getPublicRes(122);
|
|
parentSection.style.height = parentSection.getAttribute("data-height") + "px";
|
|
} else {
|
|
parentSection.setAttribute("data-showall", true);
|
|
newVersionDescShowOrHide.textContent = getPublicRes(123);
|
|
parentSection.style.height = "auto";
|
|
}
|
|
debunced_resize();
|
|
});
|
|
monitor.observe(newVersionBlock.parentNode, monitor.EventType.resize, debunced_resize);
|
|
eutils.addEvent(checkUpdateBtn, "click", function() {
|
|
checkUpdateBlock.style.height = "0px";
|
|
var self = this;
|
|
this.disabled = true;
|
|
progress.removeAttribute("value");
|
|
window.parent.setDisabledForOperation(true);
|
|
if (checkUpdateBtn.getAttribute("data-action") == "check") {
|
|
checkUpdateText.textContent = getPublicRes(106);
|
|
checkUpdateBlock.style.height = checkUpdateBlock.scrollHeight + "px";
|
|
progress.style.display = "";
|
|
docLink.style.display = "none";
|
|
stopProcess = true;
|
|
newVersionBlock.parentNode.style.height = "0px";
|
|
newVersionBlock.parentNode.style.display = "none";
|
|
setTimeout(function() {
|
|
checkUpdateBlock.style.height = "auto";
|
|
}, 500);
|
|
try {
|
|
WinJS.xhr({
|
|
url: "https://api.github.com/repos/modernw/App-Installer-For-Windows-8.x-Reset/releases/latest"
|
|
}).done(function(resp) {
|
|
// console.log("success", resp);
|
|
var json = JSON.parse(resp.responseText);
|
|
window.fetchedJson = json;
|
|
// console.log(json);
|
|
self.disabled = false;
|
|
newVersionVersion.textContent = json.name;
|
|
newVersionVersion.setAttribute("data-version", json.tag_name);
|
|
window.newver = json.tag_name;
|
|
newVersionReleaseDate.textContent = getPublicRes(112) + ": " + Bridge.External.formatDateTime("{0:yyyy-MM-dd HH:mm:ss}", json.published_at);
|
|
newVersionUrl.href = json.html_url;
|
|
newVersionDesc.innerHTML = markdown.toHTML(json.body);
|
|
checkUpdateText.textContent = getPublicRes(113);
|
|
progress.style.display = "none";
|
|
newVersionBlock.parentNode.style.display = "";
|
|
stopProcess = false;
|
|
debunced_resize();
|
|
for (var i = 0; i < json.assets.length; i++) {
|
|
if (json.assets[i].browser_download_url.indexOf("/InstallerSetup.exe") > -1) {
|
|
window.downloadUrl = json.assets[i].browser_download_url;
|
|
window.fileDigest = json.assets[i].digest;
|
|
break;
|
|
}
|
|
}
|
|
window.parent.setDisabledForOperation(false);
|
|
if (compareVersion(window.currver, window.newver) >= 0) {
|
|
checkUpdateText.textContent = getPublicRes(114);
|
|
checkUpdateBtn.textContent = getPublicRes(115);
|
|
checkUpdateBtn.setAttribute("data-action", "check");
|
|
} else {
|
|
checkUpdateText.textContent = Bridge.String.format(getPublicRes(116), window.newver);
|
|
checkUpdateBtn.textContent = getPublicRes(117);
|
|
checkUpdateBtn.setAttribute("data-action", "download");
|
|
if (autoInstallUpdate) {
|
|
setTimeout(function(thisnode) {
|
|
thisnode.click();
|
|
autoInstallUpdate = false;
|
|
}, 0, self);
|
|
}
|
|
}
|
|
}, function(error) {
|
|
// console.log("error", error);
|
|
var json = JSON.parse(error.responseText);
|
|
checkUpdateText.textContent = json.message;
|
|
progress.style.display = "none";
|
|
docLink.style.display = "";
|
|
docLink.href = json.documentation_url;
|
|
self.disabled = false;
|
|
window.parent.setDisabledForOperation(false);
|
|
});
|
|
} catch (error) {
|
|
// console.log("error", error);
|
|
checkUpdateText.textContent = error.message || e || "Unknown Exception"
|
|
progress.style.display = "none";
|
|
docLink.style.display = "none";
|
|
docLink.href = "";
|
|
self.disabled = false;
|
|
window.parent.setDisabledForOperation(false);
|
|
}
|
|
} else if (checkUpdateBtn.getAttribute("data-action") == "download") {
|
|
var storage = Bridge.External.Storage;
|
|
var path = storage.path;
|
|
stopProcess = true;
|
|
newVersionBlock.parentNode.style.height = "0px";
|
|
checkUpdateText.textContent = getPublicRes(118);
|
|
progress.style.display = "";
|
|
checkUpdateBlock.style.height = checkUpdateBlock.scrollHeight + "px";
|
|
var anime = Windows.UI.Animation;
|
|
var strutil = Bridge.External.String;
|
|
var tbputil = Bridge.External;
|
|
|
|
function setError(error) {
|
|
//console.error("download error", error);
|
|
checkUpdateText.textContent = strutil.format(getPublicRes(119), error.reason);
|
|
progress.style.display = "none";
|
|
self.disabled = false;
|
|
self.textContent = getPublicRes(132);
|
|
window.parent.setDisabledForOperation(false);
|
|
checkUpdateBlock.style.height = checkUpdateBlock.scrollHeight + "px";
|
|
tbputil.tbState = tbpFlags.error;
|
|
}
|
|
|
|
function setException(e) {
|
|
//console.error("download exception", e);
|
|
checkUpdateText.textContent = strutil.format(getPublicRes(119), e.message);
|
|
window.parent.setDisabledForOperation(false);
|
|
checkUpdateBlock.style.height = checkUpdateBlock.scrollHeight + "px";
|
|
tbputil.tbState = tbpFlags.error;
|
|
}
|
|
|
|
function setComplete(complete) {
|
|
// console.log("download complete", complete);
|
|
checkUpdateText.textContent = getPublicRes(120);
|
|
var cmdline = strutil.format("\"{0}\" /passive", tempfile);
|
|
var appinstallerpath = path.combine(path.root, "appinstaller.exe");
|
|
var settingsapppath = path.combine(path.root, "settings.exe");
|
|
window.parent.setDisabledForOperation(false);
|
|
var process = Bridge.External.Process;
|
|
checkUpdateBlock.style.height = checkUpdateBlock.scrollHeight + "px";
|
|
tbputil.tbState = tbpFlags.noProgress;
|
|
process.kill(appinstallerpath, true, false);
|
|
createProcess(cmdline, tempfile, wndDisplayMode.showNormal, false);
|
|
process.kill(settingsapppath, true, false);
|
|
}
|
|
progress.value = 0;
|
|
anime.loading(checkUpdateLoading, true);
|
|
var tempdir = path.expand("%temp%");
|
|
var tempfile = path.combine(tempdir, "InstallerSetup.exe");
|
|
tbputil.tbProgress = 0;
|
|
tbputil.tbState = tbpFlags.normal;
|
|
var proxyDownloadUrl = "https://githubproxy.cc/" + downloadUrl;
|
|
downloadFile(downloadUrl, tempfile).done(
|
|
function(complete) {
|
|
anime.loading(checkUpdateLoading, false);
|
|
if (complete.status == "ok") setComplete(complete);
|
|
else {
|
|
anime.loading(checkUpdateLoading, true);
|
|
downloadFile(proxyDownloadUrl, tempfile).done(
|
|
function(comp) {
|
|
anime.loading(checkUpdateLoading, false);
|
|
if (complete.status == "ok") setComplete(comp);
|
|
else setError(comp);
|
|
},
|
|
function(error) {
|
|
setError(error);
|
|
}
|
|
);
|
|
}
|
|
},
|
|
function(error) {
|
|
anime.loading(checkUpdateLoading, false);
|
|
anime.loading(checkUpdateLoading, true);
|
|
downloadFile(proxyDownloadUrl, tempfile).done(
|
|
function(comp) {
|
|
anime.loading(checkUpdateLoading, false);
|
|
if (complete.status == "ok") setComplete(comp);
|
|
else setError(comp);
|
|
},
|
|
function(err) {
|
|
anime.loading(checkUpdateLoading, false);
|
|
setError(err);
|
|
}
|
|
);
|
|
},
|
|
function(prog) {
|
|
//console.log("download progress", prog);
|
|
progress.value = prog.progress;
|
|
checkUpdateText.textContent = strutil.format(getPublicRes(121), Math.floor(prog.progress), formatBytesSize(prog.received), formatBytesSize(prog.total));
|
|
checkUpdateBlock.style.height = checkUpdateBlock.scrollHeight + "px";
|
|
tbputil.tbProgress = prog.progress;
|
|
}
|
|
)
|
|
}
|
|
});
|
|
})();
|
|
</script>
|
|
</div>
|
|
<script>
|
|
(function(global) {
|
|
"use strict";
|
|
|
|
function ready(e) {
|
|
var checkButton = document.getElementById("check-update");
|
|
if (autoCheckUpdate) {
|
|
setTimeout(function(thisnode) {
|
|
thisnode.click();
|
|
autoCheckUpdate = false;
|
|
}, 0, checkButton);
|
|
}
|
|
}
|
|
OnLoad.add(ready);
|
|
})(this);
|
|
</script>
|
|
</body>
|
|
|
|
</html> |