summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--!NetSurf/Resources/de/welcome.html,faf65
-rw-r--r--!NetSurf/Resources/en/licence.html,faf6
-rw-r--r--!NetSurf/Resources/en/welcome.html,faf64
-rw-r--r--!NetSurf/Resources/it/licence.html,faf6
-rw-r--r--!NetSurf/Resources/it/welcome.html,faf64
-rw-r--r--!NetSurf/Resources/ja/welcome.html,faf65
-rw-r--r--.gitignore12
-rw-r--r--Docs/BUILDING-Cocoa2
-rw-r--r--Docs/BUILDING-Framebuffer2
-rw-r--r--Docs/BUILDING-GTK2
-rw-r--r--Docs/BUILDING-Monkey2
-rw-r--r--Docs/BUILDING-RISC_OS7
-rw-r--r--Docs/BUILDING-Windows2
-rw-r--r--Docs/LIBRARIES2
-rw-r--r--Docs/PACKAGING-GTK4
-rw-r--r--Makefile21
-rw-r--r--Makefile.defaults2
-rw-r--r--Makefile.sources9
-rw-r--r--content/fetchers/about.c22
-rw-r--r--content/fetchers/resource.c1
-rw-r--r--css/css.c212
-rw-r--r--css/internal.h62
-rw-r--r--css/select.c434
-rw-r--r--desktop/netsurf.c9
-rw-r--r--desktop/save_complete.c22
-rw-r--r--desktop/tree_url_node.c13
-rw-r--r--framebuffer/nsfont_bold.c2
-rw-r--r--framebuffer/nsfont_italic.c2
-rw-r--r--framebuffer/nsfont_italic_bold.c2
-rw-r--r--framebuffer/nsfont_regular.c2
l---------framebuffer/res/welcome.html1
l---------gtk/res/en/welcome.html1
-rw-r--r--render/box_construct.c36
-rw-r--r--render/html.c70
-rw-r--r--render/html_forms.c79
-rw-r--r--render/html_script.c19
-rw-r--r--render/imagemap.c40
-rw-r--r--riscos/gui.c31
-rw-r--r--riscos/gui.h1
-rw-r--r--riscos/iconbar.c13
-rw-r--r--riscos/window.c23
-rw-r--r--utils/corestrings.c356
-rw-r--r--utils/corestrings.h120
-rw-r--r--utils/git-testament.pl2
44 files changed, 1266 insertions, 646 deletions
diff --git a/!NetSurf/Resources/de/welcome.html,faf b/!NetSurf/Resources/de/welcome.html,faf
new file mode 100644
index 000000000..fbbed0399
--- /dev/null
+++ b/!NetSurf/Resources/de/welcome.html,faf
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>Welcome to NetSurf</title>
+<style type="text/css">html,body{margin:0;padding:0;}body{color:#000;background:#fff;font-family:sans-serif;margin:0 auto;}a:link{text-decoration:underline;color:#00f;}a:visited{text-decoration:underline;color:#60a;}a:hover{text-decoration:none;}a:active{text-decoration:underline;color:#f00;}.banner{margin:0;padding:0;background:#94adff;text-align:left;}.banner img{border:none;color:#000;height:86px;width:308px;display:block;}.onlycontent{margin:0 1em;}.nslinks{display:table;width:100%;margin:0;border-spacing:0;padding:0;background:#ccd8ff;font-size:94%;}.nslinks li{display:table-cell;text-align:center;padding:0.2em 0.3em 0.3em;vertical-align:middle;}.nslinks li+li{border-left:2px solid #b1c3ff;}.version{padding:0;margin:1.2em auto 0;width:90%;color:#444;font-size:160%;}.intro{width: 90%;margin:1em auto;color:#666;}.websearch{margin:1.5em auto;padding:1.2em 0.3em;background:#d8e2ff;border:2px solid #c5d3ff;width:80%;text-align:center;}input[type=text]{border:2px solid #b6c7ff;background:#f9faff;color:#000;margin:2px;}input[type=submit]{border:2px outset #cedaff;color:#000;background:#cedaff;margin:2px;}.links{display:table;width:80%;margin:0 auto 3em;font-size:94%;}.links ul{display:table-cell;padding-left:2.5em;}.links ul+ul{padding-left:1em;}.footer{font-style:italic;color:#666;text-align:right;}.footer p{margin-top:1.5em;padding-top:0.4em;border-top:2px solid #94adff;}</style>
+</head>
+
+<body>
+<h1 class="banner"><a href="http://www.netsurf-browser.org/"><img src="about:logo" alt="NetSurf"></a></h1>
+
+<ul class="nslinks">
+<li><a href="http://www.netsurf-browser.org/">NetSurf Website</a></li>
+<li><a href="/documentation/">Dokumentation</a></li>
+<li><a href="/downloads/">Download neustes NetSurf</a></li>
+<li><a href="/contact/">Kontakt zu den Entwicklern</a></li>
+</ul>
+
+<div class="onlycontent">
+<h2 class="version">Willkommen zu NetSurf</h2>
+
+<p class="intro">NetSurf ist ein kleiner, schneller Opensource Webbrowser. Wir sind st&auml;ndig daran interessiert, unseren Browser zu verbessern. Bitte kontaktieren Sie uns, wenn Sie irgend welche Probleme bemerken.<br>
+Danke, dass Sie sich f&uuml;r NetSurf entschieden haben!</p>
+
+<form method="get" action="http://www.google.de/search">
+<div class="websearch">
+<input type="text" name="q" size="42" maxlength="255">
+<input type="submit" value="Google-Suche" name="btnG">
+</div>
+</form>
+
+<div class="links">
+<ul>
+<li><a href="http://news.bbc.co.uk/">BBC News</a></li>
+<li><a href="http://www.reuters.com/news">Reuters</a></li>
+<li><a href="http://www.cnn.com/">CNN</a></li>
+</ul>
+
+<ul>
+<li><a href="http://slashdot.org/">Slashdot</a></li>
+<li><a href="http://arstechnica.com/">Ars Technica</a></li>
+<li><a href="http://www.theregister.co.uk/">The Register</a></li>
+<li><a href="http://www.w3.org/">W3C</a></li>
+</ul>
+
+<ul>
+<li><a href="http://de.wikipedia.org/">Wikipedia</a></li>
+<li><a href="http://www.google.de/">Google</a></li>
+<li><a href="http://de.yahoo.com/">Yahoo!</a></li>
+<li><a href="http://www.imdb.com/">IMDB</a></li>
+</ul>
+
+<ul>
+<li><a href="http://www.iconbar.com/">The Icon Bar</a></li>
+<li><a href="http://www.riscosopen.org/">ROOL</a></li>
+<li><a href="http://www.riscos.info/">riscos.info</a></li>
+</ul>
+</div>
+
+<div class="footer">
+<p>NetSurf ist lizensiert unter der GNU Public Licence Version 2</p>
+</div>
+</div>
+
+</body>
+</html>
diff --git a/!NetSurf/Resources/en/licence.html,faf b/!NetSurf/Resources/en/licence.html,faf
index f841f5b63..2f78da4ec 100644
--- a/!NetSurf/Resources/en/licence.html,faf
+++ b/!NetSurf/Resources/en/licence.html,faf
@@ -106,19 +106,19 @@ version.</p>
<span><a href="#mit">MIT</a></span>
</dd>
-<dt><a href="http://source.netsurf-browser.org/trunk/libnsbmp/">Libnsbmp</a></dt>
+<dt><a href="http://www.netsurf-browser.org/projects/libnsbmp/">Libnsbmp</a></dt>
<dd>
<span>&copy; 2006 Richard Wilson<br>&copy; 2008 Sean Fox</span>
<span><a href="#mit">MIT</a></span>
</dd>
-<dt><a href="http://source.netsurf-browser.org/trunk/libnsfb/">Libnsfb</a></dt>
+<dt><a href="http://www.netsurf-browser.org/projects/libnsfb/">Libnsfb</a></dt>
<dd>
<span>&copy; 2009&ndash;2011 Vincent Sanders<br>&copy; 2009&ndash;2011 Michael Drake</span>
<span><a href="#mit">MIT</a></span>
</dd>
-<dt><a href="http://source.netsurf-browser.org/trunk/libnsgif/">Libnsgif</a></dt>
+<dt><a href="http://www.netsurf-browser.org/projects/libnsgif/">Libnsgif</a></dt>
<dd>
<span>&copy; 2004 Richard Wilson</br>&copy; 2008 Sean Fox</span>
<span><a href="#mit">MIT</a></span>
diff --git a/!NetSurf/Resources/en/welcome.html,faf b/!NetSurf/Resources/en/welcome.html,faf
new file mode 100644
index 000000000..14884f074
--- /dev/null
+++ b/!NetSurf/Resources/en/welcome.html,faf
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>Welcome to NetSurf</title>
+<style type="text/css">html,body{margin:0;padding:0;}body{color:#000;background:#fff;font-family:sans-serif;margin:0 auto;}a:link{text-decoration:underline;color:#00f;}a:visited{text-decoration:underline;color:#60a;}a:hover{text-decoration:none;}a:active{text-decoration:underline;color:#f00;}.banner{margin:0;padding:0;background:#94adff;text-align:left;}.banner img{border:none;color:#000;height:86px;width:308px;display:block;}.onlycontent{margin:0 1em;}.nslinks{display:table;width:100%;margin:0;border-spacing:0;padding:0;background:#ccd8ff;font-size:94%;}.nslinks li{display:table-cell;text-align:center;padding:0.2em 0.3em 0.3em;vertical-align:middle;}.nslinks li+li{border-left:2px solid #b1c3ff;}.version{padding:0;margin:1.2em auto 0;width:90%;color:#444;font-size:160%;}.intro{width: 90%;margin:1em auto;color:#666;}.websearch{margin:1.5em auto;padding:1.2em 0.3em;background:#d8e2ff;border:2px solid #c5d3ff;width:80%;text-align:center;}input[type=text]{border:2px solid #b6c7ff;background:#f9faff;color:#000;margin:2px;}input[type=submit]{border:2px outset #cedaff;color:#000;background:#cedaff;margin:2px;}.links{display:table;width:80%;margin:0 auto 3em;font-size:94%;}.links ul{display:table-cell;padding-left:2.5em;}.links ul+ul{padding-left:1em;}.footer{font-style:italic;color:#666;text-align:right;}.footer p{margin-top:1.5em;padding-top:0.4em;border-top:2px solid #94adff;}</style>
+</head>
+
+<body>
+<h1 class="banner"><a href="http://www.netsurf-browser.org/"><img src="about:logo" alt="NetSurf"></a></h1>
+
+<ul class="nslinks">
+<li><a href="http://www.netsurf-browser.org/">NetSurf web&nbsp;site</a></li>
+<li><a href="http://www.netsurf-browser.org/documentation/">Documentation</a></li>
+<li><a href="http://www.netsurf-browser.org/downloads/">Download latest NetSurf</a></li>
+<li><a href="http://www.netsurf-browser.org/contact/">Contact the developers</a></li>
+</ul>
+
+<div class="onlycontent">
+<h2 class="version">Welcome to NetSurf</h2>
+
+<p class="intro">NetSurf is a small, fast open source web browser. We are always keen to improve our browser, so get in touch if you run into any problems. Thanks for choosing NetSurf!</p>
+
+<form method="get" action="http://www.google.co.uk/search">
+<div class="websearch">
+<input type="text" name="q" size="42" maxlength="255">
+<input type="submit" value="Google Search" name="btnG">
+</div>
+</form>
+
+<div class="links">
+<ul>
+<li><a href="http://news.bbc.co.uk/">BBC News</a></li>
+<li><a href="http://www.reuters.com/news">Reuters</a></li>
+<li><a href="http://www.cnn.com/">CNN</a></li>
+</ul>
+
+<ul>
+<li><a href="http://slashdot.org/">Slashdot</a></li>
+<li><a href="http://arstechnica.com/">Ars Technica</a></li>
+<li><a href="http://www.theregister.co.uk/">The Register</a></li>
+<li><a href="http://www.w3.org/">W3C</a></li>
+</ul>
+
+<ul>
+<li><a href="http://en.wikipedia.org/wiki/Main_Page">Wikipedia</a></li>
+<li><a href="http://google.co.uk/">Google</a></li>
+<li><a href="http://yahoo.co.uk/">Yahoo!</a></li>
+<li><a href="http://www.imdb.com/">IMDB</a></li>
+</ul>
+
+<ul>
+<li><a href="http://www.iconbar.com/">The Icon Bar</a></li>
+<li><a href="http://www.riscosopen.org/">ROOL</a></li>
+<li><a href="http://www.riscos.info/">riscos.info</a></li>
+</ul>
+</div>
+
+<div class="footer">
+<p>NetSurf is licensed under the GNU Public Licence version 2</p>
+</div>
+</div>
+
+</body>
+</html> \ No newline at end of file
diff --git a/!NetSurf/Resources/it/licence.html,faf b/!NetSurf/Resources/it/licence.html,faf
index c54c589a1..06ab13925 100644
--- a/!NetSurf/Resources/it/licence.html,faf
+++ b/!NetSurf/Resources/it/licence.html,faf
@@ -98,19 +98,19 @@ dl.components > dd > span + span {
<span><a href="#mit">MIT</a></span>
</dd>
-<dt><a href="http://source.netsurf-browser.org/trunk/libnsbmp/">Libnsbmp</a></dt>
+<dt><a href="http://www.netsurf-browser.org/projects/libnsbmp/">Libnsbmp</a></dt>
<dd>
<span>&copy; 2006 Richard Wilson<br>&copy; 2008 Sean Fox</span>
<span><a href="#mit">MIT</a></span>
</dd>
-<dt><a href="http://source.netsurf-browser.org/trunk/libnsfb/">Libnsfb</a></dt>
+<dt><a href="http://www.netsurf-browser.org/projects/libnsfb/">Libnsfb</a></dt>
<dd>
<span>&copy; 2009&ndash;2012 Vincent Sanders<br>&copy; 2009&ndash;2012 Michael Drake</span>
<span><a href="#mit">MIT</a></span>
</dd>
-<dt><a href="http://source.netsurf-browser.org/trunk/libnsgif/">Libnsgif</a></dt>
+<dt><a href="http://www.netsurf-browser.org/projects/libnsgif/">Libnsgif</a></dt>
<dd>
<span>&copy; 2004 Richard Wilson<br>&copy; 2008 Sean Fox</span>
<span><a href="#mit">MIT</a></span>
diff --git a/!NetSurf/Resources/it/welcome.html,faf b/!NetSurf/Resources/it/welcome.html,faf
new file mode 100644
index 000000000..2d44436de
--- /dev/null
+++ b/!NetSurf/Resources/it/welcome.html,faf
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>Benvenuti su NetSurf</title>
+<style type="text/css">html,body{margin:0;padding:0;}body{color:#000;background:#fff;font-family:sans-serif;margin:0 auto;}a:link{text-decoration:underline;color:#00f;}a:visited{text-decoration:underline;color:#60a;}a:hover{text-decoration:none;}a:active{text-decoration:underline;color:#f00;}.banner{margin:0;padding:0;background:#94adff;text-align:left;}.banner img{border:none;color:#000;height:86px;width:308px;display:block;}.onlycontent{margin:0 1em;}.nslinks{display:table;width:100%;margin:0;border-spacing:0;padding:0;background:#ccd8ff;font-size:94%;}.nslinks li{display:table-cell;text-align:center;padding:0.2em 0.3em 0.3em;vertical-align:middle;}.nslinks li+li{border-left:2px solid #b1c3ff;}.version{padding:0;margin:1.2em auto 0;width:90%;color:#444;font-size:160%;}.intro{width: 90%;margin:1em auto;color:#666;}.websearch{margin:1.5em auto;padding:1.2em 0.3em;background:#d8e2ff;border:2px solid #c5d3ff;width:80%;text-align:center;}input[type=text]{border:2px solid #b6c7ff;background:#f9faff;color:#000;margin:2px;}input[type=submit]{border:2px outset #cedaff;color:#000;background:#cedaff;margin:2px;}.links{display:table;width:80%;margin:0 auto 3em;font-size:94%;}.links ul{display:table-cell;padding-left:2.5em;}.links ul+ul{padding-left:1em;}.footer{font-style:italic;color:#666;text-align:right;}.footer p{margin-top:1.5em;padding-top:0.4em;border-top:2px solid #94adff;}</style>
+</head>
+
+<body>
+<h1 class="banner"><a href="http://www.netsurf-browser.org/"><img src="about:logo" alt="NetSurf"></a></h1>
+
+<ul class="nslinks">
+<li><a href="http://www.netsurf-browser.org/">Pagina principale</a></li>
+<li><a href="/documentation/">Documentazione</a></li>
+<li><a href="/downloads/">Scarica NetSurf</a></li>
+<li><a href="/contact/">Contatta gli sviluppatori</a></li>
+</ul>
+
+<div class="onlycontent">
+<h2 class="version">Benvenuti su NetSurf</h2>
+
+<p class="intro">NetSurf la nostra idea di browser, per questo abbiamo scelto di renderlo piccolo e veloce e stiamo lavorando per renderlo sempre migliore, se hai qualche suggerimento o semplicemente hai bisogno di aiuto contattaci! Grazie per aver scelto NetSurf!</p>
+
+<form method="get" action="http://www.google.it/search">
+<div class="websearch">
+<input type="text" name="q" size="42" maxlength="255">
+<input type="submit" value="Ricerca Google" name="btnG">
+</div>
+</form>
+
+<div class="links">
+<ul>
+<li><a href="http://news.bbc.co.uk/">BBC News</a></li>
+<li><a href="http://www.reuters.com/news">Reuters</a></li>
+<li><a href="http://www.cnn.com/">CNN</a></li>
+</ul>
+
+<ul>
+<li><a href="http://slashdot.org/">Slashdot</a></li>
+<li><a href="http://arstechnica.com/">Ars Technica</a></li>
+<li><a href="http://www.theregister.co.uk/">The Register</a></li>
+<li><a href="http://www.w3.org/">W3C</a></li>
+</ul>
+
+<ul>
+<li><a href="http://en.wikipedia.org/wiki/Main_Page">Wikipedia</a></li>
+<li><a href="http://google.it/">Google</a></li>
+<li><a href="http://yahoo.co.uk/">Yahoo!</a></li>
+<li><a href="http://www.imdb.com/">IMDB</a></li>
+</ul>
+
+<ul>
+<li><a href="http://www.iconbar.com/">The Icon Bar</a></li>
+<li><a href="http://www.riscosopen.org/">ROOL</a></li>
+<li><a href="http://www.riscos.info/">riscos.info</a></li>
+</ul>
+</div>
+
+<div class="footer">
+<p>NetSurf rilasciato liberamente secondo i termini della Licenza Pubblica Generica GNU 2.0</p>
+</div>
+</div>
+
+</body>
+</html> \ No newline at end of file
diff --git a/!NetSurf/Resources/ja/welcome.html,faf b/!NetSurf/Resources/ja/welcome.html,faf
new file mode 100644
index 000000000..152847443
--- /dev/null
+++ b/!NetSurf/Resources/ja/welcome.html,faf
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=utf-8">
+<title>NetSurfへようこそ</title>
+<style type="text/css">html,body{margin:0;padding:0;}body{color:#000;background:#fff;font-family:sans-serif;margin:0 auto;}a:link{text-decoration:underline;color:#00f;}a:visited{text-decoration:underline;color:#60a;}a:hover{text-decoration:none;}a:active{text-decoration:underline;color:#f00;}.banner{margin:0;padding:0;background:#94adff;text-align:left;}.banner img{border:none;color:#000;height:86px;width:308px;display:block;}.onlycontent{margin:0 1em;}.nslinks{display:table;width:100%;margin:0;border-spacing:0;padding:0;background:#ccd8ff;font-size:94%;}.nslinks li{display:table-cell;text-align:center;padding:0.2em 0.3em 0.3em;vertical-align:middle;}.nslinks li+li{border-left:2px solid #b1c3ff;}.version{padding:0;margin:1.2em auto 0;width:90%;color:#444;font-size:160%;}.intro{width: 90%;margin:1em auto;color:#666;}.websearch{margin:1.5em auto;padding:1.2em 0.3em;background:#d8e2ff;border:2px solid #c5d3ff;width:80%;text-align:center;}input[type=text]{border:2px solid #b6c7ff;background:#f9faff;color:#000;margin:2px;}input[type=submit]{border:2px outset #cedaff;color:#000;background:#cedaff;margin:2px;}.links{display:table;width:80%;margin:0 auto 3em;font-size:94%;}.links ul{display:table-cell;padding-left:2.5em;}.links ul+ul{padding-left:1em;}.footer{font-style:italic;color:#666;text-align:right;}.footer p{margin-top:1.5em;padding-top:0.4em;border-top:2px solid #94adff;}</style>
+</head>
+
+<body>
+<h1 class="banner"><a href="http://www.netsurf-browser.org/"><img src="about:logo" alt="NetSurf"></a></h1>
+
+<ul class="nslinks">
+<li><a href="http://www.netsurf-browser.org/">NetSurfウェブサイト</a></li>
+<li><a href="/documentation/">ドキュメンテーション</a></li>
+<li><a href="/downloads/">最新のNetSurfをダウンロード</a></li>
+<li><a href="/contact/">開発者とコンタクト</a></li>
+</ul>
+
+<div class="onlycontent">
+<h2 class="version">NetSurfへようこそ</h2>
+
+<p class="intro">NetSurfは小さくて速いオープンソースのウェブブラウザです。私たちはいつもこのブラウザを改良する気満々ですから、どんな問題でも声をかけてください。NetSurfを選んでくれてありがとう!</p>
+
+<form method="get" action="http://www.google.co.jp/search">
+<div class="websearch">
+<input type="text" name="q" size="42" maxlength="255">
+<input type="submit" value="Google検索" name="btnG">
+</div>
+</form>
+
+<div class="links">
+<ul>
+<li><a href="http://news.bbc.co.uk/">BBC News</a></li>
+<li><a href="http://www.reuters.com/news">Reuters</a></li>
+<li><a href="http://www.cnn.com/">CNN</a></li>
+</ul>
+
+<ul>
+<li><a href="http://slashdot.jp/">Slashdot</a></li>
+<li><a href="http://arstechnica.com/">Ars Technica</a></li>
+<li><a href="http://www.theregister.co.uk/">The Register</a></li>
+<li><a href="http://www.w3.org/">W3C</a></li>
+</ul>
+
+<ul>
+<li><a href="http://ja.wikipedia.org/wiki/Main_Page">Wikipedia</a></li>
+<li><a href="http://google.co.jp/">Google</a></li>
+<li><a href="http://yahoo.co.jp/">Yahoo!</a></li>
+<li><a href="http://www.imdb.com/">IMDB</a></li>
+</ul>
+
+<ul>
+<li><a href="http://www.iconbar.com/">The Icon Bar</a></li>
+<li><a href="http://www.riscosopen.org/">ROOL</a></li>
+<li><a href="http://www.riscos.info/">riscos.info</a></li>
+</ul>
+</div>
+
+<div class="footer">
+<p>NetSurfはGNU Public Licence version 2でライセンシングされます。</p>
+</div>
+</div>
+
+</body>
+</html>
diff --git a/.gitignore b/.gitignore
index f27ca08ca..053a22050 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,12 +1,12 @@
*~
gtk/res/toolbarIndices
windows/res/preferences
-!NetSurf/!Run,feb
-!NetSurf/!RunImage,ff8
-!NetSurf/Resources/en/Templates,fec
-!NetSurf/Resources/fr/Templates,fec
-!NetSurf/Resources/de/Templates,fec
-!NetSurf/Resources/nl/Templates,fec
+\!NetSurf/!Run,feb
+\!NetSurf/!RunImage,ff8
+\!NetSurf/Resources/en/Templates,fec
+\!NetSurf/Resources/fr/Templates,fec
+\!NetSurf/Resources/de/Templates,fec
+\!NetSurf/Resources/nl/Templates,fec
test/nsurl
test/urldbtest
test/llcache
diff --git a/Docs/BUILDING-Cocoa b/Docs/BUILDING-Cocoa
index 7bfac2937..31a58ee81 100644
--- a/Docs/BUILDING-Cocoa
+++ b/Docs/BUILDING-Cocoa
@@ -27,7 +27,7 @@
The remainder must be installed manually. Currently, some of the libraries
developed as part of the NetSurf project have not had official releases.
Hopefully they will soon be released with downloadable tarballs and packaged
- in common distros. For now, you'll have to make do with svn checkouts.
+ in common distros. For now, you'll have to make do with Git checkouts.
Package installation
----------------------
diff --git a/Docs/BUILDING-Framebuffer b/Docs/BUILDING-Framebuffer
index 7cddc7e74..4eb993f13 100644
--- a/Docs/BUILDING-Framebuffer
+++ b/Docs/BUILDING-Framebuffer
@@ -211,7 +211,7 @@ Index: framebuffer/font_freetype.c
The remainder must be installed manually. Currently, some of the libraries
developed as part of the NetSurf project have not had official releases.
Hopefully they will soon be released with downloadable tarballs and packaged
- in common distros. For now, you'll have to make do with svn checkouts.
+ in common distros. For now, you'll have to make do with Git checkouts.
Package installation
----------------------
diff --git a/Docs/BUILDING-GTK b/Docs/BUILDING-GTK
index b01dbf021..2749bf4ec 100644
--- a/Docs/BUILDING-GTK
+++ b/Docs/BUILDING-GTK
@@ -51,7 +51,7 @@
The remainder must be installed manually. Currently, some of the libraries
developed as part of the NetSurf project have not had official releases.
Hopefully they will soon be released with downloadable tarballs and packaged
- in common distros. For now, you'll have to make do with svn checkouts.
+ in common distros. For now, you'll have to make do with Git checkouts.
Some of NetSurf's own libraries will be installed in /usr/local/ by default.
Fedora, and perhaps some other distributions of Linux, do not ship a
diff --git a/Docs/BUILDING-Monkey b/Docs/BUILDING-Monkey
index aa77f99ec..b467c7c15 100644
--- a/Docs/BUILDING-Monkey
+++ b/Docs/BUILDING-Monkey
@@ -47,7 +47,7 @@
The remainder must be installed manually. Currently, some of the libraries
developed as part of the NetSurf project have not had official releases.
Hopefully they will soon be released with downloadable tarballs and packaged
- in common distros. For now, you'll have to make do with svn checkouts.
+ in common distros. For now, you'll have to make do with Git checkouts.
Some of NetSurf's own libraries will be installed in /usr/local/ by default.
Fedora, and perhaps some other distributions of Linux, do not ship a
diff --git a/Docs/BUILDING-RISC_OS b/Docs/BUILDING-RISC_OS
index 5c4c3d531..7e61bd22f 100644
--- a/Docs/BUILDING-RISC_OS
+++ b/Docs/BUILDING-RISC_OS
@@ -1,5 +1,5 @@
--------------------------------------------------------------------------------
- Build Instructions for RISC OS NetSurf 16 January 2010
+ Build Instructions for RISC OS NetSurf 16 July 2012
--------------------------------------------------------------------------------
This document provides instructions for building the RISC OS NetSurf
@@ -16,11 +16,6 @@
| + Perl 5.8.8 or later
| + GCC 3.4.6 release 3 or later
| + The latest NSTools
- |
- | For instructions on how to do all of the above, consult the following
- | document:
- |
- | http://www.netsurf-browser.org/documentation/robuild
If you want to cross-compile NetSurf for RISC OS, use the BUILDING-ROCross
document.
diff --git a/Docs/BUILDING-Windows b/Docs/BUILDING-Windows
index d615871aa..49b3ad344 100644
--- a/Docs/BUILDING-Windows
+++ b/Docs/BUILDING-Windows
@@ -204,7 +204,7 @@ EOF
-----------
The windows resources may be rebuilt. Currently there is 1 object
- file included in the svn distribution of NetSurf that could be
+ file included in the Git distribution of NetSurf that could be
manually compiled
$ cd windows/res
diff --git a/Docs/LIBRARIES b/Docs/LIBRARIES
index f6292809d..dc5a98048 100644
--- a/Docs/LIBRARIES
+++ b/Docs/LIBRARIES
@@ -30,7 +30,7 @@
Required:
- $ git clone git://git.netsurf-browser.org/pencil
+ $ git clone git://git.netsurf-browser.org/libpencil
$ git clone git://git.netsurf-browser.org/rufl
diff --git a/Docs/PACKAGING-GTK b/Docs/PACKAGING-GTK
index 5453dff3f..67e63b231 100644
--- a/Docs/PACKAGING-GTK
+++ b/Docs/PACKAGING-GTK
@@ -74,8 +74,8 @@
===============
If the user hasn't specified a home page URL in their Preferences, NetSurf
- defaults to a "portal" welcome page on http://www.netsurf-browser.org/ - if
- you wish to change this, you can do so by editing NETSURF_HOMEPAGE in
+ defaults to a "portal" welcome page at about:netsurf - if you wish to
+ change this, you can do so by overriding the NETSURF_HOMEPAGE URL in
Makefile.config.
diff --git a/Makefile b/Makefile
index 22212a4d2..d51936fbb 100644
--- a/Makefile
+++ b/Makefile
@@ -241,8 +241,25 @@ else
ifeq ($(TARGET),cocoa)
PKG_CONFIG := PKG_CONFIG_PATH="$(PKG_CONFIG_PATH):/usr/local/lib/pkgconfig" pkg-config
else
- # Building for GTK, Framebuffer, Atari
- PKG_CONFIG := pkg-config
+ ifeq ($(TARGET),atari)
+ ifeq ($(HOST),atari)
+ PKG_CONFIG := pkg-config
+ else
+ ifeq ($(HOST),mint)
+ PKG_CONFIG := pkg-config
+ else
+ GCCSDK_INSTALL_ENV ?= /opt/netsurf/m68k-atari-mint/env
+ GCCSDK_INSTALL_CROSSBIN ?= /opt/netsurf/m68k-atari-mint/cross/bin
+
+ CC := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*gcc)
+
+ PKG_CONFIG := PKG_CONFIG_LIBDIR="$(GCCSDK_INSTALL_ENV)/lib/pkgconfig" pkg-config
+ endif
+ endif
+ else
+ # Building for GTK, Framebuffer
+ PKG_CONFIG := pkg-config
+ endif
endif
endif
endif
diff --git a/Makefile.defaults b/Makefile.defaults
index 8995a7271..1fdb42552 100644
--- a/Makefile.defaults
+++ b/Makefile.defaults
@@ -86,7 +86,7 @@ NETSURF_UA_FORMAT_STRING := "NetSurf/%d.%d (%s; %s)"
# option does not apply to the RISC OS version, as it has its own local
# home page, and it can be changed by editing the end of gui_init2() in
# riscos/gui.c
-NETSURF_HOMEPAGE := "http://www.netsurf-browser.org/welcome/"
+NETSURF_HOMEPAGE := "about:welcome"
# Force using glibc internal iconv implementation instead of external libiconv
# Valid options: YES, NO
diff --git a/Makefile.sources b/Makefile.sources
index 608381934..95695f786 100644
--- a/Makefile.sources
+++ b/Makefile.sources
@@ -13,12 +13,13 @@ S_CSS := css.c dump.c internal.c select.c utils.c
S_RENDER := box.c box_construct.c box_normalise.c \
font.c form.c \
- html.c html_script.c html_interaction.c html_redraw.c html_forms.c \
- imagemap.c layout.c list.c search.c table.c \
+ html.c html_script.c html_interaction.c html_redraw.c \
+ html_forms.c imagemap.c layout.c list.c search.c table.c \
textinput.c textplain.c
-S_UTILS := base64.c filename.c hashtable.c locale.c messages.c nsurl.c \
- talloc.c url.c utf8.c utils.c useragent.c filepath.c log.c
+S_UTILS := base64.c corestrings.c filename.c hashtable.c locale.c \
+ messages.c nsurl.c talloc.c url.c utf8.c utils.c useragent.c \
+ filepath.c log.c
S_HTTP := challenge.c generics.c primitives.c parameter.c \
content-disposition.c content-type.c www-authenticate.c
diff --git a/content/fetchers/about.c b/content/fetchers/about.c
index eddd77ef0..1330217f9 100644
--- a/content/fetchers/about.c
+++ b/content/fetchers/about.c
@@ -548,6 +548,21 @@ static bool fetch_about_logo_handler(struct fetch_about_context *ctx)
return true;
}
+static bool fetch_about_welcome_handler(struct fetch_about_context *ctx)
+{
+ fetch_msg msg;
+
+ /* content is going to return redirect */
+ fetch_set_http_code(ctx->fetchh, 302);
+
+ msg.type = FETCH_REDIRECT;
+ msg.data.redirect = "resource:welcome.html";
+
+ fetch_about_send_callback(&msg, ctx);
+
+ return true;
+}
+
/* Forward declaration because this handler requires the handler table. */
static bool fetch_about_about_handler(struct fetch_about_context *ctx);
@@ -560,13 +575,15 @@ struct about_handlers {
};
/** List of about paths and their handlers */
-struct about_handlers about_handler_list[] = {
+struct about_handlers about_handler_list[] = {
{ "credits", SLEN("credits"), NULL,
fetch_about_credits_handler, false },
{ "licence", SLEN("licence"), NULL,
fetch_about_licence_handler, false },
{ "license", SLEN("license"), NULL,
fetch_about_licence_handler, true },
+ { "welcome", SLEN("welcome"), NULL,
+ fetch_about_welcome_handler, false },
{ "config", SLEN("config"), NULL,
fetch_about_config_handler, false },
{ "Choices", SLEN("Choices"), NULL,
@@ -585,7 +602,8 @@ struct about_handlers about_handler_list[] = {
fetch_about_blank_handler, true }
};
-#define about_handler_list_len (sizeof(about_handler_list) / sizeof(struct about_handlers))
+#define about_handler_list_len (sizeof(about_handler_list) / \
+ sizeof(struct about_handlers))
/**
* List all the valid about: paths available
diff --git a/content/fetchers/resource.c b/content/fetchers/resource.c
index 1cd04f2dd..86d5498d5 100644
--- a/content/fetchers/resource.c
+++ b/content/fetchers/resource.c
@@ -79,6 +79,7 @@ static const char *fetch_resource_paths[] = {
"user.css",
"credits.html",
"licence.html",
+ "welcome.html",
"favicon.ico",
"netsurf.png"
};
diff --git a/css/css.c b/css/css.c
index 98760f560..3f660097f 100644
--- a/css/css.c
+++ b/css/css.c
@@ -83,67 +83,6 @@ static css_error nscss_register_import(struct content_css_data *c,
static lwc_string *css_charset;
static css_stylesheet *blank_import;
-dom_string *nscss_dom_string_a;
-dom_string *nscss_dom_string_abscenter;
-dom_string *nscss_dom_string_absmiddle;
-dom_string *nscss_dom_string_align;
-dom_string *nscss_dom_string_applet;
-dom_string *nscss_dom_string_background;
-dom_string *nscss_dom_string_baseline;
-dom_string *nscss_dom_string_bgcolor;
-dom_string *nscss_dom_string_body;
-dom_string *nscss_dom_string_border;
-dom_string *nscss_dom_string_bordercolor;
-dom_string *nscss_dom_string_bottom;
-dom_string *nscss_dom_string_caption;
-dom_string *nscss_dom_string_cellpadding;
-dom_string *nscss_dom_string_cellspacing;
-dom_string *nscss_dom_string_center;
-dom_string *nscss_dom_string_col;
-dom_string *nscss_dom_string_color;
-dom_string *nscss_dom_string_cols;
-dom_string *nscss_dom_string_div;
-dom_string *nscss_dom_string_embed;
-dom_string *nscss_dom_string_font;
-dom_string *nscss_dom_string_h1;
-dom_string *nscss_dom_string_h2;
-dom_string *nscss_dom_string_h3;
-dom_string *nscss_dom_string_h4;
-dom_string *nscss_dom_string_h5;
-dom_string *nscss_dom_string_h6;
-dom_string *nscss_dom_string_height;
-dom_string *nscss_dom_string_hr;
-dom_string *nscss_dom_string_href;
-dom_string *nscss_dom_string_hspace;
-dom_string *nscss_dom_string_iframe;
-dom_string *nscss_dom_string_img;
-dom_string *nscss_dom_string_input;
-dom_string *nscss_dom_string_justify;
-dom_string *nscss_dom_string_left;
-dom_string *nscss_dom_string_link;
-dom_string *nscss_dom_string_middle;
-dom_string *nscss_dom_string_object;
-dom_string *nscss_dom_string_p;
-dom_string *nscss_dom_string_password;
-dom_string *nscss_dom_string_right;
-dom_string *nscss_dom_string_rows;
-dom_string *nscss_dom_string_size;
-dom_string *nscss_dom_string_table;
-dom_string *nscss_dom_string_tbody;
-dom_string *nscss_dom_string_td;
-dom_string *nscss_dom_string_text;
-dom_string *nscss_dom_string_textarea;
-dom_string *nscss_dom_string_texttop;
-dom_string *nscss_dom_string_tfoot;
-dom_string *nscss_dom_string_th;
-dom_string *nscss_dom_string_thead;
-dom_string *nscss_dom_string_top;
-dom_string *nscss_dom_string_tr;
-dom_string *nscss_dom_string_type;
-dom_string *nscss_dom_string_valign;
-dom_string *nscss_dom_string_vlink;
-dom_string *nscss_dom_string_vspace;
-dom_string *nscss_dom_string_width;
/**
* Initialise a CSS content
@@ -830,79 +769,6 @@ css_error nscss_register_import(struct content_css_data *c,
*/
static void nscss_fini(void)
{
-#define CSS_DOM_STRING_UNREF(NAME) \
- do { \
- if (nscss_dom_string_##NAME != NULL) { \
- dom_string_unref(nscss_dom_string_##NAME); \
- nscss_dom_string_##NAME = NULL; \
- } \
- } while (0) \
-
- CSS_DOM_STRING_UNREF(a);
- CSS_DOM_STRING_UNREF(abscenter);
- CSS_DOM_STRING_UNREF(absmiddle);
- CSS_DOM_STRING_UNREF(align);
- CSS_DOM_STRING_UNREF(applet);
- CSS_DOM_STRING_UNREF(background);
- CSS_DOM_STRING_UNREF(baseline);
- CSS_DOM_STRING_UNREF(bgcolor);
- CSS_DOM_STRING_UNREF(body);
- CSS_DOM_STRING_UNREF(border);
- CSS_DOM_STRING_UNREF(bordercolor);
- CSS_DOM_STRING_UNREF(bottom);
- CSS_DOM_STRING_UNREF(caption);
- CSS_DOM_STRING_UNREF(cellpadding);
- CSS_DOM_STRING_UNREF(cellspacing);
- CSS_DOM_STRING_UNREF(center);
- CSS_DOM_STRING_UNREF(col);
- CSS_DOM_STRING_UNREF(color);
- CSS_DOM_STRING_UNREF(cols);
- CSS_DOM_STRING_UNREF(div);
- CSS_DOM_STRING_UNREF(embed);
- CSS_DOM_STRING_UNREF(font);
- CSS_DOM_STRING_UNREF(h1);
- CSS_DOM_STRING_UNREF(h2);
- CSS_DOM_STRING_UNREF(h3);
- CSS_DOM_STRING_UNREF(h4);
- CSS_DOM_STRING_UNREF(h5);
- CSS_DOM_STRING_UNREF(h6);
- CSS_DOM_STRING_UNREF(height);
- CSS_DOM_STRING_UNREF(hr);
- CSS_DOM_STRING_UNREF(href);
- CSS_DOM_STRING_UNREF(hspace);
- CSS_DOM_STRING_UNREF(iframe);
- CSS_DOM_STRING_UNREF(img);
- CSS_DOM_STRING_UNREF(input);
- CSS_DOM_STRING_UNREF(justify);
- CSS_DOM_STRING_UNREF(left);
- CSS_DOM_STRING_UNREF(link);
- CSS_DOM_STRING_UNREF(middle);
- CSS_DOM_STRING_UNREF(object);
- CSS_DOM_STRING_UNREF(p);
- CSS_DOM_STRING_UNREF(password);
- CSS_DOM_STRING_UNREF(right);
- CSS_DOM_STRING_UNREF(rows);
- CSS_DOM_STRING_UNREF(size);
- CSS_DOM_STRING_UNREF(table);
- CSS_DOM_STRING_UNREF(tbody);
- CSS_DOM_STRING_UNREF(td);
- CSS_DOM_STRING_UNREF(text);
- CSS_DOM_STRING_UNREF(textarea);
- CSS_DOM_STRING_UNREF(texttop);
- CSS_DOM_STRING_UNREF(tfoot);
- CSS_DOM_STRING_UNREF(th);
- CSS_DOM_STRING_UNREF(thead);
- CSS_DOM_STRING_UNREF(top);
- CSS_DOM_STRING_UNREF(tr);
- CSS_DOM_STRING_UNREF(type);
- CSS_DOM_STRING_UNREF(valign);
- CSS_DOM_STRING_UNREF(vlink);
- CSS_DOM_STRING_UNREF(vspace);
- CSS_DOM_STRING_UNREF(width);
-
-#undef CSS_DOM_STRING_UNREF
-
-
if (css_charset != NULL) {
lwc_string_unref(css_charset);
css_charset = NULL;
@@ -933,7 +799,6 @@ nserror nscss_init(void)
{
lwc_error lerror;
nserror error;
- dom_exception exc;
lerror = lwc_intern_string("charset", SLEN("charset"), &css_charset);
if (lerror != lwc_error_ok) {
@@ -941,83 +806,6 @@ nserror nscss_init(void)
goto error;
}
-
-#define CSS_DOM_STRING_INTERN(NAME) \
- do { \
- exc = dom_string_create_interned((const uint8_t *)#NAME,\
- sizeof(#NAME) - 1, \
- &nscss_dom_string_##NAME ); \
- if ((exc != DOM_NO_ERR) || \
- (nscss_dom_string_##NAME == NULL)) { \
- error = NSERROR_NOMEM; \
- goto error; \
- } \
- } while(0)
-
- CSS_DOM_STRING_INTERN(a);
- CSS_DOM_STRING_INTERN(abscenter);
- CSS_DOM_STRING_INTERN(absmiddle);
- CSS_DOM_STRING_INTERN(align);
- CSS_DOM_STRING_INTERN(applet);
- CSS_DOM_STRING_INTERN(background);
- CSS_DOM_STRING_INTERN(baseline);
- CSS_DOM_STRING_INTERN(bgcolor);
- CSS_DOM_STRING_INTERN(body);
- CSS_DOM_STRING_INTERN(border);
- CSS_DOM_STRING_INTERN(bordercolor);
- CSS_DOM_STRING_INTERN(bottom);
- CSS_DOM_STRING_INTERN(caption);
- CSS_DOM_STRING_INTERN(cellpadding);
- CSS_DOM_STRING_INTERN(cellspacing);
- CSS_DOM_STRING_INTERN(center);
- CSS_DOM_STRING_INTERN(col);
- CSS_DOM_STRING_INTERN(color);
- CSS_DOM_STRING_INTERN(cols);
- CSS_DOM_STRING_INTERN(div);
- CSS_DOM_STRING_INTERN(embed);
- CSS_DOM_STRING_INTERN(font);
- CSS_DOM_STRING_INTERN(h1);
- CSS_DOM_STRING_INTERN(h2);
- CSS_DOM_STRING_INTERN(h3);
- CSS_DOM_STRING_INTERN(h4);
- CSS_DOM_STRING_INTERN(h5);
- CSS_DOM_STRING_INTERN(h6);
- CSS_DOM_STRING_INTERN(height);
- CSS_DOM_STRING_INTERN(hr);
- CSS_DOM_STRING_INTERN(href);
- CSS_DOM_STRING_INTERN(hspace);
- CSS_DOM_STRING_INTERN(iframe);
- CSS_DOM_STRING_INTERN(img);
- CSS_DOM_STRING_INTERN(input);
- CSS_DOM_STRING_INTERN(justify);
- CSS_DOM_STRING_INTERN(left);
- CSS_DOM_STRING_INTERN(link);
- CSS_DOM_STRING_INTERN(middle);
- CSS_DOM_STRING_INTERN(object);
- CSS_DOM_STRING_INTERN(p);
- CSS_DOM_STRING_INTERN(password);
- CSS_DOM_STRING_INTERN(right);
- CSS_DOM_STRING_INTERN(rows);
- CSS_DOM_STRING_INTERN(size);
- CSS_DOM_STRING_INTERN(table);
- CSS_DOM_STRING_INTERN(tbody);
- CSS_DOM_STRING_INTERN(td);
- CSS_DOM_STRING_INTERN(text);
- CSS_DOM_STRING_INTERN(textarea);
- CSS_DOM_STRING_INTERN(texttop);
- CSS_DOM_STRING_INTERN(tfoot);
- CSS_DOM_STRING_INTERN(th);
- CSS_DOM_STRING_INTERN(thead);
- CSS_DOM_STRING_INTERN(top);
- CSS_DOM_STRING_INTERN(tr);
- CSS_DOM_STRING_INTERN(type);
- CSS_DOM_STRING_INTERN(valign);
- CSS_DOM_STRING_INTERN(vlink);
- CSS_DOM_STRING_INTERN(vspace);
- CSS_DOM_STRING_INTERN(width);
-
-#undef CSS_DOM_STRING_INTERN
-
error = content_factory_register_handler("text/css",
&css_content_handler);
if (error != NSERROR_OK)
diff --git a/css/internal.h b/css/internal.h
index 9f6907d15..0344d6b32 100644
--- a/css/internal.h
+++ b/css/internal.h
@@ -24,66 +24,4 @@
css_error nscss_resolve_url(void *pw, const char *base,
lwc_string *rel, lwc_string **abs);
-extern struct dom_string *nscss_dom_string_a;
-extern struct dom_string *nscss_dom_string_abscenter;
-extern struct dom_string *nscss_dom_string_absmiddle;
-extern struct dom_string *nscss_dom_string_align;
-extern struct dom_string *nscss_dom_string_applet;
-extern struct dom_string *nscss_dom_string_background;
-extern struct dom_string *nscss_dom_string_baseline;
-extern struct dom_string *nscss_dom_string_bgcolor;
-extern struct dom_string *nscss_dom_string_body;
-extern struct dom_string *nscss_dom_string_border;
-extern struct dom_string *nscss_dom_string_bordercolor;
-extern struct dom_string *nscss_dom_string_bottom;
-extern struct dom_string *nscss_dom_string_caption;
-extern struct dom_string *nscss_dom_string_cellpadding;
-extern struct dom_string *nscss_dom_string_cellspacing;
-extern struct dom_string *nscss_dom_string_center;
-extern struct dom_string *nscss_dom_string_col;
-extern struct dom_string *nscss_dom_string_color;
-extern struct dom_string *nscss_dom_string_cols;
-extern struct dom_string *nscss_dom_string_div;
-extern struct dom_string *nscss_dom_string_embed;
-extern struct dom_string *nscss_dom_string_font;
-extern struct dom_string *nscss_dom_string_h1;
-extern struct dom_string *nscss_dom_string_h2;
-extern struct dom_string *nscss_dom_string_h3;
-extern struct dom_string *nscss_dom_string_h4;
-extern struct dom_string *nscss_dom_string_h5;
-extern struct dom_string *nscss_dom_string_h6;
-extern struct dom_string *nscss_dom_string_height;
-extern struct dom_string *nscss_dom_string_hr;
-extern struct dom_string *nscss_dom_string_href;
-extern struct dom_string *nscss_dom_string_hspace;
-extern struct dom_string *nscss_dom_string_iframe;
-extern struct dom_string *nscss_dom_string_img;
-extern struct dom_string *nscss_dom_string_input;
-extern struct dom_string *nscss_dom_string_justify;
-extern struct dom_string *nscss_dom_string_left;
-extern struct dom_string *nscss_dom_string_link;
-extern struct dom_string *nscss_dom_string_middle;
-extern struct dom_string *nscss_dom_string_object;
-extern struct dom_string *nscss_dom_string_p;
-extern struct dom_string *nscss_dom_string_password;
-extern struct dom_string *nscss_dom_string_right;
-extern struct dom_string *nscss_dom_string_rows;
-extern struct dom_string *nscss_dom_string_size;
-extern struct dom_string *nscss_dom_string_table;
-extern struct dom_string *nscss_dom_string_tbody;
-extern struct dom_string *nscss_dom_string_td;
-extern struct dom_string *nscss_dom_string_text;
-extern struct dom_string *nscss_dom_string_textarea;
-extern struct dom_string *nscss_dom_string_texttop;
-extern struct dom_string *nscss_dom_string_tfoot;
-extern struct dom_string *nscss_dom_string_th;
-extern struct dom_string *nscss_dom_string_thead;
-extern struct dom_string *nscss_dom_string_top;
-extern struct dom_string *nscss_dom_string_tr;
-extern struct dom_string *nscss_dom_string_type;
-extern struct dom_string *nscss_dom_string_valign;
-extern struct dom_string *nscss_dom_string_vlink;
-extern struct dom_string *nscss_dom_string_vspace;
-extern struct dom_string *nscss_dom_string_width;
-
#endif
diff --git a/css/select.c b/css/select.c
index 1ea818f0e..3fd6e292f 100644
--- a/css/select.c
+++ b/css/select.c
@@ -28,6 +28,7 @@
#include "css/utils.h"
#include "desktop/gui.h"
#include "desktop/options.h"
+#include "utils/corestrings.h"
#include "utils/log.h"
#include "utils/url.h"
#include "utils/utils.h"
@@ -533,6 +534,7 @@ css_error node_id(void *pw, void *node, lwc_string **id)
dom_string_unref(attr);
return CSS_NOMEM;
}
+ dom_string_unref(attr);
}
return CSS_OK;
@@ -637,9 +639,10 @@ css_error named_sibling_node(void *pw, void *node,
dom_node_unref(n);
if (dom_string_caseless_lwc_isequal(name, qname->name)) {
- /** \todo Sort out reference counting */
*sibling = n;
}
+
+ dom_string_unref(name);
}
return CSS_OK;
@@ -1515,9 +1518,10 @@ css_error node_is_link(void *pw, void *n, bool *match)
return CSS_NOMEM;
}
- if (dom_string_isequal(node_name, nscss_dom_string_a)) {
+ if (dom_string_caseless_lwc_isequal(node_name, corestring_lwc_a)) {
bool has_href;
- exc = dom_element_has_attribute(node, nscss_dom_string_href, &has_href);
+ exc = dom_element_has_attribute(node, corestring_dom_href,
+ &has_href);
if ((exc == DOM_NO_ERR) && (has_href)) {
*match = true;
} else {
@@ -1751,30 +1755,31 @@ node_presentational_hint_vertical_align(nscss_select_ctx *ctx,
if (err != DOM_NO_ERR)
return CSS_PROPERTY_NOT_SET;
- if (dom_string_isequal(name, nscss_dom_string_col) ||
- dom_string_isequal(name, nscss_dom_string_thead) ||
- dom_string_isequal(name, nscss_dom_string_tbody) ||
- dom_string_isequal(name, nscss_dom_string_tfoot) ||
- dom_string_isequal(name, nscss_dom_string_tr) ||
- dom_string_isequal(name, nscss_dom_string_td) ||
- dom_string_isequal(name, nscss_dom_string_th)) {
+ if (dom_string_caseless_lwc_isequal(name, corestring_lwc_col) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_thead) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_tbody) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_tfoot) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_tr) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_td) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_th)) {
err = dom_element_get_attribute(node,
- nscss_dom_string_valign, &valign);
+ corestring_dom_valign, &valign);
if (err != DOM_NO_ERR || valign == NULL) {
dom_string_unref(name);
return CSS_PROPERTY_NOT_SET;
}
- if (dom_string_caseless_isequal(valign, nscss_dom_string_top)) {
+ if (dom_string_caseless_lwc_isequal(valign,
+ corestring_lwc_top)) {
hint->status = CSS_VERTICAL_ALIGN_TOP;
- } else if (dom_string_caseless_isequal(valign,
- nscss_dom_string_middle)) {
+ } else if (dom_string_caseless_lwc_isequal(valign,
+ corestring_lwc_middle)) {
hint->status = CSS_VERTICAL_ALIGN_MIDDLE;
- } else if (dom_string_caseless_isequal(valign,
- nscss_dom_string_bottom)) {
+ } else if (dom_string_caseless_lwc_isequal(valign,
+ corestring_lwc_bottom)) {
hint->status = CSS_VERTICAL_ALIGN_BOTTOM;
- } else if (dom_string_caseless_isequal(valign,
- nscss_dom_string_baseline)) {
+ } else if (dom_string_caseless_lwc_isequal(valign,
+ corestring_lwc_baseline)) {
hint->status = CSS_VERTICAL_ALIGN_BASELINE;
} else {
dom_string_unref(valign);
@@ -1786,33 +1791,39 @@ node_presentational_hint_vertical_align(nscss_select_ctx *ctx,
dom_string_unref(name);
return CSS_OK;
- } else if (dom_string_isequal(name, nscss_dom_string_applet) ||
- dom_string_isequal(name, nscss_dom_string_embed) ||
- dom_string_isequal(name, nscss_dom_string_iframe) ||
- dom_string_isequal(name, nscss_dom_string_img) ||
- dom_string_isequal(name, nscss_dom_string_object)) {
+ } else if (dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_applet) ||
+ dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_embed) ||
+ dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_iframe) ||
+ dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_img) ||
+ dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_object)) {
/** \todo input[type=image][align=*] - $11.3.3 */
err = dom_element_get_attribute(node,
- nscss_dom_string_align, &valign);
+ corestring_dom_align, &valign);
if (err != DOM_NO_ERR || valign == NULL) {
dom_string_unref(name);
return CSS_PROPERTY_NOT_SET;
}
- if (dom_string_caseless_isequal(valign, nscss_dom_string_top)) {
+ if (dom_string_caseless_lwc_isequal(valign,
+ corestring_lwc_top)) {
hint->status = CSS_VERTICAL_ALIGN_TOP;
- } else if (dom_string_caseless_isequal(valign,
- nscss_dom_string_bottom) ||
- dom_string_caseless_isequal(valign,
- nscss_dom_string_baseline)) {
+ } else if (dom_string_caseless_lwc_isequal(valign,
+ corestring_lwc_bottom) ||
+ dom_string_caseless_lwc_isequal(valign,
+ corestring_lwc_baseline)) {
hint->status = CSS_VERTICAL_ALIGN_BASELINE;
- } else if (dom_string_caseless_isequal(valign,
- nscss_dom_string_texttop)) {
+ } else if (dom_string_caseless_lwc_isequal(valign,
+ corestring_lwc_texttop)) {
hint->status = CSS_VERTICAL_ALIGN_TEXT_TOP;
- } else if (dom_string_caseless_isequal(valign,
- nscss_dom_string_absmiddle) ||
- dom_string_caseless_isequal(valign,
- nscss_dom_string_abscenter)) {
+ } else if (dom_string_caseless_lwc_isequal(valign,
+ corestring_lwc_absmiddle) ||
+ dom_string_caseless_lwc_isequal(valign,
+ corestring_lwc_abscenter)) {
hint->status = CSS_VERTICAL_ALIGN_MIDDLE;
} else {
dom_string_unref(valign);
@@ -1843,30 +1854,31 @@ node_presentational_hint_text_align(nscss_select_ctx *ctx,
if (err != DOM_NO_ERR)
return CSS_PROPERTY_NOT_SET;
- if (dom_string_isequal(name, nscss_dom_string_p) ||
- dom_string_isequal(name, nscss_dom_string_h1) ||
- dom_string_isequal(name, nscss_dom_string_h2) ||
- dom_string_isequal(name, nscss_dom_string_h3) ||
- dom_string_isequal(name, nscss_dom_string_h4) ||
- dom_string_isequal(name, nscss_dom_string_h5) ||
- dom_string_isequal(name, nscss_dom_string_h6)) {
+ if (dom_string_caseless_lwc_isequal(name, corestring_lwc_p) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_h1) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_h2) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_h3) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_h4) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_h5) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_h6)) {
err = dom_element_get_attribute(node,
- nscss_dom_string_align, &align);
+ corestring_dom_align, &align);
if (err != DOM_NO_ERR || align == NULL) {
dom_string_unref(name);
return CSS_PROPERTY_NOT_SET;
}
- if (dom_string_caseless_isequal(align, nscss_dom_string_left)) {
+ if (dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_left)) {
hint->status = CSS_TEXT_ALIGN_LEFT;
- } else if (dom_string_caseless_isequal(align,
- nscss_dom_string_center)) {
+ } else if (dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_center)) {
hint->status = CSS_TEXT_ALIGN_CENTER;
- } else if (dom_string_caseless_isequal(align,
- nscss_dom_string_right)) {
+ } else if (dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_right)) {
hint->status = CSS_TEXT_ALIGN_RIGHT;
- } else if (dom_string_caseless_isequal(align,
- nscss_dom_string_justify)) {
+ } else if (dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_justify)) {
hint->status = CSS_TEXT_ALIGN_JUSTIFY;
} else {
dom_string_unref(align);
@@ -1878,31 +1890,33 @@ node_presentational_hint_text_align(nscss_select_ctx *ctx,
dom_string_unref(name);
return CSS_OK;
- } else if (dom_string_isequal(name, nscss_dom_string_center)) {
+ } else if (dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_center)) {
hint->status = CSS_TEXT_ALIGN_LIBCSS_CENTER;
dom_string_unref(name);
return CSS_OK;
- } else if (dom_string_isequal(name, nscss_dom_string_caption)) {
+ } else if (dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_caption)) {
err = dom_element_get_attribute(node,
- nscss_dom_string_align, &align);
+ corestring_dom_align, &align);
if (err != DOM_NO_ERR) {
dom_string_unref(name);
return CSS_PROPERTY_NOT_SET;
}
- if (align == NULL || dom_string_caseless_isequal(align,
- nscss_dom_string_center)) {
+ if (align == NULL || dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_center)) {
hint->status = CSS_TEXT_ALIGN_LIBCSS_CENTER;
- } else if (dom_string_caseless_isequal(align,
- nscss_dom_string_left)) {
+ } else if (dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_left)) {
hint->status = CSS_TEXT_ALIGN_LIBCSS_LEFT;
- } else if (dom_string_caseless_isequal(align,
- nscss_dom_string_right)) {
+ } else if (dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_right)) {
hint->status = CSS_TEXT_ALIGN_LIBCSS_RIGHT;
- } else if (dom_string_caseless_isequal(align,
- nscss_dom_string_justify)) {
+ } else if (dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_justify)) {
hint->status = CSS_TEXT_ALIGN_JUSTIFY;
} else {
dom_string_unref(align);
@@ -1915,31 +1929,38 @@ node_presentational_hint_text_align(nscss_select_ctx *ctx,
dom_string_unref(name);
return CSS_OK;
- } else if (dom_string_isequal(name, nscss_dom_string_div) ||
- dom_string_isequal(name, nscss_dom_string_thead) ||
- dom_string_isequal(name, nscss_dom_string_tbody) ||
- dom_string_isequal(name, nscss_dom_string_tfoot) ||
- dom_string_isequal(name, nscss_dom_string_tr) ||
- dom_string_isequal(name, nscss_dom_string_td) ||
- dom_string_isequal(name, nscss_dom_string_th)) {
+ } else if (dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_div) ||
+ dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_thead) ||
+ dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_tbody) ||
+ dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_tfoot) ||
+ dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_tr) ||
+ dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_td) ||
+ dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_th)) {
err = dom_element_get_attribute(node,
- nscss_dom_string_align, &align);
+ corestring_dom_align, &align);
if (err != DOM_NO_ERR || align == NULL) {
dom_string_unref(name);
return CSS_PROPERTY_NOT_SET;
}
- if (dom_string_caseless_isequal(align,
- nscss_dom_string_center)) {
+ if (dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_center)) {
hint->status = CSS_TEXT_ALIGN_LIBCSS_CENTER;
- } else if (dom_string_caseless_isequal(align,
- nscss_dom_string_left)) {
+ } else if (dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_left)) {
hint->status = CSS_TEXT_ALIGN_LIBCSS_LEFT;
- } else if (dom_string_caseless_isequal(align,
- nscss_dom_string_right)) {
+ } else if (dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_right)) {
hint->status = CSS_TEXT_ALIGN_LIBCSS_RIGHT;
- } else if (dom_string_caseless_isequal(align,
- nscss_dom_string_justify)) {
+ } else if (dom_string_caseless_lwc_isequal(align,
+ corestring_lwc_justify)) {
hint->status = CSS_TEXT_ALIGN_JUSTIFY;
} else {
dom_string_unref(align);
@@ -1951,7 +1972,8 @@ node_presentational_hint_text_align(nscss_select_ctx *ctx,
dom_string_unref(name);
return CSS_OK;
- } else if (dom_string_isequal(name, nscss_dom_string_table)) {
+ } else if (dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_table)) {
/* Tables usually reset alignment */
hint->status = CSS_TEXT_ALIGN_INHERIT_IF_NON_MAGIC;
@@ -1979,20 +2001,15 @@ node_presentational_hint_padding_trbl(nscss_select_ctx *ctx,
if (exc != DOM_NO_ERR)
return CSS_BADPARM;
- if (dom_string_isequal(name, nscss_dom_string_td) ||
- dom_string_isequal(name, nscss_dom_string_th)) {
+ if (dom_string_caseless_lwc_isequal(name, corestring_lwc_td) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_th)) {
css_qname qs;
dom_node *tablenode = NULL;
qs.ns = NULL;
- exc = dom_string_intern(nscss_dom_string_table, &qs.name);
- if (exc != DOM_NO_ERR) {
- dom_string_unref(name);
- return CSS_BADPARM;
- }
+ qs.name = lwc_string_ref(corestring_lwc_table);
if (named_ancestor_node(ctx, node, &qs,
(void *)&tablenode) != CSS_OK) {
/* Didn't find, or had error */
- lwc_string_unref(qs.name);
dom_string_unref(name);
return CSS_PROPERTY_NOT_SET;
}
@@ -2001,8 +2018,8 @@ node_presentational_hint_padding_trbl(nscss_select_ctx *ctx,
if (tablenode != NULL) {
exc = dom_element_get_attribute(tablenode,
- nscss_dom_string_cellpadding,
- &cellpadding);
+ corestring_dom_cellpadding,
+ &cellpadding);
if (exc != DOM_NO_ERR) {
dom_string_unref(name);
return CSS_BADPARM;
@@ -2043,11 +2060,11 @@ node_presentational_hint_margin_rl(nscss_select_ctx *ctx,
if (exc != DOM_NO_ERR)
return CSS_BADPARM;
- if (dom_string_isequal(n, nscss_dom_string_img) ||
- dom_string_isequal(n, nscss_dom_string_applet)) {
+ if (dom_string_caseless_lwc_isequal(n, corestring_lwc_img) ||
+ dom_string_caseless_lwc_isequal(n, corestring_lwc_applet)) {
dom_string_unref(n);
exc = dom_element_get_attribute(node,
- nscss_dom_string_hspace, &n);
+ corestring_dom_hspace, &n);
if (exc != DOM_NO_ERR) {
return CSS_BADPARM;
}
@@ -2065,11 +2082,11 @@ node_presentational_hint_margin_rl(nscss_select_ctx *ctx,
}
dom_string_unref(n);
return CSS_OK;
- } else if (dom_string_isequal(n, nscss_dom_string_table) ||
- dom_string_isequal(n, nscss_dom_string_align)) {
+ } else if (dom_string_caseless_lwc_isequal(n, corestring_lwc_table) ||
+ dom_string_caseless_lwc_isequal(n, corestring_lwc_align)) {
dom_string_unref(n);
exc = dom_element_get_attribute(node,
- nscss_dom_string_align, &n);
+ corestring_dom_align, &n);
if (exc != DOM_NO_ERR) {
return CSS_BADPARM;
}
@@ -2077,10 +2094,14 @@ node_presentational_hint_margin_rl(nscss_select_ctx *ctx,
if (n == NULL)
return CSS_PROPERTY_NOT_SET;
- if (dom_string_caseless_isequal(n, nscss_dom_string_center) ||
- dom_string_caseless_isequal(n, nscss_dom_string_abscenter) ||
- dom_string_caseless_isequal(n, nscss_dom_string_middle) ||
- dom_string_caseless_isequal(n, nscss_dom_string_absmiddle)) {
+ if (dom_string_caseless_lwc_isequal(n,
+ corestring_lwc_center) ||
+ dom_string_caseless_lwc_isequal(n,
+ corestring_lwc_abscenter) ||
+ dom_string_caseless_lwc_isequal(n,
+ corestring_lwc_middle) ||
+ dom_string_caseless_lwc_isequal(n,
+ corestring_lwc_absmiddle)) {
hint->status = CSS_MARGIN_AUTO;
} else {
dom_string_unref(n);
@@ -2089,17 +2110,18 @@ node_presentational_hint_margin_rl(nscss_select_ctx *ctx,
dom_string_unref(n);
return CSS_OK;
- } else if (dom_string_isequal(n, nscss_dom_string_hr)) {
+ } else if (dom_string_caseless_lwc_isequal(n, corestring_lwc_hr)) {
dom_string_unref(n);
exc = dom_element_get_attribute(node,
- nscss_dom_string_align, &n);
+ corestring_dom_align, &n);
if (exc != DOM_NO_ERR)
return CSS_BADPARM;
if (n == NULL)
return CSS_PROPERTY_NOT_SET;
- if (dom_string_caseless_isequal(n, nscss_dom_string_left)) {
+ if (dom_string_caseless_lwc_isequal(n,
+ corestring_lwc_left)) {
if (property == CSS_PROP_MARGIN_LEFT) {
hint->data.length.value = 0;
hint->data.length.unit = CSS_UNIT_PX;
@@ -2107,9 +2129,11 @@ node_presentational_hint_margin_rl(nscss_select_ctx *ctx,
} else {
hint->status = CSS_MARGIN_AUTO;
}
- } else if (dom_string_caseless_isequal(n, nscss_dom_string_center)) {
+ } else if (dom_string_caseless_lwc_isequal(n,
+ corestring_lwc_center)) {
hint->status = CSS_MARGIN_AUTO;
- } else if (dom_string_caseless_isequal(n, nscss_dom_string_right)) {
+ } else if (dom_string_caseless_lwc_isequal(n,
+ corestring_lwc_right)) {
if (property == CSS_PROP_MARGIN_RIGHT) {
hint->data.length.value = 0;
hint->data.length.unit = CSS_UNIT_PX;
@@ -2143,10 +2167,10 @@ node_presentational_hint_margin_tb(nscss_select_ctx *ctx,
if (exc != DOM_NO_ERR)
return CSS_BADPARM;
- if (dom_string_isequal(name, nscss_dom_string_img) ||
- dom_string_isequal(name, nscss_dom_string_applet)) {
- exc = dom_element_get_attribute(node, nscss_dom_string_vspace,
- &vspace);
+ if (dom_string_caseless_lwc_isequal(name, corestring_lwc_img) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_applet)) {
+ exc = dom_element_get_attribute(node, corestring_dom_vspace,
+ &vspace);
if (exc != DOM_NO_ERR) {
dom_string_unref(name);
return CSS_BADPARM;
@@ -2186,16 +2210,12 @@ node_presentational_hint_border_trbl_width(nscss_select_ctx *ctx,
if (exc != DOM_NO_ERR)
return CSS_BADPARM;
- if (dom_string_isequal(name, nscss_dom_string_td) ||
- dom_string_isequal(name, nscss_dom_string_th)) {
+ if (dom_string_caseless_lwc_isequal(name, corestring_lwc_td) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_th)) {
css_qname qs;
dom_node *tablenode = NULL;
qs.ns = NULL;
- exc = dom_string_intern(nscss_dom_string_table, &qs.name);
- if (exc != DOM_NO_ERR) {
- dom_string_unref(name);
- return CSS_BADPARM;
- }
+ qs.name = lwc_string_ref(corestring_lwc_table);
if (named_ancestor_node(ctx, node, &qs,
(void *)&tablenode) != CSS_OK) {
/* Didn't find, or had error */
@@ -2207,7 +2227,7 @@ node_presentational_hint_border_trbl_width(nscss_select_ctx *ctx,
lwc_string_unref(qs.name);
if (tablenode != NULL) {
exc = dom_element_get_attribute(tablenode,
- nscss_dom_string_border, &width);
+ corestring_dom_border, &width);
if (exc != DOM_NO_ERR) {
dom_string_unref(name);
return CSS_BADPARM;
@@ -2217,8 +2237,9 @@ node_presentational_hint_border_trbl_width(nscss_select_ctx *ctx,
* return a reffed node to the CSS
*/
is_table_cell = true;
- } else if (dom_string_isequal(name, nscss_dom_string_table)) {
- exc = dom_element_get_attribute(node, nscss_dom_string_border,
+ } else if (dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_table)) {
+ exc = dom_element_get_attribute(node, corestring_dom_border,
&width);
if (exc != DOM_NO_ERR) {
dom_string_unref(name);
@@ -2263,17 +2284,12 @@ node_presentational_hint_border_trbl_style(nscss_select_ctx *ctx,
if (exc != DOM_NO_ERR)
return CSS_BADPARM;
- if (dom_string_isequal(name, nscss_dom_string_td) ||
- dom_string_isequal(name, nscss_dom_string_th)) {
+ if (dom_string_caseless_lwc_isequal(name, corestring_lwc_td) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_th)) {
css_qname qs;
dom_node *tablenode = NULL;
qs.ns = NULL;
-
- exc = dom_string_intern(nscss_dom_string_table, &qs.name);
- if (exc != DOM_NO_ERR) {
- dom_string_unref(name);
- return CSS_BADPARM;
- }
+ qs.name = lwc_string_ref(corestring_lwc_table);
if (named_ancestor_node(ctx, node, &qs,
(void *)&tablenode) != CSS_OK) {
@@ -2289,7 +2305,7 @@ node_presentational_hint_border_trbl_style(nscss_select_ctx *ctx,
bool has_border = false;
exc = dom_element_has_attribute(tablenode,
- nscss_dom_string_border,
+ corestring_dom_border,
&has_border);
if (exc != DOM_NO_ERR) {
dom_string_unref(name);
@@ -2305,11 +2321,12 @@ node_presentational_hint_border_trbl_style(nscss_select_ctx *ctx,
/* No need to unref tablenode, named_ancestor_node does not
* return a reffed node to the CSS
*/
- } else if (dom_string_isequal(name, nscss_dom_string_table)) {
+ } else if (dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_table)) {
bool has_border = false;
exc = dom_element_has_attribute(node,
- nscss_dom_string_border,
+ corestring_dom_border,
&has_border);
if (exc != DOM_NO_ERR) {
dom_string_unref(name);
@@ -2341,17 +2358,12 @@ node_presentational_hint_border_trbl_color(nscss_select_ctx *ctx,
if (err != DOM_NO_ERR)
return CSS_PROPERTY_NOT_SET;
- if (dom_string_isequal(name, nscss_dom_string_td) ||
- dom_string_isequal(name, nscss_dom_string_th)) {
+ if (dom_string_caseless_lwc_isequal(name, corestring_lwc_td) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_th)) {
css_qname qs;
dom_node *tablenode = NULL;
qs.ns = NULL;
-
- err = dom_string_intern(nscss_dom_string_table, &qs.name);
- if (err != DOM_NO_ERR) {
- dom_string_unref(name);
- return CSS_BADPARM;
- }
+ qs.name = lwc_string_ref(corestring_lwc_table);
if (named_ancestor_node(ctx, node, &qs,
(void *)&tablenode) != CSS_OK) {
@@ -2365,17 +2377,18 @@ node_presentational_hint_border_trbl_color(nscss_select_ctx *ctx,
if (tablenode != NULL) {
err = dom_element_get_attribute(node,
- nscss_dom_string_bordercolor,
- &bordercolor);
+ corestring_dom_bordercolor,
+ &bordercolor);
}
/* No need to unref tablenode, named_ancestor_node does not
* return a reffed node to the CSS
*/
- } else if (dom_string_isequal(name, nscss_dom_string_table)) {
+ } else if (dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_table)) {
err = dom_element_get_attribute(node,
- nscss_dom_string_bordercolor,
- &bordercolor);
+ corestring_dom_bordercolor,
+ &bordercolor);
}
dom_string_unref(name);
@@ -2409,14 +2422,16 @@ node_presentational_hint_border_spacing(nscss_select_ctx *ctx,
return CSS_PROPERTY_NOT_SET;
}
- if (!dom_string_caseless_isequal(node_name, nscss_dom_string_table)) {
+ if (!dom_string_caseless_lwc_isequal(node_name,
+ corestring_lwc_table)) {
dom_string_unref(node_name);
return CSS_PROPERTY_NOT_SET;
}
dom_string_unref(node_name);
- err = dom_element_get_attribute(node, nscss_dom_string_cellspacing, &cellspacing);
+ err = dom_element_get_attribute(node,
+ corestring_dom_cellspacing, &cellspacing);
if ((err != DOM_NO_ERR) || (cellspacing == NULL)) {
return CSS_PROPERTY_NOT_SET;
}
@@ -2453,27 +2468,26 @@ node_presentational_hint_width(nscss_select_ctx *ctx,
if (err != DOM_NO_ERR)
return CSS_PROPERTY_NOT_SET;
- if (dom_string_isequal(name, nscss_dom_string_hr) ||
- dom_string_isequal(name, nscss_dom_string_iframe) ||
- dom_string_isequal(name, nscss_dom_string_img) ||
- dom_string_isequal(name, nscss_dom_string_object) ||
- dom_string_isequal(name, nscss_dom_string_table) ||
- dom_string_isequal(name, nscss_dom_string_td) ||
- dom_string_isequal(name, nscss_dom_string_th) ||
- dom_string_isequal(name, nscss_dom_string_applet)) {
+ if (dom_string_caseless_lwc_isequal(name, corestring_lwc_hr) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_iframe) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_img) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_object) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_table) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_td) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_th) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_applet)) {
err = dom_element_get_attribute(node,
- nscss_dom_string_width,
- &width);
- } else if (dom_string_isequal(name, nscss_dom_string_textarea)) {
+ corestring_dom_width, &width);
+ } else if (dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_textarea)) {
textarea = true;
err = dom_element_get_attribute(node,
- nscss_dom_string_cols,
- &width);
- } else if (dom_string_isequal(name, nscss_dom_string_input)) {
+ corestring_dom_cols, &width);
+ } else if (dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_input)) {
input = true;
err = dom_element_get_attribute(node,
- nscss_dom_string_size,
- &width);
+ corestring_dom_size, &width);
}
dom_string_unref(name);
@@ -2494,15 +2508,16 @@ node_presentational_hint_width(nscss_select_ctx *ctx,
}
if (input) {
- err = dom_element_get_attribute(node,
- nscss_dom_string_type,
- &width);
+ err = dom_element_get_attribute(node,
+ corestring_dom_type, &width);
if ((err != DOM_NO_ERR) || (width == NULL)) {
return CSS_PROPERTY_NOT_SET;
}
- if (dom_string_isequal(name, nscss_dom_string_text) ||
- dom_string_isequal(name, nscss_dom_string_password)) {
+ if (dom_string_lwc_isequal(width,
+ corestring_lwc_text) ||
+ dom_string_lwc_isequal(width,
+ corestring_lwc_password)) {
hint->data.length.unit = CSS_UNIT_EX;
}
@@ -2533,21 +2548,20 @@ node_presentational_hint_height(nscss_select_ctx *ctx,
if (err != DOM_NO_ERR)
return CSS_PROPERTY_NOT_SET;
- if (dom_string_isequal(name, nscss_dom_string_iframe) ||
- dom_string_isequal(name, nscss_dom_string_td) ||
- dom_string_isequal(name, nscss_dom_string_th) ||
- dom_string_isequal(name, nscss_dom_string_tr) ||
- dom_string_isequal(name, nscss_dom_string_img) ||
- dom_string_isequal(name, nscss_dom_string_object) ||
- dom_string_isequal(name, nscss_dom_string_applet)) {
+ if (dom_string_caseless_lwc_isequal(name, corestring_lwc_iframe) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_td) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_th) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_tr) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_img) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_object) ||
+ dom_string_caseless_lwc_isequal(name, corestring_lwc_applet)) {
err = dom_element_get_attribute(node,
- nscss_dom_string_height,
- &height);
- } else if (dom_string_isequal(name, nscss_dom_string_textarea)) {
+ corestring_dom_height, &height);
+ } else if (dom_string_caseless_lwc_isequal(name,
+ corestring_lwc_textarea)) {
textarea = true;
err = dom_element_get_attribute(node,
- nscss_dom_string_rows,
- &height);
+ corestring_dom_rows, &height);
}
dom_string_unref(name);
@@ -2588,14 +2602,15 @@ node_presentational_hint_font_size(nscss_select_ctx *ctx,
return CSS_NOMEM;
}
- if (!dom_string_isequal(node_name, nscss_dom_string_font)) {
+ if (!dom_string_caseless_lwc_isequal(node_name,
+ corestring_lwc_font)) {
dom_string_unref(node_name);
return CSS_PROPERTY_NOT_SET;
}
dom_string_unref(node_name);
- err = dom_element_get_attribute(node, nscss_dom_string_align, &size);
+ err = dom_element_get_attribute(node, corestring_dom_align, &size);
if ((err != DOM_NO_ERR) || (size == NULL)) {
return CSS_PROPERTY_NOT_SET;
}
@@ -2627,27 +2642,32 @@ node_presentational_hint_float(nscss_select_ctx *ctx,
}
/** \todo input[type=image][align=*] - $11.3.3 */
- if (!dom_string_isequal(node_name, nscss_dom_string_applet) &&
- !dom_string_isequal(node_name, nscss_dom_string_embed) &&
- !dom_string_isequal(node_name, nscss_dom_string_iframe) &&
- !dom_string_isequal(node_name, nscss_dom_string_img) &&
- !dom_string_isequal(node_name, nscss_dom_string_object)) {
+ if (!dom_string_caseless_lwc_isequal(node_name,
+ corestring_lwc_applet) &&
+ !dom_string_caseless_lwc_isequal(node_name,
+ corestring_lwc_embed) &&
+ !dom_string_caseless_lwc_isequal(node_name,
+ corestring_lwc_iframe) &&
+ !dom_string_caseless_lwc_isequal(node_name,
+ corestring_lwc_img) &&
+ !dom_string_caseless_lwc_isequal(node_name,
+ corestring_lwc_object)) {
dom_string_unref(node_name);
return CSS_PROPERTY_NOT_SET;
}
dom_string_unref(node_name);
- err = dom_element_get_attribute(node, nscss_dom_string_align, &align);
+ err = dom_element_get_attribute(node, corestring_dom_align, &align);
if ((err != DOM_NO_ERR) || (align == NULL)) {
return CSS_PROPERTY_NOT_SET;
}
- if (dom_string_isequal(align, nscss_dom_string_left)) {
+ if (dom_string_lwc_isequal(align, corestring_lwc_left)) {
hint->status = CSS_FLOAT_LEFT;
dom_string_unref(align);
return CSS_OK;
- } else if (dom_string_isequal(align, nscss_dom_string_right)) {
+ } else if (dom_string_lwc_isequal(align, corestring_lwc_right)) {
hint->status = CSS_FLOAT_RIGHT;
dom_string_unref(align);
return CSS_OK;
@@ -2673,18 +2693,14 @@ node_presentational_hint_color(nscss_select_ctx *ctx,
return CSS_NOMEM;
}
- if (dom_string_isequal(node_name, nscss_dom_string_a)) {
+ if (dom_string_caseless_lwc_isequal(node_name, corestring_lwc_a)) {
/* find body node */
css_qname qs;
dom_node *bodynode = NULL;
bool is_visited;
qs.ns = NULL;
- err = dom_string_intern(nscss_dom_string_body, &qs.name);
- if (err != DOM_NO_ERR) {
- dom_string_unref(node_name);
- return CSS_BADPARM;
- }
+ qs.name = lwc_string_ref(corestring_lwc_body);
if (named_ancestor_node(ctx, node, &qs,
(void *)&bodynode) != CSS_OK) {
/* Didn't find, or had error */
@@ -2706,26 +2722,31 @@ node_presentational_hint_color(nscss_select_ctx *ctx,
return error;
if (is_visited) {
- err = dom_element_get_attribute(node, nscss_dom_string_vlink, &color);
+ err = dom_element_get_attribute(node,
+ corestring_dom_vlink, &color);
if ((err != DOM_NO_ERR) || (color == NULL)) {
dom_string_unref(node_name);
return CSS_PROPERTY_NOT_SET;
}
} else {
- err = dom_element_get_attribute(node, nscss_dom_string_link, &color);
+ err = dom_element_get_attribute(node,
+ corestring_dom_link, &color);
if ((err != DOM_NO_ERR) || (color == NULL)) {
dom_string_unref(node_name);
return CSS_PROPERTY_NOT_SET;
}
}
- } else if (dom_string_isequal(node_name, nscss_dom_string_body)) {
- err = dom_element_get_attribute(node, nscss_dom_string_text, &color);
+ } else if (dom_string_caseless_lwc_isequal(node_name,
+ corestring_lwc_body)) {
+ err = dom_element_get_attribute(node,
+ corestring_dom_text, &color);
if ((err != DOM_NO_ERR) || (color == NULL)) {
dom_string_unref(node_name);
return CSS_PROPERTY_NOT_SET;
}
} else {
- err = dom_element_get_attribute(node, nscss_dom_string_color, &color);
+ err = dom_element_get_attribute(node,
+ corestring_dom_color, &color);
if ((err != DOM_NO_ERR) || (color == NULL)) {
dom_string_unref(node_name);
return CSS_PROPERTY_NOT_SET;
@@ -2759,19 +2780,20 @@ node_presentational_hint_caption_side(nscss_select_ctx *ctx,
return CSS_PROPERTY_NOT_SET;
}
- if (!dom_string_caseless_isequal(node_name, nscss_dom_string_caption)) {
+ if (!dom_string_caseless_lwc_isequal(node_name,
+ corestring_lwc_caption)) {
dom_string_unref(node_name);
return CSS_PROPERTY_NOT_SET;
}
dom_string_unref(node_name);
- err = dom_element_get_attribute(node, nscss_dom_string_align, &align);
+ err = dom_element_get_attribute(node, corestring_dom_align, &align);
if ((err != DOM_NO_ERR) || (align == NULL)) {
return CSS_PROPERTY_NOT_SET;
}
- if (dom_string_caseless_isequal(align, nscss_dom_string_bottom)) {
+ if (dom_string_caseless_lwc_isequal(align, corestring_lwc_bottom)) {
hint->status = CSS_CAPTION_SIDE_BOTTOM;
dom_string_unref(align);
return CSS_OK;
@@ -2790,7 +2812,8 @@ node_presentational_hint_background_color(nscss_select_ctx *ctx,
dom_exception err;
dom_string *bgcolor;
- err = dom_element_get_attribute(node, nscss_dom_string_bgcolor, &bgcolor);
+ err = dom_element_get_attribute(node,
+ corestring_dom_bgcolor, &bgcolor);
if ((err != DOM_NO_ERR) || (bgcolor == NULL)) {
return CSS_PROPERTY_NOT_SET;
}
@@ -2819,12 +2842,14 @@ node_presentational_hint_background_image(nscss_select_ctx *ctx,
lwc_string *iurl;
lwc_error lerror;
- err = dom_element_get_attribute(node, nscss_dom_string_background, &atr_val);
+ err = dom_element_get_attribute(node,
+ corestring_dom_background, &atr_val);
if ((err != DOM_NO_ERR) || (atr_val == NULL)) {
return CSS_PROPERTY_NOT_SET;
}
- error = nsurl_join(ctx->base_url, (const char *)dom_string_data(atr_val), &url);
+ error = nsurl_join(ctx->base_url,
+ (const char *)dom_string_data(atr_val), &url);
dom_string_unref(atr_val);
@@ -2832,7 +2857,8 @@ node_presentational_hint_background_image(nscss_select_ctx *ctx,
return CSS_NOMEM;
}
- lerror = lwc_intern_string(nsurl_access(url), nsurl_length(url), &iurl);
+ lerror = lwc_intern_string(nsurl_access(url),
+ nsurl_length(url), &iurl);
nsurl_unref(url);
diff --git a/desktop/netsurf.c b/desktop/netsurf.c
index 4fa7134c0..d2010d80b 100644
--- a/desktop/netsurf.c
+++ b/desktop/netsurf.c
@@ -47,6 +47,7 @@
#include "render/html.h"
#include "render/textplain.h"
+#include "utils/corestrings.h"
#include "utils/log.h"
#include "utils/url.h"
#include "utils/utf8.h"
@@ -76,7 +77,7 @@ bool verbose_log = false;
static void netsurf_lwc_iterator(lwc_string *str, void *pw)
{
- LOG(("%.*s", (int) lwc_string_length(str), lwc_string_data(str)));
+ LOG(("[%3u] %.*s", str->refcnt, (int) lwc_string_length(str), lwc_string_data(str)));
}
/**
@@ -169,6 +170,11 @@ nserror netsurf_init(int *pargc,
messages_load(messages);
+ /* corestrings init */
+ error = corestrings_init();
+ if (error != NSERROR_OK)
+ return error;
+
/* set up cache limits based on the memory cache size option */
hlcache_parameters.limit = nsoption_int(memory_cache_size);
@@ -287,6 +293,7 @@ void netsurf_exit(void)
LOG(("Destroying System colours"));
gui_system_colour_finalize();
+ corestrings_fini();
LOG(("Remaining lwc strings:"));
lwc_iterate_strings(netsurf_lwc_iterator, NULL);
diff --git a/desktop/save_complete.c b/desktop/save_complete.c
index 33234ce2c..0ac64b515 100644
--- a/desktop/save_complete.c
+++ b/desktop/save_complete.c
@@ -589,28 +589,28 @@ bool rewrite_urls(xmlNode *n, const char *base,
/* ignore */
}
/* 1 */
- else if (strcmp((const char *) n->name, "object") == 0) {
+ else if (strcasecmp((const char *) n->name, "object") == 0) {
if (!rewrite_url(n, "data", base, list))
return false;
}
/* 2 */
- else if (strcmp((const char *) n->name, "a") == 0 ||
- strcmp((const char *) n->name, "area") == 0 ||
- strcmp((const char *) n->name, "link") == 0) {
+ else if (strcasecmp((const char *) n->name, "a") == 0 ||
+ strcasecmp((const char *) n->name, "area") == 0 ||
+ strcasecmp((const char *) n->name, "link") == 0) {
if (!rewrite_url(n, "href", base, list))
return false;
}
/* 3 */
- else if (strcmp((const char *) n->name, "frame") == 0 ||
- strcmp((const char *) n->name, "iframe") == 0 ||
- strcmp((const char *) n->name, "input") == 0 ||
- strcmp((const char *) n->name, "img") == 0 ||
- strcmp((const char *) n->name, "script") == 0) {
+ else if (strcasecmp((const char *) n->name, "frame") == 0 ||
+ strcasecmp((const char *) n->name, "iframe") == 0 ||
+ strcasecmp((const char *) n->name, "input") == 0 ||
+ strcasecmp((const char *) n->name, "img") == 0 ||
+ strcasecmp((const char *) n->name, "script") == 0) {
if (!rewrite_url(n, "src", base, list))
return false;
}
/* 4 */
- else if (strcmp((const char *) n->name, "style") == 0) {
+ else if (strcasecmp((const char *) n->name, "style") == 0) {
unsigned int len;
xmlChar *content;
@@ -642,7 +642,7 @@ bool rewrite_urls(xmlNode *n, const char *base,
return true;
}
/* 5 */
- else if (strcmp((const char *) n->name, "base") == 0) {
+ else if (strcasecmp((const char *) n->name, "base") == 0) {
/* simply remove any <base> tags from the document */
xmlUnlinkNode(n);
xmlFreeNode(n);
diff --git a/desktop/tree_url_node.c b/desktop/tree_url_node.c
index 380ba43b9..d477249c9 100644
--- a/desktop/tree_url_node.c
+++ b/desktop/tree_url_node.c
@@ -470,7 +470,7 @@ static xmlNode *tree_url_find_xml_element(xmlNode *node, const char *name)
for (xmlnode = node->children;
xmlnode && !(xmlnode->type == XML_ELEMENT_NODE &&
- strcmp((const char *) xmlnode->name, name) == 0);
+ strcasecmp((const char *) xmlnode->name, name) == 0);
xmlnode = xmlnode->next)
;
@@ -498,7 +498,7 @@ static void tree_url_load_entry(xmlNode *li, struct tree *tree,
for (xmlnode = li->children; xmlnode; xmlnode = xmlnode->next) {
/* The li must contain an "a" element */
if (xmlnode->type == XML_ELEMENT_NODE &&
- strcmp((const char *)xmlnode->name, "a") == 0) {
+ strcasecmp((const char *)xmlnode->name, "a") == 0) {
url1 = (char *)xmlGetProp(xmlnode,
(const xmlChar *) "href");
title = (char *)xmlNodeGetContent(xmlnode);
@@ -590,12 +590,12 @@ static void tree_url_load_directory(xmlNode *ul, struct tree *tree,
if (xmlnode->type != XML_ELEMENT_NODE)
continue;
- if (strcmp((const char *)xmlnode->name, "li") == 0) {
+ if (strcasecmp((const char *)xmlnode->name, "li") == 0) {
/* entry */
tree_url_load_entry(xmlnode, tree, directory, callback,
callback_data);
- } else if (strcmp((const char *)xmlnode->name, "h4") == 0) {
+ } else if (strcasecmp((const char *)xmlnode->name, "h4") == 0) {
/* directory */
bool dir_is_default = false;
title = (char *) xmlNodeGetContent(xmlnode );
@@ -610,7 +610,7 @@ static void tree_url_load_directory(xmlNode *ul, struct tree *tree,
xmlnode = xmlnode->next)
;
if ((xmlnode == NULL) ||
- strcmp((const char *)xmlnode->name, "ul") != 0) {
+ strcasecmp((const char *)xmlnode->name, "ul") != 0) {
/* next element isn't expected ul */
free(title);
warn_user("TreeLoadError", "(Expected "
@@ -620,7 +620,8 @@ static void tree_url_load_directory(xmlNode *ul, struct tree *tree,
id = xmlGetProp(xmlnode,
(const xmlChar *) "id");
if (id != NULL) {
- if(strcmp((const char *)id, "default") == 0)
+ if (strcasecmp((const char *)id,
+ "default") == 0)
dir_is_default = true;
xmlFree(id);
}
diff --git a/framebuffer/nsfont_bold.c b/framebuffer/nsfont_bold.c
index 824b76197..6ea4d71cd 100644
--- a/framebuffer/nsfont_bold.c
+++ b/framebuffer/nsfont_bold.c
@@ -10,7 +10,7 @@
* format and many glyphs added for use in the NetSurf project.
*
* Plain text font data:
- * http://source.netsurf-browser.org/trunk/art/fonts/netsurf/glyph_data
+ * http://source.netsurf-browser.org/?p=art.git;a=blob_plain;f=fonts/netsurf/glyph_data;hb=HEAD
*
* Zap: http://zap.tartarus.org/
* NetSurf: http://www.netsurf-browser.org/
diff --git a/framebuffer/nsfont_italic.c b/framebuffer/nsfont_italic.c
index 29444b2be..9dc29553a 100644
--- a/framebuffer/nsfont_italic.c
+++ b/framebuffer/nsfont_italic.c
@@ -10,7 +10,7 @@
* format and many glyphs added for use in the NetSurf project.
*
* Plain text font data:
- * http://source.netsurf-browser.org/trunk/art/fonts/netsurf/glyph_data
+ * http://source.netsurf-browser.org/?p=art.git;a=blob_plain;f=fonts/netsurf/glyph_data;hb=HEAD
*
* Zap: http://zap.tartarus.org/
* NetSurf: http://www.netsurf-browser.org/
diff --git a/framebuffer/nsfont_italic_bold.c b/framebuffer/nsfont_italic_bold.c
index feb4284c4..d70794668 100644
--- a/framebuffer/nsfont_italic_bold.c
+++ b/framebuffer/nsfont_italic_bold.c
@@ -10,7 +10,7 @@
* format and many glyphs added for use in the NetSurf project.
*
* Plain text font data:
- * http://source.netsurf-browser.org/trunk/art/fonts/netsurf/glyph_data
+ * http://source.netsurf-browser.org/?p=art.git;a=blob_plain;f=fonts/netsurf/glyph_data;hb=HEAD
*
* Zap: http://zap.tartarus.org/
* NetSurf: http://www.netsurf-browser.org/
diff --git a/framebuffer/nsfont_regular.c b/framebuffer/nsfont_regular.c
index eb9259d8c..829e3876b 100644
--- a/framebuffer/nsfont_regular.c
+++ b/framebuffer/nsfont_regular.c
@@ -10,7 +10,7 @@
* format and many glyphs added for use in the NetSurf project.
*
* Plain text font data:
- * http://source.netsurf-browser.org/trunk/art/fonts/netsurf/glyph_data
+ * http://source.netsurf-browser.org/?p=art.git;a=blob_plain;f=fonts/netsurf/glyph_data;hb=HEAD
*
* Zap: http://zap.tartarus.org/
* NetSurf: http://www.netsurf-browser.org/
diff --git a/framebuffer/res/welcome.html b/framebuffer/res/welcome.html
new file mode 120000
index 000000000..5b394445b
--- /dev/null
+++ b/framebuffer/res/welcome.html
@@ -0,0 +1 @@
+../../!NetSurf/Resources/en/welcome.html,faf \ No newline at end of file
diff --git a/gtk/res/en/welcome.html b/gtk/res/en/welcome.html
new file mode 120000
index 000000000..28362130a
--- /dev/null
+++ b/gtk/res/en/welcome.html
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/en/welcome.html,faf \ No newline at end of file
diff --git a/render/box_construct.c b/render/box_construct.c
index 5f8b092c5..fbaa9db5e 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -114,6 +114,7 @@ static bool box_frameset(BOX_SPECIAL_PARAMS);
static bool box_create_frameset(struct content_html_frames *f, dom_node *n,
html_content *content);
static bool box_select_add_option(struct form_control *control, dom_node *n);
+static bool box_noscript(BOX_SPECIAL_PARAMS);
static bool box_object(BOX_SPECIAL_PARAMS);
static bool box_embed(BOX_SPECIAL_PARAMS);
static bool box_pre(BOX_SPECIAL_PARAMS);
@@ -139,6 +140,7 @@ static const struct element_entry element_table[] = {
{"image", box_image},
{"img", box_image},
{"input", box_input},
+ {"noscript", box_noscript},
{"object", box_object},
{"pre", box_pre},
{"select", box_select},
@@ -164,7 +166,7 @@ bool xml_to_box(dom_node *n, html_content *c, box_construct_complete_cb cb)
return false;
ctx->content = c;
- ctx->n = n;
+ ctx->n = dom_node_ref(n);
ctx->root_box = NULL;
ctx->cb = cb;
@@ -384,6 +386,7 @@ static dom_node *next_node(dom_node *n, html_content *content,
dom_node_unref(n);
return NULL;
}
+ dom_node_unref(n);
} else {
err = dom_node_get_next_sibling(n, &next);
if (err != DOM_NO_ERR) {
@@ -421,6 +424,7 @@ static dom_node *next_node(dom_node *n, html_content *content,
if (parent_next != NULL) {
dom_node_unref(parent_next);
+ dom_node_unref(parent);
break;
}
@@ -1750,6 +1754,20 @@ bool box_image(BOX_SPECIAL_PARAMS)
/**
+ * Noscript element
+ */
+
+bool box_noscript(BOX_SPECIAL_PARAMS)
+{
+ /* If scripting is enabled, do not display the contents of noscript */
+ if (nsoption_bool(enable_javascript))
+ *convert_children = false;
+
+ return true;
+}
+
+
+/**
* Destructor for object_params, for <object> elements
*
* \param b The object params being destroyed.
@@ -1923,7 +1941,7 @@ bool box_object(BOX_SPECIAL_PARAMS)
return false;
}
- if (strcmp(dom_string_data(name), "param") != 0) {
+ if (strcasecmp(dom_string_data(name), "param") != 0) {
/* The first non-param child is the start of
* the alt html. Therefore, we should break
* out of this loop. */
@@ -2176,9 +2194,11 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
}
if (type != DOM_ELEMENT_NODE ||
- (strcmp(dom_string_data(name),
+ (strcasecmp(
+ dom_string_data(name),
"frame") != 0 &&
- strcmp(dom_string_data(name),
+ strcasecmp(
+ dom_string_data(name),
"frameset") != 0)) {
err = dom_node_get_next_sibling(c,
&next);
@@ -2209,7 +2229,7 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
return false;
}
- if (strcmp(dom_string_data(s), "frameset") == 0) {
+ if (strcasecmp(dom_string_data(s), "frameset") == 0) {
dom_string_unref(s);
frame->border = 0;
if (box_create_frameset(frame, c,
@@ -2683,14 +2703,14 @@ bool box_select(BOX_SPECIAL_PARAMS)
return false;
}
- if (strcmp(dom_string_data(name), "option") == 0) {
+ if (strcasecmp(dom_string_data(name), "option") == 0) {
dom_string_unref(name);
if (box_select_add_option(gadget, c) == false) {
dom_node_unref(c);
goto no_memory;
}
- } else if (strcmp(dom_string_data(name), "optgroup") == 0) {
+ } else if (strcasecmp(dom_string_data(name), "optgroup") == 0) {
dom_string_unref(name);
err = dom_node_get_first_child(c, &c2);
@@ -2709,7 +2729,7 @@ bool box_select(BOX_SPECIAL_PARAMS)
return false;
}
- if (strcmp(dom_string_data(c2_name),
+ if (strcasecmp(dom_string_data(c2_name),
"option") == 0) {
dom_string_unref(c2_name);
diff --git a/render/html.c b/render/html.c
index 8c11f35b9..31c64edd4 100644
--- a/render/html.c
+++ b/render/html.c
@@ -113,6 +113,9 @@ dom_string *html_dom_string_coords;
dom_string *html_dom_string_circle;
dom_string *html_dom_string_poly;
dom_string *html_dom_string_polygon;
+dom_string *html_dom_string_button;
+dom_string *html_dom_string_input;
+dom_string *html_dom_string_textarea;
static void html_destroy_objects(html_content *html)
@@ -184,6 +187,7 @@ static void html_box_convert_done(html_content *c, bool success)
msg_data.error = messages_get("NoMemory");
content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
content_set_error(&c->base);
+ dom_node_unref(html);
return;
}
/*imagemap_dump(c);*/
@@ -198,6 +202,7 @@ static void html_box_convert_done(html_content *c, bool success)
content_set_done(&c->base);
html_set_status(c, "");
+ dom_node_unref(html);
}
/**
@@ -287,12 +292,15 @@ void html_finish_conversion(html_content *c)
}
if (xml_to_box(html, c, html_box_convert_done) == false) {
+ dom_node_unref(html);
html_destroy_objects(c);
msg_data.error = messages_get("NoMemory");
content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
content_set_error(&c->base);
return;
}
+
+ dom_node_unref(html);
}
@@ -736,18 +744,22 @@ static bool html_head(html_content *c, dom_node *head)
if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) {
exc = dom_node_get_node_name(node, &node_name);
- if ((exc == DOM_NO_ERR) || (node_name != NULL)) {
+ if ((exc == DOM_NO_ERR) && (node_name != NULL)) {
if (dom_string_caseless_isequal(node_name,
- html_dom_string_title)) {
+ html_dom_string_title)) {
html_process_title(c, node);
- } else if (dom_string_caseless_isequal(node_name,
- html_dom_string_base)) {
+ } else if (dom_string_caseless_isequal(
+ node_name,
+ html_dom_string_base)) {
html_process_base(c, node);
- } else if (dom_string_caseless_isequal(node_name,
- html_dom_string_link)) {
+ } else if (dom_string_caseless_isequal(
+ node_name,
+ html_dom_string_link)) {
html_process_link(c, node);
}
}
+ if (node_name != NULL)
+ dom_string_unref(node_name);
}
/* move to next node */
@@ -997,28 +1009,35 @@ static bool html_meta_refresh(html_content *c, dom_node *head)
}
/* Recurse into noscript elements */
- if (strcmp(dom_string_data(name), "noscript") == 0) {
+ if (strcasecmp(dom_string_data(name),
+ "noscript") == 0) {
if (html_meta_refresh(c, n) == false) {
/* Some error occurred */
+ dom_string_unref(name);
dom_node_unref(n);
return false;
} else if (c->base.refresh) {
/* Meta refresh found - stop */
+ dom_string_unref(name);
dom_node_unref(n);
return true;
}
- } else if (strcmp(dom_string_data(name), "meta") == 0) {
+ } else if (strcasecmp(dom_string_data(name),
+ "meta") == 0) {
if (html_meta_refresh_process_element(c,
n) == false) {
/* Some error occurred */
+ dom_string_unref(name);
dom_node_unref(n);
return false;
} else if (c->base.refresh != NULL) {
/* Meta refresh found - stop */
+ dom_string_unref(name);
dom_node_unref(n);
return true;
}
}
+ dom_string_unref(name);
}
exc = dom_node_get_next_sibling(n, &next);
@@ -1436,7 +1455,7 @@ html_process_style_element(html_content *c,
/* type='text/css', or not present (invalid but common) */
exc = dom_element_get_attribute(style, html_dom_string_type, &val);
if (exc == DOM_NO_ERR && val != NULL) {
- if (strcmp(dom_string_data(val), "text/css") != 0) {
+ if (strcasecmp(dom_string_data(val), "text/css") != 0) {
dom_string_unref(val);
return true;
}
@@ -1683,14 +1702,14 @@ html_process_stylesheet(dom_node *node, dom_string *name, void *vctx)
hlcache_child_context child;
/* deal with style nodes */
- if (strcmp(dom_string_data(name), "style") == 0) {
+ if (strcasecmp(dom_string_data(name), "style") == 0) {
if (!html_process_style_element(ctx->c, &ctx->count, node))
return false;
return true;
}
/* if it is not a link node skip it */
- if (strcmp(dom_string_data(name), "link") != 0) {
+ if (strcasecmp(dom_string_data(name), "link") != 0) {
return true;
}
@@ -1713,7 +1732,7 @@ html_process_stylesheet(dom_node *node, dom_string *name, void *vctx)
/* type='text/css' or not present */
exc = dom_element_get_attribute(node, html_dom_string_type, &type_attr);
if (exc == DOM_NO_ERR && type_attr != NULL) {
- if (strcmp(dom_string_data(type_attr), "text/css") != 0) {
+ if (strcasecmp(dom_string_data(type_attr), "text/css") != 0) {
dom_string_unref(type_attr);
return true;
}
@@ -1993,6 +2012,7 @@ static bool html_convert(struct content *c)
LOG(("root element not html"));
msg_data.error = messages_get("ParsingFail");
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ dom_node_unref(html);
return false;
}
dom_string_unref(node_name);
@@ -2041,16 +2061,22 @@ static bool html_convert(struct content *c)
if (html_head(htmlc, head) == false) {
msg_data.error = messages_get("NoMemory");
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ dom_node_unref(html);
+ dom_node_unref(head);
return false;
}
/* handle meta refresh */
- if (html_meta_refresh(htmlc, head) == false)
+ if (html_meta_refresh(htmlc, head) == false) {
+ dom_node_unref(html);
+ dom_node_unref(head);
return false;
+ }
}
/* Retrieve forms from parser */
- htmlc->forms = html_forms_get_forms(htmlc->encoding, htmlc->document);
+ htmlc->forms = html_forms_get_forms(htmlc->encoding,
+ (dom_html_document *) htmlc->document);
for (f = htmlc->forms; f != NULL; f = f->prev) {
char *action;
url_func_result res;
@@ -2068,6 +2094,8 @@ static bool html_convert(struct content *c)
if (res != URL_FUNC_OK) {
msg_data.error = messages_get("NoMemory");
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ dom_node_unref(html);
+ dom_node_unref(head);
return false;
}
@@ -2081,15 +2109,21 @@ static bool html_convert(struct content *c)
msg_data.error = messages_get("NoMemory");
content_broadcast(c, CONTENT_MSG_ERROR,
msg_data);
+ dom_node_unref(html);
+ dom_node_unref(head);
return false;
}
}
}
+ dom_node_unref(head);
/* get stylesheets */
- if (html_find_stylesheets(htmlc, html) == false)
+ if (html_find_stylesheets(htmlc, html) == false) {
+ dom_node_unref(html);
return false;
+ }
+ dom_node_unref(html);
return true;
}
@@ -3137,6 +3171,9 @@ static void html_fini(void)
HTML_DOM_STRING_UNREF(circle);
HTML_DOM_STRING_UNREF(poly);
HTML_DOM_STRING_UNREF(polygon);
+ HTML_DOM_STRING_UNREF(button);
+ HTML_DOM_STRING_UNREF(input);
+ HTML_DOM_STRING_UNREF(textarea);
#undef HTML_DOM_STRING_UNREF
@@ -3266,6 +3303,9 @@ nserror html_init(void)
HTML_DOM_STRING_INTERN(circle);
HTML_DOM_STRING_INTERN(poly);
HTML_DOM_STRING_INTERN(polygon);
+ HTML_DOM_STRING_INTERN(button);
+ HTML_DOM_STRING_INTERN(input);
+ HTML_DOM_STRING_INTERN(textarea);
#undef HTML_DOM_STRING_INTERN
diff --git a/render/html_forms.c b/render/html_forms.c
index 626fe4c0e..284850dc5 100644
--- a/render/html_forms.c
+++ b/render/html_forms.c
@@ -19,6 +19,7 @@
#include "render/form.h"
#include "render/html_internal.h"
+#include "utils/corestrings.h"
#include "utils/log.h"
@@ -258,7 +259,7 @@ out:
static struct form_control *
parse_input_element(struct form *forms, dom_html_input_element *input)
{
- struct form_control *control;
+ struct form_control *control = NULL;
dom_html_form_element *form = NULL;
dom_string *ds_type = NULL;
dom_string *ds_name = NULL;
@@ -392,6 +393,52 @@ out:
}
static struct form_control *
+parse_textarea_element(struct form *forms, dom_html_text_area_element *ta)
+{
+ struct form_control *control = NULL;
+ dom_html_form_element *form = NULL;
+ dom_string *ds_name = NULL;
+
+ char *name = NULL;
+
+ if (dom_html_text_area_element_get_form(ta, &form) != DOM_NO_ERR)
+ goto out;
+
+ if (dom_html_text_area_element_get_name(ta, &ds_name) != DOM_NO_ERR)
+ goto out;
+
+ if (ds_name != NULL)
+ name = strndup(dom_string_data(ds_name),
+ dom_string_byte_length(ds_name));
+
+ control = form_new_control(ta, GADGET_TEXTAREA);
+
+ if (control == NULL)
+ goto out;
+
+ if (name != NULL) {
+ /* Hand the name string over */
+ control->name = name;
+ name = NULL;
+ }
+
+ if (form != NULL && control != NULL)
+ form_add_control(find_form(forms, form), control);
+
+out:
+ if (form != NULL)
+ dom_node_unref(form);
+ if (ds_name != NULL)
+ dom_string_unref(ds_name);
+
+ if (name != NULL)
+ free(name);
+
+
+ return control;
+}
+
+static struct form_control *
invent_fake_gadget(dom_node *node)
{
struct form_control *ctl = form_new_control(node, GADGET_HIDDEN);
@@ -416,7 +463,6 @@ struct form_control *html_forms_get_control_for_node(struct form *forms, dom_nod
struct form_control *ctl = NULL;
dom_exception err;
dom_string *ds_name = NULL;
- char *node_name = NULL;
if (forms == NULL)
return NULL;
@@ -432,18 +478,22 @@ struct form_control *html_forms_get_control_for_node(struct form *forms, dom_nod
/* Step two, extract the node's name so we can construct a gadget. */
err = dom_element_get_tag_name(node, &ds_name);
if (err == DOM_NO_ERR && ds_name != NULL) {
- node_name = strndup(dom_string_data(ds_name),
- dom_string_byte_length(ds_name));
- }
-
- /* Step three, attempt to work out what gadget to make */
- if (node_name && strcasecmp(node_name, "button") == 0)
- ctl = parse_button_element(forms,
- (dom_html_button_element *) node);
- else if (node_name && strcasecmp(node_name, "input") == 0)
- ctl = parse_input_element(forms,
- (dom_html_input_element *) node);
+ /* Step three, attempt to work out what gadget to make */
+ if (dom_string_caseless_lwc_isequal(ds_name,
+ corestring_lwc_button)) {
+ ctl = parse_button_element(forms,
+ (dom_html_button_element *) node);
+ } else if (dom_string_caseless_lwc_isequal(ds_name,
+ corestring_lwc_input)) {
+ ctl = parse_input_element(forms,
+ (dom_html_input_element *) node);
+ } else if (dom_string_caseless_lwc_isequal(ds_name,
+ corestring_lwc_textarea)) {
+ ctl = parse_textarea_element(forms,
+ (dom_html_text_area_element *) node);
+ }
+ }
/* If all else fails, fake gadget time */
if (ctl == NULL)
@@ -451,8 +501,7 @@ struct form_control *html_forms_get_control_for_node(struct form *forms, dom_nod
if (ds_name != NULL)
dom_string_unref(ds_name);
- if (node_name != NULL)
- free(node_name);
+
return ctl;
}
diff --git a/render/html_script.c b/render/html_script.c
index 631dcca1e..5fd8c8acc 100644
--- a/render/html_script.c
+++ b/render/html_script.c
@@ -29,6 +29,7 @@
#include <stdlib.h>
#include "utils/config.h"
+#include "utils/corestrings.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "javascript/js.h"
@@ -77,19 +78,23 @@ static bool html_scripts_exec(html_content *c)
continue;
/* ensure script content fetch status is not an error */
- if (content_get_status(s->data.external) == CONTENT_STATUS_ERROR)
+ if (content_get_status(s->data.external) ==
+ CONTENT_STATUS_ERROR)
continue;
/* ensure script handler for content type */
- script_handler = select_script_handler(content_get_type(s->data.external));
+ script_handler = select_script_handler(
+ content_get_type(s->data.external));
if (script_handler == NULL)
continue; /* unsupported type */
- if (content_get_status(s->data.external) == CONTENT_STATUS_DONE) {
+ if (content_get_status(s->data.external) ==
+ CONTENT_STATUS_DONE) {
/* external script is now available */
const char *data;
unsigned long size;
- data = content_get_source_data(s->data.external, &size );
+ data = content_get_source_data(
+ s->data.external, &size );
script_handler(c->jscontext, data, size);
s->already_started = true;
@@ -236,12 +241,12 @@ html_process_script(void *ctx, dom_node *node)
LOG(("content %p parser %p node %p",c,c->parser, node));
- exc = dom_element_get_attribute(node, html_dom_string_type, &mimetype);
+ exc = dom_element_get_attribute(node, corestring_dom_type, &mimetype);
if (exc != DOM_NO_ERR || mimetype == NULL) {
- mimetype = dom_string_ref(html_dom_string_text_javascript);
+ mimetype = dom_string_ref(corestring_dom_text_javascript);
}
- exc = dom_element_get_attribute(node, html_dom_string_src, &src);
+ exc = dom_element_get_attribute(node, corestring_dom_src, &src);
if (exc != DOM_NO_ERR || src == NULL) {
struct lwc_string_s *lwcmimetype;
script_handler_t *script_handler;
diff --git a/render/imagemap.c b/render/imagemap.c
index 7b612979e..fb1b8cd3f 100644
--- a/render/imagemap.c
+++ b/render/imagemap.c
@@ -32,6 +32,7 @@
#include "render/box.h"
#include "render/html_internal.h"
#include "render/imagemap.h"
+#include "utils/corestrings.h"
#include "utils/log.h"
#include "utils/utils.h"
@@ -258,7 +259,7 @@ imagemap_extract(html_content *c)
unsigned long maybe_maps, mapnr;
exc = dom_document_get_elements_by_tag_name(c->document,
- html_dom_string_map,
+ corestring_dom_map,
&nlist);
if (exc != DOM_NO_ERR) {
return false;
@@ -277,7 +278,7 @@ imagemap_extract(html_content *c)
goto out_nlist;
}
- exc = dom_element_get_attribute(node, html_dom_string_id,
+ exc = dom_element_get_attribute(node, corestring_dom_id,
&name);
if (exc != DOM_NO_ERR) {
dom_node_unref(node);
@@ -286,7 +287,7 @@ imagemap_extract(html_content *c)
if (name == NULL) {
exc = dom_element_get_attribute(node,
- html_dom_string_name,
+ corestring_dom_name,
&name);
if (exc != DOM_NO_ERR) {
dom_node_unref(node);
@@ -391,10 +392,10 @@ bool imagemap_extract_map(dom_node *node, html_content *c,
struct mapentry **entry)
{
if (imagemap_extract_map_entries(node, c, entry,
- html_dom_string_area) == false)
+ corestring_dom_area) == false)
return false;
return imagemap_extract_map_entries(node, c, entry,
- html_dom_string_a);
+ corestring_dom_a);
}
/**
* Adds an imagemap entry to the list
@@ -414,39 +415,38 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
struct mapentry *new_map, *temp;
bool ret = true;
- if (tagtype == html_dom_string_area) {
+ if (dom_string_caseless_isequal(tagtype, corestring_dom_area)) {
bool nohref = false;
exc = dom_element_has_attribute(n,
- html_dom_string_nohref,
- &nohref);
+ corestring_dom_nohref, &nohref);
if ((exc != DOM_NO_ERR) || nohref)
/* Skip <area nohref="anything" /> */
goto ok_out;
}
- exc = dom_element_get_attribute(n, html_dom_string_href, &href);
+ exc = dom_element_get_attribute(n, corestring_dom_href, &href);
if (exc != DOM_NO_ERR) {
/* No href="" attribute, skip this element */
goto ok_out;
}
- exc = dom_element_get_attribute(n, html_dom_string_target, &target);
+ exc = dom_element_get_attribute(n, corestring_dom_target, &target);
if (exc != DOM_NO_ERR) {
goto ok_out;
}
- exc = dom_element_get_attribute(n, html_dom_string_shape, &shape);
+ exc = dom_element_get_attribute(n, corestring_dom_shape, &shape);
if (exc != DOM_NO_ERR) {
goto ok_out;
}
/* If there's no shape, we default to rectangles */
if (shape == NULL)
- shape = dom_string_ref(html_dom_string_rect);
+ shape = dom_string_ref(corestring_dom_rect);
- if (!dom_string_caseless_isequal(shape, html_dom_string_default)) {
+ if (!dom_string_caseless_lwc_isequal(shape, corestring_lwc_default)) {
/* If not 'default' and there's no 'coords' give up */
- exc = dom_element_get_attribute(n, html_dom_string_coords,
+ exc = dom_element_get_attribute(n, corestring_dom_coords,
&coords);
if (exc != DOM_NO_ERR) {
goto ok_out;
@@ -458,15 +458,15 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
goto bad_out;
}
- if (dom_string_caseless_isequal(shape, html_dom_string_rect) ||
- dom_string_caseless_isequal(shape, html_dom_string_rectangle))
+ if (dom_string_caseless_lwc_isequal(shape, corestring_lwc_rect) ||
+ dom_string_caseless_lwc_isequal(shape, corestring_lwc_rectangle))
new_map->type = IMAGEMAP_RECT;
- else if (dom_string_caseless_isequal(shape, html_dom_string_circle))
+ else if (dom_string_caseless_lwc_isequal(shape, corestring_lwc_circle))
new_map->type = IMAGEMAP_CIRCLE;
- else if (dom_string_caseless_isequal(shape, html_dom_string_poly) ||
- dom_string_caseless_isequal(shape, html_dom_string_polygon))
+ else if (dom_string_caseless_lwc_isequal(shape, corestring_lwc_poly) ||
+ dom_string_caseless_lwc_isequal(shape, corestring_lwc_polygon))
new_map->type = IMAGEMAP_POLY;
- else if (dom_string_caseless_isequal(shape, html_dom_string_default))
+ else if (dom_string_caseless_lwc_isequal(shape, corestring_lwc_default))
new_map->type = IMAGEMAP_DEFAULT;
else
goto bad_out;
diff --git a/riscos/gui.c b/riscos/gui.c
index 11f4e1df7..e11679b82 100644
--- a/riscos/gui.c
+++ b/riscos/gui.c
@@ -761,13 +761,11 @@ static void gui_init2(int argc, char** argv)
}
/* default homepage */
else {
- url = calloc(80, sizeof(char));
+ url = strdup(NETSURF_HOMEPAGE);
if (!url) {
LOG(("malloc failed"));
die("Insufficient memory for URL");
}
- snprintf(url, 80, "file:///<NetSurf$Dir>/Docs/welcome/index_%s",
- nsoption_charp(language));
}
if (open_window)
@@ -1825,14 +1823,11 @@ void ro_msg_dataopen(wimp_message *message)
if (len < 9 || strcmp(".!NetSurf",
message->data.data_xfer.file_name + len - 9))
return;
- if (nsoption_charp(homepage_url) && nsoption_charp(homepage_url)[0]) {
+ if (nsoption_charp(homepage_url) &&
+ nsoption_charp(homepage_url)[0]) {
url = strdup(nsoption_charp(homepage_url));
} else {
- url = malloc(80);
- if (url)
- snprintf(url, 80,
- "file:///<NetSurf$Dir>/Docs/welcome/index_%s",
- nsoption_charp(language));
+ url = strdup(NETSURF_HOMEPAGE);
}
if (!url)
warn_user("NoMemory", 0);
@@ -2119,24 +2114,6 @@ void ro_gui_screen_size(int *width, int *height)
/**
- * Opens a language sensitive help page
- *
- * \param page the page to open
- */
-void ro_gui_open_help_page(const char *page)
-{
- char url[80];
- int length;
-
- if ((length = snprintf(url, sizeof url,
- "file:///<NetSurf$Dir>/Docs/%s_%s",
- page, nsoption_charp(language))) >= 0 &&
- length < (int)sizeof(url))
- browser_window_create(url, NULL, 0, true, false);
-}
-
-
-/**
* Send the source of a content to a text editor.
*/
diff --git a/riscos/gui.h b/riscos/gui.h
index 14835274b..cd70a39a0 100644
--- a/riscos/gui.h
+++ b/riscos/gui.h
@@ -114,7 +114,6 @@ extern struct gui_window *ro_gui_current_redraw_gui;
/* in gui.c */
void ro_gui_open_window_request(wimp_open *open);
-void ro_gui_open_help_page(const char *page);
void ro_gui_screen_size(int *width, int *height);
void ro_gui_view_source(struct hlcache_handle *c);
void ro_gui_dump_content(struct hlcache_handle *c);
diff --git a/riscos/iconbar.c b/riscos/iconbar.c
index 9e3a050e1..24d8661cc 100644
--- a/riscos/iconbar.c
+++ b/riscos/iconbar.c
@@ -117,19 +117,16 @@ void ro_gui_iconbar_initialise(void)
bool ro_gui_iconbar_click(wimp_pointer *pointer)
{
- char url[80];
int key_down = 0;
switch (pointer->buttons) {
case wimp_CLICK_SELECT:
if (nsoption_charp(homepage_url) != NULL) {
browser_window_create(nsoption_charp(homepage_url),
- NULL, 0, true, false);
+ NULL, 0, true, false);
} else {
- snprintf(url, sizeof url,
- "file:///<NetSurf$Dir>/Docs/welcome/index_%s",
- nsoption_charp(language));
- browser_window_create(url, NULL, 0, true, false);
+ browser_window_create(NETSURF_HOMEPAGE,
+ NULL, 0, true, false);
}
break;
@@ -186,7 +183,9 @@ bool ro_gui_iconbar_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
switch (action) {
case HELP_OPEN_CONTENTS:
- ro_gui_open_help_page("documentation/index");
+ browser_window_create(
+ "http://www.netsurf-browser.org/documentation/",
+ NULL, 0, true, false);
return true;
case BROWSER_NAVIGATE_URL:
ro_gui_dialog_prepare_open_url();
diff --git a/riscos/window.c b/riscos/window.c
index 78410ac6a..deae43c25 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -1917,7 +1917,9 @@ bool ro_gui_window_handle_local_keypress(struct gui_window *g, wimp_key *key,
switch (c) {
case IS_WIMP_KEY + wimp_KEY_F1: /* Help. */
- ro_gui_open_help_page("documentation/index");
+ browser_window_create(
+ "http://www.netsurf-browser.org/documentation/",
+ NULL, 0, true, false);
return true;
case IS_WIMP_KEY + wimp_KEY_CONTROL + wimp_KEY_F1:
@@ -2642,13 +2644,19 @@ bool ro_gui_window_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
/* help actions */
case HELP_OPEN_CONTENTS:
- ro_gui_open_help_page("documentation/index");
+ browser_window_create(
+ "http://www.netsurf-browser.org/documentation/",
+ NULL, 0, true, false);
break;
case HELP_OPEN_GUIDE:
- ro_gui_open_help_page("documentation/guide");
+ browser_window_create(
+ "http://www.netsurf-browser.org/documentation/guide",
+ NULL, 0, true, false);
break;
case HELP_OPEN_INFORMATION:
- ro_gui_open_help_page("documentation/info");
+ browser_window_create(
+ "http://www.netsurf-browser.org/documentation/info",
+ NULL, 0, true, false);
break;
case HELP_OPEN_CREDITS:
browser_window_create("about:credits", NULL, 0, true, false);
@@ -3882,18 +3890,13 @@ bool ro_gui_window_navigate_up(struct gui_window *g, const char *url) {
void ro_gui_window_action_home(struct gui_window *g)
{
- char url[80];
-
if (g == NULL || g->bw == NULL)
return;
if ((nsoption_charp(homepage_url)) && (nsoption_charp(homepage_url)[0])) {
browser_window_go(g->bw, nsoption_charp(homepage_url), 0, true);
} else {
- snprintf(url, sizeof url,
- "file:///<NetSurf$Dir>/Docs/welcome/index_%s",
- nsoption_charp(language));
- browser_window_go(g->bw, url, 0, true);
+ browser_window_go(g->bw, NETSURF_HOMEPAGE, 0, true);
}
}
diff --git a/utils/corestrings.c b/utils/corestrings.c
new file mode 100644
index 000000000..02b0b53e1
--- /dev/null
+++ b/utils/corestrings.c
@@ -0,0 +1,356 @@
+/*
+ * Copyright 2012 Michael Drake <tlsa@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Useful interned string pointers (implementation).
+ */
+
+#include <dom/dom.h>
+
+#include "utils/corestrings.h"
+#include "utils/utils.h"
+
+/* lwc_string strings */
+lwc_string *corestring_lwc_a;
+lwc_string *corestring_lwc_abscenter;
+lwc_string *corestring_lwc_absmiddle;
+lwc_string *corestring_lwc_align;
+lwc_string *corestring_lwc_applet;
+lwc_string *corestring_lwc_baseline;
+lwc_string *corestring_lwc_body;
+lwc_string *corestring_lwc_bottom;
+lwc_string *corestring_lwc_button;
+lwc_string *corestring_lwc_caption;
+lwc_string *corestring_lwc_center;
+lwc_string *corestring_lwc_circle;
+lwc_string *corestring_lwc_col;
+lwc_string *corestring_lwc_default;
+lwc_string *corestring_lwc_div;
+lwc_string *corestring_lwc_embed;
+lwc_string *corestring_lwc_font;
+lwc_string *corestring_lwc_h1;
+lwc_string *corestring_lwc_h2;
+lwc_string *corestring_lwc_h3;
+lwc_string *corestring_lwc_h4;
+lwc_string *corestring_lwc_h5;
+lwc_string *corestring_lwc_h6;
+lwc_string *corestring_lwc_hr;
+lwc_string *corestring_lwc_iframe;
+lwc_string *corestring_lwc_img;
+lwc_string *corestring_lwc_input;
+lwc_string *corestring_lwc_justify;
+lwc_string *corestring_lwc_left;
+lwc_string *corestring_lwc_middle;
+lwc_string *corestring_lwc_object;
+lwc_string *corestring_lwc_p;
+lwc_string *corestring_lwc_password;
+lwc_string *corestring_lwc_poly;
+lwc_string *corestring_lwc_polygon;
+lwc_string *corestring_lwc_rect;
+lwc_string *corestring_lwc_rectangle;
+lwc_string *corestring_lwc_right;
+lwc_string *corestring_lwc_table;
+lwc_string *corestring_lwc_tbody;
+lwc_string *corestring_lwc_td;
+lwc_string *corestring_lwc_text;
+lwc_string *corestring_lwc_textarea;
+lwc_string *corestring_lwc_texttop;
+lwc_string *corestring_lwc_tfoot;
+lwc_string *corestring_lwc_th;
+lwc_string *corestring_lwc_thead;
+lwc_string *corestring_lwc_top;
+lwc_string *corestring_lwc_tr;
+
+/* dom_string strings */
+dom_string *corestring_dom_a;
+dom_string *corestring_dom_align;
+dom_string *corestring_dom_area;
+dom_string *corestring_dom_background;
+dom_string *corestring_dom_bgcolor;
+dom_string *corestring_dom_border;
+dom_string *corestring_dom_bordercolor;
+dom_string *corestring_dom_cellpadding;
+dom_string *corestring_dom_cellspacing;
+dom_string *corestring_dom_color;
+dom_string *corestring_dom_cols;
+dom_string *corestring_dom_coords;
+dom_string *corestring_dom_height;
+dom_string *corestring_dom_href;
+dom_string *corestring_dom_hspace;
+dom_string *corestring_dom_id;
+dom_string *corestring_dom_link;
+dom_string *corestring_dom_map;
+dom_string *corestring_dom_name;
+dom_string *corestring_dom_nohref;
+dom_string *corestring_dom_rect;
+dom_string *corestring_dom_rows;
+dom_string *corestring_dom_size;
+dom_string *corestring_dom_shape;
+dom_string *corestring_dom_src;
+dom_string *corestring_dom_target;
+dom_string *corestring_dom_text;
+dom_string *corestring_dom_text_javascript;
+dom_string *corestring_dom_type;
+dom_string *corestring_dom_valign;
+dom_string *corestring_dom_vlink;
+dom_string *corestring_dom_vspace;
+dom_string *corestring_dom_width;
+
+
+/*
+ * Free the core strings
+ */
+void corestrings_fini(void)
+{
+#define CSS_LWC_STRING_UNREF(NAME) \
+ do { \
+ if (corestring_lwc_##NAME != NULL) { \
+ lwc_string_unref(corestring_lwc_##NAME); \
+ corestring_lwc_##NAME = NULL; \
+ } \
+ } while (0)
+
+ CSS_LWC_STRING_UNREF(a);
+ CSS_LWC_STRING_UNREF(abscenter);
+ CSS_LWC_STRING_UNREF(absmiddle);
+ CSS_LWC_STRING_UNREF(align);
+ CSS_LWC_STRING_UNREF(applet);
+ CSS_LWC_STRING_UNREF(baseline);
+ CSS_LWC_STRING_UNREF(body);
+ CSS_LWC_STRING_UNREF(bottom);
+ CSS_LWC_STRING_UNREF(button);
+ CSS_LWC_STRING_UNREF(caption);
+ CSS_LWC_STRING_UNREF(center);
+ CSS_LWC_STRING_UNREF(circle);
+ CSS_LWC_STRING_UNREF(col);
+ CSS_LWC_STRING_UNREF(default);
+ CSS_LWC_STRING_UNREF(div);
+ CSS_LWC_STRING_UNREF(embed);
+ CSS_LWC_STRING_UNREF(font);
+ CSS_LWC_STRING_UNREF(h1);
+ CSS_LWC_STRING_UNREF(h2);
+ CSS_LWC_STRING_UNREF(h3);
+ CSS_LWC_STRING_UNREF(h4);
+ CSS_LWC_STRING_UNREF(h5);
+ CSS_LWC_STRING_UNREF(h6);
+ CSS_LWC_STRING_UNREF(hr);
+ CSS_LWC_STRING_UNREF(iframe);
+ CSS_LWC_STRING_UNREF(img);
+ CSS_LWC_STRING_UNREF(input);
+ CSS_LWC_STRING_UNREF(justify);
+ CSS_LWC_STRING_UNREF(left);
+ CSS_LWC_STRING_UNREF(middle);
+ CSS_LWC_STRING_UNREF(object);
+ CSS_LWC_STRING_UNREF(p);
+ CSS_LWC_STRING_UNREF(password);
+ CSS_LWC_STRING_UNREF(poly);
+ CSS_LWC_STRING_UNREF(polygon);
+ CSS_LWC_STRING_UNREF(rect);
+ CSS_LWC_STRING_UNREF(rectangle);
+ CSS_LWC_STRING_UNREF(right);
+ CSS_LWC_STRING_UNREF(table);
+ CSS_LWC_STRING_UNREF(tbody);
+ CSS_LWC_STRING_UNREF(td);
+ CSS_LWC_STRING_UNREF(text);
+ CSS_LWC_STRING_UNREF(textarea);
+ CSS_LWC_STRING_UNREF(texttop);
+ CSS_LWC_STRING_UNREF(tfoot);
+ CSS_LWC_STRING_UNREF(th);
+ CSS_LWC_STRING_UNREF(thead);
+ CSS_LWC_STRING_UNREF(top);
+ CSS_LWC_STRING_UNREF(tr);
+#undef CSS_LWC_STRING_UNREF
+
+#define CSS_DOM_STRING_UNREF(NAME) \
+ do { \
+ if (corestring_dom_##NAME != NULL) { \
+ dom_string_unref(corestring_dom_##NAME); \
+ corestring_dom_##NAME = NULL; \
+ } \
+ } while (0)
+
+ CSS_DOM_STRING_UNREF(a);
+ CSS_DOM_STRING_UNREF(align);
+ CSS_DOM_STRING_UNREF(area);
+ CSS_DOM_STRING_UNREF(background);
+ CSS_DOM_STRING_UNREF(bgcolor);
+ CSS_DOM_STRING_UNREF(border);
+ CSS_DOM_STRING_UNREF(bordercolor);
+ CSS_DOM_STRING_UNREF(cellpadding);
+ CSS_DOM_STRING_UNREF(cellspacing);
+ CSS_DOM_STRING_UNREF(color);
+ CSS_DOM_STRING_UNREF(cols);
+ CSS_DOM_STRING_UNREF(coords);
+ CSS_DOM_STRING_UNREF(height);
+ CSS_DOM_STRING_UNREF(href);
+ CSS_DOM_STRING_UNREF(hspace);
+ CSS_DOM_STRING_UNREF(id);
+ CSS_DOM_STRING_UNREF(link);
+ CSS_DOM_STRING_UNREF(map);
+ CSS_DOM_STRING_UNREF(name);
+ CSS_DOM_STRING_UNREF(nohref);
+ CSS_DOM_STRING_UNREF(rect);
+ CSS_DOM_STRING_UNREF(rows);
+ CSS_DOM_STRING_UNREF(size);
+ CSS_DOM_STRING_UNREF(shape);
+ CSS_DOM_STRING_UNREF(src);
+ CSS_DOM_STRING_UNREF(target);
+ CSS_DOM_STRING_UNREF(text);
+ CSS_DOM_STRING_UNREF(text_javascript);
+ CSS_DOM_STRING_UNREF(type);
+ CSS_DOM_STRING_UNREF(valign);
+ CSS_DOM_STRING_UNREF(vlink);
+ CSS_DOM_STRING_UNREF(vspace);
+ CSS_DOM_STRING_UNREF(width);
+#undef CSS_DOM_STRING_UNREF
+}
+
+
+/*
+ * Create the core strings
+ */
+nserror corestrings_init(void)
+{
+ lwc_error lerror;
+ nserror error;
+ dom_exception exc;
+
+#define CSS_LWC_STRING_INTERN(NAME) \
+ do { \
+ lerror = lwc_intern_string( \
+ (const char *)#NAME, \
+ sizeof(#NAME) - 1, \
+ &corestring_lwc_##NAME ); \
+ if ((lerror != lwc_error_ok) || \
+ (corestring_lwc_##NAME == NULL)) { \
+ error = NSERROR_NOMEM; \
+ goto error; \
+ } \
+ } while(0)
+
+ CSS_LWC_STRING_INTERN(a);
+ CSS_LWC_STRING_INTERN(abscenter);
+ CSS_LWC_STRING_INTERN(absmiddle);
+ CSS_LWC_STRING_INTERN(align);
+ CSS_LWC_STRING_INTERN(applet);
+ CSS_LWC_STRING_INTERN(baseline);
+ CSS_LWC_STRING_INTERN(body);
+ CSS_LWC_STRING_INTERN(bottom);
+ CSS_LWC_STRING_INTERN(button);
+ CSS_LWC_STRING_INTERN(caption);
+ CSS_LWC_STRING_INTERN(center);
+ CSS_LWC_STRING_INTERN(circle);
+ CSS_LWC_STRING_INTERN(col);
+ CSS_LWC_STRING_INTERN(default);
+ CSS_LWC_STRING_INTERN(div);
+ CSS_LWC_STRING_INTERN(embed);
+ CSS_LWC_STRING_INTERN(font);
+ CSS_LWC_STRING_INTERN(h1);
+ CSS_LWC_STRING_INTERN(h2);
+ CSS_LWC_STRING_INTERN(h3);
+ CSS_LWC_STRING_INTERN(h4);
+ CSS_LWC_STRING_INTERN(h5);
+ CSS_LWC_STRING_INTERN(h6);
+ CSS_LWC_STRING_INTERN(hr);
+ CSS_LWC_STRING_INTERN(iframe);
+ CSS_LWC_STRING_INTERN(img);
+ CSS_LWC_STRING_INTERN(input);
+ CSS_LWC_STRING_INTERN(justify);
+ CSS_LWC_STRING_INTERN(left);
+ CSS_LWC_STRING_INTERN(middle);
+ CSS_LWC_STRING_INTERN(object);
+ CSS_LWC_STRING_INTERN(p);
+ CSS_LWC_STRING_INTERN(password);
+ CSS_LWC_STRING_INTERN(poly);
+ CSS_LWC_STRING_INTERN(polygon);
+ CSS_LWC_STRING_INTERN(rect);
+ CSS_LWC_STRING_INTERN(rectangle);
+ CSS_LWC_STRING_INTERN(right);
+ CSS_LWC_STRING_INTERN(table);
+ CSS_LWC_STRING_INTERN(tbody);
+ CSS_LWC_STRING_INTERN(td);
+ CSS_LWC_STRING_INTERN(text);
+ CSS_LWC_STRING_INTERN(textarea);
+ CSS_LWC_STRING_INTERN(texttop);
+ CSS_LWC_STRING_INTERN(tfoot);
+ CSS_LWC_STRING_INTERN(th);
+ CSS_LWC_STRING_INTERN(thead);
+ CSS_LWC_STRING_INTERN(top);
+ CSS_LWC_STRING_INTERN(tr);
+#undef CSS_LWC_STRING_INTERN
+
+#define CSS_DOM_STRING_INTERN(NAME) \
+ do { \
+ exc = dom_string_create_interned( \
+ (const uint8_t *)#NAME, \
+ sizeof(#NAME) - 1, \
+ &corestring_dom_##NAME ); \
+ if ((exc != DOM_NO_ERR) || \
+ (corestring_dom_##NAME == NULL)) { \
+ error = NSERROR_NOMEM; \
+ goto error; \
+ } \
+ } while(0)
+
+ CSS_DOM_STRING_INTERN(a);
+ CSS_DOM_STRING_INTERN(align);
+ CSS_DOM_STRING_INTERN(area);
+ CSS_DOM_STRING_INTERN(background);
+ CSS_DOM_STRING_INTERN(bgcolor);
+ CSS_DOM_STRING_INTERN(border);
+ CSS_DOM_STRING_INTERN(bordercolor);
+ CSS_DOM_STRING_INTERN(cellpadding);
+ CSS_DOM_STRING_INTERN(cellspacing);
+ CSS_DOM_STRING_INTERN(color);
+ CSS_DOM_STRING_INTERN(cols);
+ CSS_DOM_STRING_INTERN(coords);
+ CSS_DOM_STRING_INTERN(height);
+ CSS_DOM_STRING_INTERN(href);
+ CSS_DOM_STRING_INTERN(hspace);
+ CSS_DOM_STRING_INTERN(id);
+ CSS_DOM_STRING_INTERN(link);
+ CSS_DOM_STRING_INTERN(map);
+ CSS_DOM_STRING_INTERN(name);
+ CSS_DOM_STRING_INTERN(nohref);
+ CSS_DOM_STRING_INTERN(rect);
+ CSS_DOM_STRING_INTERN(rows);
+ CSS_DOM_STRING_INTERN(size);
+ CSS_DOM_STRING_INTERN(shape);
+ CSS_DOM_STRING_INTERN(src);
+ CSS_DOM_STRING_INTERN(target);
+ CSS_DOM_STRING_INTERN(text);
+ CSS_DOM_STRING_INTERN(type);
+ CSS_DOM_STRING_INTERN(valign);
+ CSS_DOM_STRING_INTERN(vlink);
+ CSS_DOM_STRING_INTERN(vspace);
+ CSS_DOM_STRING_INTERN(width);
+#undef CSS_DOM_STRING_INTERN
+
+ exc = dom_string_create_interned((const uint8_t *) "text/javascript",
+ SLEN("text/javascript"),
+ &corestring_dom_text_javascript);
+ if ((exc != DOM_NO_ERR) || (corestring_dom_text_javascript == NULL))
+ goto error;
+
+ return NSERROR_OK;
+
+error:
+ corestrings_fini();
+
+ return error;
+}
diff --git a/utils/corestrings.h b/utils/corestrings.h
new file mode 100644
index 000000000..2986eb140
--- /dev/null
+++ b/utils/corestrings.h
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2012 Michael Drake <tlsa@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Useful interned string pointers (interface).
+ */
+
+#ifndef NETSURF_UTILS_CORESTRINGS_H_
+#define NETSURF_UTILS_CORESTRINGS_H_
+
+#include <libwapcaplet/libwapcaplet.h>
+#include "utils/errors.h"
+
+nserror corestrings_init(void);
+void corestrings_fini(void);
+
+/* lwc_string strings */
+extern lwc_string *corestring_lwc_a;
+extern lwc_string *corestring_lwc_abscenter;
+extern lwc_string *corestring_lwc_absmiddle;
+extern lwc_string *corestring_lwc_align;
+extern lwc_string *corestring_lwc_applet;
+extern lwc_string *corestring_lwc_baseline;
+extern lwc_string *corestring_lwc_body;
+extern lwc_string *corestring_lwc_bottom;
+extern lwc_string *corestring_lwc_button;
+extern lwc_string *corestring_lwc_caption;
+extern lwc_string *corestring_lwc_center;
+extern lwc_string *corestring_lwc_circle;
+extern lwc_string *corestring_lwc_col;
+extern lwc_string *corestring_lwc_default;
+extern lwc_string *corestring_lwc_div;
+extern lwc_string *corestring_lwc_embed;
+extern lwc_string *corestring_lwc_font;
+extern lwc_string *corestring_lwc_h1;
+extern lwc_string *corestring_lwc_h2;
+extern lwc_string *corestring_lwc_h3;
+extern lwc_string *corestring_lwc_h4;
+extern lwc_string *corestring_lwc_h5;
+extern lwc_string *corestring_lwc_h6;
+extern lwc_string *corestring_lwc_hr;
+extern lwc_string *corestring_lwc_iframe;
+extern lwc_string *corestring_lwc_img;
+extern lwc_string *corestring_lwc_input;
+extern lwc_string *corestring_lwc_justify;
+extern lwc_string *corestring_lwc_left;
+extern lwc_string *corestring_lwc_middle;
+extern lwc_string *corestring_lwc_object;
+extern lwc_string *corestring_lwc_p;
+extern lwc_string *corestring_lwc_password;
+extern lwc_string *corestring_lwc_poly;
+extern lwc_string *corestring_lwc_polygon;
+extern lwc_string *corestring_lwc_rect;
+extern lwc_string *corestring_lwc_rectangle;
+extern lwc_string *corestring_lwc_right;
+extern lwc_string *corestring_lwc_table;
+extern lwc_string *corestring_lwc_tbody;
+extern lwc_string *corestring_lwc_td;
+extern lwc_string *corestring_lwc_text;
+extern lwc_string *corestring_lwc_textarea;
+extern lwc_string *corestring_lwc_texttop;
+extern lwc_string *corestring_lwc_tfoot;
+extern lwc_string *corestring_lwc_th;
+extern lwc_string *corestring_lwc_thead;
+extern lwc_string *corestring_lwc_top;
+extern lwc_string *corestring_lwc_tr;
+
+struct dom_string;
+
+/* dom_string strings */
+extern struct dom_string *corestring_dom_a;
+extern struct dom_string *corestring_dom_align;
+extern struct dom_string *corestring_dom_area;
+extern struct dom_string *corestring_dom_background;
+extern struct dom_string *corestring_dom_bgcolor;
+extern struct dom_string *corestring_dom_border;
+extern struct dom_string *corestring_dom_bordercolor;
+extern struct dom_string *corestring_dom_cellpadding;
+extern struct dom_string *corestring_dom_cellspacing;
+extern struct dom_string *corestring_dom_color;
+extern struct dom_string *corestring_dom_cols;
+extern struct dom_string *corestring_dom_coords;
+extern struct dom_string *corestring_dom_height;
+extern struct dom_string *corestring_dom_href;
+extern struct dom_string *corestring_dom_hspace;
+extern struct dom_string *corestring_dom_id;
+extern struct dom_string *corestring_dom_link;
+extern struct dom_string *corestring_dom_map;
+extern struct dom_string *corestring_dom_name;
+extern struct dom_string *corestring_dom_nohref;
+extern struct dom_string *corestring_dom_rect;
+extern struct dom_string *corestring_dom_rows;
+extern struct dom_string *corestring_dom_size;
+extern struct dom_string *corestring_dom_shape;
+extern struct dom_string *corestring_dom_src;
+extern struct dom_string *corestring_dom_target;
+extern struct dom_string *corestring_dom_text;
+extern struct dom_string *corestring_dom_text_javascript;
+extern struct dom_string *corestring_dom_type;
+extern struct dom_string *corestring_dom_valign;
+extern struct dom_string *corestring_dom_vlink;
+extern struct dom_string *corestring_dom_vspace;
+extern struct dom_string *corestring_dom_width;
+
+#endif
diff --git a/utils/git-testament.pl b/utils/git-testament.pl
index dc6301b50..89c41ab5e 100644
--- a/utils/git-testament.pl
+++ b/utils/git-testament.pl
@@ -68,7 +68,7 @@ if ( $git_present ) {
chomp $gitinfo{url};
$gitinfo{revision} = `git rev-parse HEAD`;
chomp $gitinfo{revision};
- $gitinfo{branch} = `git for-each-ref --format="\%(refname:short)" \$(git symbolic-ref HEAD)`;
+ $gitinfo{branch} = `git for-each-ref --format="\%(refname:short)" \$(git symbolic-ref HEAD 2>/dev/null || git show-ref -s HEAD)`;
chomp $gitinfo{branch};
@bits = split /\s+/, `git describe --tags --exact-match HEAD 2>/dev/null`;
$bits[0] = "" unless exists $bits[0];