netsurf: branch master updated. 31c9ffb4b51b79394f882e5efed629c2df0600d9
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/31c9ffb4b51b79394f882...
...commit http://git.netsurf-browser.org/netsurf.git/commit/31c9ffb4b51b79394f882e5...
...tree http://git.netsurf-browser.org/netsurf.git/tree/31c9ffb4b51b79394f882e5ef...
The branch, master has been updated
via 31c9ffb4b51b79394f882e5efed629c2df0600d9 (commit)
from 61872ab3a493d60ede0e5ca2221b4c5c94708171 (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/commitdiff/31c9ffb4b51b79394f8...
commit 31c9ffb4b51b79394f882e5efed629c2df0600d9
Author: Vincent Sanders <vince(a)netsurf-browser.org>
Commit: Vincent Sanders <vince(a)netsurf-browser.org>
make boxes keep reference to the DOM node that causes them
diff --git a/render/box.c b/render/box.c
index b9d0598..5dfada0 100644
--- a/render/box.c
+++ b/render/box.c
@@ -92,9 +92,14 @@ static int box_talloc_destructor(struct box *b)
if (b->href != NULL)
nsurl_unref(b->href);
- if (b->id != NULL)
+ if (b->id != NULL) {
lwc_string_unref(b->id);
-
+ }
+
+ if (b->node != NULL) {
+ dom_node_unref(b->node);
+ }
+
return 0;
}
@@ -172,6 +177,7 @@ struct box * box_create(css_select_results *styles, css_computed_style *style,
box->object = NULL;
box->object_params = NULL;
box->iframe = NULL;
+ box->node = NULL;
return box;
}
diff --git a/render/box.h b/render/box.h
index a4622e3..0953d9f 100644
--- a/render/box.h
+++ b/render/box.h
@@ -265,6 +265,8 @@ struct box {
/** Iframe's browser_window, or NULL if none */
struct browser_window *iframe;
+
+ struct dom_node *node; /**< DOM node that generated this box or NULL */
};
/** Table column data. */
diff --git a/render/box_construct.c b/render/box_construct.c
index 6357587..52c8cfe 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -994,12 +994,15 @@ bool box_construct_element(struct box_construct_ctx *ctx,
return true;
}
- /* Attach box to DOM node */
+ /* Attach DOM node to box */
err = dom_node_set_user_data(ctx->n, kstr_box_key, box, NULL,
(void *) &old_box);
if (err != DOM_NO_ERR)
return false;
+ /* Attach box to DOM node */
+ box->node = dom_node_ref(ctx->n);
+
if (props.inline_container == NULL &&
(box->type == BOX_INLINE ||
box->type == BOX_BR ||
-----------------------------------------------------------------------
Summary of changes:
render/box.c | 10 ++++++++--
render/box.h | 2 ++
render/box_construct.c | 5 ++++-
3 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/render/box.c b/render/box.c
index b9d0598..5dfada0 100644
--- a/render/box.c
+++ b/render/box.c
@@ -92,9 +92,14 @@ static int box_talloc_destructor(struct box *b)
if (b->href != NULL)
nsurl_unref(b->href);
- if (b->id != NULL)
+ if (b->id != NULL) {
lwc_string_unref(b->id);
-
+ }
+
+ if (b->node != NULL) {
+ dom_node_unref(b->node);
+ }
+
return 0;
}
@@ -172,6 +177,7 @@ struct box * box_create(css_select_results *styles, css_computed_style *style,
box->object = NULL;
box->object_params = NULL;
box->iframe = NULL;
+ box->node = NULL;
return box;
}
diff --git a/render/box.h b/render/box.h
index a4622e3..0953d9f 100644
--- a/render/box.h
+++ b/render/box.h
@@ -265,6 +265,8 @@ struct box {
/** Iframe's browser_window, or NULL if none */
struct browser_window *iframe;
+
+ struct dom_node *node; /**< DOM node that generated this box or NULL */
};
/** Table column data. */
diff --git a/render/box_construct.c b/render/box_construct.c
index 6357587..52c8cfe 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -994,12 +994,15 @@ bool box_construct_element(struct box_construct_ctx *ctx,
return true;
}
- /* Attach box to DOM node */
+ /* Attach DOM node to box */
err = dom_node_set_user_data(ctx->n, kstr_box_key, box, NULL,
(void *) &old_box);
if (err != DOM_NO_ERR)
return false;
+ /* Attach box to DOM node */
+ box->node = dom_node_ref(ctx->n);
+
if (props.inline_container == NULL &&
(box->type == BOX_INLINE ||
box->type == BOX_BR ||
--
NetSurf Browser
11 years
netsurf: branch master updated. 61872ab3a493d60ede0e5ca2221b4c5c94708171
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/61872ab3a493d60ede0e5...
...commit http://git.netsurf-browser.org/netsurf.git/commit/61872ab3a493d60ede0e5ca...
...tree http://git.netsurf-browser.org/netsurf.git/tree/61872ab3a493d60ede0e5ca22...
The branch, master has been updated
via 61872ab3a493d60ede0e5ca2221b4c5c94708171 (commit)
via 23dc635e1a2386d52779384d6117f020376142f7 (commit)
via d66e9c34a8e5e6081541c2b7bfd1e97012289494 (commit)
from ec79063155c809d52e54812e0045900bbad53532 (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/commitdiff/61872ab3a493d60ede0...
commit 61872ab3a493d60ede0e5ca2221b4c5c94708171
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Debug
diff --git a/amiga/gui.c b/amiga/gui.c
index 93ee082..7482b4b 100755
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -1206,6 +1206,7 @@ void ami_handle_msg(void)
struct browser_window *closedbw;
struct timeval curtime;
static int drag_x_move = 0, drag_y_move = 0;
+ char *url;
if(IsMinListEmpty(window_list))
{
@@ -1601,11 +1602,13 @@ void ami_handle_msg(void)
break;
case GID_HOTLIST:
- GetAttrs(gwin->objects[GID_HOTLIST],
- SPEEDBAR_SelectedNode, &tabnode, TAG_DONE);
- GetSpeedButtonNodeAttrs(tabnode, SBNA_UserData, (ULONG *)&storage, TAG_DONE);
-
- browser_window_go(gwin->bw, (char *)storage, NULL, true);
+ GetAttr(SPEEDBAR_SelectedNode,
+ (Object *)gwin->objects[GID_HOTLIST],
+ (ULONG *)&tabnode);
+ printf("%lx %d\n", tabnode, code);
+ GetSpeedButtonNodeAttrs(tabnode, SBNA_UserData, (ULONG *)&url, TAG_DONE);
+ printf("%s\n", url);
+ browser_window_go(gwin->bw, url, NULL, true);
break;
case GID_HOME:
commitdiff http://git.netsurf-browser.org/netsurf.git/commitdiff/23dc635e1a2386d5277...
commit 23dc635e1a2386d52779384d6117f020376142f7
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Make hotlist toolbar work and update (only updates on hotlist window close currently)
diff --git a/amiga/gui.c b/amiga/gui.c
index 2cbceac..93ee082 100755
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -1600,6 +1600,14 @@ void ami_handle_msg(void)
browser_window_go(gwin->bw,(char *)storage, NULL, true);
break;
+ case GID_HOTLIST:
+ GetAttrs(gwin->objects[GID_HOTLIST],
+ SPEEDBAR_SelectedNode, &tabnode, TAG_DONE);
+ GetSpeedButtonNodeAttrs(tabnode, SBNA_UserData, (ULONG *)&storage, TAG_DONE);
+
+ browser_window_go(gwin->bw, (char *)storage, NULL, true);
+ break;
+
case GID_HOME:
browser_window_go(gwin->bw,nsoption_charp(homepage_url),NULL,true);
break;
@@ -2477,7 +2485,7 @@ int ami_gui_hotlist_scan(struct tree *tree, struct List *speed_button_list, stru
{
element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
if(!element) element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
- if(element && (strcmp(tree_node_element_get_text(element), "Toolbar") == 0))
+ if(element && (strcmp(tree_node_element_get_text(element), messages_get("HotlistToolbar")) == 0))
{
ami_gui_hotlist_scan_2(tree, tree_node_get_child(node), &gen, &item, speed_button_list, gwin);
}
@@ -2509,12 +2517,100 @@ void ami_gui_hotlist_toolbar_add(struct gui_window_2 *gwin)
IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_ADDIMAGE,
gwin->win, gwin->objects[GID_HOTLISTSEPBAR], NULL);
+
+ FlushLayoutDomainCache((struct Gadget *)gwin->objects[GID_MAIN]);
+
+ RethinkLayout((struct Gadget *)gwin->objects[GID_MAIN],
+ gwin->win, NULL, TRUE);
+ }
+}
+
+void ami_gui_hotlist_toolbar_free(struct gui_window_2 *gwin, struct List *speed_button_list)
+{
+ int i;
+ struct Node *node;
+ struct Node *nnode;
+
+ if(IsListEmpty(speed_button_list)) return;
+ node = GetHead(speed_button_list);
+
+ do {
+ nnode = GetSucc(node);
+ Remove(node);
+ FreeSpeedButtonNode(node);
+ } while(node = nnode);
+
+ for(i = 0; i < AMI_GUI_TOOLBAR_MAX; i++) {
+ if(gwin->hotlist_toolbar_lab[i]) {
+ free(gwin->hotlist_toolbar_lab[i]);
+ gwin->hotlist_toolbar_lab[i] = NULL;
+ }
}
+}
+
+void ami_gui_hotlist_toolbar_remove(struct gui_window_2 *gwin)
+{
+ IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_REMOVECHILD,
+ gwin->win, gwin->objects[GID_HOTLIST]);
+
+ IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_REMOVECHILD,
+ gwin->win, gwin->objects[GID_HOTLISTSEPBAR]);
FlushLayoutDomainCache((struct Gadget *)gwin->objects[GID_MAIN]);
RethinkLayout((struct Gadget *)gwin->objects[GID_MAIN],
gwin->win, NULL, TRUE);
+
+ gwin->redraw_required = true;
+ gwin->bw->reformat_pending = true;
+
+ ami_gui_hotlist_toolbar_free(gwin, &gwin->hotlist_toolbar_list);
+}
+
+void ami_gui_hotlist_toolbar_update(struct gui_window_2 *gwin)
+{
+ if(IsListEmpty(&gwin->hotlist_toolbar_list)) {
+ ami_gui_hotlist_toolbar_add(gwin);
+ return;
+ }
+
+ /* Below should be SetAttr according to Autodocs */
+ SetGadgetAttrs((struct Gadget *)gwin->objects[GID_HOTLIST],
+ gwin->win, NULL,
+ SPEEDBAR_Buttons, ~0,
+ TAG_DONE);
+
+ ami_gui_hotlist_toolbar_free(gwin, &gwin->hotlist_toolbar_list);
+
+ if(ami_gui_hotlist_scan(ami_tree_get_tree(hotlist_window), &gwin->hotlist_toolbar_list, gwin) > 0) {
+ SetGadgetAttrs((struct Gadget *)gwin->objects[GID_HOTLIST],
+ gwin->win, NULL,
+ SPEEDBAR_Buttons, &gwin->hotlist_toolbar_list,
+ TAG_DONE);
+ } else {
+ ami_gui_hotlist_toolbar_remove(gwin);
+ }
+}
+
+void ami_gui_hotlist_toolbar_update_all(void)
+{
+ struct nsObject *node;
+ struct nsObject *nnode;
+ struct gui_window_2 *gwin;
+
+ if(IsMinListEmpty(window_list)) return;
+
+ node = (struct nsObject *)GetHead((struct List *)window_list);
+
+ do {
+ nnode=(struct nsObject *)GetSucc((struct Node *)node);
+ gwin = node->objstruct;
+
+ if(node->Type == AMINS_WINDOW)
+ {
+ ami_gui_hotlist_toolbar_update(gwin);
+ }
+ } while(node = nnode);
}
void ami_toggletabbar(struct gui_window_2 *gwin, bool show)
@@ -3305,6 +3401,8 @@ void gui_window_destroy(struct gui_window *g)
ami_gui_appicon_remove(g->shared);
if(g->shared->appwin) RemoveAppWindow(g->shared->appwin);
+ ami_gui_hotlist_toolbar_free(g->shared, &g->shared->hotlist_toolbar_list);
+
/* These aren't freed by the above.
* TODO: nav_west etc need freeing too? */
DisposeObject(g->shared->objects[GID_ADDTAB_BM]);
diff --git a/amiga/gui.h b/amiga/gui.h
index 14cec10..6a5434f 100755
--- a/amiga/gui.h
+++ b/amiga/gui.h
@@ -153,6 +153,7 @@ int ami_key_to_nskey(ULONG keycode, struct InputEvent *ie);
bool ami_text_box_at_point(struct gui_window_2 *gwin, ULONG *x, ULONG *y);
BOOL ami_gadget_hit(Object *obj, int x, int y);
void ami_gui_history(struct gui_window_2 *gwin, bool back);
+void ami_gui_hotlist_toolbar_update_all(void);
struct TextFont *origrpfont;
struct MinList *window_list;
diff --git a/amiga/menu.c b/amiga/menu.c
index b116e1b..f428606 100755
--- a/amiga/menu.c
+++ b/amiga/menu.c
@@ -506,17 +506,17 @@ ULONG ami_menu_scan(struct tree *tree, bool count, struct gui_window_2 *gwin)
{
element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
if(!element) element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
- if(element && (strcmp(tree_node_element_get_text(element),"Menu")==0))
+ if(element && (strcmp(tree_node_element_get_text(element), messages_get("HotlistMenu")) == 0))
{
// found menu
- ami_menu_scan_2(tree,tree_node_get_child(node),&gen,&item,count,gwin);
+ ami_menu_scan_2(tree, tree_node_get_child(node), &gen, &item, count, gwin);
}
}
return(item - AMI_MENU_HOTLIST);
}
-void ami_menu_scan_2(struct tree *tree,struct node *root,WORD *gen,
+void ami_menu_scan_2(struct tree *tree, struct node *root, WORD *gen,
ULONG *item, bool count, struct gui_window_2 *gwin)
{
struct node *tempnode;
diff --git a/amiga/tree.c b/amiga/tree.c
index f2ef3cc..95a68dc 100755
--- a/amiga/tree.c
+++ b/amiga/tree.c
@@ -690,6 +690,8 @@ void ami_tree_close(struct treeview_window *twin)
ami_utf8_free(twin->sslreject);
ami_ssl_free(twin);
}
+
+ ami_gui_hotlist_toolbar_update_all();
}
void ami_tree_update_quals(struct treeview_window *twin)
commitdiff http://git.netsurf-browser.org/netsurf.git/commitdiff/d66e9c34a8e5e608154...
commit d66e9c34a8e5e6081541c2b7bfd1e97012289494
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Create "menu" and "toolbar" directories in the hotlist if they don't exist on startup
diff --git a/amiga/hotlist.c b/amiga/hotlist.c
index 6469cbd..b67e10f 100755
--- a/amiga/hotlist.c
+++ b/amiga/hotlist.c
@@ -18,8 +18,41 @@
#include <proto/exec.h>
#include "amiga/hotlist.h"
-#include "desktop/hotlist.h"
#include "amiga/tree.h"
+#include "desktop/hotlist.h"
+#include "utils/messages.h"
+
+bool ami_hotlist_find_dir(struct tree *tree, const char *dir_name)
+{
+ struct node *root = tree_node_get_child(tree_get_root(tree));
+ struct node *node;
+ struct node_element *element;
+
+ for (node = root; node; node = tree_node_get_next(node))
+ {
+ element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
+ if(!element) element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
+ if(element && (strcmp(tree_node_element_get_text(element), dir_name) == 0))
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void ami_hotlist_add_default_dirs(struct tree *tree)
+{
+ if(ami_hotlist_find_dir(tree, messages_get("HotlistMenu")) == false) {
+ tree_create_folder_node(tree, tree_get_root(tree),
+ messages_get("HotlistMenu"), true, false, false);
+ }
+
+ if(ami_hotlist_find_dir(tree, messages_get("HotlistToolbar")) == false) {
+ tree_create_folder_node(tree, tree_get_root(tree),
+ messages_get("HotlistToolbar"), true, false, false);
+ }
+}
void ami_hotlist_initialise(const char *hotlist_file)
{
@@ -30,6 +63,8 @@ void ami_hotlist_initialise(const char *hotlist_file)
hotlist_initialise(ami_tree_get_tree(hotlist_window),
hotlist_file,
tree_directory_icon_name);
+
+ ami_hotlist_add_default_dirs(ami_tree_get_tree(hotlist_window));
}
void ami_hotlist_free(const char *hotlist_file)
diff --git a/resources/FatMessages b/resources/FatMessages
index 45b3086..e8f22aa 100644
--- a/resources/FatMessages
+++ b/resources/FatMessages
@@ -1207,6 +1207,19 @@ fr.all.HotlistFeatureRequest:Demandes de nouvelles fonctions de Netsurf
it.all.HotlistFeatureRequest:Suggerimenti per NetSurf
nl.all.HotlistFeatureRequest:NetSurf feature requests
+# Default (Amiga) hotlist folder names
+#
+en.ami.HotlistMenu:Hotlist menu
+de.ami.HotlistMenu:Hotlist menu
+fr.ami.HotlistMenu:Hotlist menu
+it.ami.HotlistMenu:Hotlist menu
+nl.ami.HotlistMenu:Hotlist menu
+en.ami.HotlistToolbar:Hotlist toolbar
+de.ami.HotlistToolbar:Hotlist toolbar
+fr.ami.HotlistToolbar:Hotlist toolbar
+it.ami.HotlistToolbar:Hotlist toolbar
+nl.ami.HotlistToolbar:Hotlist toolbar
+
# Global history user interface tokens
# ====================================
-----------------------------------------------------------------------
Summary of changes:
amiga/gui.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++-
amiga/gui.h | 1 +
amiga/hotlist.c | 37 +++++++++++++++++-
amiga/menu.c | 6 +-
amiga/tree.c | 2 +
resources/FatMessages | 13 ++++++
6 files changed, 157 insertions(+), 5 deletions(-)
diff --git a/amiga/gui.c b/amiga/gui.c
index 2cbceac..7482b4b 100755
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -1206,6 +1206,7 @@ void ami_handle_msg(void)
struct browser_window *closedbw;
struct timeval curtime;
static int drag_x_move = 0, drag_y_move = 0;
+ char *url;
if(IsMinListEmpty(window_list))
{
@@ -1600,6 +1601,16 @@ void ami_handle_msg(void)
browser_window_go(gwin->bw,(char *)storage, NULL, true);
break;
+ case GID_HOTLIST:
+ GetAttr(SPEEDBAR_SelectedNode,
+ (Object *)gwin->objects[GID_HOTLIST],
+ (ULONG *)&tabnode);
+ printf("%lx %d\n", tabnode, code);
+ GetSpeedButtonNodeAttrs(tabnode, SBNA_UserData, (ULONG *)&url, TAG_DONE);
+ printf("%s\n", url);
+ browser_window_go(gwin->bw, url, NULL, true);
+ break;
+
case GID_HOME:
browser_window_go(gwin->bw,nsoption_charp(homepage_url),NULL,true);
break;
@@ -2477,7 +2488,7 @@ int ami_gui_hotlist_scan(struct tree *tree, struct List *speed_button_list, stru
{
element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
if(!element) element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
- if(element && (strcmp(tree_node_element_get_text(element), "Toolbar") == 0))
+ if(element && (strcmp(tree_node_element_get_text(element), messages_get("HotlistToolbar")) == 0))
{
ami_gui_hotlist_scan_2(tree, tree_node_get_child(node), &gen, &item, speed_button_list, gwin);
}
@@ -2509,12 +2520,100 @@ void ami_gui_hotlist_toolbar_add(struct gui_window_2 *gwin)
IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_ADDIMAGE,
gwin->win, gwin->objects[GID_HOTLISTSEPBAR], NULL);
+
+ FlushLayoutDomainCache((struct Gadget *)gwin->objects[GID_MAIN]);
+
+ RethinkLayout((struct Gadget *)gwin->objects[GID_MAIN],
+ gwin->win, NULL, TRUE);
+ }
+}
+
+void ami_gui_hotlist_toolbar_free(struct gui_window_2 *gwin, struct List *speed_button_list)
+{
+ int i;
+ struct Node *node;
+ struct Node *nnode;
+
+ if(IsListEmpty(speed_button_list)) return;
+ node = GetHead(speed_button_list);
+
+ do {
+ nnode = GetSucc(node);
+ Remove(node);
+ FreeSpeedButtonNode(node);
+ } while(node = nnode);
+
+ for(i = 0; i < AMI_GUI_TOOLBAR_MAX; i++) {
+ if(gwin->hotlist_toolbar_lab[i]) {
+ free(gwin->hotlist_toolbar_lab[i]);
+ gwin->hotlist_toolbar_lab[i] = NULL;
+ }
}
+}
+
+void ami_gui_hotlist_toolbar_remove(struct gui_window_2 *gwin)
+{
+ IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_REMOVECHILD,
+ gwin->win, gwin->objects[GID_HOTLIST]);
+
+ IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_REMOVECHILD,
+ gwin->win, gwin->objects[GID_HOTLISTSEPBAR]);
FlushLayoutDomainCache((struct Gadget *)gwin->objects[GID_MAIN]);
RethinkLayout((struct Gadget *)gwin->objects[GID_MAIN],
gwin->win, NULL, TRUE);
+
+ gwin->redraw_required = true;
+ gwin->bw->reformat_pending = true;
+
+ ami_gui_hotlist_toolbar_free(gwin, &gwin->hotlist_toolbar_list);
+}
+
+void ami_gui_hotlist_toolbar_update(struct gui_window_2 *gwin)
+{
+ if(IsListEmpty(&gwin->hotlist_toolbar_list)) {
+ ami_gui_hotlist_toolbar_add(gwin);
+ return;
+ }
+
+ /* Below should be SetAttr according to Autodocs */
+ SetGadgetAttrs((struct Gadget *)gwin->objects[GID_HOTLIST],
+ gwin->win, NULL,
+ SPEEDBAR_Buttons, ~0,
+ TAG_DONE);
+
+ ami_gui_hotlist_toolbar_free(gwin, &gwin->hotlist_toolbar_list);
+
+ if(ami_gui_hotlist_scan(ami_tree_get_tree(hotlist_window), &gwin->hotlist_toolbar_list, gwin) > 0) {
+ SetGadgetAttrs((struct Gadget *)gwin->objects[GID_HOTLIST],
+ gwin->win, NULL,
+ SPEEDBAR_Buttons, &gwin->hotlist_toolbar_list,
+ TAG_DONE);
+ } else {
+ ami_gui_hotlist_toolbar_remove(gwin);
+ }
+}
+
+void ami_gui_hotlist_toolbar_update_all(void)
+{
+ struct nsObject *node;
+ struct nsObject *nnode;
+ struct gui_window_2 *gwin;
+
+ if(IsMinListEmpty(window_list)) return;
+
+ node = (struct nsObject *)GetHead((struct List *)window_list);
+
+ do {
+ nnode=(struct nsObject *)GetSucc((struct Node *)node);
+ gwin = node->objstruct;
+
+ if(node->Type == AMINS_WINDOW)
+ {
+ ami_gui_hotlist_toolbar_update(gwin);
+ }
+ } while(node = nnode);
}
void ami_toggletabbar(struct gui_window_2 *gwin, bool show)
@@ -3305,6 +3404,8 @@ void gui_window_destroy(struct gui_window *g)
ami_gui_appicon_remove(g->shared);
if(g->shared->appwin) RemoveAppWindow(g->shared->appwin);
+ ami_gui_hotlist_toolbar_free(g->shared, &g->shared->hotlist_toolbar_list);
+
/* These aren't freed by the above.
* TODO: nav_west etc need freeing too? */
DisposeObject(g->shared->objects[GID_ADDTAB_BM]);
diff --git a/amiga/gui.h b/amiga/gui.h
index 14cec10..6a5434f 100755
--- a/amiga/gui.h
+++ b/amiga/gui.h
@@ -153,6 +153,7 @@ int ami_key_to_nskey(ULONG keycode, struct InputEvent *ie);
bool ami_text_box_at_point(struct gui_window_2 *gwin, ULONG *x, ULONG *y);
BOOL ami_gadget_hit(Object *obj, int x, int y);
void ami_gui_history(struct gui_window_2 *gwin, bool back);
+void ami_gui_hotlist_toolbar_update_all(void);
struct TextFont *origrpfont;
struct MinList *window_list;
diff --git a/amiga/hotlist.c b/amiga/hotlist.c
index 6469cbd..b67e10f 100755
--- a/amiga/hotlist.c
+++ b/amiga/hotlist.c
@@ -18,8 +18,41 @@
#include <proto/exec.h>
#include "amiga/hotlist.h"
-#include "desktop/hotlist.h"
#include "amiga/tree.h"
+#include "desktop/hotlist.h"
+#include "utils/messages.h"
+
+bool ami_hotlist_find_dir(struct tree *tree, const char *dir_name)
+{
+ struct node *root = tree_node_get_child(tree_get_root(tree));
+ struct node *node;
+ struct node_element *element;
+
+ for (node = root; node; node = tree_node_get_next(node))
+ {
+ element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
+ if(!element) element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
+ if(element && (strcmp(tree_node_element_get_text(element), dir_name) == 0))
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void ami_hotlist_add_default_dirs(struct tree *tree)
+{
+ if(ami_hotlist_find_dir(tree, messages_get("HotlistMenu")) == false) {
+ tree_create_folder_node(tree, tree_get_root(tree),
+ messages_get("HotlistMenu"), true, false, false);
+ }
+
+ if(ami_hotlist_find_dir(tree, messages_get("HotlistToolbar")) == false) {
+ tree_create_folder_node(tree, tree_get_root(tree),
+ messages_get("HotlistToolbar"), true, false, false);
+ }
+}
void ami_hotlist_initialise(const char *hotlist_file)
{
@@ -30,6 +63,8 @@ void ami_hotlist_initialise(const char *hotlist_file)
hotlist_initialise(ami_tree_get_tree(hotlist_window),
hotlist_file,
tree_directory_icon_name);
+
+ ami_hotlist_add_default_dirs(ami_tree_get_tree(hotlist_window));
}
void ami_hotlist_free(const char *hotlist_file)
diff --git a/amiga/menu.c b/amiga/menu.c
index b116e1b..f428606 100755
--- a/amiga/menu.c
+++ b/amiga/menu.c
@@ -506,17 +506,17 @@ ULONG ami_menu_scan(struct tree *tree, bool count, struct gui_window_2 *gwin)
{
element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
if(!element) element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
- if(element && (strcmp(tree_node_element_get_text(element),"Menu")==0))
+ if(element && (strcmp(tree_node_element_get_text(element), messages_get("HotlistMenu")) == 0))
{
// found menu
- ami_menu_scan_2(tree,tree_node_get_child(node),&gen,&item,count,gwin);
+ ami_menu_scan_2(tree, tree_node_get_child(node), &gen, &item, count, gwin);
}
}
return(item - AMI_MENU_HOTLIST);
}
-void ami_menu_scan_2(struct tree *tree,struct node *root,WORD *gen,
+void ami_menu_scan_2(struct tree *tree, struct node *root, WORD *gen,
ULONG *item, bool count, struct gui_window_2 *gwin)
{
struct node *tempnode;
diff --git a/amiga/tree.c b/amiga/tree.c
index f2ef3cc..95a68dc 100755
--- a/amiga/tree.c
+++ b/amiga/tree.c
@@ -690,6 +690,8 @@ void ami_tree_close(struct treeview_window *twin)
ami_utf8_free(twin->sslreject);
ami_ssl_free(twin);
}
+
+ ami_gui_hotlist_toolbar_update_all();
}
void ami_tree_update_quals(struct treeview_window *twin)
diff --git a/resources/FatMessages b/resources/FatMessages
index 45b3086..e8f22aa 100644
--- a/resources/FatMessages
+++ b/resources/FatMessages
@@ -1207,6 +1207,19 @@ fr.all.HotlistFeatureRequest:Demandes de nouvelles fonctions de Netsurf
it.all.HotlistFeatureRequest:Suggerimenti per NetSurf
nl.all.HotlistFeatureRequest:NetSurf feature requests
+# Default (Amiga) hotlist folder names
+#
+en.ami.HotlistMenu:Hotlist menu
+de.ami.HotlistMenu:Hotlist menu
+fr.ami.HotlistMenu:Hotlist menu
+it.ami.HotlistMenu:Hotlist menu
+nl.ami.HotlistMenu:Hotlist menu
+en.ami.HotlistToolbar:Hotlist toolbar
+de.ami.HotlistToolbar:Hotlist toolbar
+fr.ami.HotlistToolbar:Hotlist toolbar
+it.ami.HotlistToolbar:Hotlist toolbar
+nl.ami.HotlistToolbar:Hotlist toolbar
+
# Global history user interface tokens
# ====================================
--
NetSurf Browser
11 years
netsurf: branch mono/removing-windom-dependency updated. b1018779f984ed1ac57663b97fa439602074d1d9
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/b1018779f984ed1ac5766...
...commit http://git.netsurf-browser.org/netsurf.git/commit/b1018779f984ed1ac57663b...
...tree http://git.netsurf-browser.org/netsurf.git/tree/b1018779f984ed1ac57663b97...
The branch, mono/removing-windom-dependency has been updated
via b1018779f984ed1ac57663b97fa439602074d1d9 (commit)
from 1b93b72b9b731bb1844d5941e5165ff0ebc6711a (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/commitdiff/b1018779f984ed1ac57...
commit b1018779f984ed1ac57663b97fa439602074d1d9
Author: Ole Loots <ole(a)monochrom.net>
Commit: Ole Loots <ole(a)monochrom.net>
Removed debug statements
diff --git a/atari/toolbar.c b/atari/toolbar.c
index 50343aa..1c3a17c 100644
--- a/atari/toolbar.c
+++ b/atari/toolbar.c
@@ -195,20 +195,12 @@ static void tb_txt_request_redraw(void *data, int x, int y, int w, int h)
printf("data: %p\n", data);
struct s_toolbar * tb = (struct s_toolbar *)data;
-
- printf("tb gx: %d\n", tb->area.g_x);
- printf("aes tb: %p\n", aes_toolbar);
-
-
toolbar_get_grect(tb, TOOLBAR_URL_AREA, &area);
area.g_x += x;
area.g_y += y;
area.g_w = w;
area.g_h = h;
- //guiwin_get_grect(tb->owner->win, GUIWIN_AREA_TOOLBAR, &area);
-
-
dbg_grect("toolbar redraw request", &area);
window_schedule_redraw_grect(tb->owner, &area);
@@ -379,7 +371,6 @@ static void toolbar_reflow(struct s_toolbar *tb)
// position throbber image:
- printf("throbber reflow for index: %d\n", tb->throbber.index);
throbber_form[tb->throbber.index].ob_x = tb->area.g_x +
aes_toolbar[TOOLBAR_THROBBER_AREA].ob_x;
@@ -406,11 +397,6 @@ void toolbar_redraw(struct s_toolbar *tb, GRECT *clip)
objc_draw_grect(aes_toolbar,0,8,clip);
- printf("rdrw throbber (%d) at: %d,%d, %d, %d\n", tb->throbber.index,
- throbber_form[tb->throbber.index].ob_x,
- throbber_form[tb->throbber.index].ob_y,
- throbber_form[tb->throbber.index].ob_width,
- throbber_form[tb->throbber.index].ob_height );
objc_draw_grect(&throbber_form[tb->throbber.index], 0, 1, clip);
GRECT url_area;
-----------------------------------------------------------------------
Summary of changes:
atari/toolbar.c | 14 --------------
1 files changed, 0 insertions(+), 14 deletions(-)
diff --git a/atari/toolbar.c b/atari/toolbar.c
index 50343aa..1c3a17c 100644
--- a/atari/toolbar.c
+++ b/atari/toolbar.c
@@ -195,20 +195,12 @@ static void tb_txt_request_redraw(void *data, int x, int y, int w, int h)
printf("data: %p\n", data);
struct s_toolbar * tb = (struct s_toolbar *)data;
-
- printf("tb gx: %d\n", tb->area.g_x);
- printf("aes tb: %p\n", aes_toolbar);
-
-
toolbar_get_grect(tb, TOOLBAR_URL_AREA, &area);
area.g_x += x;
area.g_y += y;
area.g_w = w;
area.g_h = h;
- //guiwin_get_grect(tb->owner->win, GUIWIN_AREA_TOOLBAR, &area);
-
-
dbg_grect("toolbar redraw request", &area);
window_schedule_redraw_grect(tb->owner, &area);
@@ -379,7 +371,6 @@ static void toolbar_reflow(struct s_toolbar *tb)
// position throbber image:
- printf("throbber reflow for index: %d\n", tb->throbber.index);
throbber_form[tb->throbber.index].ob_x = tb->area.g_x +
aes_toolbar[TOOLBAR_THROBBER_AREA].ob_x;
@@ -406,11 +397,6 @@ void toolbar_redraw(struct s_toolbar *tb, GRECT *clip)
objc_draw_grect(aes_toolbar,0,8,clip);
- printf("rdrw throbber (%d) at: %d,%d, %d, %d\n", tb->throbber.index,
- throbber_form[tb->throbber.index].ob_x,
- throbber_form[tb->throbber.index].ob_y,
- throbber_form[tb->throbber.index].ob_width,
- throbber_form[tb->throbber.index].ob_height );
objc_draw_grect(&throbber_form[tb->throbber.index], 0, 1, clip);
GRECT url_area;
--
NetSurf Browser
11 years
netsurf: branch mono/removing-windom-dependency updated. 1b93b72b9b731bb1844d5941e5165ff0ebc6711a
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/1b93b72b9b731bb1844d5...
...commit http://git.netsurf-browser.org/netsurf.git/commit/1b93b72b9b731bb1844d594...
...tree http://git.netsurf-browser.org/netsurf.git/tree/1b93b72b9b731bb1844d5941e...
The branch, mono/removing-windom-dependency has been updated
via 1b93b72b9b731bb1844d5941e5165ff0ebc6711a (commit)
from 9ec2e77b2782454facda6858ca04735cb03f6743 (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/commitdiff/1b93b72b9b731bb1844...
commit 1b93b72b9b731bb1844d5941e5165ff0ebc6711a
Author: Ole Loots <ole(a)monochrom.net>
Commit: Ole Loots <ole(a)monochrom.net>
re-implemented browser toolbar redraw / URL area redraw.
diff --git a/atari/gui.c b/atari/gui.c
index 2528eff..753dd08 100755
--- a/atari/gui.c
+++ b/atari/gui.c
@@ -552,20 +552,15 @@ static void throbber_advance( void * data )
{
LGRECT work;
struct gui_window * gw = (struct gui_window *)data;
- if( gw->root == NULL )
+ if (gw->root == NULL)
return;
- if( gw->root->toolbar == NULL )
+ if (gw->root->toolbar == NULL)
return;
- // TODO: implement access to throbber
- //if( gw->root->toolbar->throbber.running == false)
- // return;
-// mt_CompGetLGrect(&app, gw->root->toolbar->throbber.comp,
-// WF_WORKXYWH, &work);
-// gw->root->toolbar->throbber.index++;
-// if( gw->root->toolbar->throbber.index > gw->root->toolbar->throbber.max_index )
-// gw->root->toolbar->throbber.index = THROBBER_MIN_INDEX;
-// ApplWrite(_AESapid, WM_REDRAW, guiwin_get_handle(gw->root->win),
-// work.g_x, work.g_y, work.g_w, work.g_h);
+
+ if (gw->root->toolbar->throbber.running == false)
+ return;
+
+ toolbar_throbber_progress(gw->root->toolbar);
schedule(100, throbber_advance, gw );
}
@@ -574,41 +569,26 @@ void gui_window_start_throbber(struct gui_window *w)
GRECT work;
if (w == NULL)
return;
- // TODO: implement throbber acess
- //if( w->root->toolbar->throbber.running == true )
- // return;
-// browser_get_rect(w, BR_THROBBER, &work);
-// w->root->toolbar->throbber.running = true;
-// w->root->toolbar->throbber.index = THROBBER_MIN_INDEX;
- schedule(100, throbber_advance, w );
-// ApplWrite( _AESapid, WM_REDRAW, guiwin_get_handle(w->root->win),
-// work.g_x, work.g_y, work.g_w, work.g_h );
+ toolbar_set_throbber_state(w->root->toolbar, true);
+ schedule(100, throbber_advance, w );
rendering = true;
}
void gui_window_stop_throbber(struct gui_window *w)
{
- LGRECT work;
if (w == NULL)
return;
- // TODO: implement something like throbber_is_running();
- //if( w->root->toolbar->throbber.running == false )
- // return;
+ if (w->root->toolbar->throbber.running == false)
+ return;
schedule_remove(throbber_advance, w);
+ toolbar_set_throbber_state(w->root->toolbar, false);
+
/* refresh toolbar buttons: */
toolbar_update_buttons(w->root->toolbar, w->browser->bw, -1);
- /* redraw throbber: */
-// mt_CompGetLGrect(&app, w->root->toolbar->throbber.comp,
-// WF_WORKXYWH, &work);
-// w->root->toolbar->throbber.running = false;
-// ApplWrite( _AESapid, WM_REDRAW, guiwin_get_handle(w->root->win),
-// work.g_x, work.g_y, work.g_w, work.g_h );
- // TODO: send throbber redraw
-
rendering = false;
}
diff --git a/atari/res/netsurf.rsc b/atari/res/netsurf.rsc
index 803cb2b..f911df9 100755
Binary files a/atari/res/netsurf.rsc and b/atari/res/netsurf.rsc differ
diff --git a/atari/res/netsurf.rsm b/atari/res/netsurf.rsm
index 587fefa..649ea82 100755
--- a/atari/res/netsurf.rsm
+++ b/atari/res/netsurf.rsm
@@ -3,7 +3,7 @@ ResourceMaster v3.65
#N 99@32@AZAaza___ _@AZAaza090___ _@@_@
#FoC-Header@rsm2out@C-Header@rsh@@@[C-Header@0@
#R 0@0@1@1@1@1@
-#M 20010100@0@7728@618@
+#M 20010100@0@7728@622@
#T 0@1@MAINMENU@@62@@
#O 4@32@T_FILE@@
#O 5@32@T_EDIT@@
@@ -198,4 +198,4 @@ ResourceMaster v3.65
#O 5@33@BT_DOWN_PIC@@
#O 6@25@BT_UP@@
#O 4@33@BT_UP_PIC@@
-#c 770@
+#c 780@
diff --git a/atari/rootwin.c b/atari/rootwin.c
index c0ad688..11a4a42 100755
--- a/atari/rootwin.c
+++ b/atari/rootwin.c
@@ -189,8 +189,10 @@ int window_create(struct gui_window * gw,
return( -1 );
memset( gw->root, 0, sizeof(struct s_gui_win_root) );
gw->root->title = malloc(atari_sysinfo.aes_max_win_title_len+1);
- // TODO: use desk size
+ redraw_slots_init(&gw->root->redraw_slots, 8);
+
+ // TODO: use desk size
aes_handle = wind_create(flags, 40, 40, app.w, app.h);
if(aes_handle<0) {
free(gw->root->title);
@@ -200,7 +202,12 @@ int window_create(struct gui_window * gw,
gw->root->win = guiwin_add(aes_handle,
GW_FLAG_PREPROC_WM | GW_FLAG_RECV_PREPROC_WM, handle_event);
+ struct rootwin_data_s * data = malloc(sizeof(struct rootwin_data_s));
+ data->rootwin = gw->root;
+ guiwin_set_user_data(gw->root->win, (void*)data);
+
/* create toolbar component: */
+ guiwin_set_toolbar(gw->root->win, get_tree(TOOLBAR), 0, 0);
if( tb ) {
gw->root->toolbar = toolbar_create(gw->root);
assert(gw->root->toolbar);
@@ -224,13 +231,6 @@ int window_create(struct gui_window * gw,
wind_set(aes_handle, WF_OPTS, 1, WO0_NOBLITW, 0, 0);
wind_set(aes_handle, WF_OPTS, 1, WO0_NOBLITH, 0, 0);
- redraw_slots_init(&gw->root->redraw_slots, 8);
-
- guiwin_set_toolbar(gw->root->win, get_tree(TOOLBAR), 0, 0);
- struct rootwin_data_s * data = malloc(sizeof(struct rootwin_data_s));
- data->rootwin = gw->root;
- guiwin_set_user_data(gw->root->win, (void*)data);
-
if (inflags & WIN_TOP) {
window_set_focus(gw->root, BROWSER, gw->browser);
}
diff --git a/atari/toolbar.c b/atari/toolbar.c
index 75d7abe..50343aa 100644
--- a/atari/toolbar.c
+++ b/atari/toolbar.c
@@ -87,39 +87,6 @@ struct s_tb_button
};
-struct s_url_widget
-{
- /* widget is only redrawn when this flag is set */
- bool redraw;
- struct text_area *textarea;
- GRECT rdw_area;
- GRECT area;
-};
-
-struct s_throbber_widget
-{
- short index;
- short max_index;
- bool running;
- GRECT area;
-};
-
-struct s_toolbar
-{
- struct s_gui_win_root *owner;
- struct s_url_widget url;
- struct s_throbber_widget throbber;
- GRECT btdim;
- GRECT area;
- /* size & location of buttons: */
- struct s_tb_button * buttons;
- bool hidden;
- int btcnt;
- int style;
- bool redraw;
- bool reflow;
-};
-
extern char * option_homepage_url;
extern void * h_gem_rsrc;
extern struct gui_window * input_window;
@@ -206,7 +173,13 @@ static struct s_toolbar_style toolbar_styles[] =
{18, 34, 64, 64, 2, 0, 0 },
/* custom style: */
{18, 34, 64, 64, 2, 0, 0 }
-};
+};
+
+static const struct redraw_context toolbar_rdrw_ctx = {
+ .interactive = true,
+ .background_images = true,
+ .plot = &atari_plotters
+ };
static void tb_txt_request_redraw(void *data, int x, int y, int w, int h );
static nserror toolbar_icon_callback( hlcache_handle *handle,
@@ -216,31 +189,30 @@ static nserror toolbar_icon_callback( hlcache_handle *handle,
* Callback for textarea redraw
*/
static void tb_txt_request_redraw(void *data, int x, int y, int w, int h)
-{
- LGRECT work;
- if( data == NULL )
- return;
- CMP_TOOLBAR t = data;
- if( t->url.redraw == false ){
- t->url.redraw = true;
- //t->redraw = true;
- t->url.rdw_area.g_x = x;
- t->url.rdw_area.g_y = y;
- t->url.rdw_area.g_w = w;
- t->url.rdw_area.g_h = h;
- } else {
- /* merge the redraw area to the new area.: */
- int newx1 = x+w;
- int newy1 = y+h;
- int oldx1 = t->url.rdw_area.g_x + t->url.rdw_area.g_w;
- int oldy1 = t->url.rdw_area.g_y + t->url.rdw_area.g_h;
- t->url.rdw_area.g_x = MIN(t->url.rdw_area.g_x, x);
- t->url.rdw_area.g_y = MIN(t->url.rdw_area.g_y, y);
- t->url.rdw_area.g_w = ( oldx1 > newx1 ) ?
- oldx1 - t->url.rdw_area.g_x : newx1 - t->url.rdw_area.g_x;
- t->url.rdw_area.g_h = ( oldy1 > newy1 ) ?
- oldy1 - t->url.rdw_area.g_y : newy1 - t->url.rdw_area.g_y;
- }
+{
+
+ GRECT area;
+ printf("data: %p\n", data);
+ struct s_toolbar * tb = (struct s_toolbar *)data;
+
+
+ printf("tb gx: %d\n", tb->area.g_x);
+ printf("aes tb: %p\n", aes_toolbar);
+
+
+ toolbar_get_grect(tb, TOOLBAR_URL_AREA, &area);
+ area.g_x += x;
+ area.g_y += y;
+ area.g_w = w;
+ area.g_h = h;
+
+ //guiwin_get_grect(tb->owner->win, GUIWIN_AREA_TOOLBAR, &area);
+
+
+ dbg_grect("toolbar redraw request", &area);
+
+ window_schedule_redraw_grect(tb->owner, &area);
+ return;
}
/**
@@ -278,24 +250,6 @@ static struct s_tb_button *button_init(struct s_toolbar *tb, OBJECT * tree, int
}
-static void toolbar_reflow(struct s_toolbar *tb)
-{
- LOG((""));
-/*
- int i=0, x=0;
-
- x = 2;
- while (tb->buttons[i].rsc_id > 0) {
- tb->buttons[i].area.g_x = x;
- x += tb->buttons[i].area.g_w;
- x += 2;
- i++;
- }
- tb->url.area.g_x = x;
-*/
-}
-
-
void toolbar_init( void )
{
int i=0, n;
@@ -379,9 +333,6 @@ struct s_toolbar *toolbar_create(struct s_gui_win_root *owner)
ta_height -= (TOOLBAR_URL_MARGIN_TOP + TOOLBAR_URL_MARGIN_BOTTOM);
t->url.textarea = textarea_create(300, ta_height, 0, &font_style_url,
tb_txt_request_redraw, t);
- if( t->url.textarea != NULL ){
- textarea_set_text(t->url.textarea, "http://");
- }
/* create the throbber widget: */
t->throbber.area.g_h = toolbar_styles[t->style].height;
@@ -391,7 +342,8 @@ struct s_toolbar *toolbar_create(struct s_gui_win_root *owner)
t->throbber.index = 0;
t->throbber.max_index = 8;
} else {
- t->throbber.index = THROBBER_MIN_INDEX;
+ t->throbber.running = false;
+ t->throbber.index = THROBBER_INACTIVE_INDEX;
t->throbber.max_index = THROBBER_MAX_INDEX;
}
t->throbber.running = false;
@@ -409,7 +361,7 @@ void toolbar_destroy(struct s_toolbar *tb)
free(tb);
}
-static void toolbar_objc_reflow(struct s_toolbar *tb)
+static void toolbar_reflow(struct s_toolbar *tb)
{
// position toolbar areas:
@@ -423,9 +375,11 @@ static void toolbar_objc_reflow(struct s_toolbar *tb)
aes_toolbar[TOOLBAR_URL_AREA].ob_width = tb->area.g_w
- (aes_toolbar[TOOLBAR_NAVIGATION_AREA].ob_width
- + aes_toolbar[TOOLBAR_THROBBER_AREA].ob_width);
+ + aes_toolbar[TOOLBAR_THROBBER_AREA].ob_width + 1);
+
// position throbber image:
+ printf("throbber reflow for index: %d\n", tb->throbber.index);
throbber_form[tb->throbber.index].ob_x = tb->area.g_x +
aes_toolbar[TOOLBAR_THROBBER_AREA].ob_x;
@@ -438,17 +392,48 @@ static void toolbar_objc_reflow(struct s_toolbar *tb)
((aes_toolbar[TOOLBAR_THROBBER_AREA].ob_height
- throbber_form[tb->throbber.index].ob_height) >> 1);
+
tb->reflow = false;
}
void toolbar_redraw(struct s_toolbar *tb, GRECT *clip)
{
+ GRECT area;
+
if(tb->reflow == true)
- toolbar_objc_reflow(tb);
+ toolbar_reflow(tb);
+
objc_draw_grect(aes_toolbar,0,8,clip);
+ printf("rdrw throbber (%d) at: %d,%d, %d, %d\n", tb->throbber.index,
+ throbber_form[tb->throbber.index].ob_x,
+ throbber_form[tb->throbber.index].ob_y,
+ throbber_form[tb->throbber.index].ob_width,
+ throbber_form[tb->throbber.index].ob_height );
objc_draw_grect(&throbber_form[tb->throbber.index], 0, 1, clip);
+
+ GRECT url_area;
+ toolbar_get_grect(tb, TOOLBAR_URL_AREA, &area);
+ url_area = area;
+ if (rc_intersect(clip, &area)) {
+
+ struct rect r = {
+ .x0 = 0,
+ .y0 = 0,
+ .x1 = url_area.g_w,
+ .y1 = url_area.g_h
+ };
+
+ r.x0 = area.g_x - url_area.g_x;
+ r.x1 = r.x0 + area.g_w;
+ plot_set_dimensions(url_area.g_x, url_area.g_y, url_area.g_w,
+ url_area.g_h);
+ textarea_set_dimensions(tb->url.textarea,
+ aes_toolbar[TOOLBAR_URL_AREA].ob_width,
+ 20);
+ textarea_redraw(tb->url.textarea, 0, 0, &r, &toolbar_rdrw_ctx);
+ }
}
@@ -469,8 +454,47 @@ void toolbar_set_dimensions(struct s_toolbar *tb, GRECT *area)
void toolbar_set_url(struct s_toolbar *tb, const char * text)
{
LOG((""));
+ textarea_set_text(tb->url.textarea, text);
+
+ GRECT area;
+ toolbar_get_grect(tb, TOOLBAR_URL_AREA, &area);
+
+ window_schedule_redraw_grect(tb->owner, &area);
+}
+
+void toolbar_set_throbber_state(struct s_toolbar *tb, bool active)
+{
+ GRECT throbber_area;
+
+ tb->throbber.running = active;
+ if (active) {
+ tb->throbber.index = THROBBER_MIN_INDEX;
+ } else {
+ tb->throbber.index = THROBBER_INACTIVE_INDEX;
+ }
+
+ tb->reflow = true;
+ toolbar_get_grect(tb, TOOLBAR_THROBBER_AREA, &throbber_area);
+ window_schedule_redraw_grect(tb->owner, &throbber_area);
}
+void toolbar_throbber_progress(struct s_toolbar *tb)
+{
+ GRECT throbber_area;
+
+ assert(tb->throbber.running == true);
+
+ if(tb->throbber.running == false)
+ return;
+
+ tb->throbber.index++;
+ if(tb->throbber.index > THROBBER_MAX_INDEX)
+ tb->throbber.index = THROBBER_MIN_INDEX;
+
+ tb->reflow = true;
+ toolbar_get_grect(tb, TOOLBAR_THROBBER_AREA, &throbber_area);
+ window_schedule_redraw_grect(tb->owner, &throbber_area);
+}
bool toolbar_text_input(struct s_toolbar *tb, char *text)
{
@@ -497,10 +521,27 @@ void toolbar_mouse_input(struct s_toolbar *tb, short mx, short my)
}
+/**
+* Receive a specific region of the toolbar.
+* @param tb - the toolbar pointer
+* @param which - the area to retrieve: TOOLBAR_URL_AREA,
+* TOOLBAR_NAVIGATION_AREA,
+* TOOLBAR_THROBBER_AREA
+* @param dst - GRECT pointer receiving the area.
+*/
-void toolbar_get_grect(struct s_toolbar *tb, short which, short opt, GRECT *dst)
+void toolbar_get_grect(struct s_toolbar *tb, short which, GRECT *dst)
{
+ if (tb->reflow == true) {
+ toolbar_reflow(tb);
+ }
+
+ objc_offset(aes_toolbar, which, &dst->g_x, &dst->g_y);
+ dst->g_w = aes_toolbar[which].ob_width;
+ dst->g_h = aes_toolbar[which].ob_height;
+ printf("Toolbar get grect (%d): ", which);
+ dbg_grect("", dst);
}
diff --git a/atari/toolbar.h b/atari/toolbar.h
index 17cb16d..6a40cf3 100644
--- a/atari/toolbar.h
+++ b/atari/toolbar.h
@@ -13,6 +13,40 @@ enum toolbar_textarea {
URL_INPUT_TEXT_AREA = 1
};
+struct s_url_widget
+{
+ /* widget is only redrawn when this flag is set */
+ bool redraw;
+ struct text_area *textarea;
+ GRECT rdw_area;
+ GRECT area;
+};
+
+struct s_throbber_widget
+{
+ short index;
+ short max_index;
+ bool running;
+ GRECT area;
+};
+
+struct s_toolbar
+{
+ struct s_gui_win_root *owner;
+ struct s_url_widget url;
+ struct s_throbber_widget throbber;
+ GRECT btdim;
+ GRECT area;
+ /* size & location of buttons: */
+ struct s_tb_button * buttons;
+ bool hidden;
+ int btcnt;
+ int style;
+ bool redraw;
+ bool reflow;
+};
+
+
void toolbar_init(void);
struct s_toolbar *toolbar_create(struct s_gui_win_root *owner);
void toolbar_destroy(struct s_toolbar * tb);
@@ -24,10 +58,12 @@ bool toolbar_key_input(struct s_toolbar *tb, short nkc);
void toolbar_mouse_input(struct s_toolbar *tb, short mx, short my);
void toolbar_update_buttons(struct s_toolbar *tb, struct browser_window *bw,
short idx);
-void toolbar_get_grect(struct s_toolbar *tb, short which, short opt, GRECT *g);
+void toolbar_get_grect(struct s_toolbar *tb, short which, GRECT *g);
struct text_area *toolbar_get_textarea(struct s_toolbar *tb,
enum toolbar_textarea which);
+void toolbar_set_throbber_state(struct s_toolbar *tb, bool active);
void toolbar_redraw(struct s_toolbar *tb, GRECT *clip);
+void toolbar_throbber_progress(struct s_toolbar *tb);
/* public events handlers: */
void toolbar_back_click(struct s_toolbar *tb);
void toolbar_reload_click(struct s_toolbar *tb);
-----------------------------------------------------------------------
Summary of changes:
atari/gui.c | 46 +++--------
atari/res/netsurf.rsc | Bin 35788 -> 35788 bytes
atari/res/netsurf.rsm | 4 +-
atari/rootwin.c | 16 ++--
atari/toolbar.c | 211 +++++++++++++++++++++++++++++--------------------
atari/toolbar.h | 38 +++++++++-
6 files changed, 186 insertions(+), 129 deletions(-)
diff --git a/atari/gui.c b/atari/gui.c
index 2528eff..753dd08 100755
--- a/atari/gui.c
+++ b/atari/gui.c
@@ -552,20 +552,15 @@ static void throbber_advance( void * data )
{
LGRECT work;
struct gui_window * gw = (struct gui_window *)data;
- if( gw->root == NULL )
+ if (gw->root == NULL)
return;
- if( gw->root->toolbar == NULL )
+ if (gw->root->toolbar == NULL)
return;
- // TODO: implement access to throbber
- //if( gw->root->toolbar->throbber.running == false)
- // return;
-// mt_CompGetLGrect(&app, gw->root->toolbar->throbber.comp,
-// WF_WORKXYWH, &work);
-// gw->root->toolbar->throbber.index++;
-// if( gw->root->toolbar->throbber.index > gw->root->toolbar->throbber.max_index )
-// gw->root->toolbar->throbber.index = THROBBER_MIN_INDEX;
-// ApplWrite(_AESapid, WM_REDRAW, guiwin_get_handle(gw->root->win),
-// work.g_x, work.g_y, work.g_w, work.g_h);
+
+ if (gw->root->toolbar->throbber.running == false)
+ return;
+
+ toolbar_throbber_progress(gw->root->toolbar);
schedule(100, throbber_advance, gw );
}
@@ -574,41 +569,26 @@ void gui_window_start_throbber(struct gui_window *w)
GRECT work;
if (w == NULL)
return;
- // TODO: implement throbber acess
- //if( w->root->toolbar->throbber.running == true )
- // return;
-// browser_get_rect(w, BR_THROBBER, &work);
-// w->root->toolbar->throbber.running = true;
-// w->root->toolbar->throbber.index = THROBBER_MIN_INDEX;
- schedule(100, throbber_advance, w );
-// ApplWrite( _AESapid, WM_REDRAW, guiwin_get_handle(w->root->win),
-// work.g_x, work.g_y, work.g_w, work.g_h );
+ toolbar_set_throbber_state(w->root->toolbar, true);
+ schedule(100, throbber_advance, w );
rendering = true;
}
void gui_window_stop_throbber(struct gui_window *w)
{
- LGRECT work;
if (w == NULL)
return;
- // TODO: implement something like throbber_is_running();
- //if( w->root->toolbar->throbber.running == false )
- // return;
+ if (w->root->toolbar->throbber.running == false)
+ return;
schedule_remove(throbber_advance, w);
+ toolbar_set_throbber_state(w->root->toolbar, false);
+
/* refresh toolbar buttons: */
toolbar_update_buttons(w->root->toolbar, w->browser->bw, -1);
- /* redraw throbber: */
-// mt_CompGetLGrect(&app, w->root->toolbar->throbber.comp,
-// WF_WORKXYWH, &work);
-// w->root->toolbar->throbber.running = false;
-// ApplWrite( _AESapid, WM_REDRAW, guiwin_get_handle(w->root->win),
-// work.g_x, work.g_y, work.g_w, work.g_h );
- // TODO: send throbber redraw
-
rendering = false;
}
diff --git a/atari/res/netsurf.rsc b/atari/res/netsurf.rsc
index 803cb2b..f911df9 100755
Binary files a/atari/res/netsurf.rsc and b/atari/res/netsurf.rsc differ
diff --git a/atari/res/netsurf.rsm b/atari/res/netsurf.rsm
index 587fefa..649ea82 100755
--- a/atari/res/netsurf.rsm
+++ b/atari/res/netsurf.rsm
@@ -3,7 +3,7 @@ ResourceMaster v3.65
#N 99@32@AZAaza___ _@AZAaza090___ _@@_@
#FoC-Header@rsm2out@C-Header@rsh@@@[C-Header@0@
#R 0@0@1@1@1@1@
-#M 20010100@0@7728@618@
+#M 20010100@0@7728@622@
#T 0@1@MAINMENU@@62@@
#O 4@32@T_FILE@@
#O 5@32@T_EDIT@@
@@ -198,4 +198,4 @@ ResourceMaster v3.65
#O 5@33@BT_DOWN_PIC@@
#O 6@25@BT_UP@@
#O 4@33@BT_UP_PIC@@
-#c 770@
+#c 780@
diff --git a/atari/rootwin.c b/atari/rootwin.c
index c0ad688..11a4a42 100755
--- a/atari/rootwin.c
+++ b/atari/rootwin.c
@@ -189,8 +189,10 @@ int window_create(struct gui_window * gw,
return( -1 );
memset( gw->root, 0, sizeof(struct s_gui_win_root) );
gw->root->title = malloc(atari_sysinfo.aes_max_win_title_len+1);
- // TODO: use desk size
+ redraw_slots_init(&gw->root->redraw_slots, 8);
+
+ // TODO: use desk size
aes_handle = wind_create(flags, 40, 40, app.w, app.h);
if(aes_handle<0) {
free(gw->root->title);
@@ -200,7 +202,12 @@ int window_create(struct gui_window * gw,
gw->root->win = guiwin_add(aes_handle,
GW_FLAG_PREPROC_WM | GW_FLAG_RECV_PREPROC_WM, handle_event);
+ struct rootwin_data_s * data = malloc(sizeof(struct rootwin_data_s));
+ data->rootwin = gw->root;
+ guiwin_set_user_data(gw->root->win, (void*)data);
+
/* create toolbar component: */
+ guiwin_set_toolbar(gw->root->win, get_tree(TOOLBAR), 0, 0);
if( tb ) {
gw->root->toolbar = toolbar_create(gw->root);
assert(gw->root->toolbar);
@@ -224,13 +231,6 @@ int window_create(struct gui_window * gw,
wind_set(aes_handle, WF_OPTS, 1, WO0_NOBLITW, 0, 0);
wind_set(aes_handle, WF_OPTS, 1, WO0_NOBLITH, 0, 0);
- redraw_slots_init(&gw->root->redraw_slots, 8);
-
- guiwin_set_toolbar(gw->root->win, get_tree(TOOLBAR), 0, 0);
- struct rootwin_data_s * data = malloc(sizeof(struct rootwin_data_s));
- data->rootwin = gw->root;
- guiwin_set_user_data(gw->root->win, (void*)data);
-
if (inflags & WIN_TOP) {
window_set_focus(gw->root, BROWSER, gw->browser);
}
diff --git a/atari/toolbar.c b/atari/toolbar.c
index 75d7abe..50343aa 100644
--- a/atari/toolbar.c
+++ b/atari/toolbar.c
@@ -87,39 +87,6 @@ struct s_tb_button
};
-struct s_url_widget
-{
- /* widget is only redrawn when this flag is set */
- bool redraw;
- struct text_area *textarea;
- GRECT rdw_area;
- GRECT area;
-};
-
-struct s_throbber_widget
-{
- short index;
- short max_index;
- bool running;
- GRECT area;
-};
-
-struct s_toolbar
-{
- struct s_gui_win_root *owner;
- struct s_url_widget url;
- struct s_throbber_widget throbber;
- GRECT btdim;
- GRECT area;
- /* size & location of buttons: */
- struct s_tb_button * buttons;
- bool hidden;
- int btcnt;
- int style;
- bool redraw;
- bool reflow;
-};
-
extern char * option_homepage_url;
extern void * h_gem_rsrc;
extern struct gui_window * input_window;
@@ -206,7 +173,13 @@ static struct s_toolbar_style toolbar_styles[] =
{18, 34, 64, 64, 2, 0, 0 },
/* custom style: */
{18, 34, 64, 64, 2, 0, 0 }
-};
+};
+
+static const struct redraw_context toolbar_rdrw_ctx = {
+ .interactive = true,
+ .background_images = true,
+ .plot = &atari_plotters
+ };
static void tb_txt_request_redraw(void *data, int x, int y, int w, int h );
static nserror toolbar_icon_callback( hlcache_handle *handle,
@@ -216,31 +189,30 @@ static nserror toolbar_icon_callback( hlcache_handle *handle,
* Callback for textarea redraw
*/
static void tb_txt_request_redraw(void *data, int x, int y, int w, int h)
-{
- LGRECT work;
- if( data == NULL )
- return;
- CMP_TOOLBAR t = data;
- if( t->url.redraw == false ){
- t->url.redraw = true;
- //t->redraw = true;
- t->url.rdw_area.g_x = x;
- t->url.rdw_area.g_y = y;
- t->url.rdw_area.g_w = w;
- t->url.rdw_area.g_h = h;
- } else {
- /* merge the redraw area to the new area.: */
- int newx1 = x+w;
- int newy1 = y+h;
- int oldx1 = t->url.rdw_area.g_x + t->url.rdw_area.g_w;
- int oldy1 = t->url.rdw_area.g_y + t->url.rdw_area.g_h;
- t->url.rdw_area.g_x = MIN(t->url.rdw_area.g_x, x);
- t->url.rdw_area.g_y = MIN(t->url.rdw_area.g_y, y);
- t->url.rdw_area.g_w = ( oldx1 > newx1 ) ?
- oldx1 - t->url.rdw_area.g_x : newx1 - t->url.rdw_area.g_x;
- t->url.rdw_area.g_h = ( oldy1 > newy1 ) ?
- oldy1 - t->url.rdw_area.g_y : newy1 - t->url.rdw_area.g_y;
- }
+{
+
+ GRECT area;
+ printf("data: %p\n", data);
+ struct s_toolbar * tb = (struct s_toolbar *)data;
+
+
+ printf("tb gx: %d\n", tb->area.g_x);
+ printf("aes tb: %p\n", aes_toolbar);
+
+
+ toolbar_get_grect(tb, TOOLBAR_URL_AREA, &area);
+ area.g_x += x;
+ area.g_y += y;
+ area.g_w = w;
+ area.g_h = h;
+
+ //guiwin_get_grect(tb->owner->win, GUIWIN_AREA_TOOLBAR, &area);
+
+
+ dbg_grect("toolbar redraw request", &area);
+
+ window_schedule_redraw_grect(tb->owner, &area);
+ return;
}
/**
@@ -278,24 +250,6 @@ static struct s_tb_button *button_init(struct s_toolbar *tb, OBJECT * tree, int
}
-static void toolbar_reflow(struct s_toolbar *tb)
-{
- LOG((""));
-/*
- int i=0, x=0;
-
- x = 2;
- while (tb->buttons[i].rsc_id > 0) {
- tb->buttons[i].area.g_x = x;
- x += tb->buttons[i].area.g_w;
- x += 2;
- i++;
- }
- tb->url.area.g_x = x;
-*/
-}
-
-
void toolbar_init( void )
{
int i=0, n;
@@ -379,9 +333,6 @@ struct s_toolbar *toolbar_create(struct s_gui_win_root *owner)
ta_height -= (TOOLBAR_URL_MARGIN_TOP + TOOLBAR_URL_MARGIN_BOTTOM);
t->url.textarea = textarea_create(300, ta_height, 0, &font_style_url,
tb_txt_request_redraw, t);
- if( t->url.textarea != NULL ){
- textarea_set_text(t->url.textarea, "http://");
- }
/* create the throbber widget: */
t->throbber.area.g_h = toolbar_styles[t->style].height;
@@ -391,7 +342,8 @@ struct s_toolbar *toolbar_create(struct s_gui_win_root *owner)
t->throbber.index = 0;
t->throbber.max_index = 8;
} else {
- t->throbber.index = THROBBER_MIN_INDEX;
+ t->throbber.running = false;
+ t->throbber.index = THROBBER_INACTIVE_INDEX;
t->throbber.max_index = THROBBER_MAX_INDEX;
}
t->throbber.running = false;
@@ -409,7 +361,7 @@ void toolbar_destroy(struct s_toolbar *tb)
free(tb);
}
-static void toolbar_objc_reflow(struct s_toolbar *tb)
+static void toolbar_reflow(struct s_toolbar *tb)
{
// position toolbar areas:
@@ -423,9 +375,11 @@ static void toolbar_objc_reflow(struct s_toolbar *tb)
aes_toolbar[TOOLBAR_URL_AREA].ob_width = tb->area.g_w
- (aes_toolbar[TOOLBAR_NAVIGATION_AREA].ob_width
- + aes_toolbar[TOOLBAR_THROBBER_AREA].ob_width);
+ + aes_toolbar[TOOLBAR_THROBBER_AREA].ob_width + 1);
+
// position throbber image:
+ printf("throbber reflow for index: %d\n", tb->throbber.index);
throbber_form[tb->throbber.index].ob_x = tb->area.g_x +
aes_toolbar[TOOLBAR_THROBBER_AREA].ob_x;
@@ -438,17 +392,48 @@ static void toolbar_objc_reflow(struct s_toolbar *tb)
((aes_toolbar[TOOLBAR_THROBBER_AREA].ob_height
- throbber_form[tb->throbber.index].ob_height) >> 1);
+
tb->reflow = false;
}
void toolbar_redraw(struct s_toolbar *tb, GRECT *clip)
{
+ GRECT area;
+
if(tb->reflow == true)
- toolbar_objc_reflow(tb);
+ toolbar_reflow(tb);
+
objc_draw_grect(aes_toolbar,0,8,clip);
+ printf("rdrw throbber (%d) at: %d,%d, %d, %d\n", tb->throbber.index,
+ throbber_form[tb->throbber.index].ob_x,
+ throbber_form[tb->throbber.index].ob_y,
+ throbber_form[tb->throbber.index].ob_width,
+ throbber_form[tb->throbber.index].ob_height );
objc_draw_grect(&throbber_form[tb->throbber.index], 0, 1, clip);
+
+ GRECT url_area;
+ toolbar_get_grect(tb, TOOLBAR_URL_AREA, &area);
+ url_area = area;
+ if (rc_intersect(clip, &area)) {
+
+ struct rect r = {
+ .x0 = 0,
+ .y0 = 0,
+ .x1 = url_area.g_w,
+ .y1 = url_area.g_h
+ };
+
+ r.x0 = area.g_x - url_area.g_x;
+ r.x1 = r.x0 + area.g_w;
+ plot_set_dimensions(url_area.g_x, url_area.g_y, url_area.g_w,
+ url_area.g_h);
+ textarea_set_dimensions(tb->url.textarea,
+ aes_toolbar[TOOLBAR_URL_AREA].ob_width,
+ 20);
+ textarea_redraw(tb->url.textarea, 0, 0, &r, &toolbar_rdrw_ctx);
+ }
}
@@ -469,8 +454,47 @@ void toolbar_set_dimensions(struct s_toolbar *tb, GRECT *area)
void toolbar_set_url(struct s_toolbar *tb, const char * text)
{
LOG((""));
+ textarea_set_text(tb->url.textarea, text);
+
+ GRECT area;
+ toolbar_get_grect(tb, TOOLBAR_URL_AREA, &area);
+
+ window_schedule_redraw_grect(tb->owner, &area);
+}
+
+void toolbar_set_throbber_state(struct s_toolbar *tb, bool active)
+{
+ GRECT throbber_area;
+
+ tb->throbber.running = active;
+ if (active) {
+ tb->throbber.index = THROBBER_MIN_INDEX;
+ } else {
+ tb->throbber.index = THROBBER_INACTIVE_INDEX;
+ }
+
+ tb->reflow = true;
+ toolbar_get_grect(tb, TOOLBAR_THROBBER_AREA, &throbber_area);
+ window_schedule_redraw_grect(tb->owner, &throbber_area);
}
+void toolbar_throbber_progress(struct s_toolbar *tb)
+{
+ GRECT throbber_area;
+
+ assert(tb->throbber.running == true);
+
+ if(tb->throbber.running == false)
+ return;
+
+ tb->throbber.index++;
+ if(tb->throbber.index > THROBBER_MAX_INDEX)
+ tb->throbber.index = THROBBER_MIN_INDEX;
+
+ tb->reflow = true;
+ toolbar_get_grect(tb, TOOLBAR_THROBBER_AREA, &throbber_area);
+ window_schedule_redraw_grect(tb->owner, &throbber_area);
+}
bool toolbar_text_input(struct s_toolbar *tb, char *text)
{
@@ -497,10 +521,27 @@ void toolbar_mouse_input(struct s_toolbar *tb, short mx, short my)
}
+/**
+* Receive a specific region of the toolbar.
+* @param tb - the toolbar pointer
+* @param which - the area to retrieve: TOOLBAR_URL_AREA,
+* TOOLBAR_NAVIGATION_AREA,
+* TOOLBAR_THROBBER_AREA
+* @param dst - GRECT pointer receiving the area.
+*/
-void toolbar_get_grect(struct s_toolbar *tb, short which, short opt, GRECT *dst)
+void toolbar_get_grect(struct s_toolbar *tb, short which, GRECT *dst)
{
+ if (tb->reflow == true) {
+ toolbar_reflow(tb);
+ }
+
+ objc_offset(aes_toolbar, which, &dst->g_x, &dst->g_y);
+ dst->g_w = aes_toolbar[which].ob_width;
+ dst->g_h = aes_toolbar[which].ob_height;
+ printf("Toolbar get grect (%d): ", which);
+ dbg_grect("", dst);
}
diff --git a/atari/toolbar.h b/atari/toolbar.h
index 17cb16d..6a40cf3 100644
--- a/atari/toolbar.h
+++ b/atari/toolbar.h
@@ -13,6 +13,40 @@ enum toolbar_textarea {
URL_INPUT_TEXT_AREA = 1
};
+struct s_url_widget
+{
+ /* widget is only redrawn when this flag is set */
+ bool redraw;
+ struct text_area *textarea;
+ GRECT rdw_area;
+ GRECT area;
+};
+
+struct s_throbber_widget
+{
+ short index;
+ short max_index;
+ bool running;
+ GRECT area;
+};
+
+struct s_toolbar
+{
+ struct s_gui_win_root *owner;
+ struct s_url_widget url;
+ struct s_throbber_widget throbber;
+ GRECT btdim;
+ GRECT area;
+ /* size & location of buttons: */
+ struct s_tb_button * buttons;
+ bool hidden;
+ int btcnt;
+ int style;
+ bool redraw;
+ bool reflow;
+};
+
+
void toolbar_init(void);
struct s_toolbar *toolbar_create(struct s_gui_win_root *owner);
void toolbar_destroy(struct s_toolbar * tb);
@@ -24,10 +58,12 @@ bool toolbar_key_input(struct s_toolbar *tb, short nkc);
void toolbar_mouse_input(struct s_toolbar *tb, short mx, short my);
void toolbar_update_buttons(struct s_toolbar *tb, struct browser_window *bw,
short idx);
-void toolbar_get_grect(struct s_toolbar *tb, short which, short opt, GRECT *g);
+void toolbar_get_grect(struct s_toolbar *tb, short which, GRECT *g);
struct text_area *toolbar_get_textarea(struct s_toolbar *tb,
enum toolbar_textarea which);
+void toolbar_set_throbber_state(struct s_toolbar *tb, bool active);
void toolbar_redraw(struct s_toolbar *tb, GRECT *clip);
+void toolbar_throbber_progress(struct s_toolbar *tb);
/* public events handlers: */
void toolbar_back_click(struct s_toolbar *tb);
void toolbar_reload_click(struct s_toolbar *tb);
--
NetSurf Browser
11 years
netsurf: branch mono/removing-windom-dependency updated. 9ec2e77b2782454facda6858ca04735cb03f6743
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/9ec2e77b2782454facda6...
...commit http://git.netsurf-browser.org/netsurf.git/commit/9ec2e77b2782454facda685...
...tree http://git.netsurf-browser.org/netsurf.git/tree/9ec2e77b2782454facda6858c...
The branch, mono/removing-windom-dependency has been updated
via 9ec2e77b2782454facda6858ca04735cb03f6743 (commit)
via c3119b9356e245557c868f45b9d78b4e41be25b8 (commit)
via 4fbeacf830b1351646a375169aea05f264425c9b (commit)
via 2437ca84a877391f8988bb166cbdc82e281fe8d2 (commit)
via 4e4bc9c13578ff496d09eb8fac063cb03510d837 (commit)
via 56d5e6963a42aad0e03886496923779ee65fa362 (commit)
via 09bc58f7c2926922e59542e8ca2de2f5941714df (commit)
via 56b521a1258f7b9657c9f7dda0878b789d39f59b (commit)
via 68f359d1ec2212939f19a25dfb182d08cfa37afd (commit)
via fb5d763d757719a552b8849cbdef9c2a1c1c2db0 (commit)
via fefc9ed6bea667d9ed2a8c02e8aafb2ab9e60e31 (commit)
via 567017898c06b8c74c29580b6817899922f95d24 (commit)
via f9d94af893c83e7083065c12a643c798089ff6d8 (commit)
via fb13fcf16648a0e5ba71ac64f9c0441f0516004a (commit)
via ce309aa5a9c1f813f6bdf152221f9bff88c4d3e1 (commit)
via 2fef76db1555f49cff7f2baeec7fa084c8a5facb (commit)
via 840284b24d1a03c14592dd907894b136a37c495c (commit)
via 2836c1775ab1f3bd4257f7ab43f21366b60a2206 (commit)
via e38c0f2c3bd81501cbc3ff504c2e61fa90fcec3d (commit)
via 2a01907ca1c1574da0619a0d9012e8c6445ab0f1 (commit)
via 08a659292ed0590687f4a072e7f5603c40337a89 (commit)
via 7915708b583699f16412d5eeab6a42602319e720 (commit)
via 1765212be2689b31fa8b1ce24b28a5f8125380de (commit)
via eb454ff9f2389e7aca47b4c753a7225a9e4dae1f (commit)
via 17e19b283f8cf0e2772e61ac1e11f9919b03489b (commit)
via 38b17e11123d7da014d6c53c28f3d181a15517eb (commit)
via 8a12a8d5459a0fff8cd2e7f424300b71ec733feb (commit)
via 9b009dfb013d26a305612d58463731be0f527e48 (commit)
via dea524f585d8ceff39b7ce06767feeabc9fd6184 (commit)
via fde30ff958434d3a9564d6a033081554ed547144 (commit)
via c496d9080fa19314a2b910386228f6b10170cc3c (commit)
via 7e5ac02785ea909f72b39d1c30f2aa15fbacfa87 (commit)
via eb28188661262eef8aad4b530a3f16532aceffd4 (commit)
via ec43456e4bf0968bc68b437733199ad2af609c1e (commit)
via 8bccf1615876f7c0ddf62c05f1b9fbc78b011b94 (commit)
via 7d83151d1adb03eaa28df9ae05d0d8e8fb7e7f54 (commit)
via 966fb9f215915567d44cff97a73cf3730dd8c431 (commit)
via 054984099fd8867da92fa685dce728e1cc665fd0 (commit)
via c2cd36fda86b9bdfbb36cc340e35cfbc6609fd32 (commit)
via a159a4a79b1facc77ae41983e9f96f8117f07f21 (commit)
via 7757008433c414974c527c4745e64aa5976d606a (commit)
via bb6b546b4be757cd515253cd10eccadf78e9afb6 (commit)
from ff7cf937629933e782eb8103dadb8b5f27f14a4d (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/commitdiff/9ec2e77b2782454facd...
commit 9ec2e77b2782454facda6858ca04735cb03f6743
Author: Ole Loots <ole(a)monochrom.net>
Commit: Ole Loots <ole(a)monochrom.net>
Only change selectable toolbar objects on click.
diff --git a/atari/gemtk/guiwin.c b/atari/gemtk/guiwin.c
index 7f06c91..4558363 100644
--- a/atari/gemtk/guiwin.c
+++ b/atari/gemtk/guiwin.c
@@ -397,7 +397,8 @@ short guiwin_dispatch_event(EVMULT_IN *ev_in, EVMULT_OUT *ev_out, short msg[8])
obj_idx, ev_out->emo_mclicks, ev_out->emo_kmeta, 0
};
if (((dest->flags & GW_FLAG_CUSTOM_TOOLBAR) == 0)
- && obj_idx > 0) {
+ && (obj_idx > 0)
+ && (dest->toolbar[obj_idx].ob_flags & OF_SELECTABLE) != 0) {
dest->toolbar[obj_idx].ob_state |= OS_SELECTED;
// TODO: optimize redraw by setting the object clip:
guiwin_toolbar_redraw(dest, NULL);
commitdiff http://git.netsurf-browser.org/netsurf.git/commitdiff/c3119b9356e245557c8...
commit c3119b9356e245557c868f45b9d78b4e41be25b8
Merge: ff7cf93 4fbeacf
Author: Ole Loots <ole(a)monochrom.net>
Commit: Ole Loots <ole(a)monochrom.net>
Merge branch 'master' into mono/removing-windom-dependency
-----------------------------------------------------------------------
Summary of changes:
Makefile | 2 +-
Makefile.sources.javascript | 1 +
amiga/gui.c | 91 ++++-
amiga/gui.h | 6 +
atari/download.c | 2 +-
atari/gemtk/guiwin.c | 3 +-
beos/Makefile.target | 28 +-
beos/WindowStack.h | 45 ++
beos/bitmap.cpp | 2 -
beos/download.cpp | 249 ++++++++++
riscos/searchweb.c => beos/download.h | 2 +-
beos/fetch_rsrc.cpp | 16 +-
beos/gui.cpp | 150 ++++---
beos/gui.h | 2 +
beos/login.cpp | 25 +-
beos/res.rdef | 46 ++
beos/scaffolding.cpp | 185 +++++++-
beos/scaffolding.h | 4 +
beos/schedule.cpp | 6 +-
beos/window.cpp | 76 +++-
content/content.c | 17 +
content/content_protected.h | 5 +
desktop/browser.c | 94 +----
desktop/hotlist.c | 2 +-
javascript/js.h | 3 +
javascript/jsapi.c | 58 +++
javascript/jsapi.h | 126 ++++--
javascript/jsapi/binding.h | 10 +-
javascript/jsapi/console.bnd | 12 -
javascript/jsapi/{node.bnd => event.bnd} | 6 +-
javascript/jsapi/example.bnd | 229 ----------
javascript/jsapi/htmldocument.bnd | 15 +-
javascript/jsapi/location.bnd | 117 ++++-
javascript/jsapi/window.bnd | 89 ++++-
javascript/none.c | 5 +
render/box.h | 2 +-
render/box_construct.c | 13 +-
render/html.c | 476 +++++++++++---------
resources/FatMessages | 2 +
test/js/event-onload.html | 29 ++
test/js/index.html | 1 +
...ment-enumerate.html => location-enumerate.html} | 8 +-
...cument-enumerate.html => window-enumerate.html} | 8 +-
utils/config.h | 4 +-
utils/corestrings.c | 211 +++++++++-
utils/corestrings.h | 71 +++-
utils/errors.h | 4 +
utils/messages.c | 96 ++++
utils/messages.h | 9 +
49 files changed, 1853 insertions(+), 810 deletions(-)
create mode 100644 beos/WindowStack.h
create mode 100644 beos/download.cpp
copy riscos/searchweb.c => beos/download.h (89%)
copy javascript/jsapi/{node.bnd => event.bnd} (85%)
delete mode 100644 javascript/jsapi/example.bnd
create mode 100644 test/js/event-onload.html
copy test/js/{dom-document-enumerate.html => location-enumerate.html} (79%)
copy test/js/{dom-document-enumerate.html => window-enumerate.html} (79%)
diff --git a/Makefile b/Makefile
index c80378c..428aa74 100644
--- a/Makefile
+++ b/Makefile
@@ -453,7 +453,7 @@ ifeq ($(TARGET),beos)
$(Q)$(BEOS_SETVER) $(EXETARGET) \
-app $(VERSION_MAJ) $(VERSION_MIN) 0 d 0 \
-short "NetSurf $(VERSION_FULL)" \
- -long "NetSurf $(VERSION_FULL) © 2003 - 2008 The NetSurf Developers"
+ -long "NetSurf $(VERSION_FULL) © 2003 - 2012 The NetSurf Developers"
$(VQ)echo " MIMESET: $(EXETARGET)"
$(Q)$(BEOS_MIMESET) $(EXETARGET)
endif
diff --git a/Makefile.sources.javascript b/Makefile.sources.javascript
index 2a33565..1ece3b6 100644
--- a/Makefile.sources.javascript
+++ b/Makefile.sources.javascript
@@ -21,6 +21,7 @@ JSAPI_BINDING_htmlcollection := javascript/jsapi/htmlcollection.bnd
JSAPI_BINDING_nodelist := javascript/jsapi/nodelist.bnd
JSAPI_BINDING_text := javascript/jsapi/text.bnd
JSAPI_BINDING_node := javascript/jsapi/node.bnd
+JSAPI_BINDING_event := javascript/jsapi/event.bnd
# 1: input file
# 2: output file
diff --git a/amiga/gui.c b/amiga/gui.c
index 2933792..064c49c 100755
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -30,6 +30,7 @@
#include "desktop/selection.h"
#include "desktop/textinput.h"
#include "desktop/tree.h"
+#include "desktop/tree_url_node.h"
#include "image/ico.h"
#include "utils/log.h"
#include "utils/messages.h"
@@ -109,6 +110,7 @@
#include <proto/clicktab.h>
#include <proto/layout.h>
#include <proto/space.h>
+#include <proto/speedbar.h>
#include <proto/string.h>
#include <proto/window.h>
@@ -118,6 +120,7 @@
#include <gadgets/layout.h>
#include <gadgets/scroller.h>
#include <gadgets/space.h>
+#include <gadgets/speedbar.h>
#include <gadgets/string.h>
#include <images/bevel.h>
#include <images/bitmap.h>
@@ -1930,7 +1933,7 @@ void ami_handle_msg(void)
if(ami_menu_window_close)
{
- if(ami_menu_window_close == AMI_MENU_WINDOW_CLOSE_ALL)
+ if(ami_menu_window_close == (void *)AMI_MENU_WINDOW_CLOSE_ALL)
ami_quit_netsurf();
else
ami_close_all_tabs(ami_menu_window_close);
@@ -2425,6 +2428,86 @@ void ami_update_buttons(struct gui_window_2 *gwin)
}
}
+void ami_gui_hotlist_scan_2(struct tree *tree, struct node *root, WORD *gen, uint16 *item,
+ struct List *speed_button_list, struct gui_window_2 *gwin)
+{
+ struct node *tempnode;
+ struct node_element *element=NULL;
+ struct node *node;
+ struct Node *speed_button_node;
+
+ *gen = *gen + 1;
+
+ for (node = root; node; node = tree_node_get_next(node))
+ {
+ if((*gen == 1) && (*item < AMI_GUI_TOOLBAR_MAX)) /* Don't cascade into sub-dirs */
+ {
+ gwin->hotlist_toolbar_lab[*item] = ami_utf8_easy((char *)tree_url_node_get_title(node));
+
+ speed_button_node = AllocSpeedButtonNode(*item,
+ SBNA_Text, gwin->hotlist_toolbar_lab[*item],
+ SBNA_UserData, (void *)tree_url_node_get_url(node),
+ TAG_DONE);
+
+ AddTail(speed_button_list, speed_button_node);
+
+ *item = *item + 1;
+ }
+
+ /* Don't need this atm as it cascades into sub-dirs
+ if (tree_node_get_child(node))
+ {
+ ami_gui_hotlist_scan_2(tree, tree_node_get_child(node), gen);
+ }
+ */
+ }
+
+ *gen = *gen - 1;
+}
+
+int ami_gui_hotlist_scan(struct tree *tree, struct List *speed_button_list, struct gui_window_2 *gwin)
+{
+ struct node *root = tree_node_get_child(tree_get_root(tree));
+ struct node *node;
+ struct node_element *element;
+ static WORD gen = 0;
+ static uint16 item = 0;
+
+ for (node = root; node; node = tree_node_get_next(node))
+ {
+ element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
+ if(!element) element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
+ if(element && (strcmp(tree_node_element_get_text(element), "Toolbar") == 0))
+ {
+ ami_gui_hotlist_scan_2(tree, tree_node_get_child(node), &gen, &item, speed_button_list, gwin);
+ }
+ }
+
+ return item;
+}
+
+void ami_gui_hotlist_toolbar_add(struct gui_window_2 *gwin)
+{
+ NewList(&gwin->hotlist_toolbar_list);
+
+ if(ami_gui_hotlist_scan(ami_tree_get_tree(hotlist_window), &gwin->hotlist_toolbar_list, gwin) > 0) {
+ gwin->objects[GID_HOTLIST] =
+ SpeedBarObject,
+ GA_ID, GID_HOTLIST,
+ GA_RelVerify, TRUE,
+ SPEEDBAR_Buttons, &gwin->hotlist_toolbar_list,
+ SpeedBarEnd;
+
+ IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_ADDCHILD,
+ gwin->win, gwin->objects[GID_HOTLIST], NULL);
+ }
+
+ FlushLayoutDomainCache((struct Gadget *)gwin->objects[GID_MAIN]);
+
+ RethinkLayout((struct Gadget *)gwin->objects[GID_MAIN],
+ gwin->win, NULL, TRUE);
+}
+
void ami_toggletabbar(struct gui_window_2 *gwin, bool show)
{
if(ClickTabBase->lib_Version < 53) return;
@@ -2894,6 +2977,10 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
BEVEL_Style, BVS_SBAR_VERT,
BevelEnd,
CHILD_WeightedHeight, 0,
+ LAYOUT_AddChild, g->shared->objects[GID_HOTLISTLAYOUT] = HGroupObject,
+ LAYOUT_SpaceInner, FALSE,
+ LayoutEnd,
+ CHILD_WeightedHeight,0,
LAYOUT_AddChild, g->shared->objects[GID_TABLAYOUT] = HGroupObject,
LAYOUT_SpaceInner,FALSE,
addtabclosegadget, g->shared->objects[GID_CLOSETAB],
@@ -3039,6 +3126,8 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
RefreshGadgets((APTR)g->shared->objects[GID_STATUS],
g->shared->win, NULL);
+
+ ami_gui_hotlist_toolbar_add(g->shared); /* is this the right place for this? */
}
else
{
diff --git a/amiga/gui.h b/amiga/gui.h
index 181bd4f..59c60f4 100755
--- a/amiga/gui.h
+++ b/amiga/gui.h
@@ -64,6 +64,8 @@ enum
GID_SHOWALL,
GID_CASE,
GID_TOOLBARLAYOUT,
+ GID_HOTLIST,
+ GID_HOTLISTLAYOUT,
GID_HSCROLL,
GID_LAST
};
@@ -71,6 +73,8 @@ enum
struct find_window;
struct history_window;
+#define AMI_GUI_TOOLBAR_MAX 20
+
struct gui_window_2 {
struct nsObject *node;
struct Window *win;
@@ -98,6 +102,8 @@ struct gui_window_2 {
UBYTE *menutype;
struct NewMenu *menu;
ULONG hotlist_items;
+ char *hotlist_toolbar_lab[AMI_GUI_TOOLBAR_MAX];
+ struct List hotlist_toolbar_list;
char *svbuffer;
char *status;
char *wintitle;
diff --git a/atari/download.c b/atari/download.c
index 45be977..e852a03 100755
--- a/atari/download.c
+++ b/atari/download.c
@@ -265,7 +265,7 @@ nserror gui_download_window_data(struct gui_download_window *dw,
dw->lastrdw = tnow;
tree = ObjcTree(OC_FORM, dw->form );
if( dw->size_total > 0 ){
- p = (dw->size_downloaded *100) / dw->size_total;
+ p = ((double)dw->size_downloaded / (double)dw->size_total * 100);
}
speed = dw->size_downloaded / sdiff;
tree[DOWNLOAD_PROGRESS_DONE].ob_width = MAX( MIN( p*(DOWNLOAD_BAR_MAX/100), DOWNLOAD_BAR_MAX ), 1);
diff --git a/atari/gemtk/guiwin.c b/atari/gemtk/guiwin.c
index 7f06c91..4558363 100644
--- a/atari/gemtk/guiwin.c
+++ b/atari/gemtk/guiwin.c
@@ -397,7 +397,8 @@ short guiwin_dispatch_event(EVMULT_IN *ev_in, EVMULT_OUT *ev_out, short msg[8])
obj_idx, ev_out->emo_mclicks, ev_out->emo_kmeta, 0
};
if (((dest->flags & GW_FLAG_CUSTOM_TOOLBAR) == 0)
- && obj_idx > 0) {
+ && (obj_idx > 0)
+ && (dest->toolbar[obj_idx].ob_flags & OF_SELECTABLE) != 0) {
dest->toolbar[obj_idx].ob_state |= OS_SELECTED;
// TODO: optimize redraw by setting the object clip:
guiwin_toolbar_redraw(dest, NULL);
diff --git a/beos/Makefile.target b/beos/Makefile.target
index af7c939..27981be 100644
--- a/beos/Makefile.target
+++ b/beos/Makefile.target
@@ -9,12 +9,14 @@
# for Haiku
LDFLAGS += -L/boot/common/lib
# some people do *not* have libm...
- LDFLAGS += -lcurl -liconv
- LDFLAGS += -lssl -lcrypto -lcss -ldom -lparserutils -lhubbub -lwapcaplet
+ LDFLAGS += -lssl -lcrypto -lcss
+ $(eval $(call feature_enabled,NSSVG,-DWITH_NS_SVG,-lsvgtiny,SVG (libsvgtiny)))
+ LDFLAGS += -ldom -lparserutils -lhubbub -lwapcaplet
+ LDFLAGS += -lexpat -lcurl -liconv
CFLAGS += -I. -O $(WARNFLAGS) -Dnsbeos \
-D_BSD_SOURCE -D_POSIX_C_SOURCE \
- -Drestrict="" -Wno-multichar
+ -Drestrict="" -Wno-multichar
# DEBUG
CFLAGS += -g -O0
# -DDEBUG=1
@@ -59,9 +61,13 @@
# cross: Haiku ?
NETLDFLAGS := -lnetwork
endif
- LDFLAGS += -lbe -ltranslation $(NETLDFLAGS)
+ LDFLAGS += -lbe -ltranslation -ltracker $(NETLDFLAGS)
+ ifeq ($(GCCVER),2)
+ LDFLAGS += -lstdc++.r4
+ else
+ LDFLAGS += -lstdc++ -lsupc++
+ endif
- $(eval $(call feature_enabled,NSSVG,-DWITH_NS_SVG,-lsvgtiny,SVG (libsvgtiny)))
ifeq ($(HOST),beos)
CFLAGS += -I$(PREFIX)/include
LDFLAGS += -L$(PREFIX)/lib
@@ -82,11 +88,9 @@
# ----------------------------------------------------------------------------
# S_BEOS are sources purely for the BeOS build
-S_BEOS := about.cpp bitmap.cpp fetch_rsrc.cpp \
- filetype.cpp font.cpp gui.cpp login.cpp \
- gui_options.cpp plotters.cpp \
- scaffolding.cpp search.cpp schedule.cpp \
- thumbnail.cpp treeview.cpp throbber.cpp \
+S_BEOS := about.cpp bitmap.cpp download.cpp fetch_rsrc.cpp filetype.cpp \
+ font.cpp gui.cpp login.cpp gui_options.cpp plotters.cpp scaffolding.cpp \
+ search.cpp schedule.cpp thumbnail.cpp treeview.cpp throbber.cpp \
window.cpp system_colour.cpp
S_BEOS := $(addprefix beos/,$(S_BEOS))
@@ -98,7 +102,7 @@ RDEF_IMP_BEOS := $(addprefix $(OBJROOT)/,$(subst /,_,$(RDEF_IMP_BEOS)))
RDEP_BEOS := \
adblock.css beosdefault.css default.css internal.css quirks.css \
- netsurf.png ca-bundle.txt messages
+ netsurf.png ca-bundle.txt
RDEP_BEOS := $(addprefix beos/res/,$(RDEP_BEOS)) \
$(wildcard beos/res/Icons/*.png) \
$(wildcard beos/res/throbber/throbber*.png)
@@ -126,7 +130,7 @@ install-beos:
@cp -vRL beos/res/beosdefault.css $(DESTDIR)$(NETSURF_BEOS_RESOURCES)
@cp -vRL gtk/res/license $(DESTDIR)$(NETSURF_BEOS_RESOURCES)
# @cp -vRL beos/res/throbber/*.png $(DESTDIR)$(NETSURF_BEOS_RESOURCES)throbber
- gzip -9v < beos/res/messages > $(DESTDIR)$(NETSURF_BEOS_RESOURCES)messages
+ $(call split_install_messages, beos, $(DESTDIR)$(NETSURF_BEOS_RESOURCES))
# ----------------------------------------------------------------------------
# Package target
diff --git a/beos/WindowStack.h b/beos/WindowStack.h
new file mode 100644
index 0000000..947b143
--- /dev/null
+++ b/beos/WindowStack.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2010, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef WINDOW_STACK_H
+#define WINDOW_STACK_H
+
+
+#include <Window.h>
+
+
+class BWindowStack {
+public:
+ BWindowStack(BWindow* window);
+ ~BWindowStack();
+
+ status_t AddWindow(const BWindow* window);
+ status_t AddWindow(const BMessenger& window);
+ status_t AddWindowAt(const BWindow* window,
+ int32 position);
+ status_t AddWindowAt(const BMessenger& window,
+ int32 position);
+
+ status_t RemoveWindow(const BWindow* window);
+ status_t RemoveWindow(const BMessenger& window);
+ status_t RemoveWindowAt(int32 position,
+ BMessenger* window = NULL);
+
+ int32 CountWindows();
+
+ status_t WindowAt(int32 position,
+ BMessenger& messenger);
+ bool HasWindow(const BWindow* window);
+ bool HasWindow(const BMessenger& window);
+
+private:
+ status_t _AttachMessenger(const BMessenger& window);
+ status_t _ReadMessenger(BMessenger& window);
+ status_t _StartMessage(int32 what);
+
+ BPrivate::PortLink* fLink;
+};
+
+
+#endif
diff --git a/beos/bitmap.cpp b/beos/bitmap.cpp
index 83dedf7..02724a0 100644
--- a/beos/bitmap.cpp
+++ b/beos/bitmap.cpp
@@ -106,7 +106,6 @@ static inline void nsbeos_rgba_to_bgra(void *src, void *dst, int width, int heig
void *bitmap_create(int width, int height, unsigned int state)
{
- CALLED();
struct bitmap *bmp = (struct bitmap *)malloc(sizeof(struct bitmap));
if (bmp == NULL)
return NULL;
@@ -288,7 +287,6 @@ bool bitmap_save(void *vbitmap, const char *path, unsigned flags)
* \param vbitmap a bitmap, as returned by bitmap_create()
*/
void bitmap_modified(void *vbitmap) {
- CALLED();
struct bitmap *bitmap = (struct bitmap *)vbitmap;
// convert the shadow (ABGR) to into the primary bitmap
nsbeos_rgba_to_bgra(bitmap->shadow->Bits(), bitmap->primary->Bits(),
diff --git a/beos/download.cpp b/beos/download.cpp
new file mode 100644
index 0000000..bdd85b5
--- /dev/null
+++ b/beos/download.cpp
@@ -0,0 +1,249 @@
+/*
+ * Copyright 2012 Adrien Destugues <pulkomandy(a)pulkomandy.tk>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define __STDBOOL_H__ 1
+#include <stdbool.h>
+
+extern "C" {
+#include "desktop/gui.h"
+}
+#include "beos/download.h"
+
+#include <File.h>
+#include <FilePanel.h>
+#include <Locker.h>
+#include <Messenger.h>
+#include <StatusBar.h>
+#include <Window.h>
+
+class NSDownloadWindow: public BWindow
+{
+ public:
+ NSDownloadWindow(download_context* ctx);
+ ~NSDownloadWindow();
+
+ void MessageReceived(BMessage* message);
+
+ void Progress(int size);
+ void Failure(const char* error);
+ void Success();
+ private:
+ download_context* ctx;
+ BStatusBar* bar;
+ unsigned long progress;
+ bool success;
+};
+
+
+struct gui_download_window {
+ download_context* ctx;
+ NSDownloadWindow* window;
+
+ BLocker* storageLock;
+ BDataIO* storage;
+};
+
+
+NSDownloadWindow::NSDownloadWindow(download_context* ctx)
+ : BWindow(BRect(30, 30, 400, 200), "Downloads", B_TITLED_WINDOW,
+ B_NOT_RESIZABLE)
+ , ctx(ctx)
+ , progress(0)
+ , success(false)
+{
+ unsigned long dlsize = download_context_get_total_length(ctx);
+ char* buffer = human_friendly_bytesize(dlsize);
+
+ // Create the status bar
+ BRect rect = Bounds();
+ rect.InsetBy(3, 3);
+ bar = new BStatusBar(rect, "progress",
+ download_context_get_filename(ctx), buffer);
+ bar->SetMaxValue(dlsize);
+
+ // Create the backgroundview (just so that the area around the progress bar
+ // is B_PANEL_BACKGROUND_COLOR instead of white)
+ BView* back = new BView(Bounds(), "back", B_FOLLOW_ALL_SIDES, B_WILL_DRAW);
+ back->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
+
+ // Add the views to the window
+ back->AddChild(bar);
+ AddChild(back);
+
+ // Resize the window to leave a margin around the progress bar
+ BRect size = bar->Bounds();
+ ResizeTo(size.Width() + 6, size.Height() + 6);
+ Show();
+}
+
+
+NSDownloadWindow::~NSDownloadWindow()
+{
+ download_context_abort(ctx);
+ download_context_destroy(ctx);
+}
+
+
+void
+NSDownloadWindow::MessageReceived(BMessage* message)
+{
+ switch(message->what)
+ {
+ case B_SAVE_REQUESTED:
+ {
+ entry_ref directory;
+ const char* name;
+ struct gui_download_window* dw;
+ BFilePanel* source;
+
+ message->FindRef("directory", &directory);
+ message->FindString("name", &name);
+ message->FindPointer("dw", (void**)&dw);
+
+ BDirectory dir(&directory);
+ BFile* storage = new BFile(&dir, name,
+ B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE);
+ dw->storageLock->Lock();
+
+ BMallocIO* tempstore = dynamic_cast<BMallocIO*>(dw->storage);
+
+ storage->Write(tempstore->Buffer(), tempstore->BufferLength());
+ delete dw->storage;
+
+ if (success)
+ delete storage; // File is already finished downloading !
+ else
+ dw->storage = storage;
+ dw->storageLock->Unlock();
+
+ message->FindPointer("source", (void**)&source);
+ delete source;
+
+ break;
+ }
+ default:
+ BWindow::MessageReceived(message);
+ }
+}
+
+
+void
+NSDownloadWindow::Progress(int size)
+{
+ progress += size;
+
+ char* buffer = human_friendly_bytesize(progress);
+ strcat(buffer, "/");
+
+ bar->LockLooper();
+ bar->Update(size, NULL, buffer);
+ bar->Invalidate();
+ bar->UnlockLooper();
+}
+
+
+void
+NSDownloadWindow::Success()
+{
+ bar->LockLooper();
+ bar->SetBarColor(ui_color(B_SUCCESS_COLOR));
+ bar->UnlockLooper();
+
+ success = true;
+}
+
+
+void
+NSDownloadWindow::Failure(const char* error)
+{
+ bar->LockLooper();
+ bar->Update(0, NULL, error);
+ bar->SetBarColor(ui_color(B_FAILURE_COLOR));
+ bar->UnlockLooper();
+}
+
+
+struct gui_download_window *gui_download_window_create(download_context *ctx,
+ struct gui_window *parent)
+{
+ struct gui_download_window *download = (struct gui_download_window*)malloc(sizeof *download);
+ if (download == NULL)
+ return NULL;
+
+ download->storageLock = new BLocker("storage_lock");
+ download->storage = new BMallocIO();
+ download->ctx = ctx;
+
+ download->window = new NSDownloadWindow(ctx);
+
+ // Also ask the user where to save the file
+ // TODO inject the suggested name somehow
+ BMessage* msg = new BMessage(B_SAVE_REQUESTED);
+
+ BFilePanel* panel = new BFilePanel(B_SAVE_PANEL,
+ new BMessenger(download->window), NULL, 0, false);
+
+ msg->AddPointer("source", panel);
+ msg->AddPointer("dw", download);
+ panel->SetMessage(msg);
+
+ panel->Show();
+
+ return download;
+}
+
+
+nserror gui_download_window_data(struct gui_download_window *dw,
+ const char *data, unsigned int size)
+{
+ dw->window->Progress(size);
+
+ dw->storageLock->Lock();
+ dw->storage->Write(data, size);
+ dw->storageLock->Unlock();
+
+ return NSERROR_OK;
+}
+
+
+void gui_download_window_error(struct gui_download_window *dw,
+ const char *error_msg)
+{
+ dw->window->Failure(error_msg);
+
+ delete dw->storageLock;
+ delete dw->storage;
+}
+
+
+void gui_download_window_done(struct gui_download_window *dw)
+{
+ dw->window->Success();
+
+ dw->storageLock->Lock();
+
+ // Only delete if the storage is already a file. Else, we must wait for the
+ // user to select something in the BFilePanel!
+ BFile* file = dynamic_cast<BFile*>(dw->storage);
+ delete file;
+ if (file)
+ delete dw->storageLock;
+ else
+ dw->storageLock->Unlock();
+}
+
diff --git a/riscos/searchweb.c b/beos/download.h
similarity index 89%
copy from riscos/searchweb.c
copy to beos/download.h
index 14246d2..9c8d3ad 100644
--- a/riscos/searchweb.c
+++ b/beos/download.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2009 Mark Benjamin <netsurf-browser.org.MarkBenjamin(a)dfgh.net>
+ * Copyright 2012 Adrien Destugues <pulkomandy(a)pulkomandy.tk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
diff --git a/beos/fetch_rsrc.cpp b/beos/fetch_rsrc.cpp
index 79dea4e..f7c99d7 100644
--- a/beos/fetch_rsrc.cpp
+++ b/beos/fetch_rsrc.cpp
@@ -48,6 +48,7 @@ extern "C" {
#include <image.h>
#include <Resources.h>
+#include <String.h>
struct fetch_rsrc_context {
struct fetch *parent_fetch;
@@ -65,7 +66,7 @@ struct fetch_rsrc_context {
static struct fetch_rsrc_context *ring = NULL;
-static BResources *gAppResources = NULL;
+BResources *gAppResources = NULL;
static bool fetch_rsrc_initialise(lwc_string *scheme)
{
@@ -197,11 +198,11 @@ static bool fetch_rsrc_process(struct fetch_rsrc_context *c)
uint8 c1, c2, c3, c4;
if (sscanf(params, "%c%c%c%c", &c1, &c2, &c3, &c4) > 3) {
type = c1 << 24 | c2 << 16 | c3 << 8 | c4;
- printf("type:%4.4s\n", &type);
+ LOG(("fetch_rsrc: type:%4.4s\n", &type));
}
}
- fprintf(stderr, "fetch_rsrc: 0x%08lx, %ld, '%s'\n", type, id, c->name);
+ LOG(("fetch_rsrc: 0x%08lx, %ld, '%s'\n", type, id, c->name));
bool found;
if (id)
@@ -209,8 +210,13 @@ static bool fetch_rsrc_process(struct fetch_rsrc_context *c)
else
found = gAppResources->HasResource(type, c->name);
if (!found) {
+ BString error("Cannot locate resource: ");
+ if (id)
+ error << id;
+ else
+ error << c->name;
msg.type = FETCH_ERROR;
- msg.data.error = "Cannot locate rsrc: URL";
+ msg.data.error = error.String();
fetch_rsrc_send_callback(&msg, c);
return false;
}
@@ -328,7 +334,7 @@ static int find_app_resources()
char path[B_PATH_NAME_LENGTH];
if (nsbeos_find_app_path(path) < B_OK)
return B_ERROR;
-//fprintf(stderr, "loading resources from '%s'\n", path);
+ //fprintf(stderr, "loading resources from '%s'\n", path);
BFile file(path, B_READ_ONLY);
if (file.InitCheck() < 0)
diff --git a/beos/gui.cpp b/beos/gui.cpp
index b275616..133ee8c 100644
--- a/beos/gui.cpp
+++ b/beos/gui.cpp
@@ -172,7 +172,6 @@ NSBrowserApplication::MessageReceived(BMessage *message)
void
NSBrowserApplication::ArgvReceived(int32 argc, char **argv)
{
- CALLED();
NSBrowserWindow *win = nsbeos_find_last_window();
if (!win) {
return;
@@ -186,7 +185,6 @@ NSBrowserApplication::ArgvReceived(int32 argc, char **argv)
void
NSBrowserApplication::RefsReceived(BMessage *message)
{
- CALLED();
DetachCurrentMessage();
NSBrowserWindow *win = nsbeos_find_last_window();
if (!win) {
@@ -325,7 +323,6 @@ image_id nsbeos_find_app_path(char *path)
static char *find_resource(char *buf, const char *filename, const char *def)
{
- CALLED();
const char *cdir = NULL;
status_t err;
BPath path;
@@ -388,7 +385,6 @@ static char *find_resource(char *buf, const char *filename, const char *def)
*/
static void check_homedir(void)
{
- CALLED();
status_t err;
BPath path;
@@ -423,14 +419,13 @@ nsurl *gui_get_resource_url(const char *path)
u << "beosdefault.css";
else
u << path;
- fprintf(stderr, "%s(%s) -> '%s'\n", __FUNCTION__, path, u.String());
+ LOG(("(%s) -> '%s'\n", path, u.String()));
nsurl_create(u.String(), &url);
return url;
}
static void gui_init2(int argc, char** argv)
{
- CALLED();
const char *addr = NETSURF_HOMEPAGE;
if (nsoption_charp(homepage_url) != NULL)
@@ -450,7 +445,6 @@ static void gui_init2(int argc, char** argv)
/** Normal entry point from OS */
int main(int argc, char** argv)
{
- char buf[PATH_MAX];
setbuf(stderr, NULL);
BPath options;
@@ -458,12 +452,16 @@ int main(int argc, char** argv)
options.Append("x-vnd.NetSurf");
}
- find_resource(buf, "messages", "./beos/res/messages");
- LOG(("Using '%s' as Messages file", buf));
- //messages_load(buf);
+ if (!replicated) {
+ // create the Application object before trying to use messages
+ // so we can open an alert in case of error.
+ new NSBrowserApplication;
+ }
+
+ char* messages = "/boot/apps/netsurf/res/en/Messages";
/* initialise netsurf */
- netsurf_init(&argc, &argv, options.Path(), buf);
+ netsurf_init(&argc, &argv, options.Path(), messages);
gui_init(argc, argv);
gui_init2(argc, argv);
@@ -475,6 +473,27 @@ int main(int argc, char** argv)
return 0;
}
+/** called when replicated from NSBaseView::Instantiate() */
+int gui_init_replicant(int argc, char** argv)
+{
+ setbuf(stderr, NULL);
+
+ BPath options;
+ if (find_directory(B_USER_SETTINGS_DIRECTORY, &options, true) == B_OK) {
+ options.Append("x-vnd.NetSurf");
+ }
+
+ char* messages = "/boot/apps/netsurf/res/en/Messages";
+
+ /* initialise netsurf */
+ netsurf_init(&argc, &argv, options.Path(), messages);
+
+ gui_init(argc, argv);
+ gui_init2(argc, argv);
+
+ return 0;
+}
+
/* Documented in desktop/options.h */
void gui_options_init_defaults(void)
{
@@ -485,12 +504,10 @@ void gui_options_init_defaults(void)
void gui_init(int argc, char** argv)
{
char buf[PATH_MAX];
- CALLED();
if (pipe(sEventPipe) < 0)
return;
if (!replicated) {
- new NSBrowserApplication;
sBAppThreadID = spawn_thread(bapp_thread, "BApplication(NetSurf)", B_NORMAL_PRIORITY, (void *)find_thread(NULL));
if (sBAppThreadID < B_OK)
return; /* #### handle errors */
@@ -553,37 +570,38 @@ void gui_init(int argc, char** argv)
/* check what the font settings are, setting them to a default font
* if they're not set - stops Pango whinging
*/
+#define SETFONTDEFAULT(OPTION,y) if (nsoption_charp(OPTION) == NULL) nsoption_set_charp(OPTION, strdup((y)))
//XXX: use be_plain_font & friends, when we can check if font is serif or not.
/*
font_family family;
font_style style;
be_plain_font->GetFamilyAndStyle(&family, &style);
- nsoption_setnull_charp(font_sans, family);
- nsoption_setnull_charp(font_serif, family);
- nsoption_setnull_charp(font_mono, family);
- nsoption_setnull_charp(font_cursive, family);
- nsoption_setnull_charp(font_fantasy, family);
+ SETFONTDEFAULT(font_sans, family);
+ SETFONTDEFAULT(font_serif, family);
+ SETFONTDEFAULT(font_mono, family);
+ SETFONTDEFAULT(font_cursive, family);
+ SETFONTDEFAULT(font_fantasy, family);
*/
#ifdef __HAIKU__
- nsoption_setnull_charp(font_sans, "DejaVu Sans");
- nsoption_setnull_charp(font_serif, "DejaVu Serif");
- nsoption_setnull_charp(font_mono, "DejaVu Mono");
- nsoption_setnull_charp(font_cursive, "DejaVu Sans");
- nsoption_setnull_charp(font_fantasy, "DejaVu Sans");
+ SETFONTDEFAULT(font_sans, "DejaVu Sans");
+ SETFONTDEFAULT(font_serif, "DejaVu Serif");
+ SETFONTDEFAULT(font_mono, "DejaVu Mono");
+ SETFONTDEFAULT(font_cursive, "DejaVu Sans");
+ SETFONTDEFAULT(font_fantasy, "DejaVu Sans");
#else
- nsoption_setnull_charp(font_sans, "Bitstream Vera Sans");
- nsoption_setnull_charp(font_serif, "Bitstream Vera Serif");
- nsoption_setnull_charp(font_mono, "Bitstream Vera Sans Mono");
- nsoption_setnull_charp(font_cursive, "Bitstream Vera Serif");
- nsoption_setnull_charp(font_fantasy, "Bitstream Vera Serif");
+ SETFONTDEFAULT(font_sans, "Bitstream Vera Sans");
+ SETFONTDEFAULT(font_serif, "Bitstream Vera Serif");
+ SETFONTDEFAULT(font_mono, "Bitstream Vera Sans Mono");
+ SETFONTDEFAULT(font_cursive, "Bitstream Vera Serif");
+ SETFONTDEFAULT(font_fantasy, "Bitstream Vera Serif");
#if 0
- nsoption_setnull_charp(font_sans, "Swis721 BT");
- nsoption_setnull_charp(font_serif, "Dutch801 Rm BT");
- //nsoption_setnull_charp(font_mono, "Monospac821 BT");
- nsoption_setnull_charp(font_mono, "Courier10 BT");
- nsoption_setnull_charp(font_cursive, "Swis721 BT");
- nsoption_setnull_charp(font_fantasy, "Swis721 BT");
+ SETFONTDEFAULT(font_sans, "Swis721 BT");
+ SETFONTDEFAULT(font_serif, "Dutch801 Rm BT");
+ //SETFONTDEFAULT(font_mono, "Monospac821 BT");
+ SETFONTDEFAULT(font_mono, "Courier10 BT");
+ SETFONTDEFAULT(font_cursive, "Swis721 BT");
+ SETFONTDEFAULT(font_fantasy, "Swis721 BT");
#endif
#endif
@@ -680,17 +698,16 @@ void nsbeos_pipe_message_top(BMessage *message, BWindow *_this, struct beos_scaf
void gui_poll(bool active)
{
- //CALLED();
CURLMcode code;
-
fd_set read_fd_set, write_fd_set, exc_fd_set;
int max_fd = 0;
struct timeval timeout;
unsigned int fd_count = 0;
bool block = true;
+ bigtime_t next_schedule = 0;
- if (browser_reformat_pending)
- block = false;
+ // handle early deadlines
+ schedule_run();
FD_ZERO(&read_fd_set);
FD_ZERO(&write_fd_set);
@@ -709,25 +726,42 @@ void gui_poll(bool active)
FD_SET(sEventPipe[0], &read_fd_set);
max_fd = MAX(max_fd, sEventPipe[0] + 1);
+ // If there are pending events elsewhere, we should not be blocking
+ if (!browser_reformat_pending) {
+ if (earliest_callback_timeout != B_INFINITE_TIMEOUT) {
+ next_schedule = earliest_callback_timeout - system_time();
+ block = false;
+ }
+
+ // we're quite late already...
+ if (next_schedule < 0)
+ next_schedule = 0;
- bigtime_t next_schedule = earliest_callback_timeout - system_time();
- if (!block)
- next_schedule = 0LL; // now
- if (block && earliest_callback_timeout != B_INFINITE_TIMEOUT)
+ } else //we're not allowed to sleep, there is other activity going on.
block = false;
+
+ /*
+ LOG(("gui_poll: browser_reformat_pending:%d earliest_callback_timeout:%Ld"
+ " next_schedule:%Ld block:%d ", browser_reformat_pending,
+ earliest_callback_timeout, next_schedule, block));
+ */
+
timeout.tv_sec = (long)(next_schedule / 1000000LL);
timeout.tv_usec = (long)(next_schedule % 1000000LL);
- LOG(("gui_poll: select(%d, ..., %Ldus", max_fd, next_schedule));
+ //LOG(("gui_poll: select(%d, ..., %Ldus", max_fd, next_schedule));
fd_count = select(max_fd, &read_fd_set, &write_fd_set, &exc_fd_set,
block ? NULL : &timeout);
+ //LOG(("select: %d\n", fd_count));
if (fd_count > 0 && FD_ISSET(sEventPipe[0], &read_fd_set)) {
BMessage *message;
int len = read(sEventPipe[0], &message, sizeof(void *));
- LOG(("gui_poll: BMessage ? %d read", len));
- if (len == sizeof(void *))
+ //LOG(("gui_poll: BMessage ? %d read", len));
+ if (len == sizeof(void *)) {
+ //LOG(("gui_poll: BMessage.what %-4.4s\n", &(message->what)));
nsbeos_dispatch_event(message);
+ }
}
schedule_run();
@@ -739,7 +773,6 @@ void gui_poll(bool active)
void gui_quit(void)
{
- CALLED();
urldb_save_cookies(nsoption_charp(cookie_jar));
urldb_save(nsoption_charp(url_file));
//options_save_tree(hotlist,nsoption_charp(hotlist_file),messages_get("TreeHotlist"));
@@ -751,31 +784,6 @@ void gui_quit(void)
}
-
-struct gui_download_window *gui_download_window_create(download_context *ctx,
- struct gui_window *gui)
-{
- return NULL;
-}
-
-
-nserror gui_download_window_data(struct gui_download_window *dw,
- const char *data, unsigned int size)
-{
- return NSERROR_OK;
-}
-
-
-void gui_download_window_error(struct gui_download_window *dw,
- const char *error_msg)
-{
-}
-
-
-void gui_download_window_done(struct gui_download_window *dw)
-{
-}
-
#if 0 /* GTK */
static void nsbeos_select_menu_clicked(BCheckMenuItem *checkmenuitem,
gpointer user_data)
diff --git a/beos/gui.h b/beos/gui.h
index 6bbfa1d..af35677 100644
--- a/beos/gui.h
+++ b/beos/gui.h
@@ -30,6 +30,8 @@
#define CALLED() fprintf(stderr, "%s()\n", __FUNCTION__);
extern bool replicated;
+int gui_init_replicant(int argc, char** argv);
+
#if 0 /* GTK */
//extern GladeXML *gladeWindows;
diff --git a/beos/login.cpp b/beos/login.cpp
index 32860de..90cadde 100644
--- a/beos/login.cpp
+++ b/beos/login.cpp
@@ -45,7 +45,7 @@ class LoginAlert : public BAlert {
public:
LoginAlert(nserror (*callback)(bool proceed, void *pw),
void *callbaclpw,
- const char *url,
+ nsurl *url,
const char *host,
const char *realm,
const char *text);
@@ -53,7 +53,7 @@ public:
void MessageReceived(BMessage *message);
private:
- BString fUrl; /**< URL being fetched */
+ nsurl* fUrl; /**< URL being fetched */
BString fHost; /**< Host for user display */
BString fRealm; /**< Authentication realm */
nserror (*fCallback)(bool proceed, void *pw);
@@ -63,8 +63,8 @@ private:
BTextControl *fPassControl;
};
-static void create_login_window(const char *host,
- const char *realm, const char *fetchurl,
+static void create_login_window(nsurl *host,
+ lwc_string *realm, const char *fetchurl,
nserror (*cb)(bool proceed, void *pw), void *cbpw);
@@ -73,7 +73,7 @@ static void create_login_window(const char *host,
LoginAlert::LoginAlert(nserror (*callback)(bool proceed, void *pw),
void *callbackpw,
- const char *url,
+ nsurl *url,
const char *host,
const char *realm,
const char *text)
@@ -140,7 +140,7 @@ LoginAlert::MessageReceived(BMessage *message)
break;
BMessage *m = new BMessage(*message);
m->what = 'nsLO';
- m->AddString("URL", fUrl.String());
+ m->AddPointer("URL", fUrl);
m->AddString("Host", fHost.String());
m->AddString("Realm", fRealm.String());
m->AddPointer("callback", (void *)fCallback);
@@ -163,14 +163,13 @@ LoginAlert::MessageReceived(BMessage *message)
}
-void gui_401login_open(const char *url, const char *realm,
+extern "C" void gui_401login_open(nsurl *url, const char *realm,
nserror (*cb)(bool proceed, void *pw), void *cbpw)
{
- char *host;
+ lwc_string *host;
url_func_result res;
- res = url_host(url, &host);
- assert(res == URL_FUNC_OK);
+ host = nsurl_get_component(url, NSURL_HOST);
create_login_window(url, host, realm, cb, cbpw);
@@ -179,7 +178,7 @@ void gui_401login_open(const char *url, const char *realm,
//void create_login_window(struct browser_window *bw, const char *host,
// const char *realm, const char *fetchurl)
-static void create_login_window(const char *url, const char *host,
+static void create_login_window(nsurl *url, lwc_string *host,
const char *realm, nserror (*cb)(bool proceed, void *pw),
void *cbpw)
{
@@ -191,8 +190,8 @@ static void create_login_window(const char *url, const char *host,
text << "Host: " << host << "\n";
//text << "\n";
- LoginAlert *a = new LoginAlert(cb, cbpw, url, host, r.String(),
- text.String());
+ LoginAlert *a = new LoginAlert(cb, cbpw, url, lwc_string_data(host),
+ r.String(), text.String());
// asynchronously
a->Go(NULL);
diff --git a/beos/res.rdef b/beos/res.rdef
index b047bd0..862d6d0 100644
--- a/beos/res.rdef
+++ b/beos/res.rdef
@@ -32,6 +32,7 @@ resource(408, "throbber8.png") #'data' import "res/throbber/throbber8.png";
/* */
resource(500, "credits.html") #'data' import "res/en/credits.html,faf";
resource(501, "licence.html") #'data' import "res/en/licence.html,faf";
+resource(502, "welcome.html") #'data' import "res/en/welcome.html,faf";
resource(1, "BEOS:APP_FLAGS") (#'APPF') $"01000000";
@@ -397,3 +398,48 @@ resource(101, "BEOS:V:STD_ICON") #'zICO' array {
$"7F793EDCE3F417BB10DA0B"
};
+/* toolbar icons from Zumi <http://zumi.xoom.it/myhaiku>
+ * (generated by Icon-O-Matic from the HFIV source file,
+ * can't be automated)
+ */
+
+resource(102, "forward_button") #'VICN' array {
+ $"6E6369660304006603005900020006020000003C6000C000000000004C000048"
+ $"A0000080FF80FF00B300010A0748353448343E223E222C342C3422030A000100"
+ $"30222201178322040A0101001001178322040A02010000"
+};
+
+resource(103, "back_button") #'VICN' array {
+ $"6E6369660304006603005900020006020000003C6000C000000000004C000048"
+ $"A0000080FF80FF00B300010A0722353622362C482C483E363E3648030A000100"
+ $"30222201178322040A0101001001178322040A02010000"
+};
+
+resource(104, "stop_button") #'VICN' array {
+ $"6E6369660304006603800000020006020000003C6000C000000000004C000048"
+ $"A00000FFABABFFD900000208022A40402A02043525BEE325B7D825253525B7D8"
+ $"25BEE33545B7D845BEE345453545BEE345B7D8030A0002000130222201178900"
+ $"040A010200011001178900040A02020100100117850004"
+};
+
+resource(105, "reload_button") #'VICN' array {
+ $"6E6369660404006603004080020006020000003A0000C000000000004C000046"
+ $"7FFF00ABD5FFFF006CD9020006020000003A0000C000000000004C0000467FFF"
+ $"FFAAD4FF00006CD9010606C60F482232383D2D3D2D3826222A2B2329224327BC"
+ $"B7B25A4327060A00010030222201178322040A0101001001178322040A020100"
+ $"000A00010012C00000000000000000C000004AC0004AC00001178422040A0101"
+ $"0012C00000000000000000C000004AA0004AA00001178422040A03010002C000"
+ $"00000000000000C000004AA0004AA000"
+};
+
+resource(106, "home_button") #'VICN' array {
+ $"6E6369660804006603800000020006020000003A8000C000000000004C000047"
+ $"000000FFABABFFD900000554020016020000003AC000C000000000004BE00048"
+ $"A00000FFFFE50300590002000602000000370000C000000000004C00004A5000"
+ $"0080FF80FF00B20003806040040A064836483035222230223635280A04484848"
+ $"42224222480A0542404234352A283428400A042C342C4032403234080A030102"
+ $"1001178400040A040102000A0101001001178402040A020100000A0501011001"
+ $"178402040A060101000A070103000A0701030240AAAA0000000000003E000045"
+ $"0000468000"
+};
+
diff --git a/beos/scaffolding.cpp b/beos/scaffolding.cpp
index 4003b09..bcd9943 100644
--- a/beos/scaffolding.cpp
+++ b/beos/scaffolding.cpp
@@ -22,7 +22,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+
#include <BeBuild.h>
+#include <Box.h>
#include <Button.h>
#include <Dragger.h>
#include <Menu.h>
@@ -31,6 +33,8 @@
#include <Node.h>
#include <Path.h>
#include <PopUpMenu.h>
+#include <Resources.h>
+#include <Roster.h>
#include <Screen.h>
#include <ScrollView.h>
#include <String.h>
@@ -38,6 +42,12 @@
#include <TextControl.h>
#include <View.h>
#include <Window.h>
+
+#if defined(__HAIKU__)
+#include <IconUtils.h>
+#include "WindowStack.h"
+#endif
+
#include <fs_attr.h>
extern "C" {
#include "content/content.h"
@@ -164,6 +174,10 @@ static int32 nsbeos_replicant_main_thread(void *_arg);
// in beos_gui.cpp
extern int main(int argc, char** argv);
+// in fetch_rsrc.cpp
+extern BResources *gAppResources;
+
+
#warning XXX
#if 0 /* GTK */
static gboolean nsbeos_window_url_activate_event(beosWidget *, gpointer);
@@ -320,6 +334,7 @@ void
NSThrobber::SetBitmap(const BBitmap *bitmap)
{
fBitmap = bitmap;
+ Invalidate();
}
@@ -458,7 +473,7 @@ NSBaseView::MessageReceived(BMessage *message)
nsbeos_pipe_message_top(message, NULL, fScaffolding);
break;
default:
- message->PrintToStream();
+ //message->PrintToStream();
BView::MessageReceived(message);
}
}
@@ -490,12 +505,13 @@ NSBaseView::Instantiate(BMessage *archive)
if (!validate_instantiation(archive, "NSBaseView"))
return NULL;
const char *url;
- if (archive->FindString("url", &url) < B_OK) {
- return NULL;
+ if (archive->FindString("url", &url) < B_OK
+ || url == NULL || strlen(url) == 0) {
+ url = "about:";
}
struct replicant_thread_info *info = new replicant_thread_info;
- info->url = url;
+ info->url = BString(url);
if (nsbeos_find_app_path(info->app) < B_OK)
return NULL;
info->args[0] = info->app;
@@ -510,6 +526,10 @@ NSBaseView::Instantiate(BMessage *archive)
//netsurf_init(2, info->args);
//return NULL;
+ // do as much as possible in this thread to avoid deadlocks
+
+ gui_init_replicant(2, info->args);
+
replicant_done_sem = create_sem(0, "NS Replicant created");
thread_id nsMainThread = spawn_thread(nsbeos_replicant_main_thread,
"NetSurf Main Thread", B_NORMAL_PRIORITY, info);
@@ -520,7 +540,8 @@ NSBaseView::Instantiate(BMessage *archive)
return NULL;
}
resume_thread(nsMainThread);
- while (acquire_sem(replicant_done_sem) == EINTR);
+ //XXX: deadlocks BeHappy
+ //while (acquire_sem(replicant_done_sem) == EINTR);
return view;
}
@@ -539,6 +560,7 @@ void
NSBaseView::AllAttached()
{
BView::AllAttached();
+
struct beos_scaffolding *g = fScaffolding;
if (!g)
return;
@@ -576,6 +598,8 @@ NSBrowserWindow::NSBrowserWindow(BRect frame, struct beos_scaffolding *scaf)
NSBrowserWindow::~NSBrowserWindow()
{
+ if(activeWindow == this)
+ activeWindow = NULL;
}
@@ -621,17 +645,26 @@ NSBrowserWindow::QuitRequested(void)
}
+void
+NSBrowserWindow::WindowActivated(bool active)
+{
+ if(active)
+ activeWindow = this;
+ else if(activeWindow == this)
+ activeWindow = NULL;
+}
+
+
// #pragma mark - implementation
int32 nsbeos_replicant_main_thread(void *_arg)
{
struct replicant_thread_info *info = (struct replicant_thread_info *)_arg;
- int32 ret;
- ret = main(2, info->args);
- //netsurf_main_loop();
- //netsurf_exit();
+ int32 ret = 0;
+
+ netsurf_main_loop();
+ netsurf_exit();
delete info;
- //release
delete_sem(replicant_done_sem);
return ret;
}
@@ -686,6 +719,10 @@ void nsbeos_scaffolding_update_colors(nsbeos_scaffolding *g)
}
+/*static*/ BWindow*
+NSBrowserWindow::activeWindow = NULL;
+
+
void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *message)
{
int width, height;
@@ -907,6 +944,7 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
text = scaffold->url_bar->Text();
scaffold->url_bar->UnlockLooper();
+ NSBrowserWindow::activeWindow = scaffold->window;
browser_window_create(text.String(), bw, NULL, false, false);
break;
}
@@ -1570,7 +1608,20 @@ void nsbeos_attach_toplevel_view(nsbeos_scaffolding *g, BView *view)
message->AddPointer("scaffolding", g);
g->window->AddShortcut('H', 0, message, view);
+
+#if defined(__HAIKU__)
+ // Make sure the window is layouted and answering to events, but do not
+ // show it before it is actually resized
+ g->window->Hide();
+ g->window->Show();
+
+ if(NSBrowserWindow::activeWindow) {
+ BWindowStack stack(NSBrowserWindow::activeWindow);
+ stack.AddWindow(g->window);
+ }
+#endif
g->window->Show();
+
} else {
if (g->top_view->Looper())
g->top_view->UnlockLooper();
@@ -1659,6 +1710,97 @@ static BMenuItem *make_menu_item(const char *name, BMessage *message)
return item;
}
+
+class BBitmapButton: public BButton
+{
+ public:
+ BBitmapButton(BRect rect, const char* name, const char* label,
+ BMessage* message);
+ ~BBitmapButton();
+
+ void Draw(BRect updateRect);
+ void SetBitmap(const char* attrName);
+ private:
+ BBitmap* fBitmap;
+ BBitmap* fDisabledBitmap;
+};
+
+
+BBitmapButton::BBitmapButton(BRect rect, const char* name, const char* label,
+ BMessage* message)
+ : BButton(rect, name, label, message)
+{
+ SetBitmap(name);
+}
+
+
+BBitmapButton::~BBitmapButton()
+{
+ delete fBitmap;
+ delete fDisabledBitmap;
+}
+
+
+void BBitmapButton::Draw(BRect updateRect)
+{
+ if(fBitmap == NULL) {
+ BButton::Draw(updateRect);
+ return;
+ }
+
+ SetDrawingMode(B_OP_COPY);
+ FillRect(updateRect, B_SOLID_LOW);
+ rgb_color color = LowColor();
+
+ SetDrawingMode(B_OP_ALPHA);
+ if(IsEnabled()) {
+ if(Value() != 0) {
+ // button is clicked
+ DrawBitmap(fBitmap, BPoint(1, 1));
+ } else {
+ // button is released
+ DrawBitmap(fBitmap, BPoint(0, 0));
+ }
+ } else
+ DrawBitmap(fDisabledBitmap, BPoint(0, 0));
+}
+
+
+void BBitmapButton::SetBitmap(const char* attrname)
+{
+#ifdef __HAIKU__
+ size_t size = 0;
+ const void* data = gAppResources->LoadResource('VICN', attrname, &size);
+
+ if (!data) {
+ printf("CANT LOAD RESOURCE %s\n", attrname);
+ return;
+ }
+
+ fBitmap = new BBitmap(BRect(0, 0, 32, 32), B_RGB32);
+ status_t status = BIconUtils::GetVectorIcon((const uint8*)data, size, fBitmap);
+
+ if(status != B_OK) {
+ fprintf(stderr, "%s > oops %s\n", attrname, strerror(status));
+ delete fBitmap;
+ fBitmap = NULL;
+ }
+
+ fDisabledBitmap = new BBitmap(fBitmap);
+ rgb_color* pixel = (rgb_color*)fDisabledBitmap->Bits();
+ for(int i = 0; i < fDisabledBitmap->BitsLength()/4; i++)
+ {
+ *pixel = tint_color(*pixel, B_DISABLED_MARK_TINT);
+ pixel++;
+ }
+#else
+ // No vector icon support on BeOS. We could try to load a bitmap one
+ fBitmap = NULL;
+ fDisabledBitmap = NULL;
+#endif
+}
+
+
nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
{
struct beos_scaffolding *g = (struct beos_scaffolding *)malloc(sizeof(*g));
@@ -1676,7 +1818,6 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
g->window = NULL;
g->menu_bar = NULL;
- g->window = NULL;
if (replicated && !replicant_view) {
warn_user("Error: No subwindow allowed when replicated.", NULL);
@@ -1685,7 +1826,6 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
if (!replicant_view) {
-
BRect frame(0, 0, 600-1, 500-1);
if (nsoption_int(window_width) > 0) {
frame.Set(0, 0, nsoption_int(window_width) - 1, nsoption_int(window_height) - 1);
@@ -1696,7 +1836,7 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
NSBrowserWindow *win = nsbeos_find_last_window();
if (win) {
pos = win->Frame().LeftTop();
- win->Unlock();
+ win->UnlockLooper();
}
pos += BPoint(20, 20);
BScreen screen;
@@ -2035,17 +2175,19 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
// the toolbar is also the dragger for now
// XXX: try to stuff it in the status bar at the bottom
// (BDragger *must* be a parent, sibiling or direct child of NSBaseView!)
+ // XXX: B_FULL_UPDATE_ON_RESIZE avoids leaving bits on resize,
+ // but causes flicker
rect = g->top_view->Bounds();
rect.bottom = rect.top + TOOLBAR_HEIGHT - 1;
rect.right = rect.right - DRAGGER_WIDTH;
- g->tool_bar = new BView(rect, "Toolbar",
- B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, B_WILL_DRAW);
+ g->tool_bar = new BBox(rect, "Toolbar",
+ B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, B_WILL_DRAW | B_FRAME_EVENTS
+ | B_FULL_UPDATE_ON_RESIZE | B_NAVIGABLE_JUMP, B_PLAIN_BORDER);
g->top_view->AddChild(g->tool_bar);
g->tool_bar->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
g->tool_bar->SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR)) ;
// buttons
-#warning use BPictureButton
rect = g->tool_bar->Bounds();
rect.right = TOOLBAR_HEIGHT;
rect.InsetBySelf(5, 5);
@@ -2054,35 +2196,35 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
message = new BMessage('back');
message->AddPointer("scaffolding", g);
- g->back_button = new BButton(rect, "back_button", "<", message);
+ g->back_button = new BBitmapButton(rect, "back_button", "<", message);
g->tool_bar->AddChild(g->back_button);
nButtons++;
rect.OffsetBySelf(TOOLBAR_HEIGHT, 0);
message = new BMessage('forw');
message->AddPointer("scaffolding", g);
- g->forward_button = new BButton(rect, "forward_button", ">", message);
+ g->forward_button = new BBitmapButton(rect, "forward_button", ">", message);
g->tool_bar->AddChild(g->forward_button);
nButtons++;
rect.OffsetBySelf(TOOLBAR_HEIGHT, 0);
message = new BMessage('stop');
message->AddPointer("scaffolding", g);
- g->stop_button = new BButton(rect, "stop_button", "S", message);
+ g->stop_button = new BBitmapButton(rect, "stop_button", "S", message);
g->tool_bar->AddChild(g->stop_button);
nButtons++;
rect.OffsetBySelf(TOOLBAR_HEIGHT, 0);
message = new BMessage('relo');
message->AddPointer("scaffolding", g);
- g->reload_button = new BButton(rect, "reload_button", "R", message);
+ g->reload_button = new BBitmapButton(rect, "reload_button", "R", message);
g->tool_bar->AddChild(g->reload_button);
nButtons++;
rect.OffsetBySelf(TOOLBAR_HEIGHT, 0);
message = new BMessage('home');
message->AddPointer("scaffolding", g);
- g->home_button = new BButton(rect, "home_button", "H", message);
+ g->home_button = new BBitmapButton(rect, "home_button", "H", message);
g->tool_bar->AddChild(g->home_button);
nButtons++;
@@ -2407,3 +2549,4 @@ void nsbeos_scaffolding_popup_menu(nsbeos_scaffolding *g, BPoint where)
{
g->popup_menu->Go(where);
}
+
diff --git a/beos/scaffolding.h b/beos/scaffolding.h
index ae78391..bd13230 100644
--- a/beos/scaffolding.h
+++ b/beos/scaffolding.h
@@ -61,11 +61,15 @@ virtual ~NSBrowserWindow();
virtual void DispatchMessage(BMessage *message, BHandler *handler);
virtual void MessageReceived(BMessage *message);
virtual bool QuitRequested(void);
+void WindowActivated(bool active);
struct beos_scaffolding *Scaffolding() const { return fScaffolding; };
+static BWindow* activeWindow;
private:
struct beos_scaffolding *fScaffolding;
+
+
};
diff --git a/beos/schedule.cpp b/beos/schedule.cpp
index 3f82235..db0992e 100644
--- a/beos/schedule.cpp
+++ b/beos/schedule.cpp
@@ -95,8 +95,9 @@ schedule(int t, void (*callback)(void *p), void *p)
cb->context = p;
cb->callback_killed = cb->callback_fired = false;
cb->timeout = timeout;
- if (earliest_callback_timeout > timeout)
+ if (earliest_callback_timeout > timeout) {
earliest_callback_timeout = timeout;
+ }
callbacks->AddItem(cb);
}
@@ -104,11 +105,12 @@ bool
schedule_run(void)
{
LOG(("schedule_run()"));
+
+ earliest_callback_timeout = B_INFINITE_TIMEOUT;
if (callbacks == NULL)
return false; /* Nothing to do */
bigtime_t now = system_time();
- earliest_callback_timeout = B_INFINITE_TIMEOUT;
int32 i;
LOG(("Checking %ld callbacks to for deadline.", this_run->CountItems()));
diff --git a/beos/window.cpp b/beos/window.cpp
index 253b5d1..f26ba91 100644
--- a/beos/window.cpp
+++ b/beos/window.cpp
@@ -131,7 +131,7 @@ static GdkCursor *nsbeos_create_menu_cursor(void);
NSBrowserFrameView::NSBrowserFrameView(BRect frame, struct gui_window *gui)
: BView(frame, "NSBrowserFrameView", B_FOLLOW_ALL_SIDES,
- B_WILL_DRAW | B_NAVIGABLE | B_FRAME_EVENTS /*| B_SUBPIXEL_PRECISE*/),
+ B_WILL_DRAW | B_NAVIGABLE | B_FRAME_EVENTS ),
fGuiWindow(gui)
{
}
@@ -250,7 +250,7 @@ NSBrowserFrameView::MessageReceived(BMessage *message)
nsbeos_pipe_message_top(message, NULL, fGuiWindow->scaffold);
break;
default:
- message->PrintToStream();
+ //message->PrintToStream();
BView::MessageReceived(message);
}
}
@@ -756,18 +756,25 @@ void nsbeos_dispatch_event(BMessage *message)
break;
case 'nsLO': // login
{
- BString url;
+ nsurl* url;
BString realm;
BString auth;
- if (message->FindString("URL", &url) < B_OK)
+ void* cbpw;
+ nserror (*cb)(bool proceed, void* pw);
+
+ if (message->FindPointer("URL", (void**)&url) < B_OK)
break;
if (message->FindString("Realm", &realm) < B_OK)
break;
if (message->FindString("Auth", &auth) < B_OK)
break;
+ if (message->FindPointer("callback", (void**)&cb) < B_OK)
+ break;
+ if (message->FindPointer("callback_pw", (void**)&cbpw) < B_OK)
+ break;
//printf("login to '%s' with '%s'\n", url.String(), auth.String());
- urldb_set_auth_details(url.String(), realm.String(), auth.String());
- browser_window_go(gui->bw, url.String(), 0, true);
+ urldb_set_auth_details(url, realm.String(), auth.String());
+ cb(true, cbpw);
break;
}
default:
@@ -926,11 +933,44 @@ void nsbeos_window_keypress_event(BView *view, gui_window *g, BMessage *event)
nskey = utf8_to_ucs4(bytes, numbytes);
}
- bool done = browser_window_key_press(g->bw, nskey);
- LOG(("nskey %d %d", nskey, done));
- //if (browser_window_key_press(g->bw, nskey))
+ if(browser_window_key_press(g->bw, nskey))
return;
-
+
+ // Remaining events are for scrolling the page around
+ float hdelta = 0.0f, vdelta = 0.0f;
+ g->view->LockLooper();
+ BRect size = g->view->Bounds();
+ switch (byte) {
+ case B_HOME:
+ g->view->ScrollTo(0.0f, 0.0f);
+ break;
+ case B_END:
+ {
+ // TODO
+ break;
+ }
+ case B_PAGE_UP:
+ vdelta = -size.Height();
+ break;
+ case B_PAGE_DOWN:
+ vdelta = size.Height();
+ break;
+ case B_LEFT_ARROW:
+ hdelta = -10;
+ break;
+ case B_RIGHT_ARROW:
+ hdelta = 10;
+ break;
+ case B_UP_ARROW:
+ vdelta = -10;
+ break;
+ case B_DOWN_ARROW:
+ vdelta = 10;
+ break;
+ }
+
+ g->view->ScrollBy(hdelta, vdelta);
+ g->view->UnlockLooper();
}
#warning WRITEME
@@ -1038,7 +1078,7 @@ gboolean nsbeos_window_keypress_event(GtkWidget *widget, GdkEventKey *event,
void nsbeos_window_resize_event(BView *view, gui_window *g, BMessage *event)
{
- CALLED();
+ //CALLED();
int32 width;
int32 height;
@@ -1088,7 +1128,7 @@ void nsbeos_window_resize_event(BView *view, gui_window *g, BMessage *event)
void nsbeos_window_moved_event(BView *view, gui_window *g, BMessage *event)
{
- CALLED();
+ //CALLED();
#warning XXX: Invalidate ?
if (!view || !view->LockLooper())
@@ -1272,7 +1312,7 @@ void gui_window_update_box(struct gui_window *g, const struct rect *rect)
bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
{
- CALLED();
+ //CALLED();
if (g->view == NULL)
return false;
if (!g->view->LockLooper())
@@ -1302,7 +1342,7 @@ bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
{
- CALLED();
+ //CALLED();
if (g->view == NULL)
return;
if (!g->view->LockLooper())
@@ -1344,7 +1384,7 @@ void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
void gui_window_update_extent(struct gui_window *g)
{
- CALLED();
+ //CALLED();
if (!g->bw->current_content)
return;
@@ -1359,7 +1399,7 @@ void gui_window_update_extent(struct gui_window *g)
float y_prop = g->view->Bounds().Height() / y_max;
x_max -= g->view->Bounds().Width() + 1;
y_max -= g->view->Bounds().Height() + 1;
-printf("x_max = %f y_max = %f x_prop = %f y_prop = %f\n", x_max, y_max, x_prop, y_prop);
+ LOG(("x_max = %f y_max = %f x_prop = %f y_prop = %f\n", x_max, y_max, x_prop, y_prop));
if (g->view->ScrollBar(B_HORIZONTAL)) {
g->view->ScrollBar(B_HORIZONTAL)->SetRange(0, x_max);
g->view->ScrollBar(B_HORIZONTAL)->SetProportion(x_prop);
@@ -1542,7 +1582,7 @@ void gui_window_hide_pointer(struct gui_window *g)
void gui_window_place_caret(struct gui_window *g, int x, int y, int height)
{
- CALLED();
+ //CALLED();
if (g->view == NULL)
return;
if (!g->view->LockLooper())
@@ -1674,7 +1714,7 @@ bool gui_add_to_clipboard(const char *text, size_t length, bool space,
BFont font;
text_run *run = new text_run;
- nsbeos_style_to_font(font, &fstyle);
+ nsbeos_style_to_font(font, fstyle);
run->offset = current_selection.Length();
run->font = font;
run->color = nsbeos_rgb_colour(fstyle->foreground);
diff --git a/content/content.c b/content/content.c
index 353abee..1a92e40 100644
--- a/content/content.c
+++ b/content/content.c
@@ -678,6 +678,23 @@ void content_broadcast(struct content *c, content_msg msg,
}
}
+/* exported interface documented in content_protected.h */
+void content_broadcast_errorcode(struct content *c, nserror errorcode)
+{
+ struct content_user *user, *next;
+ union content_msg_data data;
+
+ assert(c);
+
+ data.errorcode = errorcode;
+
+ for (user = c->user_list->next; user != 0; user = next) {
+ next = user->next; /* user may be destroyed during callback */
+ if (user->callback != 0)
+ user->callback(c, CONTENT_MSG_ERRORCODE, data, user->pw);
+ }
+}
+
/**
* A window containing the content has been opened.
diff --git a/content/content_protected.h b/content/content_protected.h
index e399797..ecbe17f 100644
--- a/content/content_protected.h
+++ b/content/content_protected.h
@@ -160,6 +160,11 @@ void content_set_error(struct content *c);
void content_set_status(struct content *c, const char *status_message);
void content_broadcast(struct content *c, content_msg msg,
union content_msg_data data);
+/**
+ * Send an errorcode message to all users.
+ */
+void content_broadcast_errorcode(struct content *c, nserror errorcode);
+
void content_add_error(struct content *c, const char *token,
unsigned int line);
diff --git a/desktop/browser.c b/desktop/browser.c
index 8948460..6262f24 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -1195,99 +1195,7 @@ browser_window_callback_errorcode(hlcache_handle *c,
{
const char* message;
- switch (code) {
- case NSERROR_OK:
- /**< No error */
- message = messages_get("OK");
- break;
-
- case NSERROR_NOMEM:
- /**< Memory exhaustion */
- message = messages_get("NoMemory");
- break;
-
- case NSERROR_NO_FETCH_HANDLER:
- /**< No fetch handler for URL scheme */
- message = messages_get("NoHandler");
- break;
-
- case NSERROR_NOT_FOUND:
- /**< Requested item not found */
- message = messages_get("NotFound");
- break;
-
- case NSERROR_SAVE_FAILED:
- /**< Failed to save data */
- message = messages_get("SaveFailed");
- break;
-
- case NSERROR_CLONE_FAILED:
- /**< Failed to clone handle */
- message = messages_get("CloneFailed");
- break;
-
- case NSERROR_INIT_FAILED:
- /**< Initialisation failed */
- message = messages_get("InitFailed");
- break;
-
- case NSERROR_MNG_ERROR:
- /**< An MNG error occurred */
- message = messages_get("MNGError");
- break;
-
- case NSERROR_BAD_ENCODING:
- /**< The character set is unknown */
- message = messages_get("BadEncoding");
- break;
-
- case NSERROR_NEED_DATA:
- /**< More data needed */
- message = messages_get("NeedData");
- break;
-
- case NSERROR_ENCODING_CHANGE:
- /**< The character set encoding change was unhandled */
- message = messages_get("EncodingChanged");
- break;
-
- case NSERROR_BAD_PARAMETER:
- /**< Bad Parameter */
- message = messages_get("BadParameter");
- break;
-
- case NSERROR_INVALID:
- /**< Invalid data */
- message = messages_get("Invalid");
- break;
-
- case NSERROR_BOX_CONVERT:
- /**< Box conversion failed */
- message = messages_get("BoxConvert");
- break;
-
- case NSERROR_STOPPED:
- /**< Content conversion stopped */
- message = messages_get("Stopped");
- break;
-
- case NSERROR_DOM:
- /**< DOM call returned error */
- message = messages_get("ParsingFail");
- break;
-
- case NSERROR_BAD_URL:
- /**< Bad URL */
- message = messages_get("BadURL");
- break;
-
- default:
- case NSERROR_UNKNOWN:
- /**< Unknown error */
- message = messages_get("Unknown");
- break;
-
- }
+ message = messages_get_errorcode(code);
browser_window_set_status(bw, message);
diff --git a/desktop/hotlist.c b/desktop/hotlist.c
index b6eac36..e2386fc 100644
--- a/desktop/hotlist.c
+++ b/desktop/hotlist.c
@@ -415,8 +415,8 @@ void hotlist_add_entry(bool selected)
{
struct node *node;
struct node *parent = NULL;
- creating_node = true;
nsurl *url;
+ creating_node = true;
if (selected == true) {
parent = tree_get_selected_node(tree_get_root(hotlist_tree));
diff --git a/javascript/js.h b/javascript/js.h
index a6566f9..4dd8f15 100644
--- a/javascript/js.h
+++ b/javascript/js.h
@@ -51,4 +51,7 @@ jsobject *js_newcompartment(jscontext *ctx, void *win_priv, void *doc_priv);
/* execute some javascript in a context */
bool js_exec(jscontext *ctx, const char *txt, size_t txtlen);
+/* fire an event at a dom node */
+bool js_fire_event(jscontext *ctx, const char *type, void *target);
+
#endif /* _NETSURF_JAVASCRIPT_JS_H_ */
diff --git a/javascript/jsapi.c b/javascript/jsapi.c
index 35e3da3..bec5653 100644
--- a/javascript/jsapi.c
+++ b/javascript/jsapi.c
@@ -149,3 +149,61 @@ bool js_exec(jscontext *ctx, const char *txt, size_t txtlen)
return false;
}
+
+dom_exception _dom_event_create(dom_document *doc, dom_event **evt);
+#define dom_event_create(d, e) _dom_event_create((dom_document *)(d), (dom_event **) (e))
+
+bool js_fire_event(jscontext *ctx, const char *type, void *target)
+{
+ JSContext *cx = (JSContext *)ctx;
+ dom_node *node = target;
+ JSObject *jsevent;
+ jsval rval;
+ jsval argv[1];
+ JSBool ret = JS_TRUE;
+ dom_exception exc;
+ dom_event *event;
+ dom_string *type_dom;
+
+ if (node == NULL) {
+ /* deliver to window */
+ if (cx == NULL) {
+ return false;
+ }
+
+ exc = dom_string_create((unsigned char*)type, strlen(type), &type_dom);
+ if (exc != DOM_NO_ERR) {
+ return false;
+ }
+
+ exc = dom_event_create(-1, &event);
+ if (exc != DOM_NO_ERR) {
+ return false;
+ }
+
+ exc = dom_event_init(event, type_dom, false, false);
+ dom_string_unref(type_dom);
+ if (exc != DOM_NO_ERR) {
+ return false;
+ }
+
+ jsevent = jsapi_new_Event(cx, NULL, NULL, event);
+ if (jsevent == NULL) {
+ return false;
+ }
+
+ argv[0] = OBJECT_TO_JSVAL(jsevent);
+
+ ret = JS_CallFunctionName(cx,
+ JS_GetGlobalObject(cx),
+ "dispatchEvent",
+ 1,
+ argv,
+ &rval);
+ }
+
+ if (ret == JS_TRUE) {
+ return true;
+ }
+ return false;
+}
diff --git a/javascript/jsapi.h b/javascript/jsapi.h
index 8b7fe51..6b0f112 100644
--- a/javascript/jsapi.h
+++ b/javascript/jsapi.h
@@ -47,24 +47,24 @@
*/
/* native function definition with five parameters */
-#define JSAPI_NATIVE(name, cx, argc, vp) \
- jsapi_native_##name(cx, JSObject *jsapi_this, argc, vp, jsval *jsapi_rval)
+#define JSAPI_FUNC(name, cx, argc, vp) \
+ jsapi_func_##name(cx, JSObject *jsapi_this, argc, vp, jsval *jsapi_rval)
-/* native function return value */
-#define JSAPI_RVAL(cx, vp) (jsapi_rval)
+/* native function return value - No macro available */
+#define JSAPI_FUNC_RVAL(cx, vp) (jsapi_rval)
-/* native function return value setter with no JS_SET_RVAL */
-#define JSAPI_SET_RVAL(cx, vp, v) (*jsapi_rval = (v))
+/* native function return value setter - No macro available */
+#define JSAPI_FUNC_SET_RVAL(cx, vp, v) (*jsapi_rval = (v))
/* arguments */
-#define JSAPI_ARGV(cx, vp) (vp)
+#define JSAPI_FUNC_ARGV(cx, vp) (vp)
/* check if a jsval is an object */
#define JSAPI_JSVAL_IS_OBJECT(v) JSVAL_IS_OBJECT(v)
/* native function specifier with five parameters and no JS_FS macro */
#define JSAPI_FS(name, nargs, flags) \
- { #name, jsapi_native_##name, nargs, flags, 0 }
+ { #name, jsapi_func_##name, nargs, flags, 0 }
/* native function specifier list end */
#define JSAPI_FS_END { NULL, NULL, 0, 0, 0 }
@@ -73,21 +73,27 @@
/* native proprty definition */
-#define JSAPI_PROPERTYGET(name, cx, obj, vp) \
- jsapi_property_##name##_get(cx, obj, jsval id, vp)
-#define JSAPI_PROPERTYSET(name, cx, obj, vp) \
- jsapi_property_##name##_set(cx, obj, jsval id, vp)
+#define JSAPI_PROP_GETTER(name, cx, obj, vp) \
+ jsapi_property_##name##_get(cx, obj, jsval jsapi_id, vp)
+#define JSAPI_PROP_SETTER(name, cx, obj, vp) \
+ jsapi_property_##name##_set(cx, obj, jsval jsapi_id, vp)
+
+/* native property return value */
+#define JSAPI_PROP_RVAL(cx, vp) (vp)
/* native property getter return value */
-#define JS_SET_RVAL(cx, vp, v) (*(vp) = (v))
+#define JSAPI_PROP_SET_RVAL(cx, vp, v) (*(vp) = (v))
+
+/* native property ID value as a jsval */
+#define JSAPI_PROP_IDVAL(cx, vp) (*(vp) = jsapi_id)
/* native property specifier */
-#define JSAPI_PS(name, tinyid, flags) \
- { #name , tinyid , flags , jsapi_property_##name##_get , jsapi_property_##name##_set }
+#define JSAPI_PS(name, fnname, tinyid, flags) \
+ { name , tinyid , flags , jsapi_property_##fnname##_get , jsapi_property_##fnname##_set }
/* native property specifier with no setter */
-#define JSAPI_PS_RO(name, tinyid, flags) \
- { #name , tinyid , flags | JSPROP_READONLY, jsapi_property_##name##_get , NULL }
+#define JSAPI_PS_RO(name, fnname, tinyid, flags) \
+ { name , tinyid , flags | JSPROP_READONLY, jsapi_property_##fnname##_get , NULL }
/* native property specifier list end */
#define JSAPI_PS_END { NULL, 0, 0, NULL, NULL }
@@ -155,12 +161,12 @@ JS_NewCompartmentAndGlobalObject(JSContext *cx,
*/
/* five parameter jsapi native call */
-#define JSAPI_NATIVE(name, cx, argc, vp) \
- jsapi_native_##name(cx, JSObject *jsapi_this, argc, vp, jsval *jsapi_rval)
+#define JSAPI_FUNC(name, cx, argc, vp) \
+ jsapi_func_##name(cx, JSObject *jsapi_this, argc, vp, jsval *jsapi_rval)
/* five parameter function descriptor */
#define JSAPI_FS(name, nargs, flags) \
- JS_FS(#name, jsapi_native_##name, nargs, flags, 0)
+ JS_FS(#name, jsapi_func_##name, nargs, flags, 0)
/* function descriptor end */
#define JSAPI_FS_END JS_FS_END
@@ -169,10 +175,10 @@ JS_NewCompartmentAndGlobalObject(JSContext *cx,
#define JSAPI_RVAL(cx, vp) JS_RVAL(cx, jsapi_rval)
/* return value setter */
-#define JSAPI_SET_RVAL(cx, vp, v) JS_SET_RVAL(cx, jsapi_rval, v)
+#define JSAPI_FUNC_SET_RVAL(cx, vp, v) JS_SET_RVAL(cx, jsapi_rval, v)
/* arguments */
-#define JSAPI_ARGV(cx, vp) (vp)
+#define JSAPI_FUNC_ARGV(cx, vp) (vp)
/* check if a jsval is an object */
#define JSAPI_JSVAL_IS_OBJECT(v) JSVAL_IS_OBJECT(v)
@@ -180,21 +186,36 @@ JS_NewCompartmentAndGlobalObject(JSContext *cx,
/* The object instance in a native call */
#define JSAPI_THIS_OBJECT(cx,vp) jsapi_this
+
+
+
/* proprty native calls */
-#define JSAPI_PROPERTYGET(name, cx, obj, vp) \
- jsapi_property_##name##_get(cx, obj, jsval id, vp)
-#define JSAPI_PROPERTYSET(name, cx, obj, vp) \
- jsapi_property_##name##_set(cx, obj, jsval id, vp)
+#define JSAPI_PROP_GETTER(name, cx, obj, vp) \
+ jsapi_property_##name##_get(cx, obj, jsval jsapi_id, vp)
+#define JSAPI_PROP_SETTER(name, cx, obj, vp) \
+ jsapi_property_##name##_set(cx, obj, jsval jsapi_id, vp)
+
+/* native property return value */
+#define JSAPI_PROP_RVAL JS_RVAL
+
+/* native property return value setter */
+#define JSAPI_PROP_SET_RVAL JS_SET_RVAL
+
+/* native property ID value as a jsval */
+#define JSAPI_PROP_IDVAL(cx, vp) (*(vp) = jsapi_id)
/* property specifier */
-#define JSAPI_PS(name, tinyid, flags) \
- { #name , tinyid , flags , jsapi_property_##name##_get , jsapi_property_##name##_set }
+#define JSAPI_PS(name, fnname, tinyid, flags) \
+ { name , tinyid , flags , jsapi_property_##fnname##_get , jsapi_property_##fnname##_set }
-#define JSAPI_PS_RO(name, tinyid, flags) \
- { #name , tinyid , flags | JSPROP_READONLY, jsapi_property_##name##_get , NULL }
+#define JSAPI_PS_RO(name, fnname, tinyid, flags) \
+ { name , tinyid , flags | JSPROP_READONLY, jsapi_property_##fnname##_get , NULL }
#define JSAPI_PS_END { NULL, 0, 0, NULL, NULL }
+
+
+
static inline JSObject *
JS_NewCompartmentAndGlobalObject(JSContext *cx,
JSClass *jsclass,
@@ -248,11 +269,11 @@ JS_NewCompartmentAndGlobalObject(JSContext *cx,
/************************** Spidermonkey 1.8.5 **************************/
/* three parameter jsapi native call */
-#define JSAPI_NATIVE(name, cx, argc, vp) jsapi_native_##name(cx, argc, vp)
+#define JSAPI_FUNC(name, cx, argc, vp) jsapi_func_##name(cx, argc, vp)
/* three parameter function descriptor */
#define JSAPI_FS(name, nargs, flags) \
- JS_FS(#name, jsapi_native_##name, nargs, flags)
+ JS_FS(#name, jsapi_func_##name, nargs, flags)
/* function descriptor end */
#define JSAPI_FS_END JS_FS_END
@@ -261,10 +282,10 @@ JS_NewCompartmentAndGlobalObject(JSContext *cx,
#define JSAPI_RVAL JS_RVAL
/* return value setter */
-#define JSAPI_SET_RVAL JS_SET_RVAL
+#define JSAPI_FUNC_SET_RVAL JS_SET_RVAL
/* arguments */
-#define JSAPI_ARGV(cx, vp) JS_ARGV(cx,vp)
+#define JSAPI_FUNC_ARGV(cx, vp) JS_ARGV(cx,vp)
/* check if a jsval is an object */
#define JSAPI_JSVAL_IS_OBJECT(v) JSVAL_IS_OBJECT(v)
@@ -278,25 +299,34 @@ JS_NewCompartmentAndGlobalObject(JSContext *cx,
#define JSAPI_THIS_OBJECT(cx,vp) JS_THIS_OBJECT(cx,vp)
/* proprty native calls */
-#define JSAPI_PROPERTYGET(name, cx, obj, vp) \
- jsapi_property_##name##_get(cx, obj, jsid id, vp)
-#define JSAPI_PROPERTYSET(name, cx, obj, vp) \
- jsapi_property_##name##_set(cx, obj, jsid id, JSBool strict, vp)
+#define JSAPI_PROP_GETTER(name, cx, obj, vp) \
+ jsapi_property_##name##_get(cx, obj, jsid jsapi_id, vp)
+#define JSAPI_PROP_SETTER(name, cx, obj, vp) \
+ jsapi_property_##name##_set(cx, obj, jsid jsapi_id, JSBool strict, vp)
+
+/* native property return value */
+#define JSAPI_PROP_RVAL JS_RVAL
+
+/* native property getter return value */
+#define JSAPI_PROP_SET_RVAL JS_SET_RVAL
+
+/* native property ID value as a jsval */
+#define JSAPI_PROP_IDVAL(cx, vp) JS_IdToValue(cx, jsapi_id, vp)
/* property specifier */
-#define JSAPI_PS(name, tinyid, flags) { \
- #name , \
- tinyid , \
- flags , \
- jsapi_property_##name##_get , \
- jsapi_property_##name##_set \
+#define JSAPI_PS(name, fnname, tinyid, flags) { \
+ name, \
+ tinyid, \
+ flags, \
+ jsapi_property_##fnname##_get, \
+ jsapi_property_##fnname##_set \
}
-#define JSAPI_PS_RO(name, tinyid, flags) { \
- #name , \
- tinyid , \
+#define JSAPI_PS_RO(name, fnname, tinyid, flags) { \
+ name, \
+ tinyid, \
flags | JSPROP_READONLY, \
- jsapi_property_##name##_get , \
+ jsapi_property_##fnname##_get, \
NULL \
}
diff --git a/javascript/jsapi/binding.h b/javascript/jsapi/binding.h
index 6400217..f274935 100644
--- a/javascript/jsapi/binding.h
+++ b/javascript/jsapi/binding.h
@@ -45,7 +45,8 @@ JSObject *jsapi_InitClass_Location(JSContext *cx, JSObject *parent);
JSObject *jsapi_new_Location(JSContext *cx,
JSObject *window,
JSObject *parent,
- struct browser_window *bw);
+ struct browser_window *bw,
+ nsurl *url);
JSObject *jsapi_InitClass_Document(JSContext *cx, JSObject *parent);
@@ -148,4 +149,11 @@ JSObject *jsapi_new_Node(JSContext *cx,
JSObject *prototype,
JSObject *parent);
+extern JSClass JSClass_Event;
+JSObject *jsapi_InitClass_Event(JSContext *cx, JSObject *parent);
+JSObject *jsapi_new_Event(JSContext *cx,
+ JSObject *prototype,
+ JSObject *parent,
+ dom_event *event);
+
#endif
diff --git a/javascript/jsapi/console.bnd b/javascript/jsapi/console.bnd
index 6aef9dc..7c34845 100644
--- a/javascript/jsapi/console.bnd
+++ b/javascript/jsapi/console.bnd
@@ -30,18 +30,6 @@ binding navigator {
interface Console; /* Web IDL interface to generate */
- /* private members:
- * - stored in private context structure.
- * - passed as parameters to constructor and stored automatically.
- * - are *not* considered for property getters/setters.
- *
- * internal members:
- * - value stored in private context structure
- * - not passed to constructor
- * - must be instantiated by constructor
- * - are considered for property getters/setters.
- */
- internal "void *" gui_console;
}
operation log %{
diff --git a/javascript/jsapi/node.bnd b/javascript/jsapi/event.bnd
similarity index 85%
copy from javascript/jsapi/node.bnd
copy to javascript/jsapi/event.bnd
index bcf0ef7..cc03c92 100644
--- a/javascript/jsapi/node.bnd
+++ b/javascript/jsapi/event.bnd
@@ -1,4 +1,4 @@
-/* Binding to generate Node interface
+/* Binding to generate event interface
*
* Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>
*
@@ -30,5 +30,7 @@ preamble %{
binding node {
type js_libdom; /* the binding type */
- interface Node; /* Web IDL interface to generate */
+ interface Event; /* Web IDL interface to generate */
+
+ private "dom_event *" event;
}
diff --git a/javascript/jsapi/example.bnd b/javascript/jsapi/example.bnd
deleted file mode 100644
index f2f81fb..0000000
--- a/javascript/jsapi/example.bnd
+++ /dev/null
@@ -1,229 +0,0 @@
-/* Example binding to generate Example interface
- *
- * The js_libdom (javascript to libdom) binding type is currently the
- * only one implemented and this principly describes that binding.
- *
- * Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * Released under the terms of the MIT License,
- * http://www.opensource.org/licenses/mit-license
- */
-
-/* additional binding fragments may be included
- * Note: this is not preprocessed despite the #include name, the
- * parser will simply switch input to the included file and carry on
- * cosntructing the bindings Abstract Syntax Tree (AST)
- */
-#include "dom.bnd"
-
-/* directive to read WebIDL file and add its contents to the webidl AST */
-webidlfile "html.idl";
-
-/* The hdrcomment are added into the geenrated output comment header */
-hdrcomment "Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>";
-hdrcomment "This file is part of NetSurf, http://www.netsurf-browser.org/";
-hdrcomment "Released under the terms of the MIT License,";
-hdrcomment " http://www.opensource.org/licenses/mit-license";
-
-/* the preamble block is copied verbatum into the generated output
- *
- * This can be used for includes, comments or whatever else is desired
- */
-preamble %{
-
-#include <dom/dom.h>
-
-#include "utils/config.h"
-#include "utils/log.h"
-
-#include "javascript/jsapi.h"
-#include "javascript/jsapi/binding.h"
-
-%}
-
-/* this block describes the binding to be generated
- *
- * Depending on the type of binding being generated multiple blocks
- * may be allowed.
- *
- * Note: the js_libdom (javascript to libdom) binding as currently
- * implemented only allows for a single binding per file, this may
- * be improved in future.
- */
-binding example {
- type js_libdom; /* the binding type */
-
- interface Navigator; /* The WebIDL interface to generate a binding for */
-
- /* private members:
- * - stored in private context structure.
- * - passed as parameters to constructor and stored automatically.
- * - are *not* considered for property getters/setters.
- */
- private "dom_document *" node;
-
- /* internal members:
- * - value stored in private context structure
- * - not passed to constructor
- * - must be instantiated by constructor
- * - are considered for property getters/setters.
- */
- internal "void *" fluff;
-
-}
-
-/* operation implementation code.
- *
- * The body is copied verbatum into operation binding
- *
- * several values are generated automatically:
- *
- * - The generated operations use a macro to create a JSNative JSAPI
- * callback. The interface allows a uniform interface despite the
- * evolution of the interface over differing spidermonkey versions.
- *
- * - The above implies the javascript context is in a variable called cx
- *
- * - If private or internal binding members are present they may be
- * accessed through a structure named "private"
- *
- * - if there are arguemnts they may be accesed via an argc/argv jsval
- * vector.
- *
- * - Arguments are automatically converted into c variables (named as
- * per the WebIDL names.
- *
- * - Return values (excepting void return types where its omitted) are
- * always named "retval" and are of the appropriate c type. The
- * initial value is set appropriately.
- */
-operation foo %{
- retval = JS_NewStringCopyN(cx, "foo", SLEN("foo"));
-%}
-
-/* property getter implementation code.
- *
- * The body is copied verbatum into property getter binding
- *
- * several values are generated automatically:
- *
- * - The generated operations use a macro to create a JSPropertyOp
- * JSAPI callback. The interface allows a uniform interface despite
- * the evolution of the interface over differing spidermonkey
- * versions.
- *
- * - The above implies the javascript context is available in a
- * variable called "cx".
- *
- * - If private or internal binding members are present they may be
- * accessed through a structure named "private"
- *
- * - Return values (void on a getter is not possible) are always named
- * "retval" and are of the appropriate c type. The initial value is
- * set appropriately.
- *
- * - If the getter is omitted altogether but an internal or private
- * value of the same name appears in the private structure a getter
- * is automatically constructed to return that value.
- */
-getter bar %{
- retval = JS_NewStringCopyN(cx, "bar", SLEN("bar"));
-%}
-
-/* property setter implementation code.
- *
- * The body is copied verbatum into property getter binding
- *
- * several values are generated automatically:
- *
- * - The generated operations use a macro to create a JSPropertyOp
- * JSAPI callback. The interface allows a uniform interface despite
- * the evolution of the interface over differing spidermonkey
- * versions.
- *
- * - The above implies the javascript context is available in a
- * variable called "cx".
- *
- * - If private or internal binding members are present they may be
- * accessed through a structure named "private"
- *
- * - Value to set is placed in a c variable named "setval" of the
- * appropriate type.
- *
- * - Return value, named retval" is a boolean (default true) which
- * indicates if the set was performed.
- *
- * - If the setter is omitted altogether but an internal or private
- * value of the same name appears in the private structure a setter
- * is automatically constructed to assign that value.
- */
-setter baz %{
- printf("%s\n", setval);
-%}
-
-/* implementation of the class initilisation
- *
- * This allows the default JS_InitClass to be overriden - currently
- * only used for the window (global) object to cause all the other class
- * initialisors to be called.
- *
- * function prototype is:
- * JSObject *jsapi_InitClass_HTMLElement(JSContext *cx, JSObject *parent)
- */
-api init %{
- %}
-
-/* implementation of the c instance creation
- *
- * This allows the overriding of the construction of an interface instance.
- *
- * The body is copied verbatum and must return the new object in the
- * "newobject" variable.
- *
- * The base prototype is
- * JSObject *jsapi_new_HTMLElement(JSContext *cx, JSObject *prototype, JSObject *parent, ...)
- * The varadic elements are private variables as specified in the binding
- *
- * If there are private or internal values the private struct is
- * constructed and instantiated. The struct is available during the
- * new function and is automatically attached as the private value to
- * the object.
- *
- * The default implemenattion simply calls JS_NewObject()
- *
- * Note this does *not* rely upon (or even call) the instances
- * javascript constructor allowing the c code to create objects that
- * cannot be instantiated from javascript.
- *
- */
-api new %{
- %}
-
-/* additional code in the instance finalise operation.
- *
- * The body is copied verbatum into the output
- *
- * Prototype is
- * void jsclass_finalize(JSContext *cx, JSObject *obj)
- *
- * private is available (if appropriate) and freed after the body
- */
-api finalise %{
- %}
-
-/* resolver code
- *
- * A resolver is only generated if this api is provided. This is a
- * JSResolveOp with JSCLASS_NEW_RESOLVE specified and must provide a
- * complete implementation.
- *
- * The body is copied verbatum into the output
- *
- * Prototype is:
- * JSBool jsclass_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp)
- *
- */
-api resolve %{
- %}
diff --git a/javascript/jsapi/htmldocument.bnd b/javascript/jsapi/htmldocument.bnd
index 7ca4948..0ed7ac1 100644
--- a/javascript/jsapi/htmldocument.bnd
+++ b/javascript/jsapi/htmldocument.bnd
@@ -1,10 +1,21 @@
-/* Binding to generate htmldocument */
+/* Binding to generate HTMLdocument interface
+ *
+ * Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * Released under the terms of the MIT License,
+ * http://www.opensource.org/licenses/mit-license
+ */
#include "dom.bnd"
webidlfile "html.idl";
-hdrcomment "Part of NetSurf Project";
+hdrcomment "Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>";
+hdrcomment "This file is part of NetSurf, http://www.netsurf-browser.org/";
+hdrcomment "Released under the terms of the MIT License,";
+hdrcomment " http://www.opensource.org/licenses/mit-license";
preamble %{
diff --git a/javascript/jsapi/location.bnd b/javascript/jsapi/location.bnd
index c83fe46..32e38da 100644
--- a/javascript/jsapi/location.bnd
+++ b/javascript/jsapi/location.bnd
@@ -8,8 +8,6 @@
* http://www.opensource.org/licenses/mit-license
*/
-#include "dom.bnd"
-
webidlfile "html.idl";
hdrcomment "Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>";
@@ -30,24 +28,107 @@ preamble %{
%}
binding location {
- type js_libdom; /* the binding type */
-
- interface Location; /* Web IDL interface to generate */
-
- /* private members:
- * - stored in private context structure.
- * - passed as parameters to constructor and stored automatically.
- * - are *not* considered for property getters/setters.
- *
- * internal members:
- * - value stored in private context structure
- * - not passed to constructor
- * - must be instantiated by constructor
- * - are considered for property getters/setters.
- */
+ type js_libdom; /* the binding type */
+
+ interface Location; /* Web IDL interface to generate */
+
private "struct browser_window *" bw;
+ private "nsurl *" url;
+
}
operation reload %{
- browser_window_reload(private->bw, false);
+ browser_window_reload(private->bw, false);
+%}
+
+
+getter href %{
+ char *url_s = NULL;
+ size_t url_l;
+ nsurl_get(private->url, NSURL_COMPLETE, &url_s, &url_l);
+ if (url_s != NULL) {
+ jsret = JS_NewStringCopyN(cx, url_s, url_l);
+ free(url_s);
+ }
+%}
+
+getter protocol %{
+ lwc_string *component;
+ component = nsurl_get_component(private->url, NSURL_SCHEME);
+ if (component != NULL) {
+ jsret = JS_NewStringCopyN(cx,
+ lwc_string_data(component),
+ lwc_string_length(component));
+ lwc_string_unref(component);
+ }
+%}
+
+getter host %{
+ lwc_string *component;
+ component = nsurl_get_component(private->url, NSURL_HOST);
+ if (component != NULL) {
+ jsret = JS_NewStringCopyN(cx,
+ lwc_string_data(component),
+ lwc_string_length(component));
+ lwc_string_unref(component);
+ }
+%}
+
+getter hostname %{
+ lwc_string *component;
+ component = nsurl_get_component(private->url, NSURL_HOST);
+ if (component != NULL) {
+ jsret = JS_NewStringCopyN(cx,
+ lwc_string_data(component),
+ lwc_string_length(component));
+ lwc_string_unref(component);
+ }
+
+%}
+
+getter port %{
+ lwc_string *component;
+ component = nsurl_get_component(private->url, NSURL_PORT);
+ if (component != NULL) {
+ jsret = JS_NewStringCopyN(cx,
+ lwc_string_data(component),
+ lwc_string_length(component));
+ lwc_string_unref(component);
+ }
+
+%}
+
+getter pathname %{
+ lwc_string *component;
+ component = nsurl_get_component(private->url, NSURL_PATH);
+ if (component != NULL) {
+ jsret = JS_NewStringCopyN(cx,
+ lwc_string_data(component),
+ lwc_string_length(component));
+ lwc_string_unref(component);
+ }
+
+%}
+
+getter search %{
+ lwc_string *component;
+ component = nsurl_get_component(private->url, NSURL_QUERY);
+ if (component != NULL) {
+ jsret = JS_NewStringCopyN(cx,
+ lwc_string_data(component),
+ lwc_string_length(component));
+ lwc_string_unref(component);
+ }
+
+%}
+
+getter hash %{
+ lwc_string *component;
+ component = nsurl_get_component(private->url, NSURL_FRAGMENT);
+ if (component != NULL) {
+ jsret = JS_NewStringCopyN(cx,
+ lwc_string_data(component),
+ lwc_string_length(component));
+ lwc_string_unref(component);
+ }
%}
diff --git a/javascript/jsapi/window.bnd b/javascript/jsapi/window.bnd
index 767b94f..610aa71 100644
--- a/javascript/jsapi/window.bnd
+++ b/javascript/jsapi/window.bnd
@@ -1,10 +1,21 @@
-/* binding to generate window */
+/* Binding to generate window interface
+ *
+ * Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * Released under the terms of the MIT License,
+ * http://www.opensource.org/licenses/mit-license
+ */
#include "dom.bnd"
webidlfile "html.idl";
-hdrcomment "Part of NetSurf Project";
+hdrcomment "Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>";
+hdrcomment "This file is part of NetSurf, http://www.netsurf-browser.org/";
+hdrcomment "Released under the terms of the MIT License,";
+hdrcomment " http://www.opensource.org/licenses/mit-license";
preamble %{
@@ -12,10 +23,12 @@ preamble %{
#include "utils/config.h"
#include "utils/log.h"
+#include "utils/corestrings.h"
#include "javascript/jsapi.h"
#include "javascript/jsapi/binding.h"
+
%}
binding window {
@@ -23,19 +36,15 @@ binding window {
interface Window; /* Web IDL interface to generate */
- /* private are parameters to constructor stored in private
- * context structure.
- *
- * internal are value stored in private context structure but not
- * passed to constructor but are considered for property
- * getters/setters.
- */
private "struct browser_window *" bw;
private "struct html_content *" htmlc;
+
internal "JSObject *" document;
internal "JSObject *" navigator;
internal "JSObject *" console;
internal "JSObject *" location;
+
+ property unshared type EventHandler;
}
api mark %{
@@ -140,6 +149,11 @@ api init %{
return NULL;
}
+ user_proto = jsapi_InitClass_Event(cx, prototype);
+ if (user_proto == NULL) {
+ return NULL;
+ }
+
%}
api new %{
@@ -166,7 +180,8 @@ api new %{
return NULL;
}
- private->location = jsapi_new_Location(cx, NULL, newobject, bw);
+ private->location = jsapi_new_Location(cx, NULL, newobject, bw,
+ llcache_handle_get_url(private->htmlc->base.llcache));
if (private->location == NULL) {
free(private);
return NULL;
@@ -202,3 +217,57 @@ getter window %{
getter self %{
jsret = obj;
%}
+
+/* boolean dispatchEvent(Event event); */
+operation dispatchEvent %{
+ /* this implementation is unique to the window object as it is
+ * not a "real" dom node.
+ */
+
+ /* caution, this must match the struct generated from event.bnd */
+ if (event == JSVAL_VOID) {
+ jsret = JS_FALSE;
+ } else {
+ struct {
+ dom_event *event;
+ } *event_private;
+ dom_string *type_dom = NULL;
+ dom_exception exc;
+ jsval eventval = JSVAL_VOID;
+ jsval event_argv[1];
+ jsval event_rval;
+
+ event_private = JS_GetInstancePrivate(cx, event, &JSClass_Event, NULL);
+ if (event_private->event == NULL) {
+ /** @todo type error? */
+ jsret = JS_FALSE;
+ } else {
+ exc = dom_event_get_type(event_private->event, &type_dom);
+ if (exc == DOM_NO_ERR) {
+
+ if (dom_string_isequal(type_dom, corestring_dom_load)) {
+ JS_GetProperty(cx, JSAPI_THIS_OBJECT(cx, vp), "onload", &eventval);
+ }
+
+ if (eventval != JSVAL_VOID) {
+ event_argv[0] = eventval;
+ jsret = JS_CallFunctionValue(cx, NULL, eventval, 1, event_argv, &event_rval);
+ }
+ }
+ }
+ }
+%}
+
+getter EventHandler %{
+ /* this implementation is unique to the window object as it is
+ * not a dom node.
+ */
+ JSLOG("propname[%d] %s %s", tinyid , jsclass_properties[tinyid].name, JS_GetTypeName(cx, JS_TypeOfValue(cx, tinyid_jsval)));
+%}
+
+setter EventHandler %{
+ /* this implementation is unique to the window object as it is
+ * not a dom node.
+ */
+ JSLOG("propname[%d] %s %s", tinyid, jsclass_properties[tinyid].name, JS_GetTypeName(cx, JS_TypeOfValue(cx, tinyid_jsval)));
+%}
diff --git a/javascript/none.c b/javascript/none.c
index b5cfc78..6354a12 100644
--- a/javascript/none.c
+++ b/javascript/none.c
@@ -53,3 +53,8 @@ bool js_exec(jscontext *ctx, const char *txt, size_t txtlen)
{
return true;
}
+
+bool js_fire_event(jscontext *ctx, const char *type, void *target)
+{
+ return true;
+}
diff --git a/render/box.h b/render/box.h
index 6b1d28d..a4622e3 100644
--- a/render/box.h
+++ b/render/box.h
@@ -339,7 +339,7 @@ bool box_hscrollbar_present(const struct box *box);
nserror box_construct_init(void);
void box_construct_fini(void);
-bool xml_to_box(struct dom_node *n, struct html_content *c,
+nserror dom_to_box(struct dom_node *n, struct html_content *c,
box_construct_complete_cb cb);
bool box_normalise_block(struct box *block, struct html_content *c);
diff --git a/render/box_construct.c b/render/box_construct.c
index 26d9b54..6357587 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -157,10 +157,10 @@ static const struct element_entry element_table[] = {
* \param n xml tree
* \param c content of type CONTENT_HTML to construct box tree in
* \param cb callback to report conversion completion
- * \return true on success, false on memory exhaustion
+ * \return netsurf error code indicating status of call
*/
-bool xml_to_box(dom_node *n, html_content *c, box_construct_complete_cb cb)
+nserror dom_to_box(dom_node *n, html_content *c, box_construct_complete_cb cb)
{
struct box_construct_ctx *ctx;
@@ -168,13 +168,14 @@ bool xml_to_box(dom_node *n, html_content *c, box_construct_complete_cb cb)
/* create a context allocation for this box tree */
c->bctx = talloc_zero(0, int);
if (c->bctx == NULL) {
- return false;
+ return NSERROR_NOMEM;
}
}
ctx = malloc(sizeof(*ctx));
- if (ctx == NULL)
- return false;
+ if (ctx == NULL) {
+ return NSERROR_NOMEM;
+ }
ctx->content = c;
ctx->n = dom_node_ref(n);
@@ -184,7 +185,7 @@ bool xml_to_box(dom_node *n, html_content *c, box_construct_complete_cb cb)
schedule(0, (schedule_callback_fn) convert_xml_to_box, ctx);
- return true;
+ return NSERROR_OK;
}
/* mapping from CSS display to box type
diff --git a/render/html.c b/render/html.c
index f6e3fda..fc60843 100644
--- a/render/html.c
+++ b/render/html.c
@@ -78,6 +78,93 @@ static nsurl *html_adblock_stylesheet_url;
static nsurl *html_quirks_stylesheet_url;
static nsurl *html_user_stylesheet_url;
+static nserror css_error_to_nserror(css_error error)
+{
+ switch (error) {
+ case CSS_OK:
+ return NSERROR_OK;
+
+ case CSS_NOMEM:
+ return NSERROR_NOMEM;
+
+ case CSS_BADPARM:
+ return NSERROR_BAD_PARAMETER;
+
+ case CSS_INVALID:
+ return NSERROR_INVALID;
+
+ case CSS_FILENOTFOUND:
+ return NSERROR_NOT_FOUND;
+
+ case CSS_NEEDDATA:
+ return NSERROR_NEED_DATA;
+
+ case CSS_BADCHARSET:
+ return NSERROR_BAD_ENCODING;
+
+ case CSS_EOF:
+ case CSS_IMPORTS_PENDING:
+ case CSS_PROPERTY_NOT_SET:
+ default:
+ break;
+ }
+ return NSERROR_CSS;
+}
+
+static nserror
+dom_hubbub_error_to_nserror(dom_hubbub_error error)
+{
+ switch (error) {
+
+ /* HUBBUB_REPROCESS is not handled here because it can
+ * never occur outside the hubbub treebuilder
+ */
+
+ case DOM_HUBBUB_OK:
+ /* parsed ok */
+ return NSERROR_OK;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_PAUSED):
+ /* hubbub input paused */
+ return NSERROR_OK;
+
+ case DOM_HUBBUB_NOMEM:
+ /* out of memory error from DOM */
+ return NSERROR_NOMEM;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_ENCODINGCHANGE):
+ /* encoding changed */
+ return NSERROR_ENCODING_CHANGE;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_NOMEM):
+ /* out of memory error from parser */
+ return NSERROR_NOMEM;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_BADPARM):
+ return NSERROR_BAD_PARAMETER;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_INVALID):
+ return NSERROR_INVALID;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_FILENOTFOUND):
+ return NSERROR_NOT_FOUND;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_NEEDDATA):
+ return NSERROR_NEED_DATA;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_BADENCODING):
+ return NSERROR_BAD_ENCODING;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_UNKNOWN):
+ /* currently only generated by the libdom hubbub binding */
+ return NSERROR_DOM;
+ default:
+ /* unknown error */
+ /** @todo better error handling and reporting */
+ return NSERROR_UNKNOWN;
+ }
+ return NSERROR_UNKNOWN;
+}
static void html_destroy_objects(html_content *html)
{
@@ -106,7 +193,7 @@ static void html_destroy_objects(html_content *html)
*/
static void html_box_convert_done(html_content *c, bool success)
{
- union content_msg_data msg_data;
+ nserror err;
dom_exception exc; /* returned by libdom functions */
dom_node *html;
@@ -114,17 +201,19 @@ static void html_box_convert_done(html_content *c, bool success)
/* Clean up and report error if unsuccessful or aborted */
if ((success == false) || (c->aborted)) {
+ html_destroy_objects(c);
+
if (success == false) {
- msg_data.errorcode = NSERROR_BOX_CONVERT;
+ content_broadcast_errorcode(&c->base, NSERROR_BOX_CONVERT);
} else {
- msg_data.errorcode = NSERROR_STOPPED;
+ content_broadcast_errorcode(&c->base, NSERROR_STOPPED);
}
- html_destroy_objects(c);
- content_broadcast(&c->base, CONTENT_MSG_ERRORCODE, msg_data);
+
content_set_error(&c->base);
return;
}
+
#if ALWAYS_DUMP_BOX
box_dump(stderr, c->layout->children, 0);
#endif
@@ -139,18 +228,17 @@ static void html_box_convert_done(html_content *c, bool success)
* like the other error paths
*/
LOG(("error retrieving html element from dom"));
- msg_data.errorcode = NSERROR_DOM;
- content_broadcast(&c->base, CONTENT_MSG_ERRORCODE, msg_data);
+ content_broadcast_errorcode(&c->base, NSERROR_DOM);
content_set_error(&c->base);
return;
}
- /* extract image maps - can't do this sensibly in xml_to_box */
- msg_data.errorcode = imagemap_extract(c);
- if (msg_data.errorcode != NSERROR_OK) {
+ /* extract image maps - can't do this sensibly in dom_to_box */
+ err = imagemap_extract(c);
+ if (err != NSERROR_OK) {
LOG(("imagemap extraction failed"));
html_destroy_objects(c);
- content_broadcast(&c->base, CONTENT_MSG_ERRORCODE, msg_data);
+ content_broadcast_errorcode(&c->base, err);
content_set_error(&c->base);
dom_node_unref(html);
return;
@@ -171,6 +259,7 @@ static void html_box_convert_done(html_content *c, bool success)
dom_node_unref(html);
}
+
/**
* Complete conversion of an HTML document
*
@@ -182,29 +271,28 @@ void html_finish_conversion(html_content *c)
dom_exception exc; /* returned by libdom functions */
dom_node *html;
uint32_t i;
- css_error error;
+ css_error css_ret;
+ nserror error;
/* Bail out if we've been aborted */
if (c->aborted) {
- msg_data.error = messages_get("Stopped");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&c->base, NSERROR_STOPPED);
content_set_error(&c->base);
return;
}
/* check that the base stylesheet loaded; layout fails without it */
if (c->stylesheets[STYLESHEET_BASE].data.external == NULL) {
- msg_data.error = "Base stylesheet failed to load";
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&c->base, NSERROR_CSS_BASE);
content_set_error(&c->base);
return;
}
/* Create selection context */
- error = css_select_ctx_create(ns_realloc, c, &c->select_ctx);
- if (error != CSS_OK) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
+ css_ret = css_select_ctx_create(ns_realloc, c, &c->select_ctx);
+ if (css_ret != CSS_OK) {
+ content_broadcast_errorcode(&c->base,
+ css_error_to_nserror(css_ret));
content_set_error(&c->base);
return;
}
@@ -230,21 +318,27 @@ void html_finish_conversion(html_content *c)
}
if (sheet != NULL) {
- error = css_select_ctx_append_sheet(
- c->select_ctx, sheet,
- origin, CSS_MEDIA_SCREEN);
- if (error != CSS_OK) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR,
- msg_data);
+ css_ret = css_select_ctx_append_sheet(c->select_ctx,
+ sheet,
+ origin,
+ CSS_MEDIA_SCREEN);
+ if (css_ret != CSS_OK) {
+ content_broadcast_errorcode(&c->base,
+ css_error_to_nserror(css_ret));
content_set_error(&c->base);
return;
}
}
}
- /* convert xml tree to box tree */
- LOG(("XML to box (%p)", c));
+ /* fire a simple event named load at the Document's Window
+ * object, but with its target set to the Document object (and
+ * the currentTarget set to the Window object)
+ */
+ js_fire_event(c->jscontext, "load", NULL);
+
+ /* convert dom tree to box tree */
+ LOG(("DOM to box (%p)", c));
content_set_status(&c->base, messages_get("Processing"));
msg_data.explicit_status_text = NULL;
content_broadcast(&c->base, CONTENT_MSG_STATUS, msg_data);
@@ -252,17 +346,16 @@ void html_finish_conversion(html_content *c)
exc = dom_document_get_document_element(c->document, (void *) &html);
if ((exc != DOM_NO_ERR) || (html == NULL)) {
LOG(("error retrieving html element from dom"));
- msg_data.error = messages_get("ParsingFail");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&c->base, NSERROR_DOM);
content_set_error(&c->base);
return;
}
- if (xml_to_box(html, c, html_box_convert_done) == false) {
+ error = dom_to_box(html, c, html_box_convert_done);
+ if (error != NSERROR_OK) {
dom_node_unref(html);
html_destroy_objects(c);
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&c->base, error);
content_set_error(&c->base);
return;
}
@@ -276,7 +369,6 @@ static nserror
html_create_html_data(html_content *c, const http_parameter *params)
{
lwc_string *charset;
- union content_msg_data msg_data;
nserror nerror;
c->parser = NULL;
@@ -310,9 +402,6 @@ html_create_html_data(html_content *c, const http_parameter *params)
c->base.active = 1; /* The html content itself is active */
if (lwc_intern_string("*", SLEN("*"), &c->universal) != lwc_error_ok) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
-
return NSERROR_NOMEM;
}
@@ -327,10 +416,6 @@ html_create_html_data(html_content *c, const http_parameter *params)
if (c->encoding == NULL) {
lwc_string_unref(c->universal);
c->universal = NULL;
-
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
-
return NSERROR_NOMEM;
}
@@ -367,9 +452,6 @@ html_create_html_data(html_content *c, const http_parameter *params)
lwc_string_unref(c->universal);
c->universal = NULL;
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
-
return NSERROR_NOMEM;
}
@@ -409,6 +491,7 @@ html_create(const content_handler *handler,
error = html_create_html_data(html, params);
if (error != NSERROR_OK) {
+ content_broadcast_errorcode(&html->base, error);
free(html);
return error;
}
@@ -418,60 +501,6 @@ html_create(const content_handler *handler,
return NSERROR_OK;
}
-static nserror
-parse_chunk_to_nserror(dom_hubbub_error error)
-{
- switch (error) {
-
- /* HUBBUB_REPROCESS is not handled here because it can
- * never occur outside the hubbub treebuilder
- */
-
- case DOM_HUBBUB_OK:
- /* parsed ok */
- return NSERROR_OK;
-
- case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_PAUSED):
- /* hubbub input paused */
- return NSERROR_OK;
-
- case DOM_HUBBUB_NOMEM:
- /* out of memory error from DOM */
- return NSERROR_NOMEM;
-
- case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_ENCODINGCHANGE):
- /* encoding changed */
- return NSERROR_ENCODING_CHANGE;
-
- case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_NOMEM):
- /* out of memory error from parser */
- return NSERROR_NOMEM;
-
- case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_BADPARM):
- return NSERROR_BAD_PARAMETER;
-
- case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_INVALID):
- return NSERROR_INVALID;
-
- case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_FILENOTFOUND):
- return NSERROR_NOT_FOUND;
-
- case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_NEEDDATA):
- return NSERROR_NEED_DATA;
-
- case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_BADENCODING):
- return NSERROR_BAD_ENCODING;
-
- case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_UNKNOWN):
- /* currently only generated by the libdom hubbub binding */
- return NSERROR_DOM;
- default:
- /* unknown error */
- /** @todo better error handling and reporting */
- return NSERROR_UNKNOWN;
- }
- return NSERROR_UNKNOWN;
-}
static nserror
@@ -554,7 +583,7 @@ html_process_encoding_change(struct content *c,
(const uint8_t *)source_data,
source_size);
- return parse_chunk_to_nserror(error);
+ return dom_hubbub_error_to_nserror(error);
}
@@ -566,26 +595,23 @@ static bool
html_process_data(struct content *c, const char *data, unsigned int size)
{
html_content *html = (html_content *) c;
- dom_hubbub_error error;
- union content_msg_data msg_data;
+ dom_hubbub_error dom_ret;
+ nserror err = NSERROR_OK; /* assume its all going to be ok */
- msg_data.errorcode = NSERROR_OK; /* assume its all going to be ok */
-
- error = dom_hubbub_parser_parse_chunk(html->parser,
+ dom_ret = dom_hubbub_parser_parse_chunk(html->parser,
(const uint8_t *) data,
size);
-
- msg_data.errorcode = parse_chunk_to_nserror(error);
+ err = dom_hubbub_error_to_nserror(dom_ret);
/* deal with encoding change */
- if (msg_data.errorcode == NSERROR_ENCODING_CHANGE) {
- msg_data.errorcode = html_process_encoding_change(c, data, size);
+ if (err == NSERROR_ENCODING_CHANGE) {
+ err = html_process_encoding_change(c, data, size);
}
/* broadcast the error if necessary */
- if (msg_data.errorcode != NSERROR_OK) {
- content_broadcast(c, CONTENT_MSG_ERRORCODE, msg_data);
+ if (err != NSERROR_OK) {
+ content_broadcast_errorcode(c, err);
return false;
}
@@ -776,7 +802,7 @@ static bool html_process_base(html_content *c, dom_node *node)
* The title and base href are extracted if present.
*/
-static bool html_head(html_content *c, dom_node *head)
+static nserror html_head(html_content *c, dom_node *head)
{
dom_node *node;
dom_exception exc; /* returned by libdom functions */
@@ -786,7 +812,7 @@ static bool html_head(html_content *c, dom_node *head)
exc = dom_node_get_first_child(head, &node);
if (exc != DOM_NO_ERR) {
- return false;
+ return NSERROR_DOM;
}
while (node != NULL) {
@@ -810,8 +836,9 @@ static bool html_head(html_content *c, dom_node *head)
html_process_link(c, node);
}
}
- if (node_name != NULL)
+ if (node_name != NULL) {
dom_string_unref(node_name);
+ }
}
/* move to next node */
@@ -824,10 +851,10 @@ static bool html_head(html_content *c, dom_node *head)
}
}
- return true;
+ return NSERROR_OK;
}
-static bool html_meta_refresh_process_element(html_content *c, dom_node *n)
+static nserror html_meta_refresh_process_element(html_content *c, dom_node *n)
{
union content_msg_data msg_data;
const char *url, *end, *refresh = NULL;
@@ -836,28 +863,32 @@ static bool html_meta_refresh_process_element(html_content *c, dom_node *n)
dom_string *equiv, *content;
dom_exception exc;
nsurl *nsurl;
- nserror error;
+ nserror error = NSERROR_OK;
exc = dom_element_get_attribute(n, corestring_dom_http_equiv, &equiv);
- if (exc != DOM_NO_ERR)
- return false;
+ if (exc != DOM_NO_ERR) {
+ return NSERROR_DOM;
+ }
- if (equiv == NULL)
- return true;
+ if (equiv == NULL) {
+ return NSERROR_OK;
+ }
if (!dom_string_caseless_lwc_isequal(equiv, corestring_lwc_refresh)) {
dom_string_unref(equiv);
- return true;
+ return NSERROR_OK;
}
dom_string_unref(equiv);
exc = dom_element_get_attribute(n, corestring_dom_content, &content);
- if (exc != DOM_NO_ERR)
- return false;
+ if (exc != DOM_NO_ERR) {
+ return NSERROR_DOM;
+ }
- if (content == NULL)
- return true;
+ if (content == NULL) {
+ return NSERROR_OK;
+ }
end = dom_string_data(content) + dom_string_byte_length(content);
@@ -883,15 +914,16 @@ static bool html_meta_refresh_process_element(html_content *c, dom_node *n)
if (url == end || (*url < '0' || '9' < *url)) {
/* Empty content, or invalid timeval */
dom_string_unref(content);
- return true;
+ return NSERROR_OK;
}
msg_data.delay = (int) strtol(url, &new_url, 10);
/* a very small delay and self-referencing URL can cause a loop
* that grinds machines to a halt. To prevent this we set a
* minimum refresh delay of 1s. */
- if (msg_data.delay < 1)
+ if (msg_data.delay < 1) {
msg_data.delay = 1;
+ }
url = new_url;
@@ -922,9 +954,9 @@ static bool html_meta_refresh_process_element(html_content *c, dom_node *n)
c->base.refresh = nsurl_ref(
content_get_url(&c->base));
- content_broadcast(&c->base, CONTENT_MSG_REFRESH,
- msg_data);
- return true;
+ content_broadcast(&c->base, CONTENT_MSG_REFRESH, msg_data);
+
+ return NSERROR_OK;
}
/* "url" */
@@ -934,12 +966,12 @@ static bool html_meta_refresh_process_element(html_content *c, dom_node *n)
} else {
/* Unexpected input, ignore this header */
dom_string_unref(content);
- return true;
+ return NSERROR_OK;
}
} else {
/* Insufficient input, ignore this header */
dom_string_unref(content);
- return true;
+ return NSERROR_OK;
}
/* *LWS */
@@ -954,12 +986,12 @@ static bool html_meta_refresh_process_element(html_content *c, dom_node *n)
} else {
/* Unexpected input, ignore this header */
dom_string_unref(content);
- return true;
+ return NSERROR_OK;
}
} else {
/* Insufficient input, ignore this header */
dom_string_unref(content);
- return true;
+ return NSERROR_OK;
}
/* *LWS */
@@ -992,32 +1024,25 @@ static bool html_meta_refresh_process_element(html_content *c, dom_node *n)
new_url = strndup(refresh, url - refresh);
if (new_url == NULL) {
dom_string_unref(content);
- return false;
+ return NSERROR_NOMEM;
}
error = nsurl_join(c->base_url, new_url, &nsurl);
- if (error != NSERROR_OK) {
- free(new_url);
-
- dom_string_unref(content);
+ if (error == NSERROR_OK) {
+ /* broadcast valid refresh url */
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR,
- msg_data);
+ c->base.refresh = nsurl;
- return false;
+ content_broadcast(&c->base, CONTENT_MSG_REFRESH, msg_data);
}
free(new_url);
- c->base.refresh = nsurl;
-
- content_broadcast(&c->base, CONTENT_MSG_REFRESH, msg_data);
}
dom_string_unref(content);
- return true;
+ return error;
}
/**
@@ -1030,17 +1055,20 @@ static bool html_meta_refresh_process_element(html_content *c, dom_node *n)
* \return true on success, false otherwise (error reported)
*/
-static bool html_meta_refresh(html_content *c, dom_node *head)
+static nserror html_meta_refresh(html_content *c, dom_node *head)
{
dom_node *n, *next;
dom_exception exc;
+ nserror ns_error = NSERROR_OK;
- if (head == NULL)
- return true;
+ if (head == NULL) {
+ return ns_error;
+ }
exc = dom_node_get_first_child(head, &n);
- if (exc != DOM_NO_ERR)
- return false;
+ if (exc != DOM_NO_ERR) {
+ return NSERROR_DOM;
+ }
while (n != NULL) {
dom_node_type type;
@@ -1048,7 +1076,7 @@ static bool html_meta_refresh(html_content *c, dom_node *head)
exc = dom_node_get_node_type(n, &type);
if (exc != DOM_NO_ERR) {
dom_node_unref(n);
- return false;
+ return NSERROR_DOM;
}
if (type == DOM_ELEMENT_NODE) {
@@ -1057,36 +1085,35 @@ static bool html_meta_refresh(html_content *c, dom_node *head)
exc = dom_node_get_node_name(n, &name);
if (exc != DOM_NO_ERR) {
dom_node_unref(n);
- return false;
+ return NSERROR_DOM;
}
/* Recurse into noscript elements */
- if (dom_string_caseless_lwc_isequal(name,
- corestring_lwc_noscript)) {
- if (html_meta_refresh(c, n) == false) {
+ if (dom_string_caseless_lwc_isequal(name, corestring_lwc_noscript)) {
+ ns_error = html_meta_refresh(c, n);
+ if (ns_error != NSERROR_OK) {
/* Some error occurred */
dom_string_unref(name);
dom_node_unref(n);
- return false;
- } else if (c->base.refresh) {
+ return ns_error;
+ } else if (c->base.refresh != NULL) {
/* Meta refresh found - stop */
dom_string_unref(name);
dom_node_unref(n);
- return true;
+ return NSERROR_OK;
}
- } else if (dom_string_caseless_lwc_isequal(name,
- corestring_lwc_meta)) {
- if (html_meta_refresh_process_element(c,
- n) == false) {
+ } else if (dom_string_caseless_lwc_isequal(name, corestring_lwc_meta)) {
+ ns_error = html_meta_refresh_process_element(c, n);
+ if (ns_error != NSERROR_OK) {
/* Some error occurred */
dom_string_unref(name);
dom_node_unref(n);
- return false;
+ return ns_error;
} else if (c->base.refresh != NULL) {
/* Meta refresh found - stop */
dom_string_unref(name);
dom_node_unref(n);
- return true;
+ return NSERROR_OK;
}
}
dom_string_unref(name);
@@ -1095,14 +1122,14 @@ static bool html_meta_refresh(html_content *c, dom_node *head)
exc = dom_node_get_next_sibling(n, &next);
if (exc != DOM_NO_ERR) {
dom_node_unref(n);
- return false;
+ return NSERROR_DOM;
}
dom_node_unref(n);
n = next;
}
- return true;
+ return ns_error;
}
/**
@@ -1556,7 +1583,6 @@ html_process_style_element(html_content *c,
dom_node *child, *next;
dom_string *val;
dom_exception exc;
- union content_msg_data msg_data;
struct html_stylesheet *stylesheets;
struct content_css_data *sheet;
nserror error;
@@ -1609,7 +1635,8 @@ html_process_style_element(html_content *c,
if (error != NSERROR_OK) {
free(sheet);
c->stylesheet_count--;
- goto no_memory;
+ content_broadcast_errorcode(&c->base, error);
+ return false;
}
/* can't just use xmlNodeGetContent(style), because that won't
@@ -1680,8 +1707,7 @@ html_process_style_element(html_content *c,
return true;
no_memory:
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&c->base, NSERROR_NOMEM);
return false;
}
@@ -1701,7 +1727,6 @@ html_process_stylesheet(dom_node *node, dom_string *name, void *vctx)
dom_string *rel, *type_attr, *media, *href;
struct html_stylesheet *stylesheets;
nsurl *joined;
- union content_msg_data msg_data;
dom_exception exc;
nserror ns_error;
hlcache_child_context child;
@@ -1779,6 +1804,7 @@ html_process_stylesheet(dom_node *node, dom_string *name, void *vctx)
sizeof(struct html_stylesheet) * (ctx->count + 1));
if (stylesheets == NULL) {
nsurl_unref(joined);
+ ns_error = NSERROR_NOMEM;
goto no_memory;
}
@@ -1812,10 +1838,8 @@ html_process_stylesheet(dom_node *node, dom_string *name, void *vctx)
return true;
no_memory:
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&ctx->c->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&ctx->c->base, ns_error);
return false;
-
}
@@ -1831,7 +1855,6 @@ no_memory:
static bool html_find_stylesheets(html_content *c, dom_node *html)
{
- union content_msg_data msg_data;
nserror ns_error;
bool result;
struct find_stylesheet_ctx ctx;
@@ -1847,6 +1870,7 @@ static bool html_find_stylesheets(html_content *c, dom_node *html)
* stylesheet 3 is the user stylesheet */
c->stylesheets = calloc(STYLESHEET_START, sizeof(struct html_stylesheet));
if (c->stylesheets == NULL) {
+ ns_error = NSERROR_NOMEM;
goto html_find_stylesheets_no_memory;
}
@@ -1911,7 +1935,6 @@ static bool html_find_stylesheets(html_content *c, dom_node *html)
c->base.active++;
LOG(("%d fetches active", c->base.active));
-
result = libdom_treewalk(html, html_process_stylesheet, &ctx);
assert(c->stylesheet_count == ctx.count);
@@ -1919,8 +1942,7 @@ static bool html_find_stylesheets(html_content *c, dom_node *html)
return result;
html_find_stylesheets_no_memory:
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&c->base, ns_error);
return false;
}
@@ -1945,7 +1967,6 @@ static bool html_convert(struct content *c)
htmlc->base.active--; /* the html fetch is no longer active */
LOG(("%d fetches active", htmlc->base.active));
-
/* if there are no active fetches in progress no scripts are
* being fetched or they completed already.
*/
@@ -1953,14 +1974,13 @@ static bool html_convert(struct content *c)
return html_begin_conversion(htmlc);
}
return true;
-
}
bool
html_begin_conversion(html_content *htmlc)
{
dom_node *html, *head;
- union content_msg_data msg_data;
+ nserror ns_error;
struct form *f;
dom_exception exc; /* returned by libdom functions */
dom_string *node_name = NULL;
@@ -1969,19 +1989,28 @@ html_begin_conversion(html_content *htmlc)
/* complete parsing */
error = dom_hubbub_parser_completed(htmlc->parser);
if (error != DOM_HUBBUB_OK) {
- union content_msg_data msg_data;
-
- /** @todo Improve processing of errors */
LOG(("Parsing failed"));
- msg_data.error = messages_get("ParsingFail");
- content_broadcast(&htmlc->base, CONTENT_MSG_ERROR, msg_data);
+
+ content_broadcast_errorcode(&htmlc->base,
+ dom_hubbub_error_to_nserror(error));
return false;
}
+ /* Give up processing if we've been aborted */
+ if (htmlc->aborted) {
+ content_broadcast_errorcode(&htmlc->base, NSERROR_STOPPED);
+ return false;
+ }
+
+
/* complete script execution */
html_scripts_exec(htmlc);
+ /* fire a simple event that bubbles named DOMContentLoaded at
+ * the Document.
+ */
+
/* quirks mode */
exc = dom_document_get_quirks_mode(htmlc->document, &htmlc->quirks);
if (exc != DOM_NO_ERR) {
@@ -1997,32 +2026,24 @@ html_begin_conversion(html_content *htmlc)
encoding = dom_hubbub_parser_get_encoding(htmlc->parser,
&htmlc->encoding_source);
if (encoding == NULL) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&htmlc->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&htmlc->base,
+ NSERROR_NOMEM);
return false;
}
htmlc->encoding = strdup(encoding);
if (htmlc->encoding == NULL) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&htmlc->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&htmlc->base,
+ NSERROR_NOMEM);
return false;
}
}
- /* Give up processing if we've been aborted */
- if (htmlc->aborted) {
- msg_data.error = messages_get("Stopped");
- content_broadcast(&htmlc->base, CONTENT_MSG_ERROR, msg_data);
- return false;
- }
-
/* locate root element and ensure it is html */
exc = dom_document_get_document_element(htmlc->document, (void *) &html);
if ((exc != DOM_NO_ERR) || (html == NULL)) {
LOG(("error retrieving html element from dom"));
- msg_data.error = messages_get("ParsingFail");
- content_broadcast(&htmlc->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&htmlc->base, NSERROR_DOM);
return false;
}
@@ -2032,8 +2053,7 @@ html_begin_conversion(html_content *htmlc)
(!dom_string_caseless_lwc_isequal(node_name,
corestring_lwc_html))) {
LOG(("root element not html"));
- msg_data.error = messages_get("ParsingFail");
- content_broadcast(&htmlc->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&htmlc->base, NSERROR_DOM);
dom_node_unref(html);
return false;
}
@@ -2041,16 +2061,20 @@ html_begin_conversion(html_content *htmlc)
head = libdom_find_first_element(html, corestring_lwc_head);
if (head != NULL) {
- if (html_head(htmlc, head) == false) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&htmlc->base, CONTENT_MSG_ERROR, msg_data);
+ ns_error = html_head(htmlc, head);
+ if (ns_error != NSERROR_OK) {
+ content_broadcast_errorcode(&htmlc->base, ns_error);
+
dom_node_unref(html);
dom_node_unref(head);
return false;
}
/* handle meta refresh */
- if (html_meta_refresh(htmlc, head) == false) {
+ ns_error = html_meta_refresh(htmlc, head);
+ if (ns_error != NSERROR_OK) {
+ content_broadcast_errorcode(&htmlc->base, ns_error);
+
dom_node_unref(html);
dom_node_unref(head);
return false;
@@ -2062,21 +2086,23 @@ html_begin_conversion(html_content *htmlc)
(dom_html_document *) htmlc->document);
for (f = htmlc->forms; f != NULL; f = f->prev) {
nsurl *action;
- nserror res;
/* Make all actions absolute */
if (f->action == NULL || f->action[0] == '\0') {
/* HTML5 4.10.22.3 step 9 */
nsurl *doc_addr = content_get_url(&htmlc->base);
- res = nsurl_join(htmlc->base_url,
- nsurl_access(doc_addr), &action);
+ ns_error = nsurl_join(htmlc->base_url,
+ nsurl_access(doc_addr),
+ &action);
} else {
- res = nsurl_join(htmlc->base_url, f->action, &action);
+ ns_error = nsurl_join(htmlc->base_url,
+ f->action,
+ &action);
}
- if (res != NSERROR_OK) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&htmlc->base, CONTENT_MSG_ERROR, msg_data);
+ if (ns_error != NSERROR_OK) {
+ content_broadcast_errorcode(&htmlc->base, ns_error);
+
dom_node_unref(html);
dom_node_unref(head);
return false;
@@ -2086,8 +2112,9 @@ html_begin_conversion(html_content *htmlc)
f->action = strdup(nsurl_access(action));
nsurl_unref(action);
if (f->action == NULL) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&htmlc->base, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast_errorcode(&htmlc->base,
+ NSERROR_NOMEM);
+
dom_node_unref(html);
dom_node_unref(head);
return false;
@@ -2097,10 +2124,8 @@ html_begin_conversion(html_content *htmlc)
if (f->document_charset == NULL) {
f->document_charset = strdup(htmlc->encoding);
if (f->document_charset == NULL) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&htmlc->base,
- CONTENT_MSG_ERROR,
- msg_data);
+ content_broadcast_errorcode(&htmlc->base,
+ NSERROR_NOMEM);
dom_node_unref(html);
dom_node_unref(head);
return false;
@@ -2622,9 +2647,12 @@ html_get_contextual_content(struct content *c,
if (box->usemap) {
const char *target = NULL;
- data->link_url = nsurl_access(imagemap_get(html,
- box->usemap, box_x, box_y, x, y,
- &target));
+ nsurl *url = imagemap_get(html, box->usemap, box_x,
+ box_y, x, y, &target);
+ /* Box might have imagemap, but no actual link area
+ * at point */
+ if (url != NULL)
+ data->link_url = nsurl_access(url);
}
if (box->gadget) {
switch (box->gadget->type) {
diff --git a/resources/FatMessages b/resources/FatMessages
index d54acad..45b3086 100644
--- a/resources/FatMessages
+++ b/resources/FatMessages
@@ -2787,6 +2787,8 @@ de.all.ParsingFail:Dokumentparsing ist fehlgeschlagen.
fr.all.ParsingFail:L'analyse syntaxique du document a échoué.
it.all.ParsingFail:Analisi del documento fallita.
nl.all.ParsingFail:fout bij ontleden van dit document.
+en.all.CSSGeneric:Error processing CSS
+en.all.CSSBase:Base stylesheet failed to load
en.all.BadGIF:Reading GIF failed.
de.all.BadGIF:Lesen einer GIF Datei fehlgeschlagen.
fr.all.BadGIF:Erreur de lecture de GIF.
diff --git a/test/js/event-onload.html b/test/js/event-onload.html
new file mode 100644
index 0000000..aede985
--- /dev/null
+++ b/test/js/event-onload.html
@@ -0,0 +1,29 @@
+<html>
+<head>
+<title>createTextNode onload example</title>
+
+<script type="text/javascript">
+
+function addTextNode()
+{
+var newtext = document.createTextNode(" Some text added dynamically. ");
+var para = document.getElementById("p1");
+para.appendChild(newtext);
+}
+
+</script>
+</head>
+
+<body>
+<div style="border: 1px solid red">
+<p id="p1">First line of paragraph.<br /></p>
+</div><br />
+
+<button onclick="addTextNode();">add another textNode.</button>
+
+<script>
+window.onload = addTextNode;
+</script>
+
+</body>
+</html>
diff --git a/test/js/index.html b/test/js/index.html
index 7500870..7a17c95 100644
--- a/test/js/index.html
+++ b/test/js/index.html
@@ -8,6 +8,7 @@
<h2>Window</h2>
<ul>
<li><a href="window.lately.html">location</a></li>
+<li><a href="window-enumerate.html">enumerate</a></li>
</ul>
<h2>Document write</h2>
diff --git a/test/js/dom-document-enumerate.html b/test/js/location-enumerate.html
similarity index 79%
copy from test/js/dom-document-enumerate.html
copy to test/js/location-enumerate.html
index 18146ab..d455c75 100644
--- a/test/js/dom-document-enumerate.html
+++ b/test/js/location-enumerate.html
@@ -1,10 +1,10 @@
<html>
<head>
-<title>document interface enumeration</title>
+<title>location interface enumeration</title>
<link rel="stylesheet" type="text/css" href="tst.css">
</head>
<body>
-<h1>Document interface enumeration</h1>
+<h1>location interface enumeration</h1>
<script>
function output(x,y) {
@@ -18,8 +18,8 @@ function output(x,y) {
document.body.appendChild(document.createElement('br'));
}
-for(var key in document) {
- output(key, document[key]);
+for(var key in location) {
+ output(key, location[key]);
}
</script>
</body>
diff --git a/test/js/dom-document-enumerate.html b/test/js/window-enumerate.html
similarity index 79%
copy from test/js/dom-document-enumerate.html
copy to test/js/window-enumerate.html
index 18146ab..92a3111 100644
--- a/test/js/dom-document-enumerate.html
+++ b/test/js/window-enumerate.html
@@ -1,10 +1,10 @@
<html>
<head>
-<title>document interface enumeration</title>
+<title>window interface enumeration</title>
<link rel="stylesheet" type="text/css" href="tst.css">
</head>
<body>
-<h1>Document interface enumeration</h1>
+<h1>window interface enumeration</h1>
<script>
function output(x,y) {
@@ -18,8 +18,8 @@ function output(x,y) {
document.body.appendChild(document.createElement('br'));
}
-for(var key in document) {
- output(key, document[key]);
+for(var key in window) {
+ output(key, window[key]);
}
</script>
</body>
diff --git a/utils/config.h b/utils/config.h
index bd2e303..1c1eef6 100644
--- a/utils/config.h
+++ b/utils/config.h
@@ -24,14 +24,14 @@
/* Try to detect which features the target OS supports */
-#if (defined(_GNU_SOURCE) && !defined(__APPLE__))
+#if (defined(_GNU_SOURCE) && !defined(__APPLE__) || defined(__HAIKU__))
#define HAVE_STRNDUP
#else
#undef HAVE_STRNDUP
char *strndup(const char *s, size_t n);
#endif
-#if (defined(_GNU_SOURCE) || defined(__APPLE__))
+#if (defined(_GNU_SOURCE) || defined(__APPLE__) || defined(__HAIKU__))
#define HAVE_STRCASESTR
#else
#undef HAVE_STRCASESTR
diff --git a/utils/corestrings.c b/utils/corestrings.c
index 7697786..ee50757 100644
--- a/utils/corestrings.c
+++ b/utils/corestrings.c
@@ -115,45 +115,113 @@ lwc_string *corestring_lwc__top;
/* dom_string strings */
dom_string *corestring_dom_a;
+dom_string *corestring_dom_abort;
+dom_string *corestring_dom_afterprint;
dom_string *corestring_dom_align;
dom_string *corestring_dom_area;
dom_string *corestring_dom_async;
dom_string *corestring_dom_background;
+dom_string *corestring_dom_beforeprint;
+dom_string *corestring_dom_beforeunload;
dom_string *corestring_dom_bgcolor;
+dom_string *corestring_dom_blur;
dom_string *corestring_dom_border;
dom_string *corestring_dom_bordercolor;
+dom_string *corestring_dom_cancel;
+dom_string *corestring_dom_canplay;
+dom_string *corestring_dom_canplaythrough;
dom_string *corestring_dom_cellpadding;
dom_string *corestring_dom_cellspacing;
+dom_string *corestring_dom_change;
+dom_string *corestring_dom_click;
+dom_string *corestring_dom_close;
dom_string *corestring_dom_color;
dom_string *corestring_dom_cols;
dom_string *corestring_dom_content;
+dom_string *corestring_dom_contextmenu;
dom_string *corestring_dom_coords;
+dom_string *corestring_dom_cuechange;
+dom_string *corestring_dom_dblclick;
dom_string *corestring_dom_defer;
+dom_string *corestring_dom_drag;
+dom_string *corestring_dom_dragend;
+dom_string *corestring_dom_dragenter;
+dom_string *corestring_dom_dragleave;
+dom_string *corestring_dom_dragover;
+dom_string *corestring_dom_dragstart;
+dom_string *corestring_dom_drop;
+dom_string *corestring_dom_durationchange;
+dom_string *corestring_dom_emptied;
+dom_string *corestring_dom_ended;
+dom_string *corestring_dom_error;
+dom_string *corestring_dom_focus;
+dom_string *corestring_dom_hashchange;
dom_string *corestring_dom_height;
dom_string *corestring_dom_href;
dom_string *corestring_dom_hreflang;
dom_string *corestring_dom_hspace;
dom_string *corestring_dom_http_equiv;
dom_string *corestring_dom_id;
+dom_string *corestring_dom_input;
+dom_string *corestring_dom_invalid;
+dom_string *corestring_dom_keydown;
+dom_string *corestring_dom_keypress;
+dom_string *corestring_dom_keyup;
dom_string *corestring_dom_link;
+dom_string *corestring_dom_load;
+dom_string *corestring_dom_loadeddata;
+dom_string *corestring_dom_loadedmetadata;
+dom_string *corestring_dom_loadstart;
dom_string *corestring_dom_map;
dom_string *corestring_dom_media;
+dom_string *corestring_dom_message;
+dom_string *corestring_dom_mousedown;
+dom_string *corestring_dom_mousemove;
+dom_string *corestring_dom_mouseout;
+dom_string *corestring_dom_mouseover;
+dom_string *corestring_dom_mouseup;
+dom_string *corestring_dom_mousewheel;
dom_string *corestring_dom_name;
dom_string *corestring_dom_nohref;
+dom_string *corestring_dom_offline;
+dom_string *corestring_dom_online;
+dom_string *corestring_dom_pagehide;
+dom_string *corestring_dom_pageshow;
+dom_string *corestring_dom_pause;
+dom_string *corestring_dom_play;
+dom_string *corestring_dom_playing;
+dom_string *corestring_dom_popstate;
+dom_string *corestring_dom_progress;
+dom_string *corestring_dom_ratechange;
dom_string *corestring_dom_rect;
dom_string *corestring_dom_rel;
+dom_string *corestring_dom_reset;
+dom_string *corestring_dom_resize;
dom_string *corestring_dom_rows;
+dom_string *corestring_dom_scroll;
+dom_string *corestring_dom_seeked;
+dom_string *corestring_dom_seeking;
+dom_string *corestring_dom_select;
+dom_string *corestring_dom_shape;
+dom_string *corestring_dom_show;
dom_string *corestring_dom_size;
dom_string *corestring_dom_sizes;
-dom_string *corestring_dom_shape;
dom_string *corestring_dom_src;
+dom_string *corestring_dom_stalled;
+dom_string *corestring_dom_storage;
+dom_string *corestring_dom_submit;
+dom_string *corestring_dom_suspend;
dom_string *corestring_dom_target;
dom_string *corestring_dom_text;
dom_string *corestring_dom_text_javascript;
+dom_string *corestring_dom_timeupdate;
dom_string *corestring_dom_type;
+dom_string *corestring_dom_unload;
dom_string *corestring_dom_valign;
dom_string *corestring_dom_vlink;
+dom_string *corestring_dom_volumechange;
dom_string *corestring_dom_vspace;
+dom_string *corestring_dom_waiting;
dom_string *corestring_dom_width;
@@ -268,45 +336,113 @@ void corestrings_fini(void)
} while (0)
CSS_DOM_STRING_UNREF(a);
+ CSS_DOM_STRING_UNREF(abort);
+ CSS_DOM_STRING_UNREF(afterprint);
CSS_DOM_STRING_UNREF(align);
CSS_DOM_STRING_UNREF(area);
CSS_DOM_STRING_UNREF(async);
CSS_DOM_STRING_UNREF(background);
+ CSS_DOM_STRING_UNREF(beforeprint);
+ CSS_DOM_STRING_UNREF(beforeunload);
CSS_DOM_STRING_UNREF(bgcolor);
+ CSS_DOM_STRING_UNREF(blur);
CSS_DOM_STRING_UNREF(border);
CSS_DOM_STRING_UNREF(bordercolor);
+ CSS_DOM_STRING_UNREF(cancel);
+ CSS_DOM_STRING_UNREF(canplay);
+ CSS_DOM_STRING_UNREF(canplaythrough);
CSS_DOM_STRING_UNREF(cellpadding);
CSS_DOM_STRING_UNREF(cellspacing);
+ CSS_DOM_STRING_UNREF(change);
+ CSS_DOM_STRING_UNREF(click);
+ CSS_DOM_STRING_UNREF(close);
CSS_DOM_STRING_UNREF(color);
CSS_DOM_STRING_UNREF(cols);
CSS_DOM_STRING_UNREF(content);
+ CSS_DOM_STRING_UNREF(contextmenu);
CSS_DOM_STRING_UNREF(coords);
+ CSS_DOM_STRING_UNREF(cuechange);
+ CSS_DOM_STRING_UNREF(dblclick);
CSS_DOM_STRING_UNREF(defer);
+ CSS_DOM_STRING_UNREF(drag);
+ CSS_DOM_STRING_UNREF(dragend);
+ CSS_DOM_STRING_UNREF(dragenter);
+ CSS_DOM_STRING_UNREF(dragleave);
+ CSS_DOM_STRING_UNREF(dragover);
+ CSS_DOM_STRING_UNREF(dragstart);
+ CSS_DOM_STRING_UNREF(drop);
+ CSS_DOM_STRING_UNREF(durationchange);
+ CSS_DOM_STRING_UNREF(emptied);
+ CSS_DOM_STRING_UNREF(ended);
+ CSS_DOM_STRING_UNREF(error);
+ CSS_DOM_STRING_UNREF(focus);
+ CSS_DOM_STRING_UNREF(hashchange);
CSS_DOM_STRING_UNREF(height);
CSS_DOM_STRING_UNREF(href);
CSS_DOM_STRING_UNREF(hreflang);
CSS_DOM_STRING_UNREF(hspace);
CSS_DOM_STRING_UNREF(http_equiv);
CSS_DOM_STRING_UNREF(id);
+ CSS_DOM_STRING_UNREF(input);
+ CSS_DOM_STRING_UNREF(invalid);
+ CSS_DOM_STRING_UNREF(keydown);
+ CSS_DOM_STRING_UNREF(keypress);
+ CSS_DOM_STRING_UNREF(keyup);
CSS_DOM_STRING_UNREF(link);
+ CSS_DOM_STRING_UNREF(load);
+ CSS_DOM_STRING_UNREF(loadeddata);
+ CSS_DOM_STRING_UNREF(loadedmetadata);
+ CSS_DOM_STRING_UNREF(loadstart);
CSS_DOM_STRING_UNREF(map);
CSS_DOM_STRING_UNREF(media);
+ CSS_DOM_STRING_UNREF(message);
+ CSS_DOM_STRING_UNREF(mousedown);
+ CSS_DOM_STRING_UNREF(mousemove);
+ CSS_DOM_STRING_UNREF(mouseout);
+ CSS_DOM_STRING_UNREF(mouseover);
+ CSS_DOM_STRING_UNREF(mouseup);
+ CSS_DOM_STRING_UNREF(mousewheel);
CSS_DOM_STRING_UNREF(name);
CSS_DOM_STRING_UNREF(nohref);
+ CSS_DOM_STRING_UNREF(offline);
+ CSS_DOM_STRING_UNREF(online);
+ CSS_DOM_STRING_UNREF(pagehide);
+ CSS_DOM_STRING_UNREF(pageshow);
+ CSS_DOM_STRING_UNREF(pause);
+ CSS_DOM_STRING_UNREF(play);
+ CSS_DOM_STRING_UNREF(playing);
+ CSS_DOM_STRING_UNREF(popstate);
+ CSS_DOM_STRING_UNREF(progress);
+ CSS_DOM_STRING_UNREF(ratechange);
CSS_DOM_STRING_UNREF(rect);
CSS_DOM_STRING_UNREF(rel);
+ CSS_DOM_STRING_UNREF(reset);
+ CSS_DOM_STRING_UNREF(resize);
CSS_DOM_STRING_UNREF(rows);
+ CSS_DOM_STRING_UNREF(scroll);
+ CSS_DOM_STRING_UNREF(seeked);
+ CSS_DOM_STRING_UNREF(seeking);
+ CSS_DOM_STRING_UNREF(select);
+ CSS_DOM_STRING_UNREF(shape);
+ CSS_DOM_STRING_UNREF(show);
CSS_DOM_STRING_UNREF(size);
CSS_DOM_STRING_UNREF(sizes);
- CSS_DOM_STRING_UNREF(shape);
CSS_DOM_STRING_UNREF(src);
+ CSS_DOM_STRING_UNREF(stalled);
+ CSS_DOM_STRING_UNREF(storage);
+ CSS_DOM_STRING_UNREF(submit);
+ CSS_DOM_STRING_UNREF(suspend);
CSS_DOM_STRING_UNREF(target);
CSS_DOM_STRING_UNREF(text);
CSS_DOM_STRING_UNREF(text_javascript);
+ CSS_DOM_STRING_UNREF(timeupdate);
CSS_DOM_STRING_UNREF(type);
+ CSS_DOM_STRING_UNREF(unload);
CSS_DOM_STRING_UNREF(valign);
CSS_DOM_STRING_UNREF(vlink);
+ CSS_DOM_STRING_UNREF(volumechange);
CSS_DOM_STRING_UNREF(vspace);
+ CSS_DOM_STRING_UNREF(waiting);
CSS_DOM_STRING_UNREF(width);
#undef CSS_DOM_STRING_UNREF
}
@@ -452,43 +588,112 @@ nserror corestrings_init(void)
} while(0)
CSS_DOM_STRING_INTERN(a);
+ CSS_DOM_STRING_INTERN(abort);
+ CSS_DOM_STRING_INTERN(afterprint);
CSS_DOM_STRING_INTERN(align);
CSS_DOM_STRING_INTERN(area);
CSS_DOM_STRING_INTERN(async);
CSS_DOM_STRING_INTERN(background);
+ CSS_DOM_STRING_INTERN(beforeprint);
+ CSS_DOM_STRING_INTERN(beforeunload);
CSS_DOM_STRING_INTERN(bgcolor);
+ CSS_DOM_STRING_INTERN(blur);
CSS_DOM_STRING_INTERN(border);
CSS_DOM_STRING_INTERN(bordercolor);
+ CSS_DOM_STRING_INTERN(cancel);
+ CSS_DOM_STRING_INTERN(canplay);
+ CSS_DOM_STRING_INTERN(canplaythrough);
CSS_DOM_STRING_INTERN(cellpadding);
CSS_DOM_STRING_INTERN(cellspacing);
+ CSS_DOM_STRING_INTERN(change);
+ CSS_DOM_STRING_INTERN(click);
+ CSS_DOM_STRING_INTERN(close);
CSS_DOM_STRING_INTERN(color);
CSS_DOM_STRING_INTERN(cols);
CSS_DOM_STRING_INTERN(content);
+ CSS_DOM_STRING_INTERN(contextmenu);
CSS_DOM_STRING_INTERN(coords);
+ CSS_DOM_STRING_INTERN(cuechange);
+ CSS_DOM_STRING_INTERN(dblclick);
CSS_DOM_STRING_INTERN(defer);
+ CSS_DOM_STRING_INTERN(drag);
+ CSS_DOM_STRING_INTERN(dragend);
+ CSS_DOM_STRING_INTERN(dragenter);
+ CSS_DOM_STRING_INTERN(dragleave);
+ CSS_DOM_STRING_INTERN(dragover);
+ CSS_DOM_STRING_INTERN(dragstart);
+ CSS_DOM_STRING_INTERN(drop);
+ CSS_DOM_STRING_INTERN(durationchange);
+ CSS_DOM_STRING_INTERN(emptied);
+ CSS_DOM_STRING_INTERN(ended);
+ CSS_DOM_STRING_INTERN(error);
+ CSS_DOM_STRING_INTERN(focus);
+ CSS_DOM_STRING_INTERN(hashchange);
CSS_DOM_STRING_INTERN(height);
CSS_DOM_STRING_INTERN(href);
CSS_DOM_STRING_INTERN(hreflang);
CSS_DOM_STRING_INTERN(hspace);
+ CSS_DOM_STRING_INTERN(http_equiv);
CSS_DOM_STRING_INTERN(id);
+ CSS_DOM_STRING_INTERN(input);
+ CSS_DOM_STRING_INTERN(invalid);
+ CSS_DOM_STRING_INTERN(keydown);
+ CSS_DOM_STRING_INTERN(keypress);
+ CSS_DOM_STRING_INTERN(keyup);
CSS_DOM_STRING_INTERN(link);
+ CSS_DOM_STRING_INTERN(load);
+ CSS_DOM_STRING_INTERN(loadeddata);
+ CSS_DOM_STRING_INTERN(loadedmetadata);
+ CSS_DOM_STRING_INTERN(loadstart);
CSS_DOM_STRING_INTERN(map);
CSS_DOM_STRING_INTERN(media);
+ CSS_DOM_STRING_INTERN(message);
+ CSS_DOM_STRING_INTERN(mousedown);
+ CSS_DOM_STRING_INTERN(mousemove);
+ CSS_DOM_STRING_INTERN(mouseout);
+ CSS_DOM_STRING_INTERN(mouseover);
+ CSS_DOM_STRING_INTERN(mouseup);
+ CSS_DOM_STRING_INTERN(mousewheel);
CSS_DOM_STRING_INTERN(name);
CSS_DOM_STRING_INTERN(nohref);
+ CSS_DOM_STRING_INTERN(offline);
+ CSS_DOM_STRING_INTERN(online);
+ CSS_DOM_STRING_INTERN(pagehide);
+ CSS_DOM_STRING_INTERN(pageshow);
+ CSS_DOM_STRING_INTERN(pause);
+ CSS_DOM_STRING_INTERN(play);
+ CSS_DOM_STRING_INTERN(playing);
+ CSS_DOM_STRING_INTERN(popstate);
+ CSS_DOM_STRING_INTERN(progress);
+ CSS_DOM_STRING_INTERN(ratechange);
CSS_DOM_STRING_INTERN(rect);
CSS_DOM_STRING_INTERN(rel);
+ CSS_DOM_STRING_INTERN(reset);
+ CSS_DOM_STRING_INTERN(resize);
CSS_DOM_STRING_INTERN(rows);
+ CSS_DOM_STRING_INTERN(scroll);
+ CSS_DOM_STRING_INTERN(seeked);
+ CSS_DOM_STRING_INTERN(seeking);
+ CSS_DOM_STRING_INTERN(select);
+ CSS_DOM_STRING_INTERN(shape);
+ CSS_DOM_STRING_INTERN(show);
CSS_DOM_STRING_INTERN(size);
CSS_DOM_STRING_INTERN(sizes);
- CSS_DOM_STRING_INTERN(shape);
CSS_DOM_STRING_INTERN(src);
+ CSS_DOM_STRING_INTERN(stalled);
+ CSS_DOM_STRING_INTERN(storage);
+ CSS_DOM_STRING_INTERN(submit);
+ CSS_DOM_STRING_INTERN(suspend);
CSS_DOM_STRING_INTERN(target);
CSS_DOM_STRING_INTERN(text);
+ CSS_DOM_STRING_INTERN(timeupdate);
CSS_DOM_STRING_INTERN(type);
+ CSS_DOM_STRING_INTERN(unload);
CSS_DOM_STRING_INTERN(valign);
CSS_DOM_STRING_INTERN(vlink);
+ CSS_DOM_STRING_INTERN(volumechange);
CSS_DOM_STRING_INTERN(vspace);
+ CSS_DOM_STRING_INTERN(waiting);
CSS_DOM_STRING_INTERN(width);
#undef CSS_DOM_STRING_INTERN
diff --git a/utils/corestrings.h b/utils/corestrings.h
index b72c53e..e8c9b6f 100644
--- a/utils/corestrings.h
+++ b/utils/corestrings.h
@@ -121,45 +121,114 @@ struct dom_string;
/* dom_string strings */
extern struct dom_string *corestring_dom_a;
+extern struct dom_string *corestring_dom_abort;
+extern struct dom_string *corestring_dom_afterprint;
extern struct dom_string *corestring_dom_align;
extern struct dom_string *corestring_dom_area;
extern struct dom_string *corestring_dom_async;
extern struct dom_string *corestring_dom_background;
+extern struct dom_string *corestring_dom_beforeprint;
+extern struct dom_string *corestring_dom_beforeunload;
extern struct dom_string *corestring_dom_bgcolor;
+extern struct dom_string *corestring_dom_blur;
extern struct dom_string *corestring_dom_border;
extern struct dom_string *corestring_dom_bordercolor;
+extern struct dom_string *corestring_dom_cancel;
+extern struct dom_string *corestring_dom_canplay;
+extern struct dom_string *corestring_dom_canplaythrough;
extern struct dom_string *corestring_dom_cellpadding;
extern struct dom_string *corestring_dom_cellspacing;
+extern struct dom_string *corestring_dom_change;
+extern struct dom_string *corestring_dom_click;
+extern struct dom_string *corestring_dom_close;
extern struct dom_string *corestring_dom_color;
extern struct dom_string *corestring_dom_cols;
extern struct dom_string *corestring_dom_content;
+extern struct dom_string *corestring_dom_contextmenu;
extern struct dom_string *corestring_dom_coords;
+extern struct dom_string *corestring_dom_cuechange;
+extern struct dom_string *corestring_dom_dblclick;
extern struct dom_string *corestring_dom_defer;
+extern struct dom_string *corestring_dom_drag;
+extern struct dom_string *corestring_dom_dragend;
+extern struct dom_string *corestring_dom_dragenter;
+extern struct dom_string *corestring_dom_dragleave;
+extern struct dom_string *corestring_dom_dragover;
+extern struct dom_string *corestring_dom_dragstart;
+extern struct dom_string *corestring_dom_drop;
+extern struct dom_string *corestring_dom_durationchange;
+extern struct dom_string *corestring_dom_emptied;
+extern struct dom_string *corestring_dom_ended;
+extern struct dom_string *corestring_dom_error;
+extern struct dom_string *corestring_dom_focus;
+extern struct dom_string *corestring_dom_hashchange;
extern struct dom_string *corestring_dom_height;
extern struct dom_string *corestring_dom_href;
extern struct dom_string *corestring_dom_hreflang;
extern struct dom_string *corestring_dom_hspace;
extern struct dom_string *corestring_dom_http_equiv;
extern struct dom_string *corestring_dom_id;
+extern struct dom_string *corestring_dom_input;
+extern struct dom_string *corestring_dom_invalid;
+extern struct dom_string *corestring_dom_keydown;
+extern struct dom_string *corestring_dom_keypress;
+extern struct dom_string *corestring_dom_keyup;
extern struct dom_string *corestring_dom_link;
+extern struct dom_string *corestring_dom_load;
+extern struct dom_string *corestring_dom_loadeddata;
+extern struct dom_string *corestring_dom_loadedmetadata;
+extern struct dom_string *corestring_dom_loadstart;
extern struct dom_string *corestring_dom_map;
extern struct dom_string *corestring_dom_media;
+extern struct dom_string *corestring_dom_message;
+extern struct dom_string *corestring_dom_mousedown;
+extern struct dom_string *corestring_dom_mousemove;
+extern struct dom_string *corestring_dom_mouseout;
+extern struct dom_string *corestring_dom_mouseover;
+extern struct dom_string *corestring_dom_mouseup;
+extern struct dom_string *corestring_dom_mousewheel;
extern struct dom_string *corestring_dom_name;
extern struct dom_string *corestring_dom_nohref;
+extern struct dom_string *corestring_dom_offline;
+extern struct dom_string *corestring_dom_online;
+extern struct dom_string *corestring_dom_pagehide;
+extern struct dom_string *corestring_dom_pageshow;
+extern struct dom_string *corestring_dom_pause;
+extern struct dom_string *corestring_dom_play;
+extern struct dom_string *corestring_dom_playing;
+extern struct dom_string *corestring_dom_popstate;
+extern struct dom_string *corestring_dom_progress;
+extern struct dom_string *corestring_dom_ratechange;
extern struct dom_string *corestring_dom_rect;
extern struct dom_string *corestring_dom_rel;
+extern struct dom_string *corestring_dom_reset;
+extern struct dom_string *corestring_dom_resize;
extern struct dom_string *corestring_dom_rows;
+extern struct dom_string *corestring_dom_scroll;
+extern struct dom_string *corestring_dom_seeked;
+extern struct dom_string *corestring_dom_seeking;
+extern struct dom_string *corestring_dom_select;
+extern struct dom_string *corestring_dom_shape;
+extern struct dom_string *corestring_dom_show;
extern struct dom_string *corestring_dom_size;
extern struct dom_string *corestring_dom_sizes;
-extern struct dom_string *corestring_dom_shape;
extern struct dom_string *corestring_dom_src;
+extern struct dom_string *corestring_dom_stalled;
+extern struct dom_string *corestring_dom_storage;
+extern struct dom_string *corestring_dom_submit;
+extern struct dom_string *corestring_dom_suspend;
extern struct dom_string *corestring_dom_target;
extern struct dom_string *corestring_dom_text;
extern struct dom_string *corestring_dom_text_javascript;
+extern struct dom_string *corestring_dom_timeupdate;
extern struct dom_string *corestring_dom_type;
+extern struct dom_string *corestring_dom_unload;
extern struct dom_string *corestring_dom_valign;
extern struct dom_string *corestring_dom_vlink;
+extern struct dom_string *corestring_dom_volumechange;
extern struct dom_string *corestring_dom_vspace;
+extern struct dom_string *corestring_dom_waiting;
extern struct dom_string *corestring_dom_width;
+
#endif
diff --git a/utils/errors.h b/utils/errors.h
index 9ad613d..7fcb5bd 100644
--- a/utils/errors.h
+++ b/utils/errors.h
@@ -61,6 +61,10 @@ typedef enum {
NSERROR_DOM, /**< DOM call returned error */
+ NSERROR_CSS, /**< CSS call returned error */
+
+ NSERROR_CSS_BASE, /**< CSS base sheet failed */
+
NSERROR_BAD_URL /**< Bad URL */
} nserror;
diff --git a/utils/messages.c b/utils/messages.c
index 5b62912..8ae616b 100644
--- a/utils/messages.c
+++ b/utils/messages.c
@@ -200,3 +200,99 @@ const char *messages_get(const char *key)
{
return messages_get_ctx(key, messages_hash);
}
+
+
+/**
+ * lookup of a message by errorcode from the standard Messages hash.
+ *
+ * \param code errorcode of message
+ * \return message text
+ */
+
+const char *messages_get_errorcode(nserror code)
+{
+ switch (code) {
+ case NSERROR_OK:
+ /**< No error */
+ return messages_get_ctx("OK", messages_hash);
+
+ case NSERROR_NOMEM:
+ /**< Memory exhaustion */
+ return messages_get_ctx("NoMemory", messages_hash);
+
+ case NSERROR_NO_FETCH_HANDLER:
+ /**< No fetch handler for URL scheme */
+ return messages_get_ctx("NoHandler", messages_hash);
+
+ case NSERROR_NOT_FOUND:
+ /**< Requested item not found */
+ return messages_get_ctx("NotFound", messages_hash);
+
+ case NSERROR_SAVE_FAILED:
+ /**< Failed to save data */
+ return messages_get_ctx("SaveFailed", messages_hash);
+
+ case NSERROR_CLONE_FAILED:
+ /**< Failed to clone handle */
+ return messages_get_ctx("CloneFailed", messages_hash);
+
+ case NSERROR_INIT_FAILED:
+ /**< Initialisation failed */
+ return messages_get_ctx("InitFailed", messages_hash);
+
+ case NSERROR_MNG_ERROR:
+ /**< An MNG error occurred */
+ return messages_get_ctx("MNGError", messages_hash);
+
+ case NSERROR_BAD_ENCODING:
+ /**< The character set is unknown */
+ return messages_get_ctx("BadEncoding", messages_hash);
+
+ case NSERROR_NEED_DATA:
+ /**< More data needed */
+ return messages_get_ctx("NeedData", messages_hash);
+
+ case NSERROR_ENCODING_CHANGE:
+ /**< The character set encoding change was unhandled */
+ return messages_get_ctx("EncodingChanged", messages_hash);
+
+ case NSERROR_BAD_PARAMETER:
+ /**< Bad Parameter */
+ return messages_get_ctx("BadParameter", messages_hash);
+
+ case NSERROR_INVALID:
+ /**< Invalid data */
+ return messages_get_ctx("Invalid", messages_hash);
+
+ case NSERROR_BOX_CONVERT:
+ /**< Box conversion failed */
+ return messages_get_ctx("BoxConvert", messages_hash);
+
+ case NSERROR_STOPPED:
+ /**< Content conversion stopped */
+ return messages_get_ctx("Stopped", messages_hash);
+
+ case NSERROR_DOM:
+ /**< DOM call returned error */
+ return messages_get_ctx("ParsingFail", messages_hash);
+
+ case NSERROR_CSS:
+ /**< CSS call returned error */
+ return messages_get_ctx("CSSGeneric", messages_hash);
+
+ case NSERROR_CSS_BASE:
+ /**< CSS base sheet failed */
+ return messages_get_ctx("CSSBase", messages_hash);
+
+ case NSERROR_BAD_URL:
+ /**< Bad URL */
+ return messages_get_ctx("BadURL", messages_hash);
+
+ default:
+ case NSERROR_UNKNOWN:
+ break;
+ }
+
+ /**< Unknown error */
+ return messages_get_ctx("Unknown", messages_hash);
+}
diff --git a/utils/messages.h b/utils/messages.h
index 2b78d07..81c3805 100644
--- a/utils/messages.h
+++ b/utils/messages.h
@@ -33,6 +33,7 @@
#ifndef _NETSURF_UTILS_MESSAGES_H_
#define _NETSURF_UTILS_MESSAGES_H_
+#include "utils/errors.h"
#include "utils/hashtable.h"
void messages_load(const char *path);
@@ -41,6 +42,14 @@ const char *messages_get_ctx(const char *key, struct hash_table *ctx);
const char *messages_get(const char *key);
/**
+ * lookup of a message by errorcode from the standard Messages hash.
+ *
+ * \param code errorcode of message
+ * \return message text
+ */
+const char *messages_get_errorcode(nserror code);
+
+/**
* Formatted message from a key in the global message hash.
*
* \param key key of message
--
NetSurf Browser
11 years
netsurf: branch master updated. ec79063155c809d52e54812e0045900bbad53532
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/ec79063155c809d52e548...
...commit http://git.netsurf-browser.org/netsurf.git/commit/ec79063155c809d52e54812...
...tree http://git.netsurf-browser.org/netsurf.git/tree/ec79063155c809d52e54812e0...
The branch, master has been updated
via ec79063155c809d52e54812e0045900bbad53532 (commit)
via 168d09c8780de36daa580a2b584059e37744b53b (commit)
from d80bb6210dcad46997b190793efa5d472a1809c1 (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/commitdiff/ec79063155c809d52e5...
commit ec79063155c809d52e54812e0045900bbad53532
Merge: 168d09c d80bb62
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Merge branch 'master' of git://git.netsurf-browser.org/netsurf
commitdiff http://git.netsurf-browser.org/netsurf.git/commitdiff/168d09c8780de36daa5...
commit 168d09c8780de36daa580a2b584059e37744b53b
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Improve the look of the hotlist toolbar
diff --git a/amiga/gui.c b/amiga/gui.c
index 064c49c..2cbceac 100755
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -2495,11 +2495,20 @@ void ami_gui_hotlist_toolbar_add(struct gui_window_2 *gwin)
SpeedBarObject,
GA_ID, GID_HOTLIST,
GA_RelVerify, TRUE,
+ SPEEDBAR_BevelStyle, BVS_NONE,
SPEEDBAR_Buttons, &gwin->hotlist_toolbar_list,
SpeedBarEnd;
+
+ gwin->objects[GID_HOTLISTSEPBAR] =
+ BevelObject,
+ BEVEL_Style, BVS_SBAR_VERT,
+ BevelEnd;
IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_ADDCHILD,
gwin->win, gwin->objects[GID_HOTLIST], NULL);
+
+ IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_ADDIMAGE,
+ gwin->win, gwin->objects[GID_HOTLISTSEPBAR], NULL);
}
FlushLayoutDomainCache((struct Gadget *)gwin->objects[GID_MAIN]);
@@ -2977,7 +2986,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
BEVEL_Style, BVS_SBAR_VERT,
BevelEnd,
CHILD_WeightedHeight, 0,
- LAYOUT_AddChild, g->shared->objects[GID_HOTLISTLAYOUT] = HGroupObject,
+ LAYOUT_AddChild, g->shared->objects[GID_HOTLISTLAYOUT] = VGroupObject,
LAYOUT_SpaceInner, FALSE,
LayoutEnd,
CHILD_WeightedHeight,0,
diff --git a/amiga/gui.h b/amiga/gui.h
index 59c60f4..14cec10 100755
--- a/amiga/gui.h
+++ b/amiga/gui.h
@@ -66,6 +66,7 @@ enum
GID_TOOLBARLAYOUT,
GID_HOTLIST,
GID_HOTLISTLAYOUT,
+ GID_HOTLISTSEPBAR,
GID_HSCROLL,
GID_LAST
};
-----------------------------------------------------------------------
Summary of changes:
amiga/gui.c | 11 ++++++++++-
amiga/gui.h | 1 +
2 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/amiga/gui.c b/amiga/gui.c
index 064c49c..2cbceac 100755
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -2495,11 +2495,20 @@ void ami_gui_hotlist_toolbar_add(struct gui_window_2 *gwin)
SpeedBarObject,
GA_ID, GID_HOTLIST,
GA_RelVerify, TRUE,
+ SPEEDBAR_BevelStyle, BVS_NONE,
SPEEDBAR_Buttons, &gwin->hotlist_toolbar_list,
SpeedBarEnd;
+
+ gwin->objects[GID_HOTLISTSEPBAR] =
+ BevelObject,
+ BEVEL_Style, BVS_SBAR_VERT,
+ BevelEnd;
IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_ADDCHILD,
gwin->win, gwin->objects[GID_HOTLIST], NULL);
+
+ IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_ADDIMAGE,
+ gwin->win, gwin->objects[GID_HOTLISTSEPBAR], NULL);
}
FlushLayoutDomainCache((struct Gadget *)gwin->objects[GID_MAIN]);
@@ -2977,7 +2986,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
BEVEL_Style, BVS_SBAR_VERT,
BevelEnd,
CHILD_WeightedHeight, 0,
- LAYOUT_AddChild, g->shared->objects[GID_HOTLISTLAYOUT] = HGroupObject,
+ LAYOUT_AddChild, g->shared->objects[GID_HOTLISTLAYOUT] = VGroupObject,
LAYOUT_SpaceInner, FALSE,
LayoutEnd,
CHILD_WeightedHeight,0,
diff --git a/amiga/gui.h b/amiga/gui.h
index 59c60f4..14cec10 100755
--- a/amiga/gui.h
+++ b/amiga/gui.h
@@ -66,6 +66,7 @@ enum
GID_TOOLBARLAYOUT,
GID_HOTLIST,
GID_HOTLISTLAYOUT,
+ GID_HOTLISTSEPBAR,
GID_HSCROLL,
GID_LAST
};
--
NetSurf Browser
11 years
netsurf: branch master updated. 4865886721f76373cf9902f5c3fe2f159a375ee6
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/4865886721f76373cf990...
...commit http://git.netsurf-browser.org/netsurf.git/commit/4865886721f76373cf9902f...
...tree http://git.netsurf-browser.org/netsurf.git/tree/4865886721f76373cf9902f5c...
The branch, master has been updated
via 4865886721f76373cf9902f5c3fe2f159a375ee6 (commit)
from 71577f214da0e53b845b0c0a41496b0f1d0eead5 (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/commitdiff/4865886721f76373cf9...
commit 4865886721f76373cf9902f5c3fe2f159a375ee6
Author: Vincent Sanders <vince(a)netsurf-browser.org>
Commit: Vincent Sanders <vince(a)netsurf-browser.org>
fix logic
diff --git a/javascript/jsapi/window.bnd b/javascript/jsapi/window.bnd
index 7ad54db..56b2ff0 100644
--- a/javascript/jsapi/window.bnd
+++ b/javascript/jsapi/window.bnd
@@ -246,7 +246,7 @@ operation dispatchEvent %{
JS_GetProperty(cx, JSAPI_THIS_OBJECT(cx, vp), "onload", &eventval);
}
- if (JSVAL_IS_VOID(eventval)) {
+ if (!JSVAL_IS_VOID(eventval)) {
event_argv[0] = eventval;
jsret = JS_CallFunctionValue(cx, NULL, eventval, 1, event_argv, &event_rval);
}
-----------------------------------------------------------------------
Summary of changes:
javascript/jsapi/window.bnd | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/javascript/jsapi/window.bnd b/javascript/jsapi/window.bnd
index 7ad54db..56b2ff0 100644
--- a/javascript/jsapi/window.bnd
+++ b/javascript/jsapi/window.bnd
@@ -246,7 +246,7 @@ operation dispatchEvent %{
JS_GetProperty(cx, JSAPI_THIS_OBJECT(cx, vp), "onload", &eventval);
}
- if (JSVAL_IS_VOID(eventval)) {
+ if (!JSVAL_IS_VOID(eventval)) {
event_argv[0] = eventval;
jsret = JS_CallFunctionValue(cx, NULL, eventval, 1, event_argv, &event_rval);
}
--
NetSurf Browser
11 years
netsurf: branch master updated. 71577f214da0e53b845b0c0a41496b0f1d0eead5
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/71577f214da0e53b845b0...
...commit http://git.netsurf-browser.org/netsurf.git/commit/71577f214da0e53b845b0c0...
...tree http://git.netsurf-browser.org/netsurf.git/tree/71577f214da0e53b845b0c0a4...
The branch, master has been updated
via 71577f214da0e53b845b0c0a41496b0f1d0eead5 (commit)
from 4fbeacf830b1351646a375169aea05f264425c9b (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/commitdiff/71577f214da0e53b845...
commit 71577f214da0e53b845b0c0a41496b0f1d0eead5
Author: Vincent Sanders <vince(a)netsurf-browser.org>
Commit: Vincent Sanders <vince(a)netsurf-browser.org>
use macro to compare
diff --git a/javascript/jsapi/window.bnd b/javascript/jsapi/window.bnd
index 610aa71..7ad54db 100644
--- a/javascript/jsapi/window.bnd
+++ b/javascript/jsapi/window.bnd
@@ -225,37 +225,33 @@ operation dispatchEvent %{
*/
/* caution, this must match the struct generated from event.bnd */
- if (event == JSVAL_VOID) {
+ struct {
+ dom_event *event;
+ } *event_private;
+ dom_string *type_dom = NULL;
+ dom_exception exc;
+ jsval eventval = JSVAL_VOID;
+ jsval event_argv[1];
+ jsval event_rval;
+
+ event_private = JS_GetInstancePrivate(cx, event, &JSClass_Event, NULL);
+ if (event_private->event == NULL) {
+ /** @todo type error? */
jsret = JS_FALSE;
} else {
- struct {
- dom_event *event;
- } *event_private;
- dom_string *type_dom = NULL;
- dom_exception exc;
- jsval eventval = JSVAL_VOID;
- jsval event_argv[1];
- jsval event_rval;
-
- event_private = JS_GetInstancePrivate(cx, event, &JSClass_Event, NULL);
- if (event_private->event == NULL) {
- /** @todo type error? */
- jsret = JS_FALSE;
- } else {
- exc = dom_event_get_type(event_private->event, &type_dom);
- if (exc == DOM_NO_ERR) {
-
- if (dom_string_isequal(type_dom, corestring_dom_load)) {
- JS_GetProperty(cx, JSAPI_THIS_OBJECT(cx, vp), "onload", &eventval);
- }
-
- if (eventval != JSVAL_VOID) {
- event_argv[0] = eventval;
- jsret = JS_CallFunctionValue(cx, NULL, eventval, 1, event_argv, &event_rval);
- }
+ exc = dom_event_get_type(event_private->event, &type_dom);
+ if (exc == DOM_NO_ERR) {
+
+ if (dom_string_isequal(type_dom, corestring_dom_load)) {
+ JS_GetProperty(cx, JSAPI_THIS_OBJECT(cx, vp), "onload", &eventval);
+ }
+
+ if (JSVAL_IS_VOID(eventval)) {
+ event_argv[0] = eventval;
+ jsret = JS_CallFunctionValue(cx, NULL, eventval, 1, event_argv, &event_rval);
}
}
- }
+ }
%}
getter EventHandler %{
-----------------------------------------------------------------------
Summary of changes:
javascript/jsapi/window.bnd | 50 +++++++++++++++++++-----------------------
1 files changed, 23 insertions(+), 27 deletions(-)
diff --git a/javascript/jsapi/window.bnd b/javascript/jsapi/window.bnd
index 610aa71..7ad54db 100644
--- a/javascript/jsapi/window.bnd
+++ b/javascript/jsapi/window.bnd
@@ -225,37 +225,33 @@ operation dispatchEvent %{
*/
/* caution, this must match the struct generated from event.bnd */
- if (event == JSVAL_VOID) {
+ struct {
+ dom_event *event;
+ } *event_private;
+ dom_string *type_dom = NULL;
+ dom_exception exc;
+ jsval eventval = JSVAL_VOID;
+ jsval event_argv[1];
+ jsval event_rval;
+
+ event_private = JS_GetInstancePrivate(cx, event, &JSClass_Event, NULL);
+ if (event_private->event == NULL) {
+ /** @todo type error? */
jsret = JS_FALSE;
} else {
- struct {
- dom_event *event;
- } *event_private;
- dom_string *type_dom = NULL;
- dom_exception exc;
- jsval eventval = JSVAL_VOID;
- jsval event_argv[1];
- jsval event_rval;
-
- event_private = JS_GetInstancePrivate(cx, event, &JSClass_Event, NULL);
- if (event_private->event == NULL) {
- /** @todo type error? */
- jsret = JS_FALSE;
- } else {
- exc = dom_event_get_type(event_private->event, &type_dom);
- if (exc == DOM_NO_ERR) {
-
- if (dom_string_isequal(type_dom, corestring_dom_load)) {
- JS_GetProperty(cx, JSAPI_THIS_OBJECT(cx, vp), "onload", &eventval);
- }
-
- if (eventval != JSVAL_VOID) {
- event_argv[0] = eventval;
- jsret = JS_CallFunctionValue(cx, NULL, eventval, 1, event_argv, &event_rval);
- }
+ exc = dom_event_get_type(event_private->event, &type_dom);
+ if (exc == DOM_NO_ERR) {
+
+ if (dom_string_isequal(type_dom, corestring_dom_load)) {
+ JS_GetProperty(cx, JSAPI_THIS_OBJECT(cx, vp), "onload", &eventval);
+ }
+
+ if (JSVAL_IS_VOID(eventval)) {
+ event_argv[0] = eventval;
+ jsret = JS_CallFunctionValue(cx, NULL, eventval, 1, event_argv, &event_rval);
}
}
- }
+ }
%}
getter EventHandler %{
--
NetSurf Browser
11 years