blob: 8b81d1d1bac156ab3e1d857925826c0a78ff4fd1 [file] [log] [blame]
<!DOCTYPE html>
<html i18n-values="dir:textdirection">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0,
maximum-scale=1.0, user-scalable=no">
<title i18n-content="title">
</title>
<style>
body {
background-color: #E6E6E6;
font-family: Helvetica, Arial, sans-serif;
font-size: 10pt;
margin: 50px 40px 20px 40px;
text-align: center;
}
#main-frame-error {
margin: auto;
max-width: 540px;
min-width: 200px;
}
/* Don't use the main frame div when the error is in a subframe. */
html[subframe] #main-frame-error {
display: none;
}
/* Don't use the subframe error div when the error is in a main frame. */
html:not([subframe]) #sub-frame-error {
display: none;
}
#box {
background-color: #fbfbfb;
border: 1px solid #AAA;
border-bottom: 1px solid #888;
border-radius: 3px;
color: black;
<if expr="not is_android and not pp_ifdef('ios')">
/* Not done on mobile for performance reasons. */
box-shadow: 0px 2px 2px #AAA;
</if>
}
#diagnose-button {
margin-top: 20px;
margin-bottom: 10px;
-webkit-margin-start: 0px;
}
h1 {
color: #666;
margin: 10px 0px 25px 0px;
font-weight: normal;
font-size: 1.5em;
}
a {
color: #15c;
text-decoration: none;
}
.icon {
-webkit-user-select: none;
}
.icon-generic {
/**
* Can't access chrome://theme/IDR_ERROR_NETWORK_GENERIC from an untrusted
* renderer process, so embed the resource manually.
*/
content: -webkit-image-set(
url('../../app/theme/default_100_percent/common/error_network_generic.png') 1x,
url('../../app/theme/default_200_percent/common/error_network_generic.png') 2x);
}
.icon-offline {
content: -webkit-image-set(
url('../../app/theme/default_100_percent/common/error_network_offline.png') 1x,
url('../../app/theme/default_200_percent/common/error_network_offline.png') 2x);
}
#content-top {
margin: 20px 20px 20px 25px;
}
#help-box-outer {
overflow: hidden;
-webkit-transition: height ease-in 218ms;
}
#help-box-inner {
background-color: #f9f9f9;
border-top: 1px solid #EEE;
color: #444;
padding: 25px 20px;
text-align: start;
}
#suggestions {
margin-top: 15px;
}
#sub-frame-error-details {
color: #8F8F8F;
<if expr="not is_android and not pp_ifdef('ios')">
/* Not done on mobile for performance reasons. */
text-shadow: 0 1px 0 rgba(255,255,255,0.3);
</if>
}
[jscontent=failedUrl] {
overflow-wrap: break-word;
}
button {
border: 1px solid rgba(0, 0, 0, 0.25);
border-radius: 2px;
color: #444;
margin: 0px 5px;
min-height: 29px;
min-width: 65px;
-webkit-user-select: none;
padding: 8px 13px;
<if expr="not is_android">
/* iOS does not support linear-gradient without a prefix. */
background-image: -webkit-linear-gradient(#ededed, #ededed 38%, #dedede);
text-shadow: 0 1px 0 rgb(240, 240, 240);
</if>
<if expr="is_android">
/* Android uses flat background colors. */
background-color: #ededed;
font-weight: bold;
</if>
<if expr="not is_android and not pp_ifdef('ios')">
/* Not done on mobile for performance reasons. */
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.75);
</if>
}
button:hover {
border: 1px solid rgba(0, 0, 0, 0.3);
color: #000;
<if expr="not is_android">
background-image: -webkit-linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0);
</if>
<if expr="is_android">
background-color: #f0f0f0;
</if>
<if expr="not is_android and not pp_ifdef('ios')">
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.12), inset 0 1px 2px rgba(255, 255, 255, 0.95);
</if>
}
button:active {
border: 1px solid rgba(0, 0, 0, 0.3);
color: #444;
<if expr="not is_android">
background-image: -webkit-linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7);
</if>
<if expr="is_android">
background-color: #e7e7e7;
</if>
<if expr="not is_android and not pp_ifdef('ios')">
box-shadow: none;
</if>
}
#reload-button {
color: #fff;
<if expr="not is_android">
background-image: -webkit-linear-gradient(#5d9aff, #5d9aff 38%, #5891f0);
border: 1px solid rgba(45, 102, 195, 1);
text-shadow: 0 1px 0 rgba(0,0,0,0.5);
</if>
<if expr="is_android">
background-color: rgb(39, 180, 231);
border: 1px solid rgb(0, 152, 206);
</if>
<if expr="not is_android and not pp_ifdef('ios')">
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.15), inset 0 1px 2px rgba(255, 255, 255, 0.2);
</if>
}
#reload-button:hover {
<if expr="not is_android">
background-image: -webkit-linear-gradient(#659efd, #659efd 38%, #6097f1);
border: 1px solid rgba(45, 102, 195, 1);
</if>
<if expr="not is_android and not pp_ifdef('ios')">
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25), inset 0 1px 2px rgba(255, 255, 255, 0.2);
</if>
}
#reload-button:active {
<if expr="not is_android">
background-image: -webkit-linear-gradient(#6095ed, #6095ed 38%, #6095ed);
border: 1px solid rgb(38, 84, 160);
</if>
<if expr="is_android">
background-color: rgb(0, 152, 206);
</if>
<if expr="not is_android and not pp_ifdef('ios')">
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
</if>
}
.hidden {
display: none;
}
.suggestions {
margin-top: 18px;
}
.suggestion-header {
font-weight: bold;
margin-bottom: 4px;
}
.suggestion-body {
color: #777;
}
.error-code {
color: #A0A0A0;
margin-top: 15px;
}
/* Increase line height at higher resolutions. */
@media (min-width: 641px) and (min-height: 641px) {
#help-box-inner {
line-height: 18px;
}
}
/* Decrease padding at low sizes. */
@media (max-width: 640px), (max-height: 640px) {
body {
margin: 15px;
}
h1 {
margin: 10px 0px 15px 0px;
}
#content-top {
margin: 15px;
}
#help-box-inner {
padding: 20px;
}
.suggestions {
margin-top: 10px;
}
.suggestion-header {
margin-bottom: 0px;
}
.error-code {
margin-top: 10px;
}
}
/* Don't allow overflow when in a subframe. */
html[subframe] body {
overflow: hidden;
}
#sub-frame-error {
-webkit-align-items: center;
background-color: #DDD;
display: -webkit-flex;
-webkit-flex-flow: column;
height: 100%;
-webkit-justify-content: center;
left: 0px;
position: absolute;
top: 0px;
width: 100%;
}
#sub-frame-error:hover {
background-color: #EEE;
}
#sub-frame-error-details {
margin: 0 10px;
visibility: hidden;
}
/* Show details only when hovering. */
#sub-frame-error:hover #sub-frame-error-details {
visibility: visible;
}
/* If the iframe is too small, always hide the error code. */
/* TODO(mmenke): See if overflow: no-display works better, once supported. */
@media (max-width: 200px), (max-height: 95px) {
#sub-frame-error-details {
display: none;
}
}
</style>
</head>
<script>
function toggleHelpBox() {
var helpBoxOuter = document.getElementById('help-box-outer');
helpBoxOuter.classList.toggle('hidden');
var moreLessButton = document.getElementById('more-less-button');
if (helpBoxOuter.classList.contains('hidden')) {
moreLessButton.innerText = moreLessButton.moreText;
} else {
moreLessButton.innerText = moreLessButton.lessText;
}
}
function diagnoseErrors() {
var extension_id = "idddmepepmjcgiedknnmlbadcokidhoa";
var diagnose_frame = document.getElementById('diagnose-frame');
diagnose_frame.innerHTML =
'<iframe src="chrome-extension://' + extension_id +
'/index.html"></iframe>';
}
// Subframes use a different layout but the same html file. This is to make it
// easier to support platforms that load the error page via different
// mechanisms (Currently just iOS).
if (window.top.location != window.location)
document.documentElement.setAttribute('subframe', '');
function updateForDnsProbe(strings) {
var context = new JsEvalContext(strings);
jstProcess(context, document.getElementById('help-box-outer'));
jstProcess(context, document.getElementById('details'));
}
<if expr="is_macosx or is_linux or is_android">
//Re-orders buttons. Used on Mac, Linux, and Android, where reload should go on the right.
function swapButtonOrder() {
reloadButton = document.getElementById('reload-button');
moreLessButton = document.getElementById('more-less-button');
reloadButton.parentNode.insertBefore(moreLessButton, reloadButton);
}
document.addEventListener("DOMContentLoaded", swapButtonOrder);
</if>
</script>
<body id="t">
<div id="main-frame-error">
<div id="box">
<div id="content-top">
<h1>
<div><img class="icon" jseval="this.classList.add(iconClass)"></div>
<span i18n-content="heading"></span>
</h1>
<button id="reload-button" onclick="location = this.url" jsselect="reload" jsvalues=".url:reloadUrl" jscontent="msg"></button>
<button id="more-less-button" onclick="toggleHelpBox()" jsdisplay="more" jsvalues=".moreText:more; .lessText:less;" jscontent="more"></button>
</div>
<!-- Outer and inner divs are needed both for margins and sizing. -->
<div id="help-box-outer" class="hidden">
<div id="help-box-inner">
<div jsselect="summary">
<span jsvalues=".innerHTML:msg"></span>
</div>
<div class="suggestions" jsselect="suggestions">
<div class="suggestion-header" jsvalues=".innerHTML:header"></div>
<div class="suggestion-body" jsvalues=".innerHTML:body"></div>
</div>
<button id="diagnose-button" onclick="diagnoseErrors()"
jscontent="diagnose" jsdisplay="diagnose"></button>
<div id="diagnose-frame" class="hidden"></div>
<div class="error-code" jscontent="errorCode"></div>
</div>
</div>
</div>
</div>
<div id="sub-frame-error">
<!-- Show details when hovering over the icon, in case the details are
hidden because they're too large. -->
<img class="icon" jseval="this.classList.add(iconClass)" jsvalues=".title:errorDetails">
<div id="sub-frame-error-details" jsvalues=".innerHTML:errorDetails"></div>
</div>
</body>
</html>