Abrowser: new about:home page and artwork

This commit is contained in:
Ruben Rodriguez 2017-10-06 16:03:40 -04:00
parent ccd5b3b467
commit 550bed8e8a
16 changed files with 223 additions and 908 deletions

View file

@ -1,24 +0,0 @@
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.

View file

@ -1,9 +0,0 @@
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}

View file

@ -1,364 +0,0 @@
<?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>

View file

@ -1 +0,0 @@
<!ENTITY aboutAbrowser.title "About Abrowser">

View file

@ -1 +0,0 @@
<!ENTITY aboutAbrowser.title "Acerca de Abrowser">

View file

@ -1,72 +0,0 @@
/*
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]);

View file

@ -1,22 +0,0 @@
<?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>

View file

@ -1,8 +1,3 @@
%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 {
font: message-box;
@ -40,8 +35,8 @@ a {
}
#brandLogo {
height: 420px;
width: 150px;
height: 150px;
width: 420px;
margin: 22px auto 31px;
background-image: url("chrome://branding/content/about-logo.png");
background-size: 420px 150px;
@ -49,90 +44,105 @@ a {
background-repeat: no-repeat;
}
#searchForm,
#searchIconAndTextContainer,
#snippets {
width: 470px;
}
#searchForm {
#searchIconAndTextContainer {
display: -moz-box;
height: 36px;
position: relative;
}
#searchLogoContainer {
display: -moz-box;
-moz-box-align: center;
padding-top: 2px;
-moz-padding-end: 8px;
}
#searchLogoContainer[hidden] {
display: none;
}
#searchEngineLogo {
display: inline-block;
height: 28px;
width: 70px;
min-width: 70px;
#searchIcon {
border: 1px transparent;
padding: 0;
margin: 0;
width: 36px;
height: 36px;
background: url("chrome://browser/skin/search-indicator-magnifying-glass.svg") center center no-repeat;
position: absolute;
}
#searchText {
margin-left: 0;
-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;
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);
box-shadow: 0 1px 0 hsla(210,65%,9%,.02) inset,
0 0 2px hsla(210,65%,9%,.1) inset,
0 1px 0 hsla(0,0%,100%,.2);
border-radius: 2.5px 0 0 2.5px;
color: inherit;
unicode-bidi: plaintext;
}
#searchText:-moz-dir(rtl) {
border-radius: 0 2.5px 2.5px 0;
#searchText:dir(rtl) {
border-radius: 0 2px 2px 0;
}
#searchText[aria-expanded="true"] {
border-radius: 2px 0 0 0;
}
#searchText[aria-expanded="true"]:dir(rtl) {
border-radius: 0 2px 0 0;
}
#searchText[keepfocus],
#searchText:focus,
#searchText[autofocus] {
border-color: hsla(206,100%,60%,.6) hsla(206,76%,52%,.6) hsla(204,100%,40%,.6);
}
#searchSubmit {
-moz-margin-start: -1px;
background: linear-gradient(hsla(0,0%,100%,.8), hsla(0,0%,100%,.1)) padding-box;
padding: 0 9px;
margin-inline-start: -1px;
color: transparent;
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-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2);
-moz-border-start: 1px solid transparent;
border-radius: 0 2.5px 2.5px 0;
border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2) transparent;
border-radius: 0 2px 2px 0;
box-shadow: 0 0 2px hsla(0,0%,100%,.5) inset,
0 1px 0 hsla(0,0%,100%,.2);
cursor: pointer;
transition-property: background-color, border-color, box-shadow;
transition-duration: 150ms;
width: 50px;
}
#searchSubmit:-moz-dir(rtl) {
border-radius: 2.5px 0 0 2.5px;
#searchSubmit:dir(rtl) {
transform: scaleX(-1);
}
#searchText:focus + #searchSubmit,
#searchText[keepfocus] + #searchSubmit,
#searchText + #searchSubmit:hover,
#searchText[autofocus] + #searchSubmit {
border-color: #59b5fc #45a3e7 #3294d5;
color: white;
}
#searchText:focus + #searchSubmit,
#searchText[keepfocus] + #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,
0 0 0 1px hsla(0,0%,100%,.1) inset,
0 1px 0 hsla(210,54%,20%,.03);
}
#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,
0 0 0 1px hsla(0,0%,100%,.1) inset,
0 1px 0 hsla(210,54%,20%,.03),
@ -150,19 +160,19 @@ a {
#rightsSnippet {
display: block;
min-height: 38px;
background: 30px center no-repeat;
background: 0 center no-repeat;
padding: 6px 0;
-moz-padding-start: 79px;
padding-inline-start: 49px;
}
#rightsSnippet[hidden] {
display: none;
}
#defaultSnippet1:-moz-dir(rtl),
#defaultSnippet2:-moz-dir(rtl),
#rightsSnippet:-moz-dir(rtl) {
background-position: right 30px center;
#defaultSnippet1:dir(rtl),
#defaultSnippet2:dir(rtl),
#rightsSnippet:dir(rtl) {
background-position: right 0 center;
}
#defaultSnippet1 {
@ -217,7 +227,7 @@ body[narrow] #launcher[session] {
white-space: normal;
background: transparent padding-box;
border: 1px solid transparent;
border-radius: 2.5px;
border-radius: 2px;
color: #525c66;
font-size: 75%;
cursor: pointer;
@ -299,10 +309,6 @@ body[narrow] #restorePreviousSession {
content: url("chrome://browser/content/abouthome/history.png");
}
#apps::before {
content: url("chrome://browser/content/abouthome/apps.png");
}
#addons::before {
content: url("chrome://browser/content/abouthome/addons.png");
}
@ -322,10 +328,10 @@ body[narrow] #restorePreviousSession {
display: inline-block; /* display on same line as text label */
vertical-align: middle;
margin-bottom: 0;
-moz-margin-end: 8px;
margin-inline-end: 8px;
}
#restorePreviousSession:-moz-dir(rtl)::before {
#restorePreviousSession:dir(rtl)::before {
transform: scaleX(-1);
}
@ -339,21 +345,21 @@ body[narrow] #restorePreviousSession::before {
display: block;
position: relative; /* pin wordmark to edge of document, not of viewport */
-moz-box-ordinal-group: 0;
opacity: .5;
opacity: .2;
transition: opacity 150ms;
}
#aboutMozilla:hover {
opacity: 1;
opacity: .6;
}
#aboutMozilla::before {
content: url("chrome://browser/content/abouthome/mozilla.png");
content: url("chrome://browser/content/abouthome/mozilla.svg");
display: block;
position: absolute;
top: 12px;
right: 12px;
width: 69px;
offset-inline-end: 12px;
width: 67px;
height: 19px;
}
@ -362,9 +368,6 @@ body[narrow] #restorePreviousSession::before {
* rather than upscaling the original-size ones (bug 818940).
*/
@media not all and (max-resolution: 1dppx) {
#brandLogo {
background-image: url("chrome://branding/content/about-logo@2x.png");
}
#defaultSnippet1,
#defaultSnippet2,
@ -380,12 +383,15 @@ body[narrow] #restorePreviousSession::before {
background-image: url("chrome://browser/content/abouthome/snippet2@2x.png");
}
.launchButton::before,
#aboutMozilla::before {
.launchButton::before {
transform: scale(.5);
transform-origin: 0 0;
}
.launchButton:dir(rtl)::before {
transform: scale(.5) translateX(32px);
}
#downloads::before {
content: url("chrome://browser/content/abouthome/downloads@2x.png");
}
@ -398,10 +404,6 @@ body[narrow] #restorePreviousSession::before {
content: url("chrome://browser/content/abouthome/history@2x.png");
}
#apps::before {
content: url("chrome://browser/content/abouthome/apps@2x.png");
}
#addons::before {
content: url("chrome://browser/content/abouthome/addons@2x.png");
}
@ -422,8 +424,8 @@ body[narrow] #restorePreviousSession::before {
content: url("chrome://browser/content/abouthome/restore@2x.png");
}
#aboutMozilla::before {
content: url("chrome://browser/content/abouthome/mozilla@2x.png");
#restorePreviousSession:dir(rtl)::before {
transform: scale(-0.5, 0.5) translateX(24px);
transform-origin: top center;
}
}

View file

@ -2,158 +2,37 @@
* 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/. */
const SEARCH_ENGINES = {
"Google": {
// This is the "2x" image designed for OS X retina resolution, Windows at 192dpi, etc.;
// it will be scaled down as necessary on lower-dpi displays.
image: "data:image/png;base64," +
"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"
}
};
"use strict";
/* import-globals-from ../contentSearchUI.js */
// The process of adding a new default snippet involves:
// * add a new entity to aboutHome.dtd
// * add a <span/> for it in aboutHome.xhtml
// * add an entry here in the proper ordering (based on spans)
// 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.
const DATABASE_NAME = "abouthome";
const DATABASE_VERSION = 1;
const DATABASE_STORAGE = "persistent";
const SNIPPETS_OBJECTSTORE_NAME = "snippets";
var searchText;
// This global tracks if the page has been set up before, to prevent double inits
let gInitialized = false;
let gObserver = new MutationObserver(function (mutations) {
var gInitialized = false;
var gObserver = new MutationObserver(function(mutations) {
for (let mutation of mutations) {
if (mutation.attributeName == "searchEngineName") {
setupSearchEngine();
// The addition of the restore session button changes our width:
if (mutation.attributeName == "session") {
fitToWidth();
}
if (mutation.attributeName == "snippetsVersion") {
if (!gInitialized) {
// ensureSnippetsMapThen(loadSnippets);
ensureSnippetsMapThen(loadSnippets);
gInitialized = true;
}
return;
@ -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
// later and may use asynchronous getters.
window.gObserver.observe(document.documentElement, { attributes: true });
window.gObserver.observe(document.getElementById("launcher"), { attributes: true });
fitToWidth();
setupSearch();
window.addEventListener("resize", fitToWidth);
// Ask chrome to update snippets.
var event = new CustomEvent("AboutHomeLoad", {bubbles:true});
var event = new CustomEvent("AboutHomeLoad", {bubbles: true});
document.dispatchEvent(event);
});
@ -178,11 +59,39 @@ window.addEventListener("pagehide", function() {
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
// the snippets data. It is lazily initialized by ensureSnippetsMapThen(), so
// be sure its callback returned before trying to use it.
let gSnippetsMap;
let gSnippetsMapCallbacks = [];
var gSnippetsMap;
var gSnippetsMapCallbacks = [];
/**
* Ensure the snippets map is properly initialized.
@ -192,9 +101,7 @@ let gSnippetsMapCallbacks = [];
* @note Snippets should never directly manage the underlying storage, since
* it may change inadvertently.
*/
function ensureSnippetsMapThen(aCallback)
{
return;
function ensureSnippetsMapThen(aCallback) {
if (gSnippetsMap) {
aCallback(gSnippetsMap);
return;
@ -207,7 +114,7 @@ return;
return;
}
let invokeCallbacks = function () {
let invokeCallbacks = function() {
if (!gSnippetsMap) {
gSnippetsMap = Object.freeze(new Map());
}
@ -218,43 +125,52 @@ return;
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
// next time.
indexedDB.deleteDatabase(DATABASE_NAME);
invokeCallbacks();
};
openRequest.onupgradeneeded = function (event) {
openRequest.onupgradeneeded = function(event) {
let db = event.target.result;
if (!db.objectStoreNames.contains(SNIPPETS_OBJECTSTORE_NAME)) {
db.createObjectStore(SNIPPETS_OBJECTSTORE_NAME);
}
}
openRequest.onsuccess = function (event) {
openRequest.onsuccess = function(event) {
let db = event.target.result;
db.onerror = function (event) {
db.onerror = function() {
invokeCallbacks();
}
db.onversionchange = function (event) {
event.target.close();
db.onversionchange = function(versionChangeEvent) {
versionChangeEvent.target.close();
invokeCallbacks();
}
let cache = new Map();
let cursorRequest = db.transaction(SNIPPETS_OBJECTSTORE_NAME)
.objectStore(SNIPPETS_OBJECTSTORE_NAME).openCursor();
cursorRequest.onerror = function (event) {
let cursorRequest;
try {
cursorRequest = db.transaction(SNIPPETS_OBJECTSTORE_NAME)
.objectStore(SNIPPETS_OBJECTSTORE_NAME).openCursor();
} catch (ex) {
console.error(ex);
invokeCallbacks();
return;
}
cursorRequest.onerror = function() {
invokeCallbacks();
}
cursorRequest.onsuccess = function(event) {
let cursor = event.target.result;
cursorRequest.onsuccess = function(cursorRequestEvent) {
let cursor = cursorRequestEvent.target.result;
// Populate the cache from the persistent storage.
if (cursor) {
@ -265,24 +181,24 @@ return;
// The cache has been filled up, create the snippets map.
gSnippetsMap = Object.freeze({
get: function (aKey) cache.get(aKey),
set: function (aKey, aValue) {
get: (aKey) => cache.get(aKey),
set(aKey, aValue) {
db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
.objectStore(SNIPPETS_OBJECTSTORE_NAME).put(aValue, aKey);
return cache.set(aKey, aValue);
},
has: function (aKey) cache.has(aKey),
delete: function (aKey) {
has: (aKey) => cache.has(aKey),
delete(aKey) {
db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
.objectStore(SNIPPETS_OBJECTSTORE_NAME).delete(aKey);
return cache.delete(aKey);
},
clear: function () {
clear() {
db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
.objectStore(SNIPPETS_OBJECTSTORE_NAME).clear();
return cache.clear();
},
get size() cache.size
get size() { return cache.size; },
});
setTimeout(invokeCallbacks, 0);
@ -290,61 +206,39 @@ return;
}
}
function onSearchSubmit(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 onSearchSubmit(aEvent) {
gContentSearchController.search(aEvent);
}
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
// immediately when the element is first drawn, so the
// attribute is also used for styling when the page first loads.
let searchText = document.getElementById("searchText");
searchText.addEventListener("blur", function searchText_onBlur() {
searchText.removeEventListener("blur", searchText_onBlur);
searchText = document.getElementById("searchText");
searchText.addEventListener("blur", function() {
searchText.removeAttribute("autofocus");
});
let searchEngineName = document.documentElement.getAttribute("searchEngineName");
let searchEngineInfo = SEARCH_ENGINES[searchEngineName];
let logoElt = document.getElementById("searchEngineLogo");
}, {once: true});
// Add search engine logo.
if (searchEngineInfo && searchEngineInfo.image) {
logoElt.parentNode.hidden = false;
logoElt.src = searchEngineInfo.image;
logoElt.alt = searchEngineName;
searchText.placeholder = "";
if (!gContentSearchController) {
gContentSearchController =
new ContentSearchUIController(searchText, searchText.parentNode,
"abouthome", "homepage");
}
else {
logoElt.parentNode.hidden = true;
searchText.placeholder = searchEngineName;
}
}
/**
* Inform the test harness that we're done loading the page.
*/
function loadSucceeded()
{
var event = new CustomEvent("AboutHomeLoadSnippetsSucceeded", {bubbles:true});
function loadCompleted() {
var event = new CustomEvent("AboutHomeLoadSnippetsCompleted", {bubbles: true});
document.dispatchEvent(event);
}
@ -352,14 +246,13 @@ function loadSucceeded()
* Update the local snippets from the remote storage, then show them through
* showSnippets.
*/
function loadSnippets()
{
return;
function loadSnippets() {
return();
if (!gSnippetsMap)
throw new Error("Snippets map has not properly been initialized");
// 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);
// Check cached snippets version.
@ -378,32 +271,28 @@ return;
if (updateURL && shouldUpdate) {
// Try to update from network.
let xhr = new XMLHttpRequest();
try {
xhr.open("GET", updateURL, true);
} catch (ex) {
showSnippets();
loadSucceeded();
return;
}
xhr.timeout = 5000;
// 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.
gSnippetsMap.set("snippets-last-update", Date.now());
xhr.onerror = function (event) {
showSnippets();
};
xhr.onload = function (event)
{
xhr.onloadend = function() {
if (xhr.status == 200) {
gSnippetsMap.set("snippets", xhr.responseText);
gSnippetsMap.set("snippets-cached-version", currentVersion);
}
showSnippets();
loadSucceeded();
loadCompleted();
};
xhr.send(null);
try {
xhr.open("GET", updateURL, true);
xhr.send(null);
} catch (ex) {
showSnippets();
loadCompleted();
}
} else {
showSnippets();
loadSucceeded();
loadCompleted();
}
}
@ -413,10 +302,8 @@ return;
* @note: snippets should never invoke showSnippets(), or they may cause
* a "too much recursion" exception.
*/
let _snippetsShown = false;
function showSnippets()
{
return;
var _snippetsShown = false;
function showSnippets() {
let snippetsElt = document.getElementById("snippets");
// Show about:rights notification, if needed.
@ -445,12 +332,13 @@ return;
if (snippets) {
// Injecting snippets can throw if they're invalid XML.
try {
// eslint-disable-next-line no-unsanitized/property
snippetsElt.innerHTML = snippets;
// Scripts injected by innerHTML are inactive, so we have to relocate them
// through DOM manipulation to activate their contents.
Array.forEach(snippetsElt.getElementsByTagName("script"), function(elt) {
let relocatedScript = document.createElement("script");
relocatedScript.type = "text/javascript;version=1.8";
relocatedScript.type = "text/javascript";
relocatedScript.text = elt.text;
elt.parentNode.replaceChild(relocatedScript, elt);
});
@ -466,9 +354,7 @@ return;
/**
* Clear snippets element contents and show default snippets.
*/
function showDefaultSnippets()
{
return;
function showDefaultSnippets() {
// Clear eventual contents...
let snippetsElt = document.getElementById("snippets");
snippetsElt.innerHTML = "";
@ -493,7 +379,7 @@ return;
}
function fitToWidth() {
if (window.scrollMaxX) {
if (document.documentElement.scrollWidth > window.innerWidth) {
document.body.setAttribute("narrow", "true");
} else if (document.body.hasAttribute("narrow")) {
document.body.removeAttribute("narrow");

View file

@ -24,126 +24,41 @@
<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/contentSearchUI.css"/>
<link rel="stylesheet" type="text/css" media="all" defer="defer"
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;
}
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>
<script type="text/javascript"
src="chrome://browser/content/abouthome/aboutHome.js"/>
<script type="text/javascript"
src="chrome://browser/content/contentSearchUI.js"/>
</head>
<body dir="&locale.dir;">
<div id="box">
<div id="box1">
<div class="spacer"/>
<div id="topSection">
<img src="chrome://branding/content/about-logo.png"/>
<div id="brandLogo"></div>
<div id="searchContainer">
<form name="searchForm" id="searchForm" action="https://duckduckgo.com/">
<input type="hidden" name="t" value="trisquel"/>
<input type="text" name="q" value="" id="searchText" maxlength="256"
autofocus="autofocus"/>
<input id="searchSubmit" type="submit" value="Search"/>
</form>
<div id="searchIconAndTextContainer">
<div id="searchIcon"/>
<input type="text" name="q" value="" id="searchText" maxlength="256"
aria-label="&contentSearchInput.label;" autofocus="autofocus"/>
<input id="searchSubmit" type="button" onclick="onSearchSubmit(event)"
title="&contentSearchSubmit.tooltip;"/>
</div>
</div>
</div>
<div class="spacer"/>
<div id="box2">
<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);">
<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>
<div id="launcher">
<button class="launchButton" id="downloads">&abouthome.downloadsButton.label;</button>
<button class="launchButton" id="bookmarks">&abouthome.bookmarksButton.label;</button>
<button class="launchButton" id="history">&abouthome.historyButton.label;</button>
<button class="launchButton" id="addons">&abouthome.addonsButton.label;</button>
<button class="launchButton" id="sync">&abouthome.syncButton.label;</button>
<button class="launchButton" id="settings">&abouthome.preferencesButtonUnix.label;</button>
<div id="restorePreviousSessionSeparator"/>
<button class="launchButton" id="restorePreviousSession">&historyRestoreLastSession.label;</button>
</div>
</body>
</html>

View file

@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Before After
Before After

View file

@ -123,7 +123,7 @@ pref("browser.newtabpage.directory.source", "");
pref("browser.newtabpage.directory.ping", "");
pref("browser.newtabpage.introShown", true);
// Disable home snippets
pref("browser.aboutHomeSnippets.updateUrl", "data:text/html");
pref("browser.aboutHomeSnippets.updateUrl", "");
// Services
pref("gecko.handlerService.schemes.mailto.0.name", "");

View file

@ -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/searchplugins.conf debian/config/
# install aboutabrowser extension
cp $DATA/aboutabrowser@trisquel.info -r debian
echo "debian/aboutabrowser@trisquel.info @MOZ_ADDONDIR@/extensions/" >> debian/abrowser.install.in
# install extensions
for extension in $(ls -1 $DATA/extensions/); do
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
cat << EOF >> browser/themes/linux/newtab/newTab.css