netsurf: branch master updated. release/3.9-446-ge8e7485
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/e8e7485089763716f645b...
...commit http://git.netsurf-browser.org/netsurf.git/commit/e8e7485089763716f645be2...
...tree http://git.netsurf-browser.org/netsurf.git/tree/e8e7485089763716f645be2bf...
The branch, master has been updated
via e8e7485089763716f645be2bf3d55bff8b4b0659 (commit)
via f9b80469e0ee0b07a93d63c5d0cfb47c786ca4ab (commit)
from 98c1bd1b5cc63e10b458dedf76264b7ba09c2c41 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=e8e7485089763716f64...
commit e8e7485089763716f645be2bf3d55bff8b4b0659
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
test: Increase window destroy timeout to 30s by default
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/test/monkey_driver.py b/test/monkey_driver.py
index 2a9234d..20d4994 100755
--- a/test/monkey_driver.py
+++ b/test/monkey_driver.py
@@ -265,7 +265,7 @@ def run_test_step_action_window_close(ctx, step):
tag = step['window']
assert ctx['windows'].get(tag) is not None
win = ctx['windows'].pop(tag)
- timeout = int(step.get('timeout', 5))
+ timeout = int(step.get('timeout', 30))
win.kill()
win.wait_until_dead(timeout=timeout)
assert not win.alive
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=f9b80469e0ee0b07a93...
commit f9b80469e0ee0b07a93d63c5d0cfb47c786ca4ab
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
test: Extra info when windows don't destroy quickly
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/test/monkeyfarmer.py b/test/monkeyfarmer.py
index e5e6397..fbcd748 100644
--- a/test/monkeyfarmer.py
+++ b/test/monkeyfarmer.py
@@ -464,6 +464,10 @@ class BrowserWindow:
while self.alive:
self.browser.farmer.loop(once=True)
if (time.time() - now) > timeout:
+ print("*** Timed out waiting for window to be destroyed")
+ print("*** URL was: {}".format(self.url))
+ print("*** Title was: {}".format(self.title))
+ print("*** Status was: {}".format(self.status))
break
def go(self, url, referer=None):
-----------------------------------------------------------------------
Summary of changes:
test/monkey_driver.py | 2 +-
test/monkeyfarmer.py | 4 ++++
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/test/monkey_driver.py b/test/monkey_driver.py
index 2a9234d..20d4994 100755
--- a/test/monkey_driver.py
+++ b/test/monkey_driver.py
@@ -265,7 +265,7 @@ def run_test_step_action_window_close(ctx, step):
tag = step['window']
assert ctx['windows'].get(tag) is not None
win = ctx['windows'].pop(tag)
- timeout = int(step.get('timeout', 5))
+ timeout = int(step.get('timeout', 30))
win.kill()
win.wait_until_dead(timeout=timeout)
assert not win.alive
diff --git a/test/monkeyfarmer.py b/test/monkeyfarmer.py
index e5e6397..fbcd748 100644
--- a/test/monkeyfarmer.py
+++ b/test/monkeyfarmer.py
@@ -464,6 +464,10 @@ class BrowserWindow:
while self.alive:
self.browser.farmer.loop(once=True)
if (time.time() - now) > timeout:
+ print("*** Timed out waiting for window to be destroyed")
+ print("*** URL was: {}".format(self.url))
+ print("*** Title was: {}".format(self.title))
+ print("*** Status was: {}".format(self.status))
break
def go(self, url, referer=None):
--
NetSurf Browser
2 years, 11 months
netsurf: branch master updated. release/3.9-444-g98c1bd1
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/98c1bd1b5cc63e10b458d...
...commit http://git.netsurf-browser.org/netsurf.git/commit/98c1bd1b5cc63e10b458ded...
...tree http://git.netsurf-browser.org/netsurf.git/tree/98c1bd1b5cc63e10b458dedf7...
The branch, master has been updated
via 98c1bd1b5cc63e10b458dedf76264b7ba09c2c41 (commit)
from f39ce1a26229a392f193e463b70ae88d0dc11508 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=98c1bd1b5cc63e10b45...
commit 98c1bd1b5cc63e10b458dedf76264b7ba09c2c41
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
GTK: Update preferences dialog to use GtkBox
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/frontends/gtk/res/options.gtk3.ui b/frontends/gtk/res/options.gtk3.ui
index 4d3a426..82a3e17 100644
--- a/frontends/gtk/res/options.gtk3.ui
+++ b/frontends/gtk/res/options.gtk3.ui
@@ -143,9 +143,10 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
- <object class="GtkVBox" id="vbox_main">
+ <object class="GtkBox" id="vbox_main">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="valign">start</property>
<property name="spacing">6</property>
<child>
@@ -162,14 +163,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox2">
+ <object class="GtkBox" id="vbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
- <object class="GtkHBox" id="hbox1">
+ <object class="GtkBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label_startup_page">
@@ -207,9 +210,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox2">
+ <object class="GtkBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<placeholder/>
@@ -289,9 +293,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox3">
+ <object class="GtkBox" id="vbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkUrlSearch">
@@ -314,9 +319,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox3">
+ <object class="GtkBox" id="hbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label5">
@@ -393,9 +399,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox4">
+ <object class="GtkBox" id="vbox4">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkClearDownloads">
@@ -438,9 +445,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox4">
+ <object class="GtkBox" id="hbox4">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label8">
@@ -510,9 +518,10 @@
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox_appearance">
+ <object class="GtkBox" id="vbox_appearance">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="valign">start</property>
<property name="spacing">6</property>
<child>
@@ -529,9 +538,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox5">
+ <object class="GtkBox" id="vbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkShowSingleTab">
@@ -594,9 +604,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox5">
+ <object class="GtkBox" id="hbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label9">
@@ -672,14 +683,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox1">
+ <object class="GtkBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
- <object class="GtkHBox" id="hbox6">
+ <object class="GtkBox" id="hbox6">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label13">
@@ -755,9 +768,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox7">
+ <object class="GtkBox" id="vbox7">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkDisplayRecentURLs">
@@ -813,14 +827,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox8">
+ <object class="GtkBox" id="vbox8">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
- <object class="GtkHBox" id="hbox7">
+ <object class="GtkBox" id="hbox7">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label16">
@@ -899,10 +915,11 @@
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox_content">
+ <object class="GtkBox" id="vbox_content">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_content_control">
@@ -918,9 +935,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox6">
+ <object class="GtkBox" id="vbox6">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkDisablePopups">
@@ -983,9 +1001,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox8">
+ <object class="GtkBox" id="hbox8">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label17">
@@ -1061,9 +1080,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox9">
+ <object class="GtkBox" id="vbox9">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkEnableAnimations">
@@ -1119,14 +1139,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkHBox" id="hbox11">
+ <object class="GtkBox" id="hbox11">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
- <object class="GtkHBox" id="hbox12">
+ <object class="GtkBox" id="hbox12">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label26">
@@ -1168,9 +1190,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox13">
+ <object class="GtkBox" id="hbox13">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label27">
@@ -1264,14 +1287,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox10">
+ <object class="GtkBox" id="vbox10">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
- <object class="GtkHBox" id="hbox10">
+ <object class="GtkBox" id="hbox10">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label21">
@@ -1361,10 +1386,11 @@
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox_privacy">
+ <object class="GtkBox" id="vbox_privacy">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_privacy_general">
@@ -1380,9 +1406,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox15">
+ <object class="GtkBox" id="vbox15">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkSendReferer">
@@ -1458,9 +1485,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox11">
+ <object class="GtkBox" id="vbox11">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkHoverURLs">
@@ -1483,9 +1511,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox14">
+ <object class="GtkBox" id="hbox14">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label28">
@@ -1572,9 +1601,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox12">
+ <object class="GtkBox" id="vbox12">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkTable" id="table3">
@@ -1730,9 +1760,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox17">
+ <object class="GtkBox" id="hbox17">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<child>
<placeholder/>
</child>
@@ -1796,10 +1827,11 @@
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox_network">
+ <object class="GtkBox" id="vbox_network">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_network_proxy">
@@ -1894,9 +1926,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox19">
+ <object class="GtkBox" id="hbox19">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkEntry" id="entryProxyHost">
@@ -2200,10 +2233,11 @@
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox_pdfexport">
+ <object class="GtkBox" id="vbox_pdfexport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_pdfexport_appearance">
@@ -2219,9 +2253,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox13">
+ <object class="GtkBox" id="vbox13">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkSuppressImages">
@@ -2284,9 +2319,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox15">
+ <object class="GtkBox" id="hbox15">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label59">
@@ -2373,14 +2409,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox16">
+ <object class="GtkBox" id="vbox16">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
- <object class="GtkHBox" id="hbox22">
+ <object class="GtkBox" id="hbox22">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<child>
<object class="GtkLabel" id="label62">
<property name="visible">True</property>
@@ -2419,9 +2457,10 @@
<placeholder/>
</child>
<child>
- <object class="GtkHBox" id="hbox16">
+ <object class="GtkBox" id="hbox16">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label51">
@@ -2463,9 +2502,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox18">
+ <object class="GtkBox" id="hbox18">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label52">
@@ -2508,9 +2548,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox20">
+ <object class="GtkBox" id="hbox20">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label53">
@@ -2554,9 +2595,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox21">
+ <object class="GtkBox" id="hbox21">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label54">
@@ -2661,9 +2703,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox14">
+ <object class="GtkBox" id="vbox14">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">7</property>
<child>
<object class="GtkCheckButton" id="checkCompressPDF">
-----------------------------------------------------------------------
Summary of changes:
frontends/gtk/res/options.gtk3.ui | 129 ++++++++++++++++++++++++-------------
1 file changed, 86 insertions(+), 43 deletions(-)
diff --git a/frontends/gtk/res/options.gtk3.ui b/frontends/gtk/res/options.gtk3.ui
index 4d3a426..82a3e17 100644
--- a/frontends/gtk/res/options.gtk3.ui
+++ b/frontends/gtk/res/options.gtk3.ui
@@ -143,9 +143,10 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
- <object class="GtkVBox" id="vbox_main">
+ <object class="GtkBox" id="vbox_main">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="valign">start</property>
<property name="spacing">6</property>
<child>
@@ -162,14 +163,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox2">
+ <object class="GtkBox" id="vbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
- <object class="GtkHBox" id="hbox1">
+ <object class="GtkBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label_startup_page">
@@ -207,9 +210,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox2">
+ <object class="GtkBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<placeholder/>
@@ -289,9 +293,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox3">
+ <object class="GtkBox" id="vbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkUrlSearch">
@@ -314,9 +319,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox3">
+ <object class="GtkBox" id="hbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label5">
@@ -393,9 +399,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox4">
+ <object class="GtkBox" id="vbox4">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkClearDownloads">
@@ -438,9 +445,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox4">
+ <object class="GtkBox" id="hbox4">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label8">
@@ -510,9 +518,10 @@
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox_appearance">
+ <object class="GtkBox" id="vbox_appearance">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="valign">start</property>
<property name="spacing">6</property>
<child>
@@ -529,9 +538,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox5">
+ <object class="GtkBox" id="vbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkShowSingleTab">
@@ -594,9 +604,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox5">
+ <object class="GtkBox" id="hbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label9">
@@ -672,14 +683,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox1">
+ <object class="GtkBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
- <object class="GtkHBox" id="hbox6">
+ <object class="GtkBox" id="hbox6">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label13">
@@ -755,9 +768,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox7">
+ <object class="GtkBox" id="vbox7">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkDisplayRecentURLs">
@@ -813,14 +827,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox8">
+ <object class="GtkBox" id="vbox8">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
- <object class="GtkHBox" id="hbox7">
+ <object class="GtkBox" id="hbox7">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label16">
@@ -899,10 +915,11 @@
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox_content">
+ <object class="GtkBox" id="vbox_content">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_content_control">
@@ -918,9 +935,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox6">
+ <object class="GtkBox" id="vbox6">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkDisablePopups">
@@ -983,9 +1001,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox8">
+ <object class="GtkBox" id="hbox8">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label17">
@@ -1061,9 +1080,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox9">
+ <object class="GtkBox" id="vbox9">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkEnableAnimations">
@@ -1119,14 +1139,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkHBox" id="hbox11">
+ <object class="GtkBox" id="hbox11">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
- <object class="GtkHBox" id="hbox12">
+ <object class="GtkBox" id="hbox12">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label26">
@@ -1168,9 +1190,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox13">
+ <object class="GtkBox" id="hbox13">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label27">
@@ -1264,14 +1287,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox10">
+ <object class="GtkBox" id="vbox10">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
- <object class="GtkHBox" id="hbox10">
+ <object class="GtkBox" id="hbox10">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label21">
@@ -1361,10 +1386,11 @@
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox_privacy">
+ <object class="GtkBox" id="vbox_privacy">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_privacy_general">
@@ -1380,9 +1406,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox15">
+ <object class="GtkBox" id="vbox15">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkSendReferer">
@@ -1458,9 +1485,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox11">
+ <object class="GtkBox" id="vbox11">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkHoverURLs">
@@ -1483,9 +1511,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox14">
+ <object class="GtkBox" id="hbox14">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label28">
@@ -1572,9 +1601,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox12">
+ <object class="GtkBox" id="vbox12">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkTable" id="table3">
@@ -1730,9 +1760,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox17">
+ <object class="GtkBox" id="hbox17">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<child>
<placeholder/>
</child>
@@ -1796,10 +1827,11 @@
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox_network">
+ <object class="GtkBox" id="vbox_network">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_network_proxy">
@@ -1894,9 +1926,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox19">
+ <object class="GtkBox" id="hbox19">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkEntry" id="entryProxyHost">
@@ -2200,10 +2233,11 @@
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox_pdfexport">
+ <object class="GtkBox" id="vbox_pdfexport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_pdfexport_appearance">
@@ -2219,9 +2253,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox13">
+ <object class="GtkBox" id="vbox13">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkSuppressImages">
@@ -2284,9 +2319,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox15">
+ <object class="GtkBox" id="hbox15">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label59">
@@ -2373,14 +2409,16 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox16">
+ <object class="GtkBox" id="vbox16">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
- <object class="GtkHBox" id="hbox22">
+ <object class="GtkBox" id="hbox22">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<child>
<object class="GtkLabel" id="label62">
<property name="visible">True</property>
@@ -2419,9 +2457,10 @@
<placeholder/>
</child>
<child>
- <object class="GtkHBox" id="hbox16">
+ <object class="GtkBox" id="hbox16">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label51">
@@ -2463,9 +2502,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox18">
+ <object class="GtkBox" id="hbox18">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label52">
@@ -2508,9 +2548,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox20">
+ <object class="GtkBox" id="hbox20">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label53">
@@ -2554,9 +2595,10 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox21">
+ <object class="GtkBox" id="hbox21">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label54">
@@ -2661,9 +2703,10 @@
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox14">
+ <object class="GtkBox" id="vbox14">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">7</property>
<child>
<object class="GtkCheckButton" id="checkCompressPDF">
--
NetSurf Browser
2 years, 11 months
libdom: branch master updated. release/0.4.0-12-g36937ce
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libdom.git/shortlog/36937ce1ad1417b7ca08b5...
...commit http://git.netsurf-browser.org/libdom.git/commit/36937ce1ad1417b7ca08b565...
...tree http://git.netsurf-browser.org/libdom.git/tree/36937ce1ad1417b7ca08b56502...
The branch, master has been updated
via 36937ce1ad1417b7ca08b565023dc345b168291d (commit)
from 38c82c0d1e4474aff9b601fcf6ba9578396346b9 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=36937ce1ad1417b7ca08...
commit 36937ce1ad1417b7ca08b565023dc345b168291d
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Node: Add a NULL guard to hopefully calm scan-build
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/src/core/node.c b/src/core/node.c
index 9ba277e..b471725 100644
--- a/src/core/node.c
+++ b/src/core/node.c
@@ -2218,7 +2218,7 @@ void _dom_node_replace(dom_node_internal *old,
else
old->parent->last_child = last;
- for (n = first; n != last->next; n = n->next) {
+ for (n = first; n != NULL && n != last->next; n = n->next) {
n->parent = old->parent;
}
-----------------------------------------------------------------------
Summary of changes:
src/core/node.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/core/node.c b/src/core/node.c
index 9ba277e..b471725 100644
--- a/src/core/node.c
+++ b/src/core/node.c
@@ -2218,7 +2218,7 @@ void _dom_node_replace(dom_node_internal *old,
else
old->parent->last_child = last;
- for (n = first; n != last->next; n = n->next) {
+ for (n = first; n != NULL && n != last->next; n = n->next) {
n->parent = old->parent;
}
--
Document Object Model library
2 years, 11 months
netsurf: branch master updated. release/3.9-443-gf39ce1a
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/f39ce1a26229a392f193e...
...commit http://git.netsurf-browser.org/netsurf.git/commit/f39ce1a26229a392f193e46...
...tree http://git.netsurf-browser.org/netsurf.git/tree/f39ce1a26229a392f193e463b...
The branch, master has been updated
via f39ce1a26229a392f193e463b70ae88d0dc11508 (commit)
via 194dfad4a5ca36bf39bd1c20c874747991f9281c (commit)
from e87bc1bfdacd145f106bc2598997b91f4b177092 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=f39ce1a26229a392f19...
commit f39ce1a26229a392f193e463b70ae88d0dc11508
Author: Michael Drake <michael.drake(a)codethink.co.uk>
Commit: Michael Drake <michael.drake(a)codethink.co.uk>
Browser window: Constify the bw in the URL access function.
diff --git a/desktop/browser_window.c b/desktop/browser_window.c
index dba3d31..838e62d 100644
--- a/desktop/browser_window.c
+++ b/desktop/browser_window.c
@@ -3788,7 +3788,7 @@ nserror browser_window_navigate_up(struct browser_window *bw, bool new_window)
/* Exported interface, documented in include/netsurf/browser_window.h */
-nsurl* browser_window_access_url(struct browser_window *bw)
+nsurl* browser_window_access_url(const struct browser_window *bw)
{
assert(bw != NULL);
diff --git a/include/netsurf/browser_window.h b/include/netsurf/browser_window.h
index f8b86d0..7b2f652 100644
--- a/include/netsurf/browser_window.h
+++ b/include/netsurf/browser_window.h
@@ -231,7 +231,7 @@ nserror browser_window_navigate_up(struct browser_window *bw, bool new_window);
*
* \note guaranteed to return a valid nsurl ptr, never returns NULL.
*/
-struct nsurl* browser_window_access_url(struct browser_window *bw);
+struct nsurl* browser_window_access_url(const struct browser_window *bw);
/**
* Access a browser window's URL.
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=194dfad4a5ca36bf39b...
commit 194dfad4a5ca36bf39bd1c20c874747991f9281c
Author: Michael Drake <michael.drake(a)codethink.co.uk>
Commit: Michael Drake <michael.drake(a)codethink.co.uk>
Core window: Constify the core_window handle through the getters.
diff --git a/frontends/amiga/corewindow.c b/frontends/amiga/corewindow.c
index 44798d2..bfb0eb2 100644
--- a/frontends/amiga/corewindow.c
+++ b/frontends/amiga/corewindow.c
@@ -826,7 +826,8 @@ ami_cw_invalidate_area(struct core_window *cw, const struct rect *r)
static nserror
-ami_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
+ami_cw_get_window_dimensions(const struct core_window *cw,
+ int *width, int *height)
{
struct ami_corewindow *ami_cw = (struct ami_corewindow *)cw;
@@ -867,7 +868,7 @@ ami_cw_update_size(struct core_window *cw, int width, int height)
static nserror
-ami_cw_get_scroll(struct core_window *cw, int *x, int *y)
+ami_cw_get_scroll(const struct core_window *cw, int *x, int *y)
{
struct ami_corewindow *ami_cw = (struct ami_corewindow *)cw;
ULONG win_x0, win_y0;
diff --git a/frontends/atari/treeview.c b/frontends/atari/treeview.c
index 49d26ef..6ab0999 100644
--- a/frontends/atari/treeview.c
+++ b/frontends/atari/treeview.c
@@ -484,7 +484,7 @@ atari_treeview_set_scroll(struct core_window *cw, int x, int y)
}
static nserror
-atari_treeview_get_scroll(struct core_window *cw, int *x, int *y)
+atari_treeview_get_scroll(const struct core_window *cw, int *x, int *y)
{
/* TODO */
return NSERROR_NOT_IMPLEMENTED;
@@ -499,7 +499,7 @@ atari_treeview_get_scroll(struct core_window *cw, int *x, int *y)
* \param height to be set to viewport height in px, if non NULL
*/
static nserror
-atari_treeview_get_window_dimensions(struct core_window *cw,
+atari_treeview_get_window_dimensions(const struct core_window *cw,
int *width,
int *height)
{
diff --git a/frontends/framebuffer/corewindow.c b/frontends/framebuffer/corewindow.c
index a27d666..dbd8d01 100644
--- a/frontends/framebuffer/corewindow.c
+++ b/frontends/framebuffer/corewindow.c
@@ -160,7 +160,7 @@ fb_cw_set_scroll(struct core_window *cw, int x, int y)
static nserror
-fb_cw_get_scroll(struct core_window *cw, int *x, int *y)
+fb_cw_get_scroll(const struct core_window *cw, int *x, int *y)
{
/* struct fb_corewindow *fb_cw = (struct fb_corewindow *)cw;
@@ -171,7 +171,8 @@ fb_cw_get_scroll(struct core_window *cw, int *x, int *y)
static nserror
-fb_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
+fb_cw_get_window_dimensions(const struct core_window *cw,
+ int *width, int *height)
{
struct fb_corewindow *fb_cw = (struct fb_corewindow *)cw;
diff --git a/frontends/gtk/corewindow.c b/frontends/gtk/corewindow.c
index cb78212..fc26f13 100644
--- a/frontends/gtk/corewindow.c
+++ b/frontends/gtk/corewindow.c
@@ -633,7 +633,7 @@ nsgtk_cw_set_scroll(struct core_window *cw, int x, int y)
* \param r rectangle that needs scrolling.
*/
static nserror
-nsgtk_cw_get_scroll(struct core_window *cw, int *x, int *y)
+nsgtk_cw_get_scroll(const struct core_window *cw, int *x, int *y)
{
struct nsgtk_corewindow *nsgtk_cw = (struct nsgtk_corewindow *)cw;
GtkAdjustment *vadj;
@@ -660,7 +660,8 @@ nsgtk_cw_get_scroll(struct core_window *cw, int *x, int *y)
* \param[out] height to be set to viewport height in px
*/
static nserror
-nsgtk_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
+nsgtk_cw_get_window_dimensions(const struct core_window *cw,
+ int *width, int *height)
{
struct nsgtk_corewindow *nsgtk_cw = (struct nsgtk_corewindow *)cw;
GtkAdjustment *vadj;
diff --git a/frontends/riscos/corewindow.c b/frontends/riscos/corewindow.c
index 8004dcc..4398fca 100644
--- a/frontends/riscos/corewindow.c
+++ b/frontends/riscos/corewindow.c
@@ -832,7 +832,7 @@ ro_cw_update_size(struct core_window *cw, int width, int height)
* Callback from the core to scroll the visible content.
*/
static nserror
-ro_cw_get_scroll(struct core_window *cw, int *x, int *y)
+ro_cw_get_scroll(const struct core_window *cw, int *x, int *y)
{
struct ro_corewindow *ro_cw = (struct ro_corewindow *)cw;
wimp_window_state state = {
@@ -888,7 +888,8 @@ ro_cw_set_scroll(struct core_window *cw, int x, int y)
* \param[out] height to be set to viewport height in px
*/
static nserror
-ro_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
+ro_cw_get_window_dimensions(const struct core_window *cw,
+ int *width, int *height)
{
struct ro_corewindow *ro_cw = (struct ro_corewindow *)cw;
os_error *error;
diff --git a/frontends/windows/corewindow.c b/frontends/windows/corewindow.c
index be2891f..7d6dc69 100644
--- a/frontends/windows/corewindow.c
+++ b/frontends/windows/corewindow.c
@@ -466,7 +466,7 @@ nsw32_cw_set_scroll(struct core_window *cw, int x, int y)
static nserror
-nsw32_cw_get_scroll(struct core_window *cw, int *x, int *y)
+nsw32_cw_get_scroll(const struct core_window *cw, int *x, int *y)
{
/** /todo call getscroll apropriately */
return NSERROR_NOT_IMPLEMENTED;
@@ -481,7 +481,8 @@ nsw32_cw_get_scroll(struct core_window *cw, int *x, int *y)
* \param[out] height to be set to viewport height in px
*/
static nserror
-nsw32_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
+nsw32_cw_get_window_dimensions(const struct core_window *cw,
+ int *width, int *height)
{
struct nsw32_corewindow *nsw32_cw = (struct nsw32_corewindow *)cw;
diff --git a/include/netsurf/core_window.h b/include/netsurf/core_window.h
index 7eabda1..8cbd8ef 100644
--- a/include/netsurf/core_window.h
+++ b/include/netsurf/core_window.h
@@ -100,7 +100,7 @@ struct core_window_callback_table {
* \param[out] returns vertical scroll in px
* \return NSERROR_OK on success or appropriate error code
*/
- nserror (*get_scroll)(struct core_window *cw, int *x, int *y);
+ nserror (*get_scroll)(const struct core_window *cw, int *x, int *y);
/**
* Get window viewport dimensions
@@ -110,7 +110,7 @@ struct core_window_callback_table {
* \param[out] height to be set to viewport height in px
* \return NSERROR_OK on success or appropriate error code
*/
- nserror (*get_window_dimensions)(struct core_window *cw,
+ nserror (*get_window_dimensions)(const struct core_window *cw,
int *width, int *height);
/**
-----------------------------------------------------------------------
Summary of changes:
desktop/browser_window.c | 2 +-
frontends/amiga/corewindow.c | 5 +++--
frontends/atari/treeview.c | 4 ++--
frontends/framebuffer/corewindow.c | 5 +++--
frontends/gtk/corewindow.c | 5 +++--
frontends/riscos/corewindow.c | 5 +++--
frontends/windows/corewindow.c | 5 +++--
include/netsurf/browser_window.h | 2 +-
include/netsurf/core_window.h | 4 ++--
9 files changed, 21 insertions(+), 16 deletions(-)
diff --git a/desktop/browser_window.c b/desktop/browser_window.c
index dba3d31..838e62d 100644
--- a/desktop/browser_window.c
+++ b/desktop/browser_window.c
@@ -3788,7 +3788,7 @@ nserror browser_window_navigate_up(struct browser_window *bw, bool new_window)
/* Exported interface, documented in include/netsurf/browser_window.h */
-nsurl* browser_window_access_url(struct browser_window *bw)
+nsurl* browser_window_access_url(const struct browser_window *bw)
{
assert(bw != NULL);
diff --git a/frontends/amiga/corewindow.c b/frontends/amiga/corewindow.c
index 44798d2..bfb0eb2 100644
--- a/frontends/amiga/corewindow.c
+++ b/frontends/amiga/corewindow.c
@@ -826,7 +826,8 @@ ami_cw_invalidate_area(struct core_window *cw, const struct rect *r)
static nserror
-ami_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
+ami_cw_get_window_dimensions(const struct core_window *cw,
+ int *width, int *height)
{
struct ami_corewindow *ami_cw = (struct ami_corewindow *)cw;
@@ -867,7 +868,7 @@ ami_cw_update_size(struct core_window *cw, int width, int height)
static nserror
-ami_cw_get_scroll(struct core_window *cw, int *x, int *y)
+ami_cw_get_scroll(const struct core_window *cw, int *x, int *y)
{
struct ami_corewindow *ami_cw = (struct ami_corewindow *)cw;
ULONG win_x0, win_y0;
diff --git a/frontends/atari/treeview.c b/frontends/atari/treeview.c
index 49d26ef..6ab0999 100644
--- a/frontends/atari/treeview.c
+++ b/frontends/atari/treeview.c
@@ -484,7 +484,7 @@ atari_treeview_set_scroll(struct core_window *cw, int x, int y)
}
static nserror
-atari_treeview_get_scroll(struct core_window *cw, int *x, int *y)
+atari_treeview_get_scroll(const struct core_window *cw, int *x, int *y)
{
/* TODO */
return NSERROR_NOT_IMPLEMENTED;
@@ -499,7 +499,7 @@ atari_treeview_get_scroll(struct core_window *cw, int *x, int *y)
* \param height to be set to viewport height in px, if non NULL
*/
static nserror
-atari_treeview_get_window_dimensions(struct core_window *cw,
+atari_treeview_get_window_dimensions(const struct core_window *cw,
int *width,
int *height)
{
diff --git a/frontends/framebuffer/corewindow.c b/frontends/framebuffer/corewindow.c
index a27d666..dbd8d01 100644
--- a/frontends/framebuffer/corewindow.c
+++ b/frontends/framebuffer/corewindow.c
@@ -160,7 +160,7 @@ fb_cw_set_scroll(struct core_window *cw, int x, int y)
static nserror
-fb_cw_get_scroll(struct core_window *cw, int *x, int *y)
+fb_cw_get_scroll(const struct core_window *cw, int *x, int *y)
{
/* struct fb_corewindow *fb_cw = (struct fb_corewindow *)cw;
@@ -171,7 +171,8 @@ fb_cw_get_scroll(struct core_window *cw, int *x, int *y)
static nserror
-fb_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
+fb_cw_get_window_dimensions(const struct core_window *cw,
+ int *width, int *height)
{
struct fb_corewindow *fb_cw = (struct fb_corewindow *)cw;
diff --git a/frontends/gtk/corewindow.c b/frontends/gtk/corewindow.c
index cb78212..fc26f13 100644
--- a/frontends/gtk/corewindow.c
+++ b/frontends/gtk/corewindow.c
@@ -633,7 +633,7 @@ nsgtk_cw_set_scroll(struct core_window *cw, int x, int y)
* \param r rectangle that needs scrolling.
*/
static nserror
-nsgtk_cw_get_scroll(struct core_window *cw, int *x, int *y)
+nsgtk_cw_get_scroll(const struct core_window *cw, int *x, int *y)
{
struct nsgtk_corewindow *nsgtk_cw = (struct nsgtk_corewindow *)cw;
GtkAdjustment *vadj;
@@ -660,7 +660,8 @@ nsgtk_cw_get_scroll(struct core_window *cw, int *x, int *y)
* \param[out] height to be set to viewport height in px
*/
static nserror
-nsgtk_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
+nsgtk_cw_get_window_dimensions(const struct core_window *cw,
+ int *width, int *height)
{
struct nsgtk_corewindow *nsgtk_cw = (struct nsgtk_corewindow *)cw;
GtkAdjustment *vadj;
diff --git a/frontends/riscos/corewindow.c b/frontends/riscos/corewindow.c
index 8004dcc..4398fca 100644
--- a/frontends/riscos/corewindow.c
+++ b/frontends/riscos/corewindow.c
@@ -832,7 +832,7 @@ ro_cw_update_size(struct core_window *cw, int width, int height)
* Callback from the core to scroll the visible content.
*/
static nserror
-ro_cw_get_scroll(struct core_window *cw, int *x, int *y)
+ro_cw_get_scroll(const struct core_window *cw, int *x, int *y)
{
struct ro_corewindow *ro_cw = (struct ro_corewindow *)cw;
wimp_window_state state = {
@@ -888,7 +888,8 @@ ro_cw_set_scroll(struct core_window *cw, int x, int y)
* \param[out] height to be set to viewport height in px
*/
static nserror
-ro_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
+ro_cw_get_window_dimensions(const struct core_window *cw,
+ int *width, int *height)
{
struct ro_corewindow *ro_cw = (struct ro_corewindow *)cw;
os_error *error;
diff --git a/frontends/windows/corewindow.c b/frontends/windows/corewindow.c
index be2891f..7d6dc69 100644
--- a/frontends/windows/corewindow.c
+++ b/frontends/windows/corewindow.c
@@ -466,7 +466,7 @@ nsw32_cw_set_scroll(struct core_window *cw, int x, int y)
static nserror
-nsw32_cw_get_scroll(struct core_window *cw, int *x, int *y)
+nsw32_cw_get_scroll(const struct core_window *cw, int *x, int *y)
{
/** /todo call getscroll apropriately */
return NSERROR_NOT_IMPLEMENTED;
@@ -481,7 +481,8 @@ nsw32_cw_get_scroll(struct core_window *cw, int *x, int *y)
* \param[out] height to be set to viewport height in px
*/
static nserror
-nsw32_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
+nsw32_cw_get_window_dimensions(const struct core_window *cw,
+ int *width, int *height)
{
struct nsw32_corewindow *nsw32_cw = (struct nsw32_corewindow *)cw;
diff --git a/include/netsurf/browser_window.h b/include/netsurf/browser_window.h
index f8b86d0..7b2f652 100644
--- a/include/netsurf/browser_window.h
+++ b/include/netsurf/browser_window.h
@@ -231,7 +231,7 @@ nserror browser_window_navigate_up(struct browser_window *bw, bool new_window);
*
* \note guaranteed to return a valid nsurl ptr, never returns NULL.
*/
-struct nsurl* browser_window_access_url(struct browser_window *bw);
+struct nsurl* browser_window_access_url(const struct browser_window *bw);
/**
* Access a browser window's URL.
diff --git a/include/netsurf/core_window.h b/include/netsurf/core_window.h
index 7eabda1..8cbd8ef 100644
--- a/include/netsurf/core_window.h
+++ b/include/netsurf/core_window.h
@@ -100,7 +100,7 @@ struct core_window_callback_table {
* \param[out] returns vertical scroll in px
* \return NSERROR_OK on success or appropriate error code
*/
- nserror (*get_scroll)(struct core_window *cw, int *x, int *y);
+ nserror (*get_scroll)(const struct core_window *cw, int *x, int *y);
/**
* Get window viewport dimensions
@@ -110,7 +110,7 @@ struct core_window_callback_table {
* \param[out] height to be set to viewport height in px
* \return NSERROR_OK on success or appropriate error code
*/
- nserror (*get_window_dimensions)(struct core_window *cw,
+ nserror (*get_window_dimensions)(const struct core_window *cw,
int *width, int *height);
/**
--
NetSurf Browser
2 years, 11 months
netsurf: branch master updated. release/3.9-441-ge87bc1b
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/e87bc1bfdacd145f106bc...
...commit http://git.netsurf-browser.org/netsurf.git/commit/e87bc1bfdacd145f106bc25...
...tree http://git.netsurf-browser.org/netsurf.git/tree/e87bc1bfdacd145f106bc2598...
The branch, master has been updated
via e87bc1bfdacd145f106bc2598997b91f4b177092 (commit)
via 277c1550f516b59ffd14cdbd102ca559c1e145e6 (commit)
from c9e5fa9bc12252ba9dedf35a8b219423dea7ba44 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=e87bc1bfdacd145f106...
commit e87bc1bfdacd145f106bc2598997b91f4b177092
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
GTK: Remove hack for url bar refresh on throbber stop
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index 16e5f1f..f2b1d05 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -3592,9 +3592,6 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
browser_window_history_forward_available(bw));
nsgtk_local_history_hide();
- /* update the url bar, for the final time */
- browser_window_refresh_url_bar(bw);
-
return res;
}
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=277c1550f516b59ffd1...
commit 277c1550f516b59ffd14cdbd102ca559c1e145e6
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
browser_window: Inform GUI about redirects and final URL
To correctly have the GUI know about all url bar updates, we
should inform it during the processing of redirects and we should
ensure that when we're in the ready-but-not-done phase we do not
use the fetch parameters but instead the content's known URL
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/desktop/browser_window.c b/desktop/browser_window.c
index 2a3948f..dba3d31 100644
--- a/desktop/browser_window.c
+++ b/desktop/browser_window.c
@@ -1320,6 +1320,27 @@ browser_window__handle_error(struct browser_window *bw,
/**
+ * Update URL bar for a given browser window to given URL
+ *
+ * \param bw Browser window to update URL bar for.
+ * \param url URL for content displayed by bw including any fragment.
+ */
+static inline nserror
+browser_window_refresh_url_bar_internal(struct browser_window *bw, nsurl *url)
+{
+ assert(bw);
+ assert(url);
+
+ if ((bw->parent != NULL) || (bw->window == NULL)) {
+ /* Not root window or no gui window so do not set a URL */
+ return NSERROR_OK;
+ }
+
+ return guit->window->set_url(bw->window, url);
+}
+
+
+/**
* Browser window content event callback handler.
*/
static nserror
@@ -1393,6 +1414,7 @@ browser_window_callback(hlcache_handle *c, const hlcache_event *event, void *pw)
if (urldb_add_url(event->data.redirect.from)) {
urldb_update_url_visit_data(event->data.redirect.from);
}
+ browser_window_refresh_url_bar_internal(bw, event->data.redirect.to);
break;
case CONTENT_MSG_STATUS:
@@ -1774,27 +1796,6 @@ static void browser_window_destroy_internal(struct browser_window *bw)
/**
- * Update URL bar for a given browser window to given URL
- *
- * \param bw Browser window to update URL bar for.
- * \param url URL for content displayed by bw including any fragment.
- */
-static inline nserror
-browser_window_refresh_url_bar_internal(struct browser_window *bw, nsurl *url)
-{
- assert(bw);
- assert(url);
-
- if ((bw->parent != NULL) || (bw->window == NULL)) {
- /* Not root window or no gui window so do not set a URL */
- return NSERROR_OK;
- }
-
- return guit->window->set_url(bw->window, url);
-}
-
-
-/**
* scroll to a fragment if present
*
* \param bw browser window
@@ -3165,15 +3166,9 @@ nserror browser_window_refresh_url_bar(struct browser_window *bw)
/* no content so return about:blank */
ret = browser_window_refresh_url_bar_internal(bw,
corestring_nsurl_about_blank);
- } else if (bw->throbbing) {
- /* We're throbbing, so show the loading parameters url,
- * or if there isn't one, the current parameters url
- */
- if (bw->loading_parameters.url != NULL) {
- url = bw->loading_parameters.url;
- } else {
- url = bw->current_parameters.url;
- }
+ } else if (bw->throbbing && bw->loading_parameters.url != NULL) {
+ /* Throbbing and we have loading parameters, use those */
+ url = bw->loading_parameters.url;
ret = browser_window_refresh_url_bar_internal(bw, url);
} else if (bw->frag_id == NULL) {
if (bw->internal_nav) {
-----------------------------------------------------------------------
Summary of changes:
desktop/browser_window.c | 55 +++++++++++++++++++++-------------------------
frontends/gtk/toolbar.c | 3 ---
2 files changed, 25 insertions(+), 33 deletions(-)
diff --git a/desktop/browser_window.c b/desktop/browser_window.c
index 2a3948f..dba3d31 100644
--- a/desktop/browser_window.c
+++ b/desktop/browser_window.c
@@ -1320,6 +1320,27 @@ browser_window__handle_error(struct browser_window *bw,
/**
+ * Update URL bar for a given browser window to given URL
+ *
+ * \param bw Browser window to update URL bar for.
+ * \param url URL for content displayed by bw including any fragment.
+ */
+static inline nserror
+browser_window_refresh_url_bar_internal(struct browser_window *bw, nsurl *url)
+{
+ assert(bw);
+ assert(url);
+
+ if ((bw->parent != NULL) || (bw->window == NULL)) {
+ /* Not root window or no gui window so do not set a URL */
+ return NSERROR_OK;
+ }
+
+ return guit->window->set_url(bw->window, url);
+}
+
+
+/**
* Browser window content event callback handler.
*/
static nserror
@@ -1393,6 +1414,7 @@ browser_window_callback(hlcache_handle *c, const hlcache_event *event, void *pw)
if (urldb_add_url(event->data.redirect.from)) {
urldb_update_url_visit_data(event->data.redirect.from);
}
+ browser_window_refresh_url_bar_internal(bw, event->data.redirect.to);
break;
case CONTENT_MSG_STATUS:
@@ -1774,27 +1796,6 @@ static void browser_window_destroy_internal(struct browser_window *bw)
/**
- * Update URL bar for a given browser window to given URL
- *
- * \param bw Browser window to update URL bar for.
- * \param url URL for content displayed by bw including any fragment.
- */
-static inline nserror
-browser_window_refresh_url_bar_internal(struct browser_window *bw, nsurl *url)
-{
- assert(bw);
- assert(url);
-
- if ((bw->parent != NULL) || (bw->window == NULL)) {
- /* Not root window or no gui window so do not set a URL */
- return NSERROR_OK;
- }
-
- return guit->window->set_url(bw->window, url);
-}
-
-
-/**
* scroll to a fragment if present
*
* \param bw browser window
@@ -3165,15 +3166,9 @@ nserror browser_window_refresh_url_bar(struct browser_window *bw)
/* no content so return about:blank */
ret = browser_window_refresh_url_bar_internal(bw,
corestring_nsurl_about_blank);
- } else if (bw->throbbing) {
- /* We're throbbing, so show the loading parameters url,
- * or if there isn't one, the current parameters url
- */
- if (bw->loading_parameters.url != NULL) {
- url = bw->loading_parameters.url;
- } else {
- url = bw->current_parameters.url;
- }
+ } else if (bw->throbbing && bw->loading_parameters.url != NULL) {
+ /* Throbbing and we have loading parameters, use those */
+ url = bw->loading_parameters.url;
ret = browser_window_refresh_url_bar_internal(bw, url);
} else if (bw->frag_id == NULL) {
if (bw->internal_nav) {
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index 16e5f1f..f2b1d05 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -3592,9 +3592,6 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
browser_window_history_forward_available(bw));
nsgtk_local_history_hide();
- /* update the url bar, for the final time */
- browser_window_refresh_url_bar(bw);
-
return res;
}
--
NetSurf Browser
2 years, 11 months
netsurf: branch master updated. release/3.9-439-gc9e5fa9
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/c9e5fa9bc12252ba9dedf...
...commit http://git.netsurf-browser.org/netsurf.git/commit/c9e5fa9bc12252ba9dedf35...
...tree http://git.netsurf-browser.org/netsurf.git/tree/c9e5fa9bc12252ba9dedf35a8...
The branch, master has been updated
via c9e5fa9bc12252ba9dedf35a8b219423dea7ba44 (commit)
from a016445a8265a03719d52c49e069c7f6914c7e4d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=c9e5fa9bc12252ba9de...
commit c9e5fa9bc12252ba9dedf35a8b219423dea7ba44
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
GTK: Ensure that we don't frob the URL bar from the scaffold
To correctly refocus the location box on tab switching we
need to not update the url of the tab when the scaffold updates
its global context.
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index 0b3fe67..030c6d4 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -262,9 +262,6 @@ static void scaffolding_update_context(struct nsgtk_scaffolding *g)
nsgtk_scaffolding_set_sensitivity(g);
- /* update the url bar, particularly necessary when tabbing */
- browser_window_refresh_url_bar(bw);
-
nsgtk_local_history_hide();
}
@@ -1353,7 +1350,7 @@ void nsgtk_scaffolding_set_top_level(struct gui_window *gw)
sc->top_level = gw;
- /* Synchronise the history (will also update the URL bar) */
+ /* Synchronise the history */
scaffolding_update_context(sc);
/* Ensure the window's title bar is updated */
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index f2b1d05..16e5f1f 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -3592,6 +3592,9 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
browser_window_history_forward_available(bw));
nsgtk_local_history_hide();
+ /* update the url bar, for the final time */
+ browser_window_refresh_url_bar(bw);
+
return res;
}
-----------------------------------------------------------------------
Summary of changes:
frontends/gtk/scaffolding.c | 5 +----
frontends/gtk/toolbar.c | 3 +++
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index 0b3fe67..030c6d4 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -262,9 +262,6 @@ static void scaffolding_update_context(struct nsgtk_scaffolding *g)
nsgtk_scaffolding_set_sensitivity(g);
- /* update the url bar, particularly necessary when tabbing */
- browser_window_refresh_url_bar(bw);
-
nsgtk_local_history_hide();
}
@@ -1353,7 +1350,7 @@ void nsgtk_scaffolding_set_top_level(struct gui_window *gw)
sc->top_level = gw;
- /* Synchronise the history (will also update the URL bar) */
+ /* Synchronise the history */
scaffolding_update_context(sc);
/* Ensure the window's title bar is updated */
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index f2b1d05..16e5f1f 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -3592,6 +3592,9 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
browser_window_history_forward_available(bw));
nsgtk_local_history_hide();
+ /* update the url bar, for the final time */
+ browser_window_refresh_url_bar(bw);
+
return res;
}
--
NetSurf Browser
2 years, 11 months
netsurf: branch master updated. release/3.9-438-ga016445
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/a016445a8265a03719d52...
...commit http://git.netsurf-browser.org/netsurf.git/commit/a016445a8265a03719d52c4...
...tree http://git.netsurf-browser.org/netsurf.git/tree/a016445a8265a03719d52c49e...
The branch, master has been updated
via a016445a8265a03719d52c49e069c7f6914c7e4d (commit)
via 5239163f4dd47a3f9ca74501575053a69c5a95b8 (commit)
via 0fa5f81a52a62a04f4564d84e391543995cf9418 (commit)
via 5c377cd285536f4bec2a6cfb6352a45cfe6cb39e (commit)
via f3bdee255d3c4252640b2337224e2f0b95944d7f (commit)
via d25fada8cf820b8748a822b510b18f34f8a6ed30 (commit)
from bc1810ed61d235aac76cfc19200155ec37f55b6e (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=a016445a8265a03719d...
commit a016445a8265a03719d52c49e069c7f6914c7e4d
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
GTK: Add a location focus state machine
Because the initial navigation process on new browser window
creation is somewhat complex, we need a small state machine in
the GTK UI to ensure that we handle the correct combination
of focussing needed to maintain selection through initial tab
opening.
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index c9ec19c..f2b1d05 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -144,6 +144,25 @@ struct nsgtk_toolbar_item {
void *dataminus;
};
+/**
+ * Location focus state machine
+ *
+ * 1. If we don't care, we're in LFS_IDLE
+ * 2. When we create a new toolbar, we can put it into
+ * LFS_WANT which means that we want the url bar to focus
+ * 3. When we start throbbing if we're in LFS_WANT we move to LFS_THROB
+ * 4. When we stop throbbing, if we're in LFS_THROB we move to LFS_LAST
+ *
+ * While not in LFS_IDLE, if the url bar is updated and we previously had it
+ * fully selected then we reselect it all. If we're in LFS_LAST we move to
+ * LFS_IDLE at that point.
+ */
+typedef enum {
+ LFS_IDLE, /**< Nothing to do */
+ LFS_WANT, /**< Want focus, will apply */
+ LFS_THROB, /**< Want focus, we have started throbbing */
+ LFS_LAST, /**< Last chance for a focus update */
+} nsgtk_toolbar_location_focus_state;
/**
* control toolbar context
@@ -182,6 +201,11 @@ struct nsgtk_toolbar {
* context passed to get_bw function
*/
void *get_ctx;
+
+ /**
+ * Location focus state machine, current state
+ */
+ nsgtk_toolbar_location_focus_state loc_focus;
};
@@ -3416,6 +3440,7 @@ nserror
nsgtk_toolbar_create(GtkBuilder *builder,
struct browser_window *(*get_bw)(void *ctx),
void *get_ctx,
+ bool want_location_focus,
struct nsgtk_toolbar **tb_out)
{
nserror res;
@@ -3431,6 +3456,11 @@ nsgtk_toolbar_create(GtkBuilder *builder,
tb->get_ctx = get_ctx;
/* set the throbber start frame. */
tb->throb_frame = 0;
+ if (want_location_focus) {
+ tb->loc_focus = LFS_WANT;
+ } else {
+ tb->loc_focus = LFS_IDLE;
+ }
tb->widget = GTK_TOOLBAR(gtk_builder_get_object(builder, "toolbar"));
gtk_toolbar_set_show_arrow(tb->widget, TRUE);
@@ -3515,6 +3545,24 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
nserror res;
struct browser_window *bw;
+ /* Manage the location focus state */
+ switch (tb->loc_focus) {
+ case LFS_IDLE:
+ break;
+ case LFS_WANT:
+ if (active) {
+ tb->loc_focus = LFS_THROB;
+ }
+ break;
+ case LFS_THROB:
+ if (!active) {
+ tb->loc_focus = LFS_LAST;
+ }
+ break;
+ case LFS_LAST:
+ break;
+ }
+
/* when activating the throbber simply schedule the next frame update */
if (active) {
nsgtk_schedule(THROBBER_FRAME_TIME, next_throbber_frame, tb);
@@ -3627,7 +3675,23 @@ nserror nsgtk_toolbar_set_url(struct nsgtk_toolbar *tb, nsurl *url)
url_text = nsurl_access(url);
}
- gtk_entry_set_text(url_entry, url_text);
+ if (strcmp(url_text, gtk_entry_get_text(url_entry)) != 0) {
+ /* The URL bar content has changed, we need to update it */
+ gint startpos, endpos;
+ bool was_selected;
+ gtk_editable_get_selection_bounds(GTK_EDITABLE(url_entry),
+ &startpos, &endpos);
+ was_selected = gtk_widget_is_focus(GTK_WIDGET(url_entry)) &&
+ startpos == 0 &&
+ endpos == gtk_entry_get_text_length(url_entry);
+ gtk_entry_set_text(url_entry, url_text);
+ if (was_selected && tb->loc_focus != LFS_IDLE) {
+ gtk_widget_grab_focus(GTK_WIDGET(url_entry));
+ if (tb->loc_focus == LFS_LAST) {
+ tb->loc_focus = LFS_IDLE;
+ }
+ }
+ }
if (idn_url_s != NULL) {
free(idn_url_s);
diff --git a/frontends/gtk/toolbar.h b/frontends/gtk/toolbar.h
index 9bb859b..77c3bcd 100644
--- a/frontends/gtk/toolbar.h
+++ b/frontends/gtk/toolbar.h
@@ -32,7 +32,11 @@ struct nsgtk_scaffolding;
* \param[out] toolbar a pointer to receive the result.
* \return NSERROR_OK and toolbar updated on success else error code
*/
-nserror nsgtk_toolbar_create(GtkBuilder *builder, struct browser_window *(*get_bw)(void *ctx), void *get_bw_ctx,struct nsgtk_toolbar **toolbar);
+nserror nsgtk_toolbar_create(GtkBuilder *builder,
+ struct browser_window *(*get_bw)(void *ctx),
+ void *get_bw_ctx,
+ bool want_location_focus,
+ struct nsgtk_toolbar **toolbar);
/**
diff --git a/frontends/gtk/window.c b/frontends/gtk/window.c
index 64f09eb..925c378 100644
--- a/frontends/gtk/window.c
+++ b/frontends/gtk/window.c
@@ -862,7 +862,9 @@ gui_window_create(struct browser_window *bw,
/* create toolbar */
- res = nsgtk_toolbar_create(tab_builder, bw_from_gw, g, &g->toolbar);
+ res = nsgtk_toolbar_create(tab_builder, bw_from_gw, g,
+ !!(flags & GW_CREATE_FOCUS_LOCATION),
+ &g->toolbar);
if (res != NSERROR_OK) {
free(g);
g_object_unref(tab_builder);
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=5239163f4dd47a3f9ca...
commit 5239163f4dd47a3f9ca74501575053a69c5a95b8
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
GTK: Request and honour location focus
So that when we create a new tab we automatically focus the
location box, pass the flag into create, and honour it when it
comes back to us.
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index 1a6bc12..c9ec19c 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -926,7 +926,7 @@ nsgtk_browser_window_create(struct browser_window *bw, bool intab)
{
nserror res = NSERROR_OK;
nsurl *url = NULL;
- int flags = BW_CREATE_HISTORY | BW_CREATE_FOREGROUND;
+ int flags = BW_CREATE_HISTORY | BW_CREATE_FOREGROUND | BW_CREATE_FOCUS_LOCATION;
if (intab) {
flags |= BW_CREATE_TAB;
diff --git a/frontends/gtk/window.c b/frontends/gtk/window.c
index b47a1b0..64f09eb 100644
--- a/frontends/gtk/window.c
+++ b/frontends/gtk/window.c
@@ -969,6 +969,13 @@ gui_window_create(struct browser_window *bw,
*/
g_object_unref(tab_builder);
+ /* Finally we need to focus the location bar if requested */
+ if (flags & GW_CREATE_FOCUS_LOCATION) {
+ if (nsgtk_window_item_activate(g, OPENLOCATION_BUTTON) != NSERROR_OK) {
+ NSLOG(netsurf, WARNING, "Unable to focus location input");
+ }
+ }
+
return g;
}
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=0fa5f81a52a62a04f45...
commit 0fa5f81a52a62a04f4564d84e391543995cf9418
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Browser: Support requesting location focus
In the creation of a browser window it may be valuable to request
that the GUI focus the location input box. This can be used when
the user requests a new tab/window to allow the entry box to be
focussed properly immediately.
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/desktop/browser_window.c b/desktop/browser_window.c
index fcee085..2a3948f 100644
--- a/desktop/browser_window.c
+++ b/desktop/browser_window.c
@@ -3044,6 +3044,8 @@ browser_window_create(enum browser_window_create_flags flags,
gw_flags |= GW_CREATE_CLONE;
if (flags & BW_CREATE_FOREGROUND)
gw_flags |= GW_CREATE_FOREGROUND;
+ if (flags & BW_CREATE_FOCUS_LOCATION)
+ gw_flags |= GW_CREATE_FOCUS_LOCATION;
ret->window = guit->window->create(ret,
(existing != NULL) ? existing->window : NULL,
diff --git a/include/netsurf/browser_window.h b/include/netsurf/browser_window.h
index 75977ac..f8b86d0 100644
--- a/include/netsurf/browser_window.h
+++ b/include/netsurf/browser_window.h
@@ -112,6 +112,9 @@ enum browser_window_create_flags {
/** Request foreground opening. */
BW_CREATE_FOREGROUND = (1 << 4),
+
+ /** Request location bar focus. */
+ BW_CREATE_FOCUS_LOCATION = (1 << 5),
};
/** flags to browser_window_navigate */
diff --git a/include/netsurf/window.h b/include/netsurf/window.h
index a393a35..16fd95e 100644
--- a/include/netsurf/window.h
+++ b/include/netsurf/window.h
@@ -68,6 +68,7 @@ typedef enum {
GW_CREATE_CLONE = (1 << 0), /**< Clone existing window */
GW_CREATE_TAB = (1 << 1), /**< Create tab in same window as existing */
GW_CREATE_FOREGROUND = (1 << 2), /**< Request this window/tab is foregrounded */
+ GW_CREATE_FOCUS_LOCATION = (1 << 3) , /** Request this window/tab focusses the URL input */
} gui_window_create_flags;
/**
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=5c377cd285536f4bec2...
commit 5c377cd285536f4bec2a6cfb6352a45cfe6cb39e
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
GTK: Use new BW_CREATE_FOREGROUND flags
This gets rid of temp_open_background which was, frankly, a bit
of an eyesore. In addition it makes the open-in-new-tab context
menu action behave like Firefox's with respect to the user's preference
regarding whether or not to immediately focus new tabs.
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index 03d7160..0b3fe67 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -547,8 +547,6 @@ nsgtk_on_link_opentab_activate_menu(GtkMenuItem *widget, gpointer data)
if (current_menu_features.link == NULL)
return FALSE;
- temp_open_background = 1;
-
err = browser_window_create(BW_CREATE_CLONE |
BW_CREATE_HISTORY |
BW_CREATE_TAB,
@@ -557,8 +555,6 @@ nsgtk_on_link_opentab_activate_menu(GtkMenuItem *widget, gpointer data)
nsgtk_warning(messages_get_errorcode(err), 0);
}
- temp_open_background = -1;
-
return TRUE;
}
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index f191bc1..1a6bc12 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -926,7 +926,7 @@ nsgtk_browser_window_create(struct browser_window *bw, bool intab)
{
nserror res = NSERROR_OK;
nsurl *url = NULL;
- int flags = BW_CREATE_HISTORY;
+ int flags = BW_CREATE_HISTORY | BW_CREATE_FOREGROUND;
if (intab) {
flags |= BW_CREATE_TAB;
@@ -1995,16 +1995,14 @@ static gboolean websearch_entry_activate_cb(GtkWidget *widget, gpointer data)
SEARCH_WEB_OMNI_SEARCHONLY,
&url);
if (res == NSERROR_OK) {
- temp_open_background = 0;
bw = tb->get_bw(tb->get_ctx);
res = browser_window_create(
- BW_CREATE_HISTORY | BW_CREATE_TAB,
+ BW_CREATE_HISTORY | BW_CREATE_TAB | BW_CREATE_FOREGROUND,
url,
NULL,
bw,
NULL);
- temp_open_background = -1;
nsurl_unref(url);
}
if (res != NSERROR_OK) {
diff --git a/frontends/gtk/window.c b/frontends/gtk/window.c
index 39b7413..b47a1b0 100644
--- a/frontends/gtk/window.c
+++ b/frontends/gtk/window.c
@@ -143,9 +143,6 @@ struct gui_window {
/**< first entry in window list */
struct gui_window *window_list = NULL;
-/** flag controlling opening of tabs in the background */
-int temp_open_background = -1;
-
static void
nsgtk_select_menu_clicked(GtkCheckMenuItem *checkmenuitem,
gpointer user_data)
@@ -806,9 +803,13 @@ gui_window_create(struct browser_window *bw,
gui_window_create_flags flags)
{
struct gui_window *g; /* what is being created to return */
- bool tempback;
+ bool open_in_background = !(nsoption_bool(focus_new));
GtkBuilder* tab_builder;
+ /* If there is a foreground request, override user preference */
+ if (flags & GW_CREATE_FOREGROUND)
+ open_in_background = false;
+
nserror res;
res = nsgtk_builder_new_from_resname("tabcontents", &tab_builder);
@@ -953,18 +954,9 @@ gui_window_create(struct browser_window *bw,
nsgtk_window_input_method_commit, g);
/* add the tab container to the scaffold notebook */
- switch (temp_open_background) {
- case -1:
- tempback = !(nsoption_bool(focus_new));
- break;
- case 0:
- tempback = false;
- break;
- default:
- tempback = true;
- break;
- }
- nsgtk_tab_add(g, g->container, tempback, messages_get("NewTab"), g->icon);
+ nsgtk_tab_add(g, g->container,
+ open_in_background,
+ messages_get("NewTab"), g->icon);
/* initialy should not be visible */
nsgtk_search_toggle_visibility(g->search);
diff --git a/frontends/gtk/window.h b/frontends/gtk/window.h
index 728c653..b126a95 100644
--- a/frontends/gtk/window.h
+++ b/frontends/gtk/window.h
@@ -23,7 +23,6 @@ extern struct gui_window_table *nsgtk_window_table;
extern struct gui_search_web_table *nsgtk_search_web_table;
extern struct gui_window *window_list;
-extern int temp_open_background;
/**
* get core browsing context from gui window handle
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=f3bdee255d3c4252640...
commit f3bdee255d3c4252640b2337224e2f0b95944d7f
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Browser: Add FOREGROUND flag to window creation
To better support new-tab / new-window operations as well as
GUIs which want to allow tabs to open in the background by default,
add a flag to request a new browser window be foregrounded. This
will allow us to simplify at least the GTK frontend a little.
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/desktop/browser_window.c b/desktop/browser_window.c
index dea507f..fcee085 100644
--- a/desktop/browser_window.c
+++ b/desktop/browser_window.c
@@ -3042,6 +3042,8 @@ browser_window_create(enum browser_window_create_flags flags,
gw_flags |= GW_CREATE_TAB;
if (flags & BW_CREATE_CLONE)
gw_flags |= GW_CREATE_CLONE;
+ if (flags & BW_CREATE_FOREGROUND)
+ gw_flags |= GW_CREATE_FOREGROUND;
ret->window = guit->window->create(ret,
(existing != NULL) ? existing->window : NULL,
diff --git a/include/netsurf/browser_window.h b/include/netsurf/browser_window.h
index 98139aa..75977ac 100644
--- a/include/netsurf/browser_window.h
+++ b/include/netsurf/browser_window.h
@@ -109,6 +109,9 @@ enum browser_window_create_flags {
* have that option.
*/
BW_CREATE_UNVERIFIABLE = (1 << 3),
+
+ /** Request foreground opening. */
+ BW_CREATE_FOREGROUND = (1 << 4),
};
/** flags to browser_window_navigate */
diff --git a/include/netsurf/window.h b/include/netsurf/window.h
index 8f14a8c..a393a35 100644
--- a/include/netsurf/window.h
+++ b/include/netsurf/window.h
@@ -66,7 +66,8 @@ typedef enum {
typedef enum {
GW_CREATE_NONE = 0, /**< New window */
GW_CREATE_CLONE = (1 << 0), /**< Clone existing window */
- GW_CREATE_TAB = (1 << 1) /**< Create tab in same window as existing */
+ GW_CREATE_TAB = (1 << 1), /**< Create tab in same window as existing */
+ GW_CREATE_FOREGROUND = (1 << 2), /**< Request this window/tab is foregrounded */
} gui_window_create_flags;
/**
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=d25fada8cf820b8748a...
commit d25fada8cf820b8748a822b510b18f34f8a6ed30
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
gitignore: Ignore nsgtk2 properly
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/.gitignore b/.gitignore
index 4e84e75..054455b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,7 +9,7 @@ frontends/riscos/appdir/Resources/nl/Templates,fec
resources/*/Messages
frontends/*/res/*/Messages
codedocs
-nsgtk
+nsgtk2
nsgtk3
nsfb
nsmonkey
-----------------------------------------------------------------------
Summary of changes:
.gitignore | 2 +-
desktop/browser_window.c | 4 +++
frontends/gtk/scaffolding.c | 4 ---
frontends/gtk/toolbar.c | 72 +++++++++++++++++++++++++++++++++++---
frontends/gtk/toolbar.h | 6 +++-
frontends/gtk/window.c | 35 +++++++++---------
frontends/gtk/window.h | 1 -
include/netsurf/browser_window.h | 6 ++++
include/netsurf/window.h | 4 ++-
9 files changed, 104 insertions(+), 30 deletions(-)
diff --git a/.gitignore b/.gitignore
index 4e84e75..054455b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,7 +9,7 @@ frontends/riscos/appdir/Resources/nl/Templates,fec
resources/*/Messages
frontends/*/res/*/Messages
codedocs
-nsgtk
+nsgtk2
nsgtk3
nsfb
nsmonkey
diff --git a/desktop/browser_window.c b/desktop/browser_window.c
index dea507f..2a3948f 100644
--- a/desktop/browser_window.c
+++ b/desktop/browser_window.c
@@ -3042,6 +3042,10 @@ browser_window_create(enum browser_window_create_flags flags,
gw_flags |= GW_CREATE_TAB;
if (flags & BW_CREATE_CLONE)
gw_flags |= GW_CREATE_CLONE;
+ if (flags & BW_CREATE_FOREGROUND)
+ gw_flags |= GW_CREATE_FOREGROUND;
+ if (flags & BW_CREATE_FOCUS_LOCATION)
+ gw_flags |= GW_CREATE_FOCUS_LOCATION;
ret->window = guit->window->create(ret,
(existing != NULL) ? existing->window : NULL,
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index 03d7160..0b3fe67 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -547,8 +547,6 @@ nsgtk_on_link_opentab_activate_menu(GtkMenuItem *widget, gpointer data)
if (current_menu_features.link == NULL)
return FALSE;
- temp_open_background = 1;
-
err = browser_window_create(BW_CREATE_CLONE |
BW_CREATE_HISTORY |
BW_CREATE_TAB,
@@ -557,8 +555,6 @@ nsgtk_on_link_opentab_activate_menu(GtkMenuItem *widget, gpointer data)
nsgtk_warning(messages_get_errorcode(err), 0);
}
- temp_open_background = -1;
-
return TRUE;
}
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index f191bc1..f2b1d05 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -144,6 +144,25 @@ struct nsgtk_toolbar_item {
void *dataminus;
};
+/**
+ * Location focus state machine
+ *
+ * 1. If we don't care, we're in LFS_IDLE
+ * 2. When we create a new toolbar, we can put it into
+ * LFS_WANT which means that we want the url bar to focus
+ * 3. When we start throbbing if we're in LFS_WANT we move to LFS_THROB
+ * 4. When we stop throbbing, if we're in LFS_THROB we move to LFS_LAST
+ *
+ * While not in LFS_IDLE, if the url bar is updated and we previously had it
+ * fully selected then we reselect it all. If we're in LFS_LAST we move to
+ * LFS_IDLE at that point.
+ */
+typedef enum {
+ LFS_IDLE, /**< Nothing to do */
+ LFS_WANT, /**< Want focus, will apply */
+ LFS_THROB, /**< Want focus, we have started throbbing */
+ LFS_LAST, /**< Last chance for a focus update */
+} nsgtk_toolbar_location_focus_state;
/**
* control toolbar context
@@ -182,6 +201,11 @@ struct nsgtk_toolbar {
* context passed to get_bw function
*/
void *get_ctx;
+
+ /**
+ * Location focus state machine, current state
+ */
+ nsgtk_toolbar_location_focus_state loc_focus;
};
@@ -926,7 +950,7 @@ nsgtk_browser_window_create(struct browser_window *bw, bool intab)
{
nserror res = NSERROR_OK;
nsurl *url = NULL;
- int flags = BW_CREATE_HISTORY;
+ int flags = BW_CREATE_HISTORY | BW_CREATE_FOREGROUND | BW_CREATE_FOCUS_LOCATION;
if (intab) {
flags |= BW_CREATE_TAB;
@@ -1995,16 +2019,14 @@ static gboolean websearch_entry_activate_cb(GtkWidget *widget, gpointer data)
SEARCH_WEB_OMNI_SEARCHONLY,
&url);
if (res == NSERROR_OK) {
- temp_open_background = 0;
bw = tb->get_bw(tb->get_ctx);
res = browser_window_create(
- BW_CREATE_HISTORY | BW_CREATE_TAB,
+ BW_CREATE_HISTORY | BW_CREATE_TAB | BW_CREATE_FOREGROUND,
url,
NULL,
bw,
NULL);
- temp_open_background = -1;
nsurl_unref(url);
}
if (res != NSERROR_OK) {
@@ -3418,6 +3440,7 @@ nserror
nsgtk_toolbar_create(GtkBuilder *builder,
struct browser_window *(*get_bw)(void *ctx),
void *get_ctx,
+ bool want_location_focus,
struct nsgtk_toolbar **tb_out)
{
nserror res;
@@ -3433,6 +3456,11 @@ nsgtk_toolbar_create(GtkBuilder *builder,
tb->get_ctx = get_ctx;
/* set the throbber start frame. */
tb->throb_frame = 0;
+ if (want_location_focus) {
+ tb->loc_focus = LFS_WANT;
+ } else {
+ tb->loc_focus = LFS_IDLE;
+ }
tb->widget = GTK_TOOLBAR(gtk_builder_get_object(builder, "toolbar"));
gtk_toolbar_set_show_arrow(tb->widget, TRUE);
@@ -3517,6 +3545,24 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
nserror res;
struct browser_window *bw;
+ /* Manage the location focus state */
+ switch (tb->loc_focus) {
+ case LFS_IDLE:
+ break;
+ case LFS_WANT:
+ if (active) {
+ tb->loc_focus = LFS_THROB;
+ }
+ break;
+ case LFS_THROB:
+ if (!active) {
+ tb->loc_focus = LFS_LAST;
+ }
+ break;
+ case LFS_LAST:
+ break;
+ }
+
/* when activating the throbber simply schedule the next frame update */
if (active) {
nsgtk_schedule(THROBBER_FRAME_TIME, next_throbber_frame, tb);
@@ -3629,7 +3675,23 @@ nserror nsgtk_toolbar_set_url(struct nsgtk_toolbar *tb, nsurl *url)
url_text = nsurl_access(url);
}
- gtk_entry_set_text(url_entry, url_text);
+ if (strcmp(url_text, gtk_entry_get_text(url_entry)) != 0) {
+ /* The URL bar content has changed, we need to update it */
+ gint startpos, endpos;
+ bool was_selected;
+ gtk_editable_get_selection_bounds(GTK_EDITABLE(url_entry),
+ &startpos, &endpos);
+ was_selected = gtk_widget_is_focus(GTK_WIDGET(url_entry)) &&
+ startpos == 0 &&
+ endpos == gtk_entry_get_text_length(url_entry);
+ gtk_entry_set_text(url_entry, url_text);
+ if (was_selected && tb->loc_focus != LFS_IDLE) {
+ gtk_widget_grab_focus(GTK_WIDGET(url_entry));
+ if (tb->loc_focus == LFS_LAST) {
+ tb->loc_focus = LFS_IDLE;
+ }
+ }
+ }
if (idn_url_s != NULL) {
free(idn_url_s);
diff --git a/frontends/gtk/toolbar.h b/frontends/gtk/toolbar.h
index 9bb859b..77c3bcd 100644
--- a/frontends/gtk/toolbar.h
+++ b/frontends/gtk/toolbar.h
@@ -32,7 +32,11 @@ struct nsgtk_scaffolding;
* \param[out] toolbar a pointer to receive the result.
* \return NSERROR_OK and toolbar updated on success else error code
*/
-nserror nsgtk_toolbar_create(GtkBuilder *builder, struct browser_window *(*get_bw)(void *ctx), void *get_bw_ctx,struct nsgtk_toolbar **toolbar);
+nserror nsgtk_toolbar_create(GtkBuilder *builder,
+ struct browser_window *(*get_bw)(void *ctx),
+ void *get_bw_ctx,
+ bool want_location_focus,
+ struct nsgtk_toolbar **toolbar);
/**
diff --git a/frontends/gtk/window.c b/frontends/gtk/window.c
index 39b7413..925c378 100644
--- a/frontends/gtk/window.c
+++ b/frontends/gtk/window.c
@@ -143,9 +143,6 @@ struct gui_window {
/**< first entry in window list */
struct gui_window *window_list = NULL;
-/** flag controlling opening of tabs in the background */
-int temp_open_background = -1;
-
static void
nsgtk_select_menu_clicked(GtkCheckMenuItem *checkmenuitem,
gpointer user_data)
@@ -806,9 +803,13 @@ gui_window_create(struct browser_window *bw,
gui_window_create_flags flags)
{
struct gui_window *g; /* what is being created to return */
- bool tempback;
+ bool open_in_background = !(nsoption_bool(focus_new));
GtkBuilder* tab_builder;
+ /* If there is a foreground request, override user preference */
+ if (flags & GW_CREATE_FOREGROUND)
+ open_in_background = false;
+
nserror res;
res = nsgtk_builder_new_from_resname("tabcontents", &tab_builder);
@@ -861,7 +862,9 @@ gui_window_create(struct browser_window *bw,
/* create toolbar */
- res = nsgtk_toolbar_create(tab_builder, bw_from_gw, g, &g->toolbar);
+ res = nsgtk_toolbar_create(tab_builder, bw_from_gw, g,
+ !!(flags & GW_CREATE_FOCUS_LOCATION),
+ &g->toolbar);
if (res != NSERROR_OK) {
free(g);
g_object_unref(tab_builder);
@@ -953,18 +956,9 @@ gui_window_create(struct browser_window *bw,
nsgtk_window_input_method_commit, g);
/* add the tab container to the scaffold notebook */
- switch (temp_open_background) {
- case -1:
- tempback = !(nsoption_bool(focus_new));
- break;
- case 0:
- tempback = false;
- break;
- default:
- tempback = true;
- break;
- }
- nsgtk_tab_add(g, g->container, tempback, messages_get("NewTab"), g->icon);
+ nsgtk_tab_add(g, g->container,
+ open_in_background,
+ messages_get("NewTab"), g->icon);
/* initialy should not be visible */
nsgtk_search_toggle_visibility(g->search);
@@ -977,6 +971,13 @@ gui_window_create(struct browser_window *bw,
*/
g_object_unref(tab_builder);
+ /* Finally we need to focus the location bar if requested */
+ if (flags & GW_CREATE_FOCUS_LOCATION) {
+ if (nsgtk_window_item_activate(g, OPENLOCATION_BUTTON) != NSERROR_OK) {
+ NSLOG(netsurf, WARNING, "Unable to focus location input");
+ }
+ }
+
return g;
}
diff --git a/frontends/gtk/window.h b/frontends/gtk/window.h
index 728c653..b126a95 100644
--- a/frontends/gtk/window.h
+++ b/frontends/gtk/window.h
@@ -23,7 +23,6 @@ extern struct gui_window_table *nsgtk_window_table;
extern struct gui_search_web_table *nsgtk_search_web_table;
extern struct gui_window *window_list;
-extern int temp_open_background;
/**
* get core browsing context from gui window handle
diff --git a/include/netsurf/browser_window.h b/include/netsurf/browser_window.h
index 98139aa..f8b86d0 100644
--- a/include/netsurf/browser_window.h
+++ b/include/netsurf/browser_window.h
@@ -109,6 +109,12 @@ enum browser_window_create_flags {
* have that option.
*/
BW_CREATE_UNVERIFIABLE = (1 << 3),
+
+ /** Request foreground opening. */
+ BW_CREATE_FOREGROUND = (1 << 4),
+
+ /** Request location bar focus. */
+ BW_CREATE_FOCUS_LOCATION = (1 << 5),
};
/** flags to browser_window_navigate */
diff --git a/include/netsurf/window.h b/include/netsurf/window.h
index 8f14a8c..16fd95e 100644
--- a/include/netsurf/window.h
+++ b/include/netsurf/window.h
@@ -66,7 +66,9 @@ typedef enum {
typedef enum {
GW_CREATE_NONE = 0, /**< New window */
GW_CREATE_CLONE = (1 << 0), /**< Clone existing window */
- GW_CREATE_TAB = (1 << 1) /**< Create tab in same window as existing */
+ GW_CREATE_TAB = (1 << 1), /**< Create tab in same window as existing */
+ GW_CREATE_FOREGROUND = (1 << 2), /**< Request this window/tab is foregrounded */
+ GW_CREATE_FOCUS_LOCATION = (1 << 3) , /** Request this window/tab focusses the URL input */
} gui_window_create_flags;
/**
--
NetSurf Browser
2 years, 11 months
libhubbub: branch master updated. release/0.3.6-1-gd7e13fb
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libhubbub.git/shortlog/d7e13fb32073aac9aba...
...commit http://git.netsurf-browser.org/libhubbub.git/commit/d7e13fb32073aac9aba97...
...tree http://git.netsurf-browser.org/libhubbub.git/tree/d7e13fb32073aac9aba97fa...
The branch, master has been updated
via d7e13fb32073aac9aba97fa6021da064302fcd72 (commit)
from 050c36d483378d52cd8330fd0dcf3dfd4119ec78 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=d7e13fb32073aac9a...
commit d7e13fb32073aac9aba97fa6021da064302fcd72
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
treebuilder: Add some asserts to hopefully quieten scan-build
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index b67aa53..19f4429 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -1391,15 +1391,21 @@ hubbub_error formatting_list_remove(hubbub_treebuilder *treebuilder,
*node = entry->details.node;
*stack_index = entry->stack_index;
- if (entry->prev == NULL)
+ if (entry->prev == NULL) {
+ assert(treebuilder->context.formatting_list == entry);
treebuilder->context.formatting_list = entry->next;
- else
+ } else {
+ assert(treebuilder->context.formatting_list != entry);
entry->prev->next = entry->next;
+ }
- if (entry->next == NULL)
+ if (entry->next == NULL) {
+ assert(treebuilder->context.formatting_list_end == entry);
treebuilder->context.formatting_list_end = entry->prev;
- else
+ } else {
+ assert(treebuilder->context.formatting_list_end != entry);
entry->next->prev = entry->prev;
+ }
free(entry);
-----------------------------------------------------------------------
Summary of changes:
src/treebuilder/treebuilder.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index b67aa53..19f4429 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -1391,15 +1391,21 @@ hubbub_error formatting_list_remove(hubbub_treebuilder *treebuilder,
*node = entry->details.node;
*stack_index = entry->stack_index;
- if (entry->prev == NULL)
+ if (entry->prev == NULL) {
+ assert(treebuilder->context.formatting_list == entry);
treebuilder->context.formatting_list = entry->next;
- else
+ } else {
+ assert(treebuilder->context.formatting_list != entry);
entry->prev->next = entry->next;
+ }
- if (entry->next == NULL)
+ if (entry->next == NULL) {
+ assert(treebuilder->context.formatting_list_end == entry);
treebuilder->context.formatting_list_end = entry->prev;
- else
+ } else {
+ assert(treebuilder->context.formatting_list_end != entry);
entry->next->prev = entry->prev;
+ }
free(entry);
--
HTML5 parser library
2 years, 11 months
libdom: branch master updated. release/0.4.0-11-g38c82c0
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libdom.git/shortlog/38c82c0d1e4474aff9b601...
...commit http://git.netsurf-browser.org/libdom.git/commit/38c82c0d1e4474aff9b601fc...
...tree http://git.netsurf-browser.org/libdom.git/tree/38c82c0d1e4474aff9b601fcf6...
The branch, master has been updated
via 38c82c0d1e4474aff9b601fcf6ba9578396346b9 (commit)
from 010d1d5212cc906214feec4cfd25daca2dd2033e (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=38c82c0d1e4474aff9b6...
commit 38c82c0d1e4474aff9b601fcf6ba9578396346b9
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Deal with some scan-build-identified potential problems
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/src/core/node.c b/src/core/node.c
index 87ad837..9ba277e 100644
--- a/src/core/node.c
+++ b/src/core/node.c
@@ -2172,7 +2172,9 @@ dom_exception _dom_node_detach_range(dom_node_internal *first,
*
* This is not implemented in terms of attach/detach in case
* we want to perform any special replacement-related behaviour
- * at a later date.
+ * at a later date. If the replacement is essentially empty (either NULL
+ * or an empty document fragment node) then this essentially just removes
+ * the old node from its parent. It is up to the caller to deal with that.
*/
void _dom_node_replace(dom_node_internal *old,
dom_node_internal *replacement)
@@ -2190,6 +2192,19 @@ void _dom_node_replace(dom_node_internal *old,
last = replacement;
}
+ if (first == NULL) {
+ /* All we're doing is removing old */
+ if (old->previous == NULL) {
+ old->parent->first_child = old->next;
+ }
+ if (old->next == NULL) {
+ old->parent->last_child = old->previous;
+ }
+ old->previous = old->next = old->parent = NULL;
+ return;
+ }
+
+ /* We're replacing old with first-to-last */
first->previous = old->previous;
last->next = old->next;
diff --git a/src/html/html_select_element.c b/src/html/html_select_element.c
index ff549b2..0801d0a 100644
--- a/src/html/html_select_element.c
+++ b/src/html/html_select_element.c
@@ -213,6 +213,9 @@ dom_exception dom_html_select_element_get_selected_index(
dom_html_options_collection *col;
err = _dom_html_select_element_make_collection(ele, &col);
+ if (err != DOM_NO_ERR) {
+ return err;
+ }
err = dom_html_options_collection_get_length(col, &len);
if (err != DOM_NO_ERR) {
@@ -266,6 +269,9 @@ dom_exception dom_html_select_element_set_selected_index(
dom_html_options_collection *col;
err = _dom_html_select_element_make_collection(ele, &col);
+ if (err != DOM_NO_ERR) {
+ return err;
+ }
err = dom_html_options_collection_item(col,
index, &option);
-----------------------------------------------------------------------
Summary of changes:
src/core/node.c | 17 ++++++++++++++++-
src/html/html_select_element.c | 6 ++++++
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/src/core/node.c b/src/core/node.c
index 87ad837..9ba277e 100644
--- a/src/core/node.c
+++ b/src/core/node.c
@@ -2172,7 +2172,9 @@ dom_exception _dom_node_detach_range(dom_node_internal *first,
*
* This is not implemented in terms of attach/detach in case
* we want to perform any special replacement-related behaviour
- * at a later date.
+ * at a later date. If the replacement is essentially empty (either NULL
+ * or an empty document fragment node) then this essentially just removes
+ * the old node from its parent. It is up to the caller to deal with that.
*/
void _dom_node_replace(dom_node_internal *old,
dom_node_internal *replacement)
@@ -2190,6 +2192,19 @@ void _dom_node_replace(dom_node_internal *old,
last = replacement;
}
+ if (first == NULL) {
+ /* All we're doing is removing old */
+ if (old->previous == NULL) {
+ old->parent->first_child = old->next;
+ }
+ if (old->next == NULL) {
+ old->parent->last_child = old->previous;
+ }
+ old->previous = old->next = old->parent = NULL;
+ return;
+ }
+
+ /* We're replacing old with first-to-last */
first->previous = old->previous;
last->next = old->next;
diff --git a/src/html/html_select_element.c b/src/html/html_select_element.c
index ff549b2..0801d0a 100644
--- a/src/html/html_select_element.c
+++ b/src/html/html_select_element.c
@@ -213,6 +213,9 @@ dom_exception dom_html_select_element_get_selected_index(
dom_html_options_collection *col;
err = _dom_html_select_element_make_collection(ele, &col);
+ if (err != DOM_NO_ERR) {
+ return err;
+ }
err = dom_html_options_collection_get_length(col, &len);
if (err != DOM_NO_ERR) {
@@ -266,6 +269,9 @@ dom_exception dom_html_select_element_set_selected_index(
dom_html_options_collection *col;
err = _dom_html_select_element_make_collection(ele, &col);
+ if (err != DOM_NO_ERR) {
+ return err;
+ }
err = dom_html_options_collection_item(col,
index, &option);
--
Document Object Model library
2 years, 11 months
libnsutils: branch master updated. release/0.0.5-2-gb7199a7
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libnsutils.git/shortlog/b7199a77aca01f85a3...
...commit http://git.netsurf-browser.org/libnsutils.git/commit/b7199a77aca01f85a335...
...tree http://git.netsurf-browser.org/libnsutils.git/tree/b7199a77aca01f85a33597...
The branch, master has been updated
via b7199a77aca01f85a3359737cd4e6c73c29bd82a (commit)
from 28a80ecdf8588afe5ee521acf3ba48d81aae7373 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libnsutils.git/commit/?id=b7199a77aca01f85...
commit b7199a77aca01f85a3359737cd4e6c73c29bd82a
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
extend base64 api with url safe versions
diff --git a/include/nsutils/base64.h b/include/nsutils/base64.h
index 2baeec6..6dba643 100644
--- a/include/nsutils/base64.h
+++ b/include/nsutils/base64.h
@@ -36,6 +36,23 @@ nsuerror nsu_base64_encode_alloc(const uint8_t *input,
size_t *output_length);
/**
+ * Base 64 encode data.
+ *
+ * allocate a buffer and encode source data into it using the base64 URL safe
+ * encoding.
+ *
+ * \param input The source data to encode.
+ * \param input_length The length of the source data.
+ * \param output The buffer to recive data into, the caller must free.
+ * \param output_length The length of data placed in \a output
+ * \return NSERROR_OK on success and \a output updated else error code.
+ */
+nsuerror nsu_base64_encode_alloc_url(const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length);
+
+/**
* Base 64 decode data.
*
* allocate a buffer and decode source data into it using the Base64 encoding.
@@ -50,5 +67,22 @@ nsuerror nsu_base64_decode_alloc(const uint8_t *input,
size_t input_length,
uint8_t **output,
size_t *output_length);
-
+
+/**
+ * Base 64 decode data.
+ *
+ * Allocate a buffer and decode source data into it using the Base64 URL safe
+ * encoding.
+ *
+ * \param input The source data to decode.
+ * \param input_length The length of the source data.
+ * \param output The buffer to recive data into, the caller must free.
+ * \param output_length The length of data placed in \a output
+ * \return NSERROR_OK on success and \a output updated else error code.
+ */
+nsuerror nsu_base64_decode_alloc_url(const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length);
+
#endif
diff --git a/src/base64.c b/src/base64.c
index c11364f..79909ea 100644
--- a/src/base64.c
+++ b/src/base64.c
@@ -21,22 +21,112 @@
#include "nsutils/base64.h"
-static uint8_t decoding_table[256];
-static uint8_t encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
- 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
- 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
- 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
- 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
- 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
- 'w', 'x', 'y', 'z', '0', '1', '2', '3',
- '4', '5', '6', '7', '8', '9', '+', '/'};
+static const uint8_t b64_decoding_table[256] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0 - 7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 8 - F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 10 - 17 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 18 - 1F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 20 - 27 */
+ 0xff, 0xff, 0xff, 62, 0xff, 0xff, 0xff, 63, /* 28 - 2F */
+ 52, 53, 54, 55, 56, 57, 58, 59, /* 30 - 37 */
+ 60, 61, 0xff, 0xff, 0xff, 64, 0xff, 0xff, /* 38 - 3F */
+ 0xff, 0, 1, 2, 3, 4, 5, 6, /* 40 - 47 */
+ 7, 8, 9, 10, 11, 12, 13, 14, /* 48 - 4F */
+ 15, 16, 17, 18, 19, 20, 21, 22, /* 50 - 57 */
+ 23, 24, 25, 0xff, 0xff, 0xff, 0xff, 0xff, /* 58 - 5F */
+ 0xff, 26, 27, 28, 29, 30, 31, 32, /* 60 - 67 */
+ 33, 34, 35, 36, 37, 38, 39, 40, /* 68 - 6F */
+ 41, 42, 43, 44, 45, 46, 47, 48, /* 70 - 77 */
+ 49, 50, 51, 0xff, 0xff, 0xff, 0xff, 0xff, /* 78 - 7F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 80 - 87 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 88 - 8F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 90 - 97 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 98 - 9F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* A0 - A7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* A8 - AF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* B0 - B7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* B8 - BF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* C0 - C7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* C8 - CF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* D0 - D7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* D8 - DF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* E0 - E7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* E8 - EF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* F0 - F7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* F8 - FF */
+};
+static const uint8_t b64_encoding_table[] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+ 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+ 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+ 'w', 'x', 'y', 'z', '0', '1', '2', '3',
+ '4', '5', '6', '7', '8', '9', '+', '/'};
+static const uint8_t b64url_decoding_table[256] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0 - 7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 8 - F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 10 - 17 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 18 - 1F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 20 - 27 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 62, 0xff, 0xff, /* 28 - 2F */
+ 52, 53, 54, 55, 56, 57, 58, 59, /* 30 - 37 */
+ 60, 61, 0xff, 0xff, 0xff, 64, 0xff, 0xff, /* 38 - 3F */
+ 0xff, 0, 1, 2, 3, 4, 5, 6, /* 40 - 47 */
+ 7, 8, 9, 10, 11, 12, 13, 14, /* 48 - 4F */
+ 15, 16, 17, 18, 19, 20, 21, 22, /* 50 - 57 */
+ 23, 24, 25, 0xff, 0xff, 0xff, 0xff, 63, /* 58 - 5F */
+ 0xff, 26, 27, 28, 29, 30, 31, 32, /* 60 - 67 */
+ 33, 34, 35, 36, 37, 38, 39, 40, /* 68 - 6F */
+ 41, 42, 43, 44, 45, 46, 47, 48, /* 70 - 77 */
+ 49, 50, 51, 0xff, 0xff, 0xff, 0xff, 0xff, /* 78 - 7F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 80 - 87 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 88 - 8F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 90 - 97 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 98 - 9F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* A0 - A7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* A8 - AF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* B0 - B7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* B8 - BF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* C0 - C7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* C8 - CF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* D0 - D7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* D8 - DF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* E0 - E7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* E8 - EF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* F0 - F7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* F8 - FF */
+};
+static const uint8_t b64url_encoding_table[] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+ 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+ 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+ 'w', 'x', 'y', 'z', '0', '1', '2', '3',
+ '4', '5', '6', '7', '8', '9', '-', '_'};
static unsigned int mod_table[] = {0, 2, 1};
-/* exported interface documented in nsutils/base64.h */
-nsuerror nsu_base64_encode_alloc(const uint8_t *input,
- size_t input_length,
- uint8_t **output,
- size_t *output_length)
+
+/**
+ * Base 64 encode data using a given encoding table.
+ *
+ * allocate a buffer and encode source data into it using the Base64 encoding.
+ *
+ * \param input The source data to encode.
+ * \param input_length The length of the source data.
+ * \param output The buffer to recive data into, the caller must free.
+ * \param output_length The length of data placed in \a output
+ * \return NSERROR_OK on success and \a output updated else error code.
+ */
+static nsuerror
+table_encode_alloc(const uint8_t *encoding_table,
+ const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length)
{
uint8_t *encoded;
size_t encoded_len;
@@ -74,14 +164,62 @@ nsuerror nsu_base64_encode_alloc(const uint8_t *input,
return NSUERROR_OK;
}
+/*
+ * standard base64 encoding
+ *
+ * exported interface documented in nsutils/base64.h
+ */
+nsuerror
+nsu_base64_encode_alloc(const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length)
+{
+ return table_encode_alloc(b64_encoding_table,
+ input,
+ input_length,
+ output,
+ output_length);
+}
-/* exported interface documented in nsutils/base64.h */
-nsuerror nsu_base64_decode_alloc(const uint8_t *input,
+/*
+ * url base64 encoding
+ *
+ * exported interface documented in nsutils/base64.h
+ */
+nsuerror
+nsu_base64_encode_alloc_url(const uint8_t *input,
size_t input_length,
uint8_t **output,
size_t *output_length)
{
- static bool decode_initialised = false;
+ return table_encode_alloc(b64url_encoding_table,
+ input,
+ input_length,
+ output,
+ output_length);
+}
+
+
+/**
+ * Base 64 decode data with a given decoding table.
+ *
+ * Allocate a buffer and decode source data into it using the Base64 decoding
+ * table.
+ *
+ * \param input The source data to decode.
+ * \param input_length The length of the source data.
+ * \param output The buffer to recive data into, the caller must free.
+ * \param output_length The length of data placed in \a output
+ * \return NSERROR_OK on success and \a output updated else error code.
+ */
+static nsuerror
+base64_decode_alloc(const uint8_t *decoding_table,
+ const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length)
+{
uint8_t *decoded;
size_t decoded_len;
size_t idx;
@@ -89,15 +227,6 @@ nsuerror nsu_base64_decode_alloc(const uint8_t *input,
uint8_t sextet[4];
int sextet_idx;
- if (!decode_initialised) {
- memset(decoding_table, 0xff, sizeof(decoding_table));
- for (idx = 0; idx < 64; idx++) {
- decoding_table[encoding_table[idx]] = idx;
- }
- decoding_table['='] = 64;
- decode_initialised = true;
- }
-
decoded_len = ((input_length + 3) / 4) * 3;
if (input[input_length - 1] == '=') (decoded_len)--;
if (input[input_length - 2] == '=') (decoded_len)--;
@@ -179,3 +308,41 @@ nsuerror nsu_base64_decode_alloc(const uint8_t *input,
return NSUERROR_OK;
}
+
+
+/*
+ * standard base64 decoding
+ *
+ * exported interface documented in nsutils/base64.h
+ */
+nsuerror
+nsu_base64_decode_alloc(const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length)
+{
+ return base64_decode_alloc(b64_decoding_table,
+ input,
+ input_length,
+ output,
+ output_length);
+}
+
+
+/*
+ * standard base64 decoding
+ *
+ * exported interface documented in nsutils/base64.h
+ */
+nsuerror
+nsu_base64_decode_alloc_url(const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length)
+{
+ return base64_decode_alloc(b64url_decoding_table,
+ input,
+ input_length,
+ output,
+ output_length);
+}
diff --git a/test/base64.c b/test/base64.c
index 7b09205..5cb8a7c 100644
--- a/test/base64.c
+++ b/test/base64.c
@@ -16,37 +16,65 @@
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
+#include <unistd.h>
#include <nsutils/base64.h>
int main(int argc, char**argv)
{
- uint8_t *buffer;
- size_t buffer_len=0;
- uint8_t *output;
- size_t output_len;
-
- if (scanf("%1024mc%n", &buffer, (int *)&buffer_len) < 1) {
- return 1;
- }
-
- if (argc == 1) {
- /* encode */
- nsu_base64_encode_alloc(buffer, buffer_len, &output, &output_len);
- } else if ((argv[1][0] == '-') && (argv[1][1] == 'd')) {
- /* decode */
- nsu_base64_decode_alloc(buffer, buffer_len, &output, &output_len);
- } else {
- fprintf(stderr, "Usage: %s [-d]\n", argv[0]);
- return 1;
- }
-
- if (output != NULL) {
- printf("%.*s", (int)output_len, output);
- free(output);
- }
-
- free(buffer);
-
- return 0;
+ uint8_t *buffer;
+ size_t buffer_len=0;
+ uint8_t *output;
+ size_t output_len;
+ int opt;
+ int decode = 0;
+ int url = 0;
+
+
+ while ((opt = getopt(argc, argv, "du")) != -1) {
+ switch (opt) {
+ case 'd':
+ decode = 1;
+ break;
+ case 'u':
+ url = 1;
+ break;
+
+ default: /* '?' */
+ fprintf(stderr, "Usage: %s [-d] [-u]\n", argv[0]);
+ exit(EXIT_FAILURE);
+
+ }
+ }
+
+ if (scanf("%1024mc%n", &buffer, (int *)&buffer_len) < 1) {
+ return 1;
+ }
+
+
+ if (decode) {
+ /* decode */
+ if (url) {
+ nsu_base64_decode_alloc_url(buffer, buffer_len, &output, &output_len);
+ } else {
+
+ nsu_base64_decode_alloc(buffer, buffer_len, &output, &output_len);
+ }
+ } else {
+ /* encode */
+ if (url) {
+ nsu_base64_encode_alloc_url(buffer, buffer_len, &output, &output_len);
+ } else {
+ nsu_base64_encode_alloc(buffer, buffer_len, &output, &output_len);
+ }
+ }
+
+ if (output != NULL) {
+ printf("%.*s", (int)output_len, output);
+ free(output);
+ }
+
+ free(buffer);
+
+ return 0;
}
diff --git a/test/runtest.sh b/test/runtest.sh
index efcb79f..9f02e1c 100755
--- a/test/runtest.sh
+++ b/test/runtest.sh
@@ -5,30 +5,70 @@ b64enctst()
{
ENC=$(echo -n "${1}" | ${TEST_PATH}/test_base64 )
if [ "${ENC}" != "${2}" ];then
- echo "Base64 encode error ${ENC} != ${2}"
+ echo "Base64 encode error '${ENC}' != '${2}'"
exit 2
- fi
+ fi
}
b64dectst()
{
DEC=$(echo -n "$1" | ${TEST_PATH}/test_base64 -d )
if [ "${DEC}" != "$2" ];then
- echo "Base64 decode error ${DEC} != $2"
+ echo "Base64 decode error '${DEC}' != '$2'"
exit 3
- fi
+ fi
}
-b64enctst 'f' 'Zg=='
-b64enctst 'fo' 'Zm8='
-b64enctst 'foo' 'Zm9v'
-b64enctst 'foob' 'Zm9vYg=='
-b64enctst 'fooba' 'Zm9vYmE='
+b64urlenctst()
+{
+ ENC=$(echo -n "${1}" | ${TEST_PATH}/test_base64 -u )
+ if [ "${ENC}" != "${2}" ];then
+ echo "Base64 url encode error '${ENC}' != '${2}'"
+ exit 2
+ fi
+}
+
+b64urldectst()
+{
+ DEC=$(echo -n "$1" | ${TEST_PATH}/test_base64 -d -u )
+ if [ "${DEC}" != "$2" ];then
+ echo "Base64 url decode error '${DEC}' != '$2'"
+ exit 3
+ fi
+}
+
+b64enctst 'f' 'Zg=='
+b64enctst 'fo' 'Zm8='
+b64enctst 'foo' 'Zm9v'
+b64enctst ' >' 'ICA+'
+b64enctst ' ?' 'ICA/'
+b64enctst 'foob' 'Zm9vYg=='
+b64enctst 'fooba' 'Zm9vYmE='
b64enctst 'foobar' 'Zm9vYmFy'
-b64dectst 'Zg==' 'f'
-b64dectst 'Zm8=' 'fo'
-b64dectst 'Zm9v' 'foo'
+b64dectst 'Zg==' 'f'
+b64dectst 'Zm8=' 'fo'
+b64dectst 'Zm9v' 'foo'
+b64dectst 'ICA+' ' >'
+b64dectst 'ICA/' ' ?'
b64dectst 'Zm9vYg==' 'foob'
b64dectst 'Zm9vYmE=' 'fooba'
b64dectst 'Zm9vYmFy' 'foobar'
+
+b64urlenctst 'f' 'Zg=='
+b64urlenctst 'fo' 'Zm8='
+b64urlenctst 'foo' 'Zm9v'
+b64urlenctst ' >' 'ICA-'
+b64urlenctst ' ?' 'ICA_'
+b64urlenctst 'foob' 'Zm9vYg=='
+b64urlenctst 'fooba' 'Zm9vYmE='
+b64urlenctst 'foobar' 'Zm9vYmFy'
+
+b64urldectst 'Zg==' 'f'
+b64urldectst 'Zm8=' 'fo'
+b64urldectst 'Zm9v' 'foo'
+b64urldectst 'ICA-' ' >'
+b64urldectst 'ICA_' ' ?'
+b64urldectst 'Zm9vYg==' 'foob'
+b64urldectst 'Zm9vYmE=' 'fooba'
+b64urldectst 'Zm9vYmFy' 'foobar'
-----------------------------------------------------------------------
Summary of changes:
include/nsutils/base64.h | 36 +++++++-
src/base64.c | 219 ++++++++++++++++++++++++++++++++++++++++------
test/base64.c | 84 ++++++++++++------
test/runtest.sh | 64 +++++++++++---
4 files changed, 336 insertions(+), 67 deletions(-)
diff --git a/include/nsutils/base64.h b/include/nsutils/base64.h
index 2baeec6..6dba643 100644
--- a/include/nsutils/base64.h
+++ b/include/nsutils/base64.h
@@ -36,6 +36,23 @@ nsuerror nsu_base64_encode_alloc(const uint8_t *input,
size_t *output_length);
/**
+ * Base 64 encode data.
+ *
+ * allocate a buffer and encode source data into it using the base64 URL safe
+ * encoding.
+ *
+ * \param input The source data to encode.
+ * \param input_length The length of the source data.
+ * \param output The buffer to recive data into, the caller must free.
+ * \param output_length The length of data placed in \a output
+ * \return NSERROR_OK on success and \a output updated else error code.
+ */
+nsuerror nsu_base64_encode_alloc_url(const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length);
+
+/**
* Base 64 decode data.
*
* allocate a buffer and decode source data into it using the Base64 encoding.
@@ -50,5 +67,22 @@ nsuerror nsu_base64_decode_alloc(const uint8_t *input,
size_t input_length,
uint8_t **output,
size_t *output_length);
-
+
+/**
+ * Base 64 decode data.
+ *
+ * Allocate a buffer and decode source data into it using the Base64 URL safe
+ * encoding.
+ *
+ * \param input The source data to decode.
+ * \param input_length The length of the source data.
+ * \param output The buffer to recive data into, the caller must free.
+ * \param output_length The length of data placed in \a output
+ * \return NSERROR_OK on success and \a output updated else error code.
+ */
+nsuerror nsu_base64_decode_alloc_url(const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length);
+
#endif
diff --git a/src/base64.c b/src/base64.c
index c11364f..79909ea 100644
--- a/src/base64.c
+++ b/src/base64.c
@@ -21,22 +21,112 @@
#include "nsutils/base64.h"
-static uint8_t decoding_table[256];
-static uint8_t encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
- 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
- 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
- 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
- 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
- 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
- 'w', 'x', 'y', 'z', '0', '1', '2', '3',
- '4', '5', '6', '7', '8', '9', '+', '/'};
+static const uint8_t b64_decoding_table[256] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0 - 7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 8 - F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 10 - 17 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 18 - 1F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 20 - 27 */
+ 0xff, 0xff, 0xff, 62, 0xff, 0xff, 0xff, 63, /* 28 - 2F */
+ 52, 53, 54, 55, 56, 57, 58, 59, /* 30 - 37 */
+ 60, 61, 0xff, 0xff, 0xff, 64, 0xff, 0xff, /* 38 - 3F */
+ 0xff, 0, 1, 2, 3, 4, 5, 6, /* 40 - 47 */
+ 7, 8, 9, 10, 11, 12, 13, 14, /* 48 - 4F */
+ 15, 16, 17, 18, 19, 20, 21, 22, /* 50 - 57 */
+ 23, 24, 25, 0xff, 0xff, 0xff, 0xff, 0xff, /* 58 - 5F */
+ 0xff, 26, 27, 28, 29, 30, 31, 32, /* 60 - 67 */
+ 33, 34, 35, 36, 37, 38, 39, 40, /* 68 - 6F */
+ 41, 42, 43, 44, 45, 46, 47, 48, /* 70 - 77 */
+ 49, 50, 51, 0xff, 0xff, 0xff, 0xff, 0xff, /* 78 - 7F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 80 - 87 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 88 - 8F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 90 - 97 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 98 - 9F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* A0 - A7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* A8 - AF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* B0 - B7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* B8 - BF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* C0 - C7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* C8 - CF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* D0 - D7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* D8 - DF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* E0 - E7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* E8 - EF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* F0 - F7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* F8 - FF */
+};
+static const uint8_t b64_encoding_table[] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+ 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+ 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+ 'w', 'x', 'y', 'z', '0', '1', '2', '3',
+ '4', '5', '6', '7', '8', '9', '+', '/'};
+static const uint8_t b64url_decoding_table[256] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0 - 7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 8 - F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 10 - 17 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 18 - 1F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 20 - 27 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 62, 0xff, 0xff, /* 28 - 2F */
+ 52, 53, 54, 55, 56, 57, 58, 59, /* 30 - 37 */
+ 60, 61, 0xff, 0xff, 0xff, 64, 0xff, 0xff, /* 38 - 3F */
+ 0xff, 0, 1, 2, 3, 4, 5, 6, /* 40 - 47 */
+ 7, 8, 9, 10, 11, 12, 13, 14, /* 48 - 4F */
+ 15, 16, 17, 18, 19, 20, 21, 22, /* 50 - 57 */
+ 23, 24, 25, 0xff, 0xff, 0xff, 0xff, 63, /* 58 - 5F */
+ 0xff, 26, 27, 28, 29, 30, 31, 32, /* 60 - 67 */
+ 33, 34, 35, 36, 37, 38, 39, 40, /* 68 - 6F */
+ 41, 42, 43, 44, 45, 46, 47, 48, /* 70 - 77 */
+ 49, 50, 51, 0xff, 0xff, 0xff, 0xff, 0xff, /* 78 - 7F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 80 - 87 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 88 - 8F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 90 - 97 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 98 - 9F */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* A0 - A7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* A8 - AF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* B0 - B7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* B8 - BF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* C0 - C7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* C8 - CF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* D0 - D7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* D8 - DF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* E0 - E7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* E8 - EF */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* F0 - F7 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* F8 - FF */
+};
+static const uint8_t b64url_encoding_table[] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+ 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+ 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+ 'w', 'x', 'y', 'z', '0', '1', '2', '3',
+ '4', '5', '6', '7', '8', '9', '-', '_'};
static unsigned int mod_table[] = {0, 2, 1};
-/* exported interface documented in nsutils/base64.h */
-nsuerror nsu_base64_encode_alloc(const uint8_t *input,
- size_t input_length,
- uint8_t **output,
- size_t *output_length)
+
+/**
+ * Base 64 encode data using a given encoding table.
+ *
+ * allocate a buffer and encode source data into it using the Base64 encoding.
+ *
+ * \param input The source data to encode.
+ * \param input_length The length of the source data.
+ * \param output The buffer to recive data into, the caller must free.
+ * \param output_length The length of data placed in \a output
+ * \return NSERROR_OK on success and \a output updated else error code.
+ */
+static nsuerror
+table_encode_alloc(const uint8_t *encoding_table,
+ const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length)
{
uint8_t *encoded;
size_t encoded_len;
@@ -74,14 +164,62 @@ nsuerror nsu_base64_encode_alloc(const uint8_t *input,
return NSUERROR_OK;
}
+/*
+ * standard base64 encoding
+ *
+ * exported interface documented in nsutils/base64.h
+ */
+nsuerror
+nsu_base64_encode_alloc(const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length)
+{
+ return table_encode_alloc(b64_encoding_table,
+ input,
+ input_length,
+ output,
+ output_length);
+}
-/* exported interface documented in nsutils/base64.h */
-nsuerror nsu_base64_decode_alloc(const uint8_t *input,
+/*
+ * url base64 encoding
+ *
+ * exported interface documented in nsutils/base64.h
+ */
+nsuerror
+nsu_base64_encode_alloc_url(const uint8_t *input,
size_t input_length,
uint8_t **output,
size_t *output_length)
{
- static bool decode_initialised = false;
+ return table_encode_alloc(b64url_encoding_table,
+ input,
+ input_length,
+ output,
+ output_length);
+}
+
+
+/**
+ * Base 64 decode data with a given decoding table.
+ *
+ * Allocate a buffer and decode source data into it using the Base64 decoding
+ * table.
+ *
+ * \param input The source data to decode.
+ * \param input_length The length of the source data.
+ * \param output The buffer to recive data into, the caller must free.
+ * \param output_length The length of data placed in \a output
+ * \return NSERROR_OK on success and \a output updated else error code.
+ */
+static nsuerror
+base64_decode_alloc(const uint8_t *decoding_table,
+ const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length)
+{
uint8_t *decoded;
size_t decoded_len;
size_t idx;
@@ -89,15 +227,6 @@ nsuerror nsu_base64_decode_alloc(const uint8_t *input,
uint8_t sextet[4];
int sextet_idx;
- if (!decode_initialised) {
- memset(decoding_table, 0xff, sizeof(decoding_table));
- for (idx = 0; idx < 64; idx++) {
- decoding_table[encoding_table[idx]] = idx;
- }
- decoding_table['='] = 64;
- decode_initialised = true;
- }
-
decoded_len = ((input_length + 3) / 4) * 3;
if (input[input_length - 1] == '=') (decoded_len)--;
if (input[input_length - 2] == '=') (decoded_len)--;
@@ -179,3 +308,41 @@ nsuerror nsu_base64_decode_alloc(const uint8_t *input,
return NSUERROR_OK;
}
+
+
+/*
+ * standard base64 decoding
+ *
+ * exported interface documented in nsutils/base64.h
+ */
+nsuerror
+nsu_base64_decode_alloc(const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length)
+{
+ return base64_decode_alloc(b64_decoding_table,
+ input,
+ input_length,
+ output,
+ output_length);
+}
+
+
+/*
+ * standard base64 decoding
+ *
+ * exported interface documented in nsutils/base64.h
+ */
+nsuerror
+nsu_base64_decode_alloc_url(const uint8_t *input,
+ size_t input_length,
+ uint8_t **output,
+ size_t *output_length)
+{
+ return base64_decode_alloc(b64url_decoding_table,
+ input,
+ input_length,
+ output,
+ output_length);
+}
diff --git a/test/base64.c b/test/base64.c
index 7b09205..5cb8a7c 100644
--- a/test/base64.c
+++ b/test/base64.c
@@ -16,37 +16,65 @@
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
+#include <unistd.h>
#include <nsutils/base64.h>
int main(int argc, char**argv)
{
- uint8_t *buffer;
- size_t buffer_len=0;
- uint8_t *output;
- size_t output_len;
-
- if (scanf("%1024mc%n", &buffer, (int *)&buffer_len) < 1) {
- return 1;
- }
-
- if (argc == 1) {
- /* encode */
- nsu_base64_encode_alloc(buffer, buffer_len, &output, &output_len);
- } else if ((argv[1][0] == '-') && (argv[1][1] == 'd')) {
- /* decode */
- nsu_base64_decode_alloc(buffer, buffer_len, &output, &output_len);
- } else {
- fprintf(stderr, "Usage: %s [-d]\n", argv[0]);
- return 1;
- }
-
- if (output != NULL) {
- printf("%.*s", (int)output_len, output);
- free(output);
- }
-
- free(buffer);
-
- return 0;
+ uint8_t *buffer;
+ size_t buffer_len=0;
+ uint8_t *output;
+ size_t output_len;
+ int opt;
+ int decode = 0;
+ int url = 0;
+
+
+ while ((opt = getopt(argc, argv, "du")) != -1) {
+ switch (opt) {
+ case 'd':
+ decode = 1;
+ break;
+ case 'u':
+ url = 1;
+ break;
+
+ default: /* '?' */
+ fprintf(stderr, "Usage: %s [-d] [-u]\n", argv[0]);
+ exit(EXIT_FAILURE);
+
+ }
+ }
+
+ if (scanf("%1024mc%n", &buffer, (int *)&buffer_len) < 1) {
+ return 1;
+ }
+
+
+ if (decode) {
+ /* decode */
+ if (url) {
+ nsu_base64_decode_alloc_url(buffer, buffer_len, &output, &output_len);
+ } else {
+
+ nsu_base64_decode_alloc(buffer, buffer_len, &output, &output_len);
+ }
+ } else {
+ /* encode */
+ if (url) {
+ nsu_base64_encode_alloc_url(buffer, buffer_len, &output, &output_len);
+ } else {
+ nsu_base64_encode_alloc(buffer, buffer_len, &output, &output_len);
+ }
+ }
+
+ if (output != NULL) {
+ printf("%.*s", (int)output_len, output);
+ free(output);
+ }
+
+ free(buffer);
+
+ return 0;
}
diff --git a/test/runtest.sh b/test/runtest.sh
index efcb79f..9f02e1c 100755
--- a/test/runtest.sh
+++ b/test/runtest.sh
@@ -5,30 +5,70 @@ b64enctst()
{
ENC=$(echo -n "${1}" | ${TEST_PATH}/test_base64 )
if [ "${ENC}" != "${2}" ];then
- echo "Base64 encode error ${ENC} != ${2}"
+ echo "Base64 encode error '${ENC}' != '${2}'"
exit 2
- fi
+ fi
}
b64dectst()
{
DEC=$(echo -n "$1" | ${TEST_PATH}/test_base64 -d )
if [ "${DEC}" != "$2" ];then
- echo "Base64 decode error ${DEC} != $2"
+ echo "Base64 decode error '${DEC}' != '$2'"
exit 3
- fi
+ fi
}
-b64enctst 'f' 'Zg=='
-b64enctst 'fo' 'Zm8='
-b64enctst 'foo' 'Zm9v'
-b64enctst 'foob' 'Zm9vYg=='
-b64enctst 'fooba' 'Zm9vYmE='
+b64urlenctst()
+{
+ ENC=$(echo -n "${1}" | ${TEST_PATH}/test_base64 -u )
+ if [ "${ENC}" != "${2}" ];then
+ echo "Base64 url encode error '${ENC}' != '${2}'"
+ exit 2
+ fi
+}
+
+b64urldectst()
+{
+ DEC=$(echo -n "$1" | ${TEST_PATH}/test_base64 -d -u )
+ if [ "${DEC}" != "$2" ];then
+ echo "Base64 url decode error '${DEC}' != '$2'"
+ exit 3
+ fi
+}
+
+b64enctst 'f' 'Zg=='
+b64enctst 'fo' 'Zm8='
+b64enctst 'foo' 'Zm9v'
+b64enctst ' >' 'ICA+'
+b64enctst ' ?' 'ICA/'
+b64enctst 'foob' 'Zm9vYg=='
+b64enctst 'fooba' 'Zm9vYmE='
b64enctst 'foobar' 'Zm9vYmFy'
-b64dectst 'Zg==' 'f'
-b64dectst 'Zm8=' 'fo'
-b64dectst 'Zm9v' 'foo'
+b64dectst 'Zg==' 'f'
+b64dectst 'Zm8=' 'fo'
+b64dectst 'Zm9v' 'foo'
+b64dectst 'ICA+' ' >'
+b64dectst 'ICA/' ' ?'
b64dectst 'Zm9vYg==' 'foob'
b64dectst 'Zm9vYmE=' 'fooba'
b64dectst 'Zm9vYmFy' 'foobar'
+
+b64urlenctst 'f' 'Zg=='
+b64urlenctst 'fo' 'Zm8='
+b64urlenctst 'foo' 'Zm9v'
+b64urlenctst ' >' 'ICA-'
+b64urlenctst ' ?' 'ICA_'
+b64urlenctst 'foob' 'Zm9vYg=='
+b64urlenctst 'fooba' 'Zm9vYmE='
+b64urlenctst 'foobar' 'Zm9vYmFy'
+
+b64urldectst 'Zg==' 'f'
+b64urldectst 'Zm8=' 'fo'
+b64urldectst 'Zm9v' 'foo'
+b64urldectst 'ICA-' ' >'
+b64urldectst 'ICA_' ' ?'
+b64urldectst 'Zm9vYg==' 'foob'
+b64urldectst 'Zm9vYmE=' 'fooba'
+b64urldectst 'Zm9vYmFy' 'foobar'
--
NetSurf generalised utility library
2 years, 11 months