Skip to content
Snippets Groups Projects
Commit 550bed8e authored by Ruben Rodriguez's avatar Ruben Rodriguez
Browse files

Abrowser: new about:home page and artwork

parent ccd5b3b4
No related branches found
No related tags found
No related merge requests found
Showing
with 226 additions and 911 deletions
Extension built by Ruben Rodriguez using pieces of torbutton as a template
Copyright (c) 2014, Ruben Rodriguez <ruben@gnu.org>
Copyright (c) 2013, The Tor Project, Inc.
Copyright (c) 2006 Scott Squires, Oleg Ivanov
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
content abrowserhome chrome/content/
locale abrowserhome af chrome/locale/es/
locale abrowserhome ak chrome/locale/en/
component {a364a9c0-2960-11e4-8c21-0800200c9a66} components/aboutAbrowser.js
contract @mozilla.org/network/protocol/about;1?what=startpage {a364a9c0-2960-11e4-8c21-0800200c9a66}
contract @mozilla.org/network/protocol/about;1?what=home {a364a9c0-2960-11e4-8c21-0800200c9a66}
<?xml version="1.0" encoding="UTF-8"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<!DOCTYPE html [
<!ENTITY % htmlDTD
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
%htmlDTD;
<!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
%globalDTD;
<!ENTITY % aboutHomeDTD SYSTEM "chrome://browser/locale/aboutHome.dtd">
%aboutHomeDTD;
<!ENTITY % browserDTD SYSTEM "chrome://browser/locale/browser.dtd" >
%browserDTD;
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>&abouthome.pageTitle;</title>
<link rel="icon" type="image/png" id="favicon"
href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" type="text/css" media="all"
href="chrome://browser/content/abouthome/aboutHome.css"/>
<style>
body{
margin:0;
background-color:#f2f2f2;
}
#box{
display: flex;
flex-flow: column;
justify-content: space-between;
align-items: center;
align-content: center;
height: 100vh;
}
#topSection, #box3, #block-horizontal-margin{
flex: 0 1 auto;
align-self: auto;
}
#topSection {
margin-top:10vh;
order:1;
}
#block-horizontal-margin{
order:2;
}
#box3{
order:3;
width:100vw;
}
label{
position:relative;
bottom:2px;
left:2px;
}
#addonsform form{
position:relative;
left:10px;
}
em {
color:#600
}
a{
color:#004998
}
#addonsform{
background-color:#fff;
font-size:14px;
padding:10px 25px 20px 25px;
border-radius: 5px;
box-shadow: 0 0px 2px hsla(0,0%,0%,.3) inset;
}
.block-side-margin {
min-width: 16px;
}
ul li {
list-style:none;
float:left;
}
ul li a{
font-weight:bold;
text-shadow:0px 1px 0px #fff;
padding:5px 10px 5px 10px;
border-radius:3px;
margin:5px;
color:#888;
background:#dcdcdc;
box-shadow: 0px 2px 0 #ccc ;
}
ul li a:hover{
color:#666;
background:#ccc;
box-shadow: 0px 2px 0 #aaa;
}
.titlelink{
font-weight:bold;
color: #678;
text-shadow: 0px 1px 0px white;
}
#footer{
min-height:50px;
display: -moz-box;
-moz-box-align: center;
-moz-box-pack: center;
width: 100%;
background-color: hsla(0,0%,0%,.03);
border-top: 1px solid hsla(0,0%,0%,.03);
box-shadow: 0 -1px 2px hsla(0,0%,0%,.1) inset, 0 -1px 0 hsla(0,0%,100%,.25);
}
#searchLogoContainer{
color:#888;
text-shadow: 0 1px 0 #fff;
}
</style>
<script type="text/javascript">
<![CDATA[
Components.utils.import("resource://gre/modules/AddonManager.jsm");
Components.utils.import("resource://gre/modules/Services.jsm");
function flip(sel){
var id = sel.id;
var addonObj=-1;
AddonManager.getAddonByID(id, function(addon) {
addonObj=addon;
});
var thread = Components.classes["@mozilla.org/thread-manager;1"].getService().currentThread;
while (addonObj == null || addonObj == -1)
thread.processNextEvent(true);
addonObj.userDisabled = addonObj.isActive;
if ( addonObj.operationsRequiringRestart != 0)
alert("This change will be applied when you restart Abrowser");
}
function languagesettings(sel){
if (sel.checked)
Services.prefs.setCharPref(sel.id,sel.value);
else
Services.prefs.clearUserPref(sel.id);
}
function fontsettings(sel){
if (sel.checked)
Services.prefs.setIntPref(sel.id,sel.value);
else
Services.prefs.clearUserPref(sel.id);
}
function jssettings(sel){
if (sel.checked){
Services.prefs.setBoolPref(sel.id, !sel.checked);}
else
Services.prefs.clearUserPref(sel.id);
}
function prepare(){
srchsvc = Components.classes["@mozilla.org/browser/search-service;1"].getService(Components.interfaces.nsIBrowserSearchService);
currentEngine = srchsvc.defaultEngine.name;
document.getElementById("searchLogoContainer").innerHTML=currentEngine+":";
/*try {
Services.prefs.getCharPref("extensions.abrowserhome.intl.accept_languages");
}catch(err){
Services.prefs.setCharPref("intl.accept_languages","en-US, en");
Services.prefs.setCharPref("extensions.abrowserhome.intl.accept_languages","en-US, en");
}
try {
Services.prefs.getIntPref("extensions.abrowserhome.browser.display.use_document_fonts");
}catch(err){
Services.prefs.setIntPref("browser.display.use_document_fonts",0);
Services.prefs.setIntPref("extensions.abrowserhome.browser.display.use_document_fonts",0);
}*/
var f = document.createElement("form");
var extensions=[
["jid1-KtlZuoiikVfFew@jetpack","Block execution of non-free <a target=\"_blank\" href=\"http://www.gnu.org/software/librejs/\">JavaScript</a> <em>(experimental)</em>"],
["spyblock@gnu.org","Block privacy <a target=\"_blank\" href=\"https://easylist.adblockplus.org\">trackers</a>"],
["torproxy@trisquel","Use <a target=\"_blank\" href=\"https://www.torproject.org/about/overview.html.en#overview\">Tor</a> when in Private Mode"],
["https-everywhere@eff.org","Get redirected to <a target=\"_blank\" href=\"https://www.eff.org/https-everywhere/faq\">HTTPS</a> when possible"],
]
for (var i=0; i<extensions.length; ++i) {
var ex=extensions[i][0];
var tmp = document.createElement("input");
tmp.setAttribute('type',"checkbox");
tmp.setAttribute('id', ex);
tmp.setAttribute('onclick','flip(this);');
var label = document.createElement("label");
label.htmlFor = ex ;
label.id = ex+'label';
label.appendChild(document.createTextNode(''));
f.appendChild(tmp);
f.appendChild(label);
document.getElementById("addonsform").appendChild(f);
}
var tmp = document.createElement("input");
tmp.setAttribute('type',"checkbox");
tmp.setAttribute('id', "intl.accept_languages");
tmp.setAttribute('value', "en-US, en");
tmp.setAttribute('onclick','languagesettings(this);');
value=Services.prefs.getCharPref("intl.accept_languages");
tmp.checked=(value=="en-US, en");
var label = document.createElement("label");
label.htmlFor = "intl.accept_languages" ;
label.id = "intl.accept_languageslabel";
label.appendChild(document.createTextNode("Request pages in English"));
f.appendChild(tmp);
f.appendChild(label);
f.appendChild(document.createElement("br"));
document.getElementById("addonsform").appendChild(f);
var tmp = document.createElement("input");
tmp.setAttribute('type',"checkbox");
tmp.setAttribute('id', "browser.display.use_document_fonts");
tmp.setAttribute('value', 0);
tmp.setAttribute('onclick','fontsettings(this);');
value=Services.prefs.getIntPref("browser.display.use_document_fonts");
tmp.checked=(value==0);
var label = document.createElement("label");
label.htmlFor = "browser.display.use_document_fonts" ;
label.id = "browser.display.use_document_fontslabel";
label.appendChild(document.createTextNode("Use system fonts"));
f.appendChild(tmp);
f.appendChild(label);
f.appendChild(document.createElement("br"));
document.getElementById("addonsform").appendChild(f);
var tmp = document.createElement("input");
tmp.setAttribute('type',"checkbox");
tmp.setAttribute('id', "javascript.enabled");
tmp.setAttribute('value', 0);
tmp.setAttribute('onclick','jssettings(this);');
value=Services.prefs.getBoolPref("javascript.enabled");
tmp.checked=(value==0);
var label = document.createElement("label");
label.htmlFor = "javascript.enabled" ;
label.id = "javascript.enabledlabel";
label.appendChild(document.createTextNode("Disable JavaScript"));
f.appendChild(tmp);
f.appendChild(label);
f.appendChild(document.createElement("br"));
document.getElementById("addonsform").appendChild(f);
for (var i=0; i<extensions.length; ++i) {
var ex=extensions[i][0];
var addonObj=-1;
AddonManager.getAddonByID(ex, function(addon) {
addonObj=addon;
});
var thread = Components.classes["@mozilla.org/thread-manager;1"].getService().currentThread;
while ( addonObj == -1)
thread.processNextEvent(true);
if ( addonObj != null){
document.getElementById(ex).checked = addonObj.isActive;
//document.getElementById(ex+'label').innerHTML = addonObj.name;
document.getElementById(ex+'label').innerHTML = extensions[i][1]+"<br/>";
}else{
document.getElementById(ex).style.display='none';
document.getElementById(ex+'label').style.display='none';
}
}
}
function onSearchSubmit(){
srchsvc = Components.classes["@mozilla.org/browser/search-service;1"].getService(Components.interfaces.nsIBrowserSearchService);
currentEngine = srchsvc.defaultEngine;
var selectedText=document.getElementById("searchText").value;
submission = currentEngine.getSubmission(selectedText,null);
window.location = submission.uri.spec;
}
]]>
</script>
</head>
<body dir="&locale.dir;" onload="prepare();">
<div id="box">
<div id="box1">
<div id="topSection">
<img src="chrome://branding/content/about-logo.png"/>
<br/>
<br/>
<div id="searchContainer">
<form name="searchForm" id="searchForm" onsubmit="onSearchSubmit(); return false">
<div id="searchLogoContainer"></div>
<input type="text" name="q" value="" id="searchText" maxlength="256"
autofocus="autofocus" dir="auto"/>
<input id="searchSubmit" type="submit" value="Search"/>
</form>
</div>
</div>
</div>
<div id="box2">
<div id="block-horizontal-margin">
<div class="block-side-margin"></div>
<div id="addonsform">
<!--<h3>Enabled privacy features:</h3>-->
<p><a target="_blank" href="https://trisquel.info/browser">Abrowser</a> protects your <a target="_blank" href="http://www.gnu.org/philosophy/free-sw.html">freedom</a> and your privacy!<br/><small>For a browser with an even bigger focus on privacy, <a href="apt:icecat">install GNU IceCat</a></small></p>
</div>
<div class="block-side-margin"></div>
</div>
</div>
<div id="box3">
<div id="footer">
<p ><a class="titlelink" href="https://trisquel.info">Trisquel GNU/Linux</a></p>
<ul style="font-size:0.8em">
<li><a href="https://trisquel.info/forum">Forum</a></li>
<li><a href="https://trisquel.info/wiki">Wiki</a></li>
<li><a href="http://store.trisquel.info/">Store</a></li>
<li><a href="https://trisquel.info/donate">Donate</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>
<!ENTITY aboutAbrowser.title "About Abrowser">
<!ENTITY aboutAbrowser.title "Acerca de Abrowser">
/*
Copyright (c) 2014, Ruben Rodriguez <ruben@gnu.org>
Copyright (c) 2013, The Tor Project, Inc.
Copyright (c) 2006 Scott Squires, Oleg Ivanov
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/
// Module specific constants
const kMODULE_NAME = "about:abrowser";
const kMODULE_CONTRACTID = "@mozilla.org/network/protocol/about;1?what=abrowser";
const kMODULE_CID = Components.ID("a364a9c0-2960-11e4-8c21-0800200c9a66");
const kAboutAbrowserURL = "chrome://abrowserhome/content/aboutAbrowser/aboutAbrowser.xhtml";
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
function AboutAbrowser()
{
}
AboutAbrowser.prototype =
{
QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
// nsIClassInfo implementation:
classDescription: kMODULE_NAME,
classID: kMODULE_CID,
contractID: kMODULE_CONTRACTID,
// nsIAboutModule implementation:
newChannel: function(aURI)
{
let ioSvc = Cc["@mozilla.org/network/io-service;1"]
.getService(Ci.nsIIOService);
let channel = ioSvc.newChannel(kAboutAbrowserURL, null, null);
channel.originalURI = aURI;
return channel;
},
getURIFlags: function(aURI)
{
return Ci.nsIAboutModule.ALLOW_SCRIPT;
}
};
const NSGetFactory = XPCOMUtils.generateNSGetFactory([AboutAbrowser]);
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:name>AbrowserHome</em:name>
<em:creator>Ruben Rodriguez</em:creator>
<em:id>aboutabrowser@trisquel.info</em:id>
<em:version>1.1</em:version>
<em:updateURL>https://127.0.0.1/</em:updateURL>
<em:multiprocessCompatible>true</em:multiprocessCompatible>
<!-- <em:updateKey></em:updateKey> -->
<!-- firefox -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>30.0</em:minVersion>
<em:maxVersion>10000.0</em:maxVersion>
</Description>
</em:targetApplication>
</Description>
</RDF>
%if 0
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
%endif
html { html {
font: message-box; font: message-box;
...@@ -40,8 +35,8 @@ a { ...@@ -40,8 +35,8 @@ a {
} }
#brandLogo { #brandLogo {
height: 420px; height: 150px;
width: 150px; width: 420px;
margin: 22px auto 31px; margin: 22px auto 31px;
background-image: url("chrome://branding/content/about-logo.png"); background-image: url("chrome://branding/content/about-logo.png");
background-size: 420px 150px; background-size: 420px 150px;
...@@ -49,90 +44,105 @@ a { ...@@ -49,90 +44,105 @@ a {
background-repeat: no-repeat; background-repeat: no-repeat;
} }
#searchForm, #searchIconAndTextContainer,
#snippets { #snippets {
width: 470px; width: 470px;
} }
#searchForm { #searchIconAndTextContainer {
display: -moz-box; display: -moz-box;
height: 36px;
position: relative;
} }
#searchLogoContainer { #searchIcon {
display: -moz-box; border: 1px transparent;
-moz-box-align: center; padding: 0;
padding-top: 2px; margin: 0;
-moz-padding-end: 8px; width: 36px;
} height: 36px;
background: url("chrome://browser/skin/search-indicator-magnifying-glass.svg") center center no-repeat;
#searchLogoContainer[hidden] { position: absolute;
display: none;
}
#searchEngineLogo {
display: inline-block;
height: 28px;
width: 70px;
min-width: 70px;
} }
#searchText { #searchText {
margin-left: 0;
-moz-box-flex: 1; -moz-box-flex: 1;
padding: 6px 8px; padding-top: 6px;
padding-bottom: 6px;
padding-inline-start: 34px;
padding-inline-end: 8px;
background: hsla(0,0%,100%,.9) padding-box; background: hsla(0,0%,100%,.9) padding-box;
border: 1px solid; border: 1px solid;
border-radius: 2px 0 0 2px;
border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2); border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2);
box-shadow: 0 1px 0 hsla(210,65%,9%,.02) inset, box-shadow: 0 1px 0 hsla(210,65%,9%,.02) inset,
0 0 2px hsla(210,65%,9%,.1) inset, 0 0 2px hsla(210,65%,9%,.1) inset,
0 1px 0 hsla(0,0%,100%,.2); 0 1px 0 hsla(0,0%,100%,.2);
border-radius: 2.5px 0 0 2.5px; color: inherit;
unicode-bidi: plaintext;
}
#searchText:dir(rtl) {
border-radius: 0 2px 2px 0;
} }
#searchText:-moz-dir(rtl) { #searchText[aria-expanded="true"] {
border-radius: 0 2.5px 2.5px 0; border-radius: 2px 0 0 0;
} }
#searchText[aria-expanded="true"]:dir(rtl) {
border-radius: 0 2px 0 0;
}
#searchText[keepfocus],
#searchText:focus, #searchText:focus,
#searchText[autofocus] { #searchText[autofocus] {
border-color: hsla(206,100%,60%,.6) hsla(206,76%,52%,.6) hsla(204,100%,40%,.6); border-color: hsla(206,100%,60%,.6) hsla(206,76%,52%,.6) hsla(204,100%,40%,.6);
} }
#searchSubmit { #searchSubmit {
-moz-margin-start: -1px; margin-inline-start: -1px;
background: linear-gradient(hsla(0,0%,100%,.8), hsla(0,0%,100%,.1)) padding-box; color: transparent;
padding: 0 9px; background: url("chrome://browser/skin/search-arrow-go.svg") center center no-repeat, linear-gradient(hsla(0,0%,100%,.8), hsla(0,0%,100%,.1)) padding-box;
-moz-context-properties: fill;
fill: #616366;
padding: 0;
border: 1px solid; border: 1px solid;
border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2); border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2) transparent;
-moz-border-start: 1px solid transparent; border-radius: 0 2px 2px 0;
border-radius: 0 2.5px 2.5px 0;
box-shadow: 0 0 2px hsla(0,0%,100%,.5) inset, box-shadow: 0 0 2px hsla(0,0%,100%,.5) inset,
0 1px 0 hsla(0,0%,100%,.2); 0 1px 0 hsla(0,0%,100%,.2);
cursor: pointer; cursor: pointer;
transition-property: background-color, border-color, box-shadow; transition-property: background-color, border-color, box-shadow;
transition-duration: 150ms; transition-duration: 150ms;
width: 50px;
} }
#searchSubmit:-moz-dir(rtl) { #searchSubmit:dir(rtl) {
border-radius: 2.5px 0 0 2.5px; transform: scaleX(-1);
} }
#searchText:focus + #searchSubmit, #searchText:focus + #searchSubmit,
#searchText[keepfocus] + #searchSubmit,
#searchText + #searchSubmit:hover, #searchText + #searchSubmit:hover,
#searchText[autofocus] + #searchSubmit { #searchText[autofocus] + #searchSubmit {
border-color: #59b5fc #45a3e7 #3294d5; border-color: #59b5fc #45a3e7 #3294d5;
color: white;
} }
#searchText:focus + #searchSubmit, #searchText:focus + #searchSubmit,
#searchText[keepfocus] + #searchSubmit,
#searchText[autofocus] + #searchSubmit { #searchText[autofocus] + #searchSubmit {
background-image: linear-gradient(#4cb1ff, #1793e5); background-image: url("chrome://browser/skin/search-arrow-go.svg"), linear-gradient(#4cb1ff, #1793e5);
fill: white;
box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset, box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset,
0 0 0 1px hsla(0,0%,100%,.1) inset, 0 0 0 1px hsla(0,0%,100%,.1) inset,
0 1px 0 hsla(210,54%,20%,.03); 0 1px 0 hsla(210,54%,20%,.03);
} }
#searchText + #searchSubmit:hover { #searchText + #searchSubmit:hover {
background-image: linear-gradient(#66bdff, #0d9eff); background-image: url("chrome://browser/skin/search-arrow-go.svg"), linear-gradient(#66bdff, #0d9eff);
fill: white;
box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset, box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset,
0 0 0 1px hsla(0,0%,100%,.1) inset, 0 0 0 1px hsla(0,0%,100%,.1) inset,
0 1px 0 hsla(210,54%,20%,.03), 0 1px 0 hsla(210,54%,20%,.03),
...@@ -150,19 +160,19 @@ a { ...@@ -150,19 +160,19 @@ a {
#rightsSnippet { #rightsSnippet {
display: block; display: block;
min-height: 38px; min-height: 38px;
background: 30px center no-repeat; background: 0 center no-repeat;
padding: 6px 0; padding: 6px 0;
-moz-padding-start: 79px; padding-inline-start: 49px;
} }
#rightsSnippet[hidden] { #rightsSnippet[hidden] {
display: none; display: none;
} }
#defaultSnippet1:-moz-dir(rtl), #defaultSnippet1:dir(rtl),
#defaultSnippet2:-moz-dir(rtl), #defaultSnippet2:dir(rtl),
#rightsSnippet:-moz-dir(rtl) { #rightsSnippet:dir(rtl) {
background-position: right 30px center; background-position: right 0 center;
} }
#defaultSnippet1 { #defaultSnippet1 {
...@@ -217,7 +227,7 @@ body[narrow] #launcher[session] { ...@@ -217,7 +227,7 @@ body[narrow] #launcher[session] {
white-space: normal; white-space: normal;
background: transparent padding-box; background: transparent padding-box;
border: 1px solid transparent; border: 1px solid transparent;
border-radius: 2.5px; border-radius: 2px;
color: #525c66; color: #525c66;
font-size: 75%; font-size: 75%;
cursor: pointer; cursor: pointer;
...@@ -299,10 +309,6 @@ body[narrow] #restorePreviousSession { ...@@ -299,10 +309,6 @@ body[narrow] #restorePreviousSession {
content: url("chrome://browser/content/abouthome/history.png"); content: url("chrome://browser/content/abouthome/history.png");
} }
#apps::before {
content: url("chrome://browser/content/abouthome/apps.png");
}
#addons::before { #addons::before {
content: url("chrome://browser/content/abouthome/addons.png"); content: url("chrome://browser/content/abouthome/addons.png");
} }
...@@ -322,10 +328,10 @@ body[narrow] #restorePreviousSession { ...@@ -322,10 +328,10 @@ body[narrow] #restorePreviousSession {
display: inline-block; /* display on same line as text label */ display: inline-block; /* display on same line as text label */
vertical-align: middle; vertical-align: middle;
margin-bottom: 0; margin-bottom: 0;
-moz-margin-end: 8px; margin-inline-end: 8px;
} }
#restorePreviousSession:-moz-dir(rtl)::before { #restorePreviousSession:dir(rtl)::before {
transform: scaleX(-1); transform: scaleX(-1);
} }
...@@ -339,21 +345,21 @@ body[narrow] #restorePreviousSession::before { ...@@ -339,21 +345,21 @@ body[narrow] #restorePreviousSession::before {
display: block; display: block;
position: relative; /* pin wordmark to edge of document, not of viewport */ position: relative; /* pin wordmark to edge of document, not of viewport */
-moz-box-ordinal-group: 0; -moz-box-ordinal-group: 0;
opacity: .5; opacity: .2;
transition: opacity 150ms; transition: opacity 150ms;
} }
#aboutMozilla:hover { #aboutMozilla:hover {
opacity: 1; opacity: .6;
} }
#aboutMozilla::before { #aboutMozilla::before {
content: url("chrome://browser/content/abouthome/mozilla.png"); content: url("chrome://browser/content/abouthome/mozilla.svg");
display: block; display: block;
position: absolute; position: absolute;
top: 12px; top: 12px;
right: 12px; offset-inline-end: 12px;
width: 69px; width: 67px;
height: 19px; height: 19px;
} }
...@@ -362,9 +368,6 @@ body[narrow] #restorePreviousSession::before { ...@@ -362,9 +368,6 @@ body[narrow] #restorePreviousSession::before {
* rather than upscaling the original-size ones (bug 818940). * rather than upscaling the original-size ones (bug 818940).
*/ */
@media not all and (max-resolution: 1dppx) { @media not all and (max-resolution: 1dppx) {
#brandLogo {
background-image: url("chrome://branding/content/about-logo@2x.png");
}
#defaultSnippet1, #defaultSnippet1,
#defaultSnippet2, #defaultSnippet2,
...@@ -380,12 +383,15 @@ body[narrow] #restorePreviousSession::before { ...@@ -380,12 +383,15 @@ body[narrow] #restorePreviousSession::before {
background-image: url("chrome://browser/content/abouthome/snippet2@2x.png"); background-image: url("chrome://browser/content/abouthome/snippet2@2x.png");
} }
.launchButton::before, .launchButton::before {
#aboutMozilla::before {
transform: scale(.5); transform: scale(.5);
transform-origin: 0 0; transform-origin: 0 0;
} }
.launchButton:dir(rtl)::before {
transform: scale(.5) translateX(32px);
}
#downloads::before { #downloads::before {
content: url("chrome://browser/content/abouthome/downloads@2x.png"); content: url("chrome://browser/content/abouthome/downloads@2x.png");
} }
...@@ -398,10 +404,6 @@ body[narrow] #restorePreviousSession::before { ...@@ -398,10 +404,6 @@ body[narrow] #restorePreviousSession::before {
content: url("chrome://browser/content/abouthome/history@2x.png"); content: url("chrome://browser/content/abouthome/history@2x.png");
} }
#apps::before {
content: url("chrome://browser/content/abouthome/apps@2x.png");
}
#addons::before { #addons::before {
content: url("chrome://browser/content/abouthome/addons@2x.png"); content: url("chrome://browser/content/abouthome/addons@2x.png");
} }
...@@ -422,8 +424,8 @@ body[narrow] #restorePreviousSession::before { ...@@ -422,8 +424,8 @@ body[narrow] #restorePreviousSession::before {
content: url("chrome://browser/content/abouthome/restore@2x.png"); content: url("chrome://browser/content/abouthome/restore@2x.png");
} }
#aboutMozilla::before { #restorePreviousSession:dir(rtl)::before {
content: url("chrome://browser/content/abouthome/mozilla@2x.png"); transform: scale(-0.5, 0.5) translateX(24px);
transform-origin: top center;
} }
} }
...@@ -2,158 +2,37 @@ ...@@ -2,158 +2,37 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const SEARCH_ENGINES = { "use strict";
"Google": {
// This is the "2x" image designed for OS X retina resolution, Windows at 192dpi, etc.; /* import-globals-from ../contentSearchUI.js */
// it will be scaled down as necessary on lower-dpi displays.
image: "data:image/png;base64," +
"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"
}
};
// The process of adding a new default snippet involves: // The process of adding a new default snippet involves:
// * add a new entity to aboutHome.dtd // * add a new entity to aboutHome.dtd
// * add a <span/> for it in aboutHome.xhtml // * add a <span/> for it in aboutHome.xhtml
// * add an entry here in the proper ordering (based on spans) // * add an entry here in the proper ordering (based on spans)
// The <a/> part of the snippet will be linked to the corresponding url. // The <a/> part of the snippet will be linked to the corresponding url.
const DEFAULT_SNIPPETS_URLS = [ "" ]; const DEFAULT_SNIPPETS_URLS = [];
const SNIPPETS_UPDATE_INTERVAL_MS = 86400000; // 1 Day. const SNIPPETS_UPDATE_INTERVAL_MS = 14400000; // 4 hours.
// IndexedDB storage constants. // IndexedDB storage constants.
const DATABASE_NAME = "abouthome"; const DATABASE_NAME = "abouthome";
const DATABASE_VERSION = 1; const DATABASE_VERSION = 1;
const DATABASE_STORAGE = "persistent";
const SNIPPETS_OBJECTSTORE_NAME = "snippets"; const SNIPPETS_OBJECTSTORE_NAME = "snippets";
var searchText;
// This global tracks if the page has been set up before, to prevent double inits // This global tracks if the page has been set up before, to prevent double inits
let gInitialized = false; var gInitialized = false;
let gObserver = new MutationObserver(function (mutations) { var gObserver = new MutationObserver(function(mutations) {
for (let mutation of mutations) { for (let mutation of mutations) {
if (mutation.attributeName == "searchEngineName") { // The addition of the restore session button changes our width:
setupSearchEngine(); if (mutation.attributeName == "session") {
fitToWidth();
}
if (mutation.attributeName == "snippetsVersion") {
if (!gInitialized) { if (!gInitialized) {
// ensureSnippetsMapThen(loadSnippets); ensureSnippetsMapThen(loadSnippets);
gInitialized = true; gInitialized = true;
} }
return; return;
...@@ -161,15 +40,17 @@ let gObserver = new MutationObserver(function (mutations) { ...@@ -161,15 +40,17 @@ let gObserver = new MutationObserver(function (mutations) {
} }
}); });
window.addEventListener("pageshow", function () { window.addEventListener("pageshow", function() {
// Delay search engine setup, cause browser.js::BrowserOnAboutPageLoad runs // Delay search engine setup, cause browser.js::BrowserOnAboutPageLoad runs
// later and may use asynchronous getters. // later and may use asynchronous getters.
window.gObserver.observe(document.documentElement, { attributes: true }); window.gObserver.observe(document.documentElement, { attributes: true });
window.gObserver.observe(document.getElementById("launcher"), { attributes: true });
fitToWidth(); fitToWidth();
setupSearch();
window.addEventListener("resize", fitToWidth); window.addEventListener("resize", fitToWidth);
// Ask chrome to update snippets. // Ask chrome to update snippets.
var event = new CustomEvent("AboutHomeLoad", {bubbles:true}); var event = new CustomEvent("AboutHomeLoad", {bubbles: true});
document.dispatchEvent(event); document.dispatchEvent(event);
}); });
...@@ -178,11 +59,39 @@ window.addEventListener("pagehide", function() { ...@@ -178,11 +59,39 @@ window.addEventListener("pagehide", function() {
window.removeEventListener("resize", fitToWidth); window.removeEventListener("resize", fitToWidth);
}); });
window.addEventListener("keypress", ev => {
if (ev.defaultPrevented) {
return;
}
// don't focus the search-box on keypress if something other than the
// body or document element has focus - don't want to steal input from other elements
// Make an exception for <a> and <button> elements (and input[type=button|submit])
// which don't usefully take keypresses anyway.
// (except space, which is handled below)
if (document.activeElement && document.activeElement != document.body &&
document.activeElement != document.documentElement &&
!["a", "button"].includes(document.activeElement.localName) &&
!document.activeElement.matches("input:-moz-any([type=button],[type=submit])")) {
return;
}
let modifiers = ev.ctrlKey + ev.altKey + ev.metaKey;
// ignore Ctrl/Cmd/Alt, but not Shift
// also ignore Tab, Insert, PageUp, etc., and Space
if (modifiers != 0 || ev.charCode == 0 || ev.charCode == 32)
return;
searchText.focus();
// need to send the first keypress outside the search-box manually to it
searchText.value += ev.key;
});
// This object has the same interface as Map and is used to store and retrieve // This object has the same interface as Map and is used to store and retrieve
// the snippets data. It is lazily initialized by ensureSnippetsMapThen(), so // the snippets data. It is lazily initialized by ensureSnippetsMapThen(), so
// be sure its callback returned before trying to use it. // be sure its callback returned before trying to use it.
let gSnippetsMap; var gSnippetsMap;
let gSnippetsMapCallbacks = []; var gSnippetsMapCallbacks = [];
/** /**
* Ensure the snippets map is properly initialized. * Ensure the snippets map is properly initialized.
...@@ -192,9 +101,7 @@ let gSnippetsMapCallbacks = []; ...@@ -192,9 +101,7 @@ let gSnippetsMapCallbacks = [];
* @note Snippets should never directly manage the underlying storage, since * @note Snippets should never directly manage the underlying storage, since
* it may change inadvertently. * it may change inadvertently.
*/ */
function ensureSnippetsMapThen(aCallback) function ensureSnippetsMapThen(aCallback) {
{
return;
if (gSnippetsMap) { if (gSnippetsMap) {
aCallback(gSnippetsMap); aCallback(gSnippetsMap);
return; return;
...@@ -207,7 +114,7 @@ return; ...@@ -207,7 +114,7 @@ return;
return; return;
} }
let invokeCallbacks = function () { let invokeCallbacks = function() {
if (!gSnippetsMap) { if (!gSnippetsMap) {
gSnippetsMap = Object.freeze(new Map()); gSnippetsMap = Object.freeze(new Map());
} }
...@@ -218,43 +125,52 @@ return; ...@@ -218,43 +125,52 @@ return;
gSnippetsMapCallbacks.length = 0; gSnippetsMapCallbacks.length = 0;
} }
let openRequest = indexedDB.open(DATABASE_NAME, DATABASE_VERSION); let openRequest = indexedDB.open(DATABASE_NAME, {version: DATABASE_VERSION,
storage: DATABASE_STORAGE});
openRequest.onerror = function (event) { openRequest.onerror = function(event) {
// Try to delete the old database so that we can start this process over // Try to delete the old database so that we can start this process over
// next time. // next time.
indexedDB.deleteDatabase(DATABASE_NAME); indexedDB.deleteDatabase(DATABASE_NAME);
invokeCallbacks(); invokeCallbacks();
}; };
openRequest.onupgradeneeded = function (event) { openRequest.onupgradeneeded = function(event) {
let db = event.target.result; let db = event.target.result;
if (!db.objectStoreNames.contains(SNIPPETS_OBJECTSTORE_NAME)) { if (!db.objectStoreNames.contains(SNIPPETS_OBJECTSTORE_NAME)) {
db.createObjectStore(SNIPPETS_OBJECTSTORE_NAME); db.createObjectStore(SNIPPETS_OBJECTSTORE_NAME);
} }
} }
openRequest.onsuccess = function (event) { openRequest.onsuccess = function(event) {
let db = event.target.result; let db = event.target.result;
db.onerror = function (event) { db.onerror = function() {
invokeCallbacks(); invokeCallbacks();
} }
db.onversionchange = function (event) { db.onversionchange = function(versionChangeEvent) {
event.target.close(); versionChangeEvent.target.close();
invokeCallbacks(); invokeCallbacks();
} }
let cache = new Map(); let cache = new Map();
let cursorRequest = db.transaction(SNIPPETS_OBJECTSTORE_NAME) let cursorRequest;
.objectStore(SNIPPETS_OBJECTSTORE_NAME).openCursor(); try {
cursorRequest.onerror = function (event) { cursorRequest = db.transaction(SNIPPETS_OBJECTSTORE_NAME)
.objectStore(SNIPPETS_OBJECTSTORE_NAME).openCursor();
} catch (ex) {
console.error(ex);
invokeCallbacks(); invokeCallbacks();
return;
} }
cursorRequest.onsuccess = function(event) { cursorRequest.onerror = function() {
let cursor = event.target.result; invokeCallbacks();
}
cursorRequest.onsuccess = function(cursorRequestEvent) {
let cursor = cursorRequestEvent.target.result;
// Populate the cache from the persistent storage. // Populate the cache from the persistent storage.
if (cursor) { if (cursor) {
...@@ -265,24 +181,24 @@ return; ...@@ -265,24 +181,24 @@ return;
// The cache has been filled up, create the snippets map. // The cache has been filled up, create the snippets map.
gSnippetsMap = Object.freeze({ gSnippetsMap = Object.freeze({
get: function (aKey) cache.get(aKey), get: (aKey) => cache.get(aKey),
set: function (aKey, aValue) { set(aKey, aValue) {
db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite") db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
.objectStore(SNIPPETS_OBJECTSTORE_NAME).put(aValue, aKey); .objectStore(SNIPPETS_OBJECTSTORE_NAME).put(aValue, aKey);
return cache.set(aKey, aValue); return cache.set(aKey, aValue);
}, },
has: function (aKey) cache.has(aKey), has: (aKey) => cache.has(aKey),
delete: function (aKey) { delete(aKey) {
db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite") db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
.objectStore(SNIPPETS_OBJECTSTORE_NAME).delete(aKey); .objectStore(SNIPPETS_OBJECTSTORE_NAME).delete(aKey);
return cache.delete(aKey); return cache.delete(aKey);
}, },
clear: function () { clear() {
db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite") db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
.objectStore(SNIPPETS_OBJECTSTORE_NAME).clear(); .objectStore(SNIPPETS_OBJECTSTORE_NAME).clear();
return cache.clear(); return cache.clear();
}, },
get size() cache.size get size() { return cache.size; },
}); });
setTimeout(invokeCallbacks, 0); setTimeout(invokeCallbacks, 0);
...@@ -290,61 +206,39 @@ return; ...@@ -290,61 +206,39 @@ return;
} }
} }
function onSearchSubmit(aEvent) function onSearchSubmit(aEvent) {
{ gContentSearchController.search(aEvent);
let searchTerms = document.getElementById("searchText").value;
let engineName = document.documentElement.getAttribute("searchEngineName");
if (engineName && searchTerms.length > 0) {
// Send an event that will perform a search and Firefox Health Report will
// record that a search from about:home has occurred.
let eventData = JSON.stringify({
engineName: engineName,
searchTerms: searchTerms
});
let event = new CustomEvent("AboutHomeSearchEvent", {detail: eventData});
document.dispatchEvent(event);
}
aEvent.preventDefault();
} }
function setupSearchEngine() var gContentSearchController;
{
function setupSearch() {
// Set submit button label for when CSS background are disabled (e.g.
// high contrast mode).
document.getElementById("searchSubmit").value =
document.body.getAttribute("dir") == "ltr" ? "\u25B6" : "\u25C0";
// The "autofocus" attribute doesn't focus the form element // The "autofocus" attribute doesn't focus the form element
// immediately when the element is first drawn, so the // immediately when the element is first drawn, so the
// attribute is also used for styling when the page first loads. // attribute is also used for styling when the page first loads.
let searchText = document.getElementById("searchText"); searchText = document.getElementById("searchText");
searchText.addEventListener("blur", function searchText_onBlur() { searchText.addEventListener("blur", function() {
searchText.removeEventListener("blur", searchText_onBlur);
searchText.removeAttribute("autofocus"); searchText.removeAttribute("autofocus");
}); }, {once: true});
let searchEngineName = document.documentElement.getAttribute("searchEngineName");
let searchEngineInfo = SEARCH_ENGINES[searchEngineName];
let logoElt = document.getElementById("searchEngineLogo");
// Add search engine logo.
if (searchEngineInfo && searchEngineInfo.image) {
logoElt.parentNode.hidden = false;
logoElt.src = searchEngineInfo.image;
logoElt.alt = searchEngineName;
searchText.placeholder = "";
}
else {
logoElt.parentNode.hidden = true;
searchText.placeholder = searchEngineName;
}
if (!gContentSearchController) {
gContentSearchController =
new ContentSearchUIController(searchText, searchText.parentNode,
"abouthome", "homepage");
}
} }
/** /**
* Inform the test harness that we're done loading the page. * Inform the test harness that we're done loading the page.
*/ */
function loadSucceeded() function loadCompleted() {
{ var event = new CustomEvent("AboutHomeLoadSnippetsCompleted", {bubbles: true});
var event = new CustomEvent("AboutHomeLoadSnippetsSucceeded", {bubbles:true});
document.dispatchEvent(event); document.dispatchEvent(event);
} }
...@@ -352,14 +246,13 @@ function loadSucceeded() ...@@ -352,14 +246,13 @@ function loadSucceeded()
* Update the local snippets from the remote storage, then show them through * Update the local snippets from the remote storage, then show them through
* showSnippets. * showSnippets.
*/ */
function loadSnippets() function loadSnippets() {
{ return();
return;
if (!gSnippetsMap) if (!gSnippetsMap)
throw new Error("Snippets map has not properly been initialized"); throw new Error("Snippets map has not properly been initialized");
// Allow tests to modify the snippets map before using it. // Allow tests to modify the snippets map before using it.
var event = new CustomEvent("AboutHomeLoadSnippets", {bubbles:true}); var event = new CustomEvent("AboutHomeLoadSnippets", {bubbles: true});
document.dispatchEvent(event); document.dispatchEvent(event);
// Check cached snippets version. // Check cached snippets version.
...@@ -378,32 +271,28 @@ return; ...@@ -378,32 +271,28 @@ return;
if (updateURL && shouldUpdate) { if (updateURL && shouldUpdate) {
// Try to update from network. // Try to update from network.
let xhr = new XMLHttpRequest(); let xhr = new XMLHttpRequest();
try { xhr.timeout = 5000;
xhr.open("GET", updateURL, true);
} catch (ex) {
showSnippets();
loadSucceeded();
return;
}
// Even if fetching should fail we don't want to spam the server, thus // Even if fetching should fail we don't want to spam the server, thus
// set the last update time regardless its results. Will retry tomorrow. // set the last update time regardless its results. Will retry tomorrow.
gSnippetsMap.set("snippets-last-update", Date.now()); gSnippetsMap.set("snippets-last-update", Date.now());
xhr.onerror = function (event) { xhr.onloadend = function() {
showSnippets();
};
xhr.onload = function (event)
{
if (xhr.status == 200) { if (xhr.status == 200) {
gSnippetsMap.set("snippets", xhr.responseText); gSnippetsMap.set("snippets", xhr.responseText);
gSnippetsMap.set("snippets-cached-version", currentVersion); gSnippetsMap.set("snippets-cached-version", currentVersion);
} }
showSnippets(); showSnippets();
loadSucceeded(); loadCompleted();
}; };
xhr.send(null); try {
xhr.open("GET", updateURL, true);
xhr.send(null);
} catch (ex) {
showSnippets();
loadCompleted();
}
} else { } else {
showSnippets(); showSnippets();
loadSucceeded(); loadCompleted();
} }
} }
...@@ -413,10 +302,8 @@ return; ...@@ -413,10 +302,8 @@ return;
* @note: snippets should never invoke showSnippets(), or they may cause * @note: snippets should never invoke showSnippets(), or they may cause
* a "too much recursion" exception. * a "too much recursion" exception.
*/ */
let _snippetsShown = false; var _snippetsShown = false;
function showSnippets() function showSnippets() {
{
return;
let snippetsElt = document.getElementById("snippets"); let snippetsElt = document.getElementById("snippets");
// Show about:rights notification, if needed. // Show about:rights notification, if needed.
...@@ -445,12 +332,13 @@ return; ...@@ -445,12 +332,13 @@ return;
if (snippets) { if (snippets) {
// Injecting snippets can throw if they're invalid XML. // Injecting snippets can throw if they're invalid XML.
try { try {
// eslint-disable-next-line no-unsanitized/property
snippetsElt.innerHTML = snippets; snippetsElt.innerHTML = snippets;
// Scripts injected by innerHTML are inactive, so we have to relocate them // Scripts injected by innerHTML are inactive, so we have to relocate them
// through DOM manipulation to activate their contents. // through DOM manipulation to activate their contents.
Array.forEach(snippetsElt.getElementsByTagName("script"), function(elt) { Array.forEach(snippetsElt.getElementsByTagName("script"), function(elt) {
let relocatedScript = document.createElement("script"); let relocatedScript = document.createElement("script");
relocatedScript.type = "text/javascript;version=1.8"; relocatedScript.type = "text/javascript";
relocatedScript.text = elt.text; relocatedScript.text = elt.text;
elt.parentNode.replaceChild(relocatedScript, elt); elt.parentNode.replaceChild(relocatedScript, elt);
}); });
...@@ -466,9 +354,7 @@ return; ...@@ -466,9 +354,7 @@ return;
/** /**
* Clear snippets element contents and show default snippets. * Clear snippets element contents and show default snippets.
*/ */
function showDefaultSnippets() function showDefaultSnippets() {
{
return;
// Clear eventual contents... // Clear eventual contents...
let snippetsElt = document.getElementById("snippets"); let snippetsElt = document.getElementById("snippets");
snippetsElt.innerHTML = ""; snippetsElt.innerHTML = "";
...@@ -493,7 +379,7 @@ return; ...@@ -493,7 +379,7 @@ return;
} }
function fitToWidth() { function fitToWidth() {
if (window.scrollMaxX) { if (document.documentElement.scrollWidth > window.innerWidth) {
document.body.setAttribute("narrow", "true"); document.body.setAttribute("narrow", "true");
} else if (document.body.hasAttribute("narrow")) { } else if (document.body.hasAttribute("narrow")) {
document.body.removeAttribute("narrow"); document.body.removeAttribute("narrow");
......
...@@ -24,126 +24,41 @@ ...@@ -24,126 +24,41 @@
<link rel="icon" type="image/png" id="favicon" <link rel="icon" type="image/png" id="favicon"
href="chrome://branding/content/icon32.png"/> href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" type="text/css" media="all" <link rel="stylesheet" type="text/css" media="all"
href="chrome://browser/content/contentSearchUI.css"/>
<link rel="stylesheet" type="text/css" media="all" defer="defer"
href="chrome://browser/content/abouthome/aboutHome.css"/> href="chrome://browser/content/abouthome/aboutHome.css"/>
<style> <script type="text/javascript"
src="chrome://browser/content/abouthome/aboutHome.js"/>
body{ <script type="text/javascript"
margin:0; src="chrome://browser/content/contentSearchUI.js"/>
background-color:#f2f2f2;
}
#box{
display: flex;
flex-flow: column;
justify-content: space-between;
align-items: center;
align-content: center;
height: 100vh;
}
#topSection, #box3, #block-horizontal-margin{
flex: 0 1 auto;
align-self: auto;
}
#topSection {
margin-top:10vh;
order:1;
}
#block-horizontal-margin{
order:2;
}
#box3{
order:3;
width:100vw;
}
label{
position:relative;
bottom:2px;
left:2px;
}
em {
color:#600
}
a{
color:#004998
}
.block-side-margin {
min-width: 16px;
-moz-box-flex: 1;
}
#block-horizontal-margin {
display: -moz-box;
-moz-box-flex: 1;
}
ul li {
list-style:none;
background:#ddd;
border-radius:3px;
padding:3px 5px 3px 5px;
margin:5px;
box-shadow: 0px 2px 0 #ccc ;
float:left;
}
ul li a{
font-weight:bold;
color:#666;
text-shadow:0px 1px 0px #fff;
}
.titlelink {
font-weight:bold;
color:#56728C;
text-shadow:0px 1px 0px #fff;
}
#footer{
min-height:100px;
}
</style>
</head> </head>
<body dir="&locale.dir;"> <body dir="&locale.dir;">
<div class="spacer"/>
<div id="box">
<div id="box1">
<div id="topSection"> <div id="topSection">
<img src="chrome://branding/content/about-logo.png"/> <div id="brandLogo"></div>
<div id="searchContainer"> <div id="searchIconAndTextContainer">
<form name="searchForm" id="searchForm" action="https://duckduckgo.com/"> <div id="searchIcon"/>
<input type="hidden" name="t" value="trisquel"/> <input type="text" name="q" value="" id="searchText" maxlength="256"
<input type="text" name="q" value="" id="searchText" maxlength="256" aria-label="&contentSearchInput.label;" autofocus="autofocus"/>
autofocus="autofocus"/> <input id="searchSubmit" type="button" onclick="onSearchSubmit(event)"
<input id="searchSubmit" type="submit" value="Search"/> title="&contentSearchSubmit.tooltip;"/>
</form>
</div> </div>
</div> </div>
</div> <div class="spacer"/>
<div id="box2"> <div id="launcher">
<div id="footer" style=" display: -moz-box; -moz-box-align: center; -moz-box-pack: center; width: 100%; background-color: hsla(0,0%,0%,.03); border-top: 1px solid hsla(0,0%,0%,.03); box-shadow: 0 2px 5px hsla(0,0%,0%,.1) inset, 0 -1px 0 hsla(0,0%,100%,.25);"> <button class="launchButton" id="downloads">&abouthome.downloadsButton.label;</button>
<p ><a class="titlelink" href="https://trisquel.info">Trisquel GNU/Linux</a>:</p> <button class="launchButton" id="bookmarks">&abouthome.bookmarksButton.label;</button>
<ul style="font-size:0.8em"> <button class="launchButton" id="history">&abouthome.historyButton.label;</button>
<li><a href="https://trisquel.info/forum">Forum</a></li> <button class="launchButton" id="addons">&abouthome.addonsButton.label;</button>
<li><a href="https://trisquel.info/wiki">Wiki</a></li> <button class="launchButton" id="sync">&abouthome.syncButton.label;</button>
<li><a href="http://store.trisquel.info/">Store</a></li> <button class="launchButton" id="settings">&abouthome.preferencesButtonUnix.label;</button>
<li><a href="https://trisquel.info/donate">Donate</a></li> <div id="restorePreviousSessionSeparator"/>
</ul> <button class="launchButton" id="restorePreviousSession">&historyRestoreLastSession.label;</button>
</div> </div>
</div>
</div>
</body> </body>
</html> </html>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 134 38">
<path d="M54.2,21.8c0,3.2-1.6,5.2-4.1,5.2s-3.9-2.2-3.9-5.1,1.5-4.9,3.9-4.9S54.2,18.4,54.2,21.8Zm61.1,3.5a1.7,1.7,0,0,0,2,1.9c1.7,0,3.5-1.2,3.6-4l-2.4-.2C116.8,23,115.3,23.4,115.3,25.3ZM134,0V38H0V0ZM39.2,26.6H37V19a5.4,5.4,0,0,0-5.7-5.8,5.6,5.6,0,0,0-5.4,3.6,5.4,5.4,0,0,0-5.4-3.6,5.5,5.5,0,0,0-5.1,2.8V13.6h-7v3.6h2.2v9.4H8.4v3.6H18.6V26.6H15.4V20.8c0-2.3.9-3.9,3.2-3.9s2.8,1.1,2.8,4v9.4h7V26.6H26.2V20.8c0-2.3.9-3.9,3.2-3.9s2.8,1.1,2.8,4v9.4h7Zm19.9-4.7c0-4.6-2.9-8.7-8.9-8.7s-8.9,4-8.9,8.9,3.5,8.4,8.7,8.4S59.1,27.2,59.1,21.9Zm18.7,2.5L74,24l-.8,2.6H67.9l9.2-10.5-.4-2.5H62.1l-.6,5.8,3.4.4.7-2.6h5.2L61.8,27.7l.5,2.5H76.8Zm8.5-.1h-5v6h5Zm0-10.7h-5v6h5ZM94,30.2l7.2-25.4H96.6L89.4,30.2Zm9.7,0,7.2-25.4h-4.7L99,30.2Zm23.8-.4V27.3h-.7c-.8,0-1.1-.3-1.1-1.3V18.9c0-3.8-3-5.6-6.6-5.6a16,16,0,0,0-7.1,1.5l-.6,3.8,3.8.4.5-1.9a5.2,5.2,0,0,1,2.5-.5c2.7,0,2.7,2,2.7,3.7v.6h-2.7c-3.8,0-7.7,1-7.7,5.1s2.7,4.8,5.1,4.8a6,6,0,0,0,5.3-3.3,3.4,3.4,0,0,0,3.6,3.3A6.4,6.4,0,0,0,127.5,29.8Z"/>
</svg>
helpers/DATA/firefox/branding/content/about-logo.png

33.8 KiB | W: | H:

helpers/DATA/firefox/branding/content/about-logo.png

43.3 KiB | W: | H:

helpers/DATA/firefox/branding/content/about-logo.png
helpers/DATA/firefox/branding/content/about-logo.png
helpers/DATA/firefox/branding/content/about-logo.png
helpers/DATA/firefox/branding/content/about-logo.png
  • 2-up
  • Swipe
  • Onion skin
helpers/DATA/firefox/branding/mozicon128.png

16.4 KiB | W: | H:

helpers/DATA/firefox/branding/mozicon128.png

27.9 KiB | W: | H:

helpers/DATA/firefox/branding/mozicon128.png
helpers/DATA/firefox/branding/mozicon128.png
helpers/DATA/firefox/branding/mozicon128.png
helpers/DATA/firefox/branding/mozicon128.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -123,7 +123,7 @@ pref("browser.newtabpage.directory.source", ""); ...@@ -123,7 +123,7 @@ pref("browser.newtabpage.directory.source", "");
pref("browser.newtabpage.directory.ping", ""); pref("browser.newtabpage.directory.ping", "");
pref("browser.newtabpage.introShown", true); pref("browser.newtabpage.introShown", true);
// Disable home snippets // Disable home snippets
pref("browser.aboutHomeSnippets.updateUrl", "data:text/html"); pref("browser.aboutHomeSnippets.updateUrl", "");
// Services // Services
pref("gecko.handlerService.schemes.mailto.0.name", ""); pref("gecko.handlerService.schemes.mailto.0.name", "");
......
...@@ -176,9 +176,11 @@ cp $DATA/bookmarks.html.in browser/locales/generic/profile/bookmarks.html.in ...@@ -176,9 +176,11 @@ cp $DATA/bookmarks.html.in browser/locales/generic/profile/bookmarks.html.in
cp $DATA/searchplugins/*.xml debian/searchplugins/en-US/ cp $DATA/searchplugins/*.xml debian/searchplugins/en-US/
cp $DATA/searchplugins/searchplugins.conf debian/config/ cp $DATA/searchplugins/searchplugins.conf debian/config/
# install aboutabrowser extension # install extensions
cp $DATA/aboutabrowser@trisquel.info -r debian for extension in $(ls -1 $DATA/extensions/); do
echo "debian/aboutabrowser@trisquel.info @MOZ_ADDONDIR@/extensions/" >> debian/abrowser.install.in cp $DATA/extensions/$extension -r debian
echo "debian/$extension @MOZ_ADDONDIR@/extensions/" >> debian/abrowser.install.in
done
# Disable newtab "What is this" popup and config button # Disable newtab "What is this" popup and config button
cat << EOF >> browser/themes/linux/newtab/newTab.css cat << EOF >> browser/themes/linux/newtab/newTab.css
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment