summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2012-11-24 23:32:56 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2012-11-24 23:32:56 +0000
commit50b7b41ab7c06462517a348b88b644157a1d4852 (patch)
treeea782824c219b41b75deae9c2e2d1be8a1047c12
parent9a1a1209be4461eb3b7ff40eed23aa35ab0c54e2 (diff)
parentec43456e4bf0968bc68b437733199ad2af609c1e (diff)
downloadnetsurf-50b7b41ab7c06462517a348b88b644157a1d4852.tar.gz
netsurf-50b7b41ab7c06462517a348b88b644157a1d4852.tar.bz2
Merge branch 'master' of git://git.netsurf-browser.org/netsurf into chris/frame-scroll
-rw-r--r--atari/Makefile.target2
-rw-r--r--atari/deskmenu.c660
-rw-r--r--atari/deskmenu.h12
-rwxr-xr-xatari/global_evnt.c534
-rwxr-xr-xatari/global_evnt.h23
-rwxr-xr-xatari/gui.c47
-rwxr-xr-xatari/misc.c3
-rw-r--r--atari/settings.c5
-rw-r--r--javascript/jsapi.h126
-rw-r--r--javascript/jsapi/binding.h3
-rw-r--r--javascript/jsapi/console.bnd12
-rw-r--r--javascript/jsapi/dom.bnd45
-rw-r--r--javascript/jsapi/htmlelement.bnd173
-rw-r--r--javascript/jsapi/location.bnd117
-rw-r--r--javascript/jsapi/window.bnd21
-rw-r--r--render/html.c9
-rw-r--r--test/js/dom-document-enumerate.html26
-rw-r--r--test/js/dom-element-childElementCount.html11
-rw-r--r--test/js/dom-element-firstElementChild.html (renamed from test/js/doc-dom1.html)0
-rw-r--r--test/js/dom-element-lastElementChild.html11
-rw-r--r--test/js/dom-element-next_prev_ElementSibling.html14
-rw-r--r--test/js/event-onload.html29
-rw-r--r--test/js/index.html7
-rw-r--r--test/js/location-enumerate.html26
-rw-r--r--test/js/window-enumerate.html26
25 files changed, 1122 insertions, 820 deletions
diff --git a/atari/Makefile.target b/atari/Makefile.target
index f7e1a6301..ad908075b 100644
--- a/atari/Makefile.target
+++ b/atari/Makefile.target
@@ -81,7 +81,7 @@ S_ATARI := gui.c findfile.c filetype.c misc.c bitmap.c schedule.c \
redrawslots.c encoding.c \
browser_win.c toolbar.c statusbar.c browser.c \
global_evnt.c osspec.c dragdrop.c system_colour.c \
- ctxmenu.c settings.c msgbox.c deskmenu.c
+ ctxmenu.c settings.c msgbox.c
S_ATARI := $(addprefix atari/,$(S_ATARI))
# This is the final source build list
diff --git a/atari/deskmenu.c b/atari/deskmenu.c
deleted file mode 100644
index 38e35391c..000000000
--- a/atari/deskmenu.c
+++ /dev/null
@@ -1,660 +0,0 @@
-#include <stdlib.h>
-#include <windom.h>
-
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/url.h"
-#include "desktop/browser.h"
-#include "desktop/browser_private.h"
-#include "desktop/options.h"
-#include "desktop/save_complete.h"
-
-#include "atari/res/netsurf.rsh"
-#include "atari/deskmenu.h"
-#include "atari/hotlist.h"
-#include "atari/history.h"
-#include "atari/toolbar.h"
-#include "atari/settings.h"
-#include "atari/search.h"
-#include "atari/misc.h"
-#include "atari/gui.h"
-#include "atari/findfile.h"
-#include "atari/browser.h"
-#include "atari/browser_win.h"
-
-typedef void __CDECL (*menu_evnt_func)(short item, short title, void * data);
-
-struct s_accelerator
-{
- char ascii; /* either ascii or */
- long keycode; /* normalised keycode is valid */
- short mod; /* shift / ctrl etc */
-};
-
-struct s_menu_item_evnt {
- short title; /* to which menu this item belongs */
- short rid; /* resource ID */
- menu_evnt_func menu_func; /* click handler */
- struct s_accelerator accel; /* accelerator info */
- char * menustr;
-};
-
-static void register_menu_str(struct s_menu_item_evnt * mi);
-static void __CDECL evnt_menu(WINDOW * win, short buff[8]);
-
-extern void *h_gem_rsrc;
-extern bool html_redraw_debug;
-extern struct gui_window * input_window;
-extern char options[PATH_MAX];
-extern const char * option_homepage_url;
-extern int option_window_width;
-extern int option_window_height;
-extern int option_window_x;
-extern int option_window_y;
-
-static OBJECT * h_gem_menu;
-
-
-/* Zero based resource tree ids: */
-#define T_ABOUT 0
-#define T_FILE MAINMENU_T_FILE - MAINMENU_T_FILE + 1
-#define T_EDIT MAINMENU_T_EDIT - MAINMENU_T_FILE + 1
-#define T_VIEW MAINMENU_T_VIEW - MAINMENU_T_FILE + 1
-#define T_NAV MAINMENU_T_NAVIGATE - MAINMENU_T_FILE + 1
-#define T_UTIL MAINMENU_T_UTIL - MAINMENU_T_FILE + 1
-#define T_HELP MAINMENU_T_NAVIGATE - MAINMENU_T_FILE + 1
-/* Count of the above defines: */
-#define NUM_MENU_TITLES 7
-
-
-static void __CDECL menu_about(short item, short title, void *data);
-static void __CDECL menu_new_win(short item, short title, void *data);
-static void __CDECL menu_open_url(short item, short title, void *data);
-static void __CDECL menu_open_file(short item, short title, void *data);
-static void __CDECL menu_close_win(short item, short title, void *data);
-static void __CDECL menu_save_page(short item, short title, void *data);
-static void __CDECL menu_quit(short item, short title, void *data);
-static void __CDECL menu_cut(short item, short title, void *data);
-static void __CDECL menu_copy(short item, short title, void *data);
-static void __CDECL menu_paste(short item, short title, void *data);
-static void __CDECL menu_find(short item, short title, void *data);
-static void __CDECL menu_choices(short item, short title, void *data);
-static void __CDECL menu_stop(short item, short title, void *data);
-static void __CDECL menu_reload(short item, short title, void *data);
-static void __CDECL menu_toolbars(short item, short title, void *data);
-static void __CDECL menu_savewin(short item, short title, void *data);
-static void __CDECL menu_debug_render(short item, short title, void *data);
-static void __CDECL menu_fg_images(short item, short title, void *data);
-static void __CDECL menu_bg_images(short item, short title, void *data);
-static void __CDECL menu_back(short item, short title, void *data);
-static void __CDECL menu_forward(short item, short title, void *data);
-static void __CDECL menu_home(short item, short title, void *data);
-static void __CDECL menu_lhistory(short item, short title, void *data);
-static void __CDECL menu_ghistory(short item, short title, void *data);
-static void __CDECL menu_add_bookmark(short item, short title, void *data);
-static void __CDECL menu_bookmarks(short item, short title, void *data);
-static void __CDECL menu_vlog(short item, short title, void *data);
-static void __CDECL menu_help_content(short item, short title, void *data);
-
-struct s_menu_item_evnt menu_evnt_tbl[] =
-{
- {T_ABOUT,MAINMENU_M_ABOUT, menu_about, {0,0,0}, NULL },
- {T_FILE, MAINMENU_M_NEWWIN, menu_new_win, {0,0,0}, NULL},
- {T_FILE, MAINMENU_M_OPENURL, menu_open_url, {'G',0,K_CTRL}, NULL},
- {T_FILE, MAINMENU_M_OPENFILE, menu_open_file, {'O',0,K_CTRL}, NULL},
- {T_FILE, MAINMENU_M_CLOSEWIN, menu_close_win, {0,0,0}, NULL},
- {T_FILE, MAINMENU_M_SAVEPAGE, menu_save_page, {0,NK_F3,0}, NULL},
- {T_FILE, MAINMENU_M_QUIT, menu_quit, {'Q',0,K_CTRL}, NULL},
- {T_EDIT, MAINMENU_M_CUT, menu_cut, {'X',0,K_CTRL}, NULL},
- {T_EDIT, MAINMENU_M_COPY, menu_copy, {'C',0,K_CTRL}, NULL},
- {T_EDIT, MAINMENU_M_PASTE, menu_paste, {'V',0,K_CTRL}, NULL},
- {T_EDIT, MAINMENU_M_FIND, menu_find, {0,NK_F4,0}, NULL},
- {T_VIEW, MAINMENU_M_RELOAD, menu_reload, {0,NK_F5,0}, NULL},
- {T_VIEW, MAINMENU_M_TOOLBARS, menu_toolbars, {0,NK_F1,K_CTRL}, NULL},
- {T_VIEW, MAINMENU_M_SAVEWIN, menu_savewin, {0,0,0}, NULL},
- {T_VIEW, MAINMENU_M_DEBUG_RENDER, menu_debug_render, {0,0,0}, NULL},
- {T_VIEW, MAINMENU_M_FG_IMAGES, menu_fg_images, {0,0,0}, NULL},
- {T_VIEW, MAINMENU_M_BG_IMAGES, menu_bg_images, {0,0,0}, NULL},
- {T_VIEW, MAINMENU_M_STOP, menu_stop, {0,NK_ESC,K_ALT}, NULL},
- {T_NAV, MAINMENU_M_BACK, menu_back, {0,NK_LEFT,K_ALT}, NULL},
- {T_NAV, MAINMENU_M_FORWARD, menu_forward, {0,NK_RIGHT,K_ALT}, NULL},
- {T_NAV, MAINMENU_M_HOME, menu_home, {0,NK_CLRHOME,0}, NULL},
- {T_UTIL, MAINMENU_M_LHISTORY,menu_lhistory, {0,NK_F7,0}, NULL},
- {T_UTIL, MAINMENU_M_GHISTORY, menu_ghistory, {0,NK_F7,K_CTRL}, NULL},
- {T_UTIL, MAINMENU_M_ADD_BOOKMARK, menu_add_bookmark, {'D',0,K_CTRL}, NULL},
- {T_UTIL, MAINMENU_M_BOOKMARKS, menu_bookmarks, {0,NK_F6,0}, NULL},
- {T_UTIL, MAINMENU_M_CHOICES, menu_choices, {0,0,0}, NULL},
- {T_UTIL, MAINMENU_M_VLOG, menu_vlog, {'V',0,K_ALT}, NULL},
- {T_HELP, MAINMENU_M_HELP_CONTENT, menu_help_content, {0,NK_F1,0}, NULL},
- {-1, -1, NULL,{0,0,0}, NULL }
-};
-
-
-/*
- Parse encoded menu key shortcut
-
- The format is:
-
- "[" - marks start of the shortcut
- "@,^,<" - If the keyshortcut is only valid
- with modifier keys, one of these characters must directly
- follow the start mark.
- Meaning:
- @ -> Alternate
- ^ -> Control
- "#" - keycode or ascii character.
- The value is handled as keycode if the character value
- is <= 28 ( Atari chracter table )
- or if it is interpreted as function key string.
- (strings: F1 - F10)
-
-*/
-static void register_menu_str( struct s_menu_item_evnt * mi )
-{
- OBJECT *gem_menu = deskmenu_get_obj_tree();
-
- assert(gem_menu != NULL);
-
- char * str = ObjcString( gem_menu, mi->rid, NULL );
- int l = strlen(str);
- int i = l;
- int x = -1;
- struct s_accelerator * accel = &mi->accel;
-
- while (i > 2) {
- if( str[i] == '['){
- x = i;
- break;
- }
- i--;
- }
- if( x > -1 ){
- mi->menustr = malloc( l+1 );
- strcpy(mi->menustr, str );
- mi->menustr[x]=' ';
- x++;
- if( str[x] == '@' ){
- accel->mod = K_ALT;
- mi->menustr[x] = 0x07;
- x++;
- }
- else if( str[x] == '^' ) {
- accel->mod = K_CTRL;
- x++;
- }
- if( str[x] <= 28 ){
- // parse symbol
- unsigned short keycode=0;
- switch( str[x] ){
- case 0x03:
- accel->keycode = NK_RIGHT;
- break;
- case 0x04:
- accel->keycode = NK_LEFT;
- break;
- case 0x1B:
- accel->keycode = NK_ESC;
- break;
- default:
- break;
- }
- } else {
- if(str[x] == 'F' && ( str[x+1] >= '1' && str[x+1] <= '9') ){
- // parse function key
- short fkey = atoi( &str[x+1] );
- if( (fkey >= 0) && (fkey <= 10) ){
- accel->keycode = NK_F1 - 1 + fkey;
- }
- } else {
- accel->ascii = str[x];
- }
- }
- }
-}
-
-static void __CDECL evnt_menu(WINDOW * win, short buff[8])
-{
- int title = buff[3];
- INT16 x,y;
- char *str;
- struct gui_window * gw = window_list;
- int i=0;
-
- deskmenu_dispatch_item(buff[3], buff[4]);
-}
-
-/*
- Menu item event handlers:
-*/
-
-static void __CDECL menu_about(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- char buf[PATH_MAX];
- strcpy((char*)&buf, "file://");
- strncat((char*)&buf, (char*)"./doc/README.TXT",
- PATH_MAX - (strlen("file://")+1) );
- browser_window_create((char*)&buf, 0, 0, true, false);
-}
-
-static void __CDECL menu_new_win(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- browser_window_create(option_homepage_url, 0, 0, true, false);
-}
-
-static void __CDECL menu_open_url(short item, short title, void *data)
-{
- struct gui_window * gw;
- struct browser_window * bw ;
- LOG(("%s", __FUNCTION__));
-
- gw = input_window;
- if( gw == NULL ) {
- bw = browser_window_create("", 0, 0, true, false);
- gw = bw->window;
-
- }
- /* Loose focus: */
- window_set_focus( gw, WIDGET_NONE, NULL );
-
- /* trigger on-focus event (select all text): */
- window_set_focus( gw, URL_WIDGET, &gw->root->toolbar->url );
-
- /* delete selection: */
- tb_url_input( gw, NK_DEL );
-}
-
-static void __CDECL menu_open_file(short item, short title, void *data)
-{
- struct gui_window * gw;
- struct browser_window * bw ;
-
- LOG(("%s", __FUNCTION__));
-
- const char * filename = file_select( messages_get("OpenFile"), "" );
- if( filename != NULL ){
- char * url = local_file_to_url( filename );
- if( url ){
- bw = browser_window_create(url, NULL, NULL, true, false);
- free( url );
- }
- }
-}
-
-static void __CDECL menu_close_win(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
- return;
- gui_window_destroy( input_window );
-}
-
-static void __CDECL menu_save_page(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- static bool init = true;
- bool is_folder=false;
- const char * path;
-
- if( !input_window )
- return;
-
- if( init ){
- init = false;
- save_complete_init();
- }
-
- do {
- // TODO: localize string
- path = file_select("Select folder", "");
- if (path)
- is_folder = is_dir(path);
- } while( !is_folder && path != NULL );
-
- if( path != NULL ){
- save_complete( input_window->browser->bw->current_content, path, NULL );
- }
-
-}
-
-static void __CDECL menu_quit(short item, short title, void *data)
-{
- short buff[8];
- memset( &buff, 0, sizeof(short)*8 );
- LOG(("%s", __FUNCTION__));
- netsurf_quit = true;
-}
-
-static void __CDECL menu_cut(short item, short title, void *data)
-{
- if( input_window != NULL )
- browser_window_key_press( input_window->browser->bw, KEY_CUT_SELECTION);
-}
-
-static void __CDECL menu_copy(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window != NULL )
- browser_window_key_press( input_window->browser->bw, KEY_COPY_SELECTION);
-}
-
-static void __CDECL menu_paste(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window != NULL )
- browser_window_key_press( input_window->browser->bw, KEY_PASTE);
-}
-
-static void __CDECL menu_find(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window != NULL )
- open_browser_search( input_window );
-}
-
-static void __CDECL menu_choices(short item, short title, void *data)
-{
- static WINDOW * settings_dlg = NULL;
- LOG(("%s", __FUNCTION__));
- settings_dlg = open_settings();
-}
-
-static void __CDECL menu_stop(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
- return;
- tb_stop_click( input_window );
-
-}
-
-static void __CDECL menu_reload(short item, short title, void *data)
-{
- if( input_window == NULL)
- return;
- tb_reload_click( input_window );
- LOG(("%s", __FUNCTION__));
-}
-
-static void __CDECL menu_toolbars(short item, short title, void *data)
-{
- static int state = 0;
- LOG(("%s", __FUNCTION__));
- if( input_window != null && input_window->root->toolbar != null ){
- state = !state;
- tb_hide( input_window, state );
- }
-}
-
-static void __CDECL menu_savewin(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if (input_window && input_window->browser) {
- GRECT rect;
- wind_get_grect(input_window->root->handle->handle, WF_CURRXYWH, &rect);
- option_window_width = rect.g_w;
- option_window_height = rect.g_h;
- option_window_x = rect.g_x;
- option_window_y = rect.g_y;
- nsoption_set_int(window_width, rect.g_w);
- nsoption_set_int(window_height, rect.g_h);
- nsoption_set_int(window_x, rect.g_x);
- nsoption_set_int(window_y, rect.g_y);
- nsoption_write((const char*)&options);
- }
-
-}
-
-static void __CDECL menu_debug_render(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- html_redraw_debug = !html_redraw_debug;
- if( input_window != NULL ) {
- if ( input_window->browser != NULL
- && input_window->browser->bw != NULL) {
- LGRECT rect;
- browser_get_rect( input_window, BR_CONTENT, &rect );
- browser_window_reformat(input_window->browser->bw, false,
- rect.g_w, rect.g_h );
- MenuIcheck(NULL, MAINMENU_M_DEBUG_RENDER,
- (html_redraw_debug) ? 1 : 0 );
- }
- }
-}
-
-static void __CDECL menu_fg_images(short item, short title, void *data)
-{
- nsoption_set_bool(foreground_images, !nsoption_bool(foreground_images));
- MenuIcheck( NULL, MAINMENU_M_FG_IMAGES,
- (nsoption_bool(foreground_images)) ? 1 : 0);
-}
-
-static void __CDECL menu_bg_images(short item, short title, void *data)
-{
- nsoption_set_bool(background_images, !nsoption_bool(background_images));
- MenuIcheck( NULL, MAINMENU_M_BG_IMAGES,
- (nsoption_bool(background_images)) ? 1 : 0);
-}
-
-static void __CDECL menu_back(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
- return;
- tb_back_click( input_window );
-}
-
-static void __CDECL menu_forward(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
- return;
- tb_forward_click( input_window );
-}
-
-static void __CDECL menu_home(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
- return;
- tb_home_click( input_window );
-}
-
-static void __CDECL menu_lhistory(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
- return;
-}
-
-static void __CDECL menu_ghistory(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- global_history_open();
-}
-
-static void __CDECL menu_add_bookmark(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if (input_window) {
- if( input_window->browser->bw->current_content != NULL ){
- atari_hotlist_add_page(
- nsurl_access(hlcache_handle_get_url(input_window->browser->bw->current_content)),
- NULL
- );
- }
- }
-}
-
-static void __CDECL menu_bookmarks(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- hotlist_open();
-}
-
-static void __CDECL menu_vlog(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- verbose_log = !verbose_log;
- MenuIcheck(NULL, MAINMENU_M_VLOG, (verbose_log) ? 1 : 0 );
-}
-
-static void __CDECL menu_help_content(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
-}
-
-/*
- Public deskmenu interface:
-*/
-
-
-/**
-* Setup & display an desktop menu.
-*/
-
-void deskmenu_init(void)
-{
- int i;
-
- h_gem_menu = get_tree(MAINMENU);
-
- // TODO: remove that call somehow...
-
- /* parse and update menu items: */
- i = 0;
- while( menu_evnt_tbl[i].rid != -1 ) {
- char * str = ObjcString(h_gem_menu, menu_evnt_tbl[i].rid, NULL );
- register_menu_str( &menu_evnt_tbl[i] );
- /* Update menu string if not null: */
- if( menu_evnt_tbl[i].menustr != NULL ){
- menu_text(h_gem_menu, menu_evnt_tbl[i].rid,
- menu_evnt_tbl[i].menustr);
- }
- i++;
- }
- deskmenu_update();
-
- menu_bar(h_gem_menu, 100);
- menu_bar(h_gem_menu, 1);
-
- // TODO: remove windom dependency.
- EvntAttach(NULL, MN_SELECTED, evnt_menu);
-}
-
-/**
-* Uninstall the desktop menu
-*/
-void deskmenu_destroy(void)
-{
- int i;
-
- /* Remove menu from desktop: */
- menu_bar(h_gem_menu, 0);
-
- /* Free modified menu titles: */
- i=0;
- while(menu_evnt_tbl[i].rid != -1) {
- if( menu_evnt_tbl[i].menustr != NULL )
- free(menu_evnt_tbl[i].menustr);
- i++;
- }
-}
-
-/**
-* Return the deskmenu AES OBJECT tree
-*/
-OBJECT * deskmenu_get_obj_tree(void)
-{
- return(h_gem_menu);
-}
-
-/**
-* Handle an menu item event
-*/
-int deskmenu_dispatch_item(short title, short item)
-{
- int i=0;
- int retval = 0;
- OBJECT * menu_root = deskmenu_get_obj_tree();
-
- menu_tnormal(menu_root, item, 1);
- menu_tnormal(menu_root, title, 1);
- menu_bar(menu_root, 1);
-
- // legacy code, is this sensible?:
- /*
- while( gw ) {
- window_set_focus( gw, WIDGET_NONE, NULL );
- gw = gw->next;
- }
- */
-
-
- while (menu_evnt_tbl[i].rid != -1) {
- if (menu_evnt_tbl[i].rid == item) {
- if (menu_evnt_tbl[i].menu_func != NULL) {
- menu_evnt_tbl[i].menu_func(item, title, NULL);
- }
- break;
- }
- i++;
- }
-
- return(retval);
-}
-
-/**
-* Handle an keypress (check for accelerator)
-*/
-int deskmenu_dispatch_keypress(unsigned short kcode, unsigned short kstate,
- unsigned short nkc)
-{
- char sascii;
- bool done = 0;
- int i = 0;
-
- sascii = keybd2ascii(kcode, K_LSHIFT);
-
- /* Iterate through the menu function table: */
- while( menu_evnt_tbl[i].rid != -1 && done == false) {
- if( kstate == menu_evnt_tbl[i].accel.mod
- && menu_evnt_tbl[i].accel.ascii != 0) {
- if( menu_evnt_tbl[i].accel.ascii == sascii) {
- deskmenu_dispatch_item(menu_evnt_tbl[i].title,
- menu_evnt_tbl[i].rid);
- done = true;
- break;
- }
- } else {
- /* the accel code hides in the keycode: */
- if( menu_evnt_tbl[i].accel.keycode != 0) {
- if( menu_evnt_tbl[i].accel.keycode == (nkc & 0xFF) &&
- kstate == menu_evnt_tbl[i].accel.mod) {
- deskmenu_dispatch_item(menu_evnt_tbl[i].title,
- menu_evnt_tbl[i].rid);
- done = true;
- break;
- }
- }
- }
- i++;
- }
- return((done==true) ? 1 : 0);
-}
-
-/**
-* Refresh the desk menu, reflecting netsurf current state.
-*/
-void deskmenu_update(void)
-{
- OBJECT * gem_menu = deskmenu_get_obj_tree();
-
- menu_icheck(gem_menu, MAINMENU_M_DEBUG_RENDER, (html_redraw_debug) ? 1 : 0);
- menu_icheck(gem_menu, MAINMENU_M_FG_IMAGES,
- (nsoption_bool(foreground_images)) ? 1 : 0);
- menu_icheck(gem_menu, MAINMENU_M_BG_IMAGES,
- (nsoption_bool(background_images)) ? 1 : 0);
-}
-
diff --git a/atari/deskmenu.h b/atari/deskmenu.h
deleted file mode 100644
index 6ab00dcc9..000000000
--- a/atari/deskmenu.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef DESKMENU_H_INCLUDED
-#define DESKMENU_H_INCLUDED
-
-void deskmenu_init(void);
-void deskmenu_destroy(void);
-int deskmenu_dispatch_item(short title, short item);
-int deskmenu_dispatch_keypress(unsigned short kcode, unsigned short kstate,
- unsigned short nkc);
-OBJECT * deskmenu_get_obj_tree(void);
-void deskmenu_update( void );
-
-#endif // DESKMENU_H_INCLUDED
diff --git a/atari/global_evnt.c b/atari/global_evnt.c
index e3a93a0e6..3b15af877 100755
--- a/atari/global_evnt.c
+++ b/atari/global_evnt.c
@@ -26,31 +26,379 @@
#include <windom.h>
#include "desktop/gui.h"
+#include "desktop/netsurf.h"
+#include "desktop/browser.h"
+#include "desktop/browser_private.h"
+#include "desktop/mouse.h"
+#include "desktop/textinput.h"
+#include "desktop/hotlist.h"
+#include "desktop/save_complete.h"
+#include "desktop/options.h"
#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/url.h"
-#include "atari/misc.h"
#include "atari/gui.h"
#include "atari/browser_win.h"
#include "atari/toolbar.h"
#include "atari/browser.h"
+#include "atari/hotlist.h"
+#include "atari/history.h"
+#include "atari/misc.h"
#include "atari/global_evnt.h"
+#include "atari/browser_win.h"
#include "atari/res/netsurf.rsh"
-#include "atari/deskmenu.h"
+#include "atari/search.h"
+#include "atari/findfile.h"
+#include "atari/settings.h"
#include "cflib.h"
extern struct gui_window *input_window;
+extern OBJECT * h_gem_menu;
extern int mouse_click_time[3];
extern int mouse_hold_start[3];
extern browser_mouse_state bmstate;
extern short last_drag_x;
extern short last_drag_y;
+extern bool html_redraw_debug;
+
+extern const char * option_homepage_url;
+extern int option_window_width;
+extern int option_window_height;
+extern int option_window_x;
+extern int option_window_y;
+extern char options[PATH_MAX];
+
+/* Zero based resource tree ids: */
+#define T_ABOUT 0
+#define T_FILE MAINMENU_T_FILE - MAINMENU_T_FILE + 1
+#define T_EDIT MAINMENU_T_EDIT - MAINMENU_T_FILE + 1
+#define T_VIEW MAINMENU_T_VIEW - MAINMENU_T_FILE + 1
+#define T_NAV MAINMENU_T_NAVIGATE - MAINMENU_T_FILE + 1
+#define T_UTIL MAINMENU_T_UTIL - MAINMENU_T_FILE + 1
+#define T_HELP MAINMENU_T_NAVIGATE - MAINMENU_T_FILE + 1
+/* Count of the above defines: */
+#define NUM_MENU_TITLES 7
/* Global event handlers: */
static void __CDECL global_evnt_apterm( WINDOW * win, short buff[8] );
+static void __CDECL global_evnt_menu( WINDOW * win, short buff[8] );
static void __CDECL global_evnt_m1( WINDOW * win, short buff[8] );
static void __CDECL global_evnt_keybd( WINDOW * win, short buff[8],void * data);
-void __CDECL global_evnt_apterm(WINDOW * win, short buff[8])
+/* Menu event handlers: */
+static void __CDECL menu_about(WINDOW *win, int item, int title, void *data);
+
+
+/* Menu event handlers: */
+static void __CDECL menu_about(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ char buf[PATH_MAX];
+ strcpy((char*)&buf, "file://");
+ strncat((char*)&buf, (char*)"./doc/README.TXT", PATH_MAX - (strlen("file://")+1) );
+ browser_window_create((char*)&buf, 0, 0, true, false);
+}
+
+static void __CDECL menu_new_win(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ browser_window_create(option_homepage_url, 0, 0, true, false);
+}
+
+static void __CDECL menu_open_url(WINDOW *win, int item, int title, void *data)
+{
+ struct gui_window * gw;
+ struct browser_window * bw ;
+ LOG(("%s", __FUNCTION__));
+
+ gw = input_window;
+ if( gw == NULL ) {
+ bw = browser_window_create("", 0, 0, true, false);
+ gw = bw->window;
+
+ }
+ /* Loose focus: */
+ window_set_focus( gw, WIDGET_NONE, NULL );
+
+ /* trigger on-focus event (select all text): */
+ window_set_focus( gw, URL_WIDGET, &gw->root->toolbar->url );
+
+ /* delete selection: */
+ tb_url_input( gw, NK_DEL );
+}
+
+static void __CDECL menu_open_file(WINDOW *win, int item, int title, void *data)
+{
+ struct gui_window * gw;
+ struct browser_window * bw ;
+
+ LOG(("%s", __FUNCTION__));
+
+ const char * filename = file_select( messages_get("OpenFile"), "" );
+ if( filename != NULL ){
+ char * url = local_file_to_url( filename );
+ if( url ){
+ bw = browser_window_create(url, NULL, NULL, true, false);
+ free( url );
+ }
+ }
+}
+
+static void __CDECL menu_close_win(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
+ return;
+ gui_window_destroy( input_window );
+}
+
+static void __CDECL menu_save_page(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ static bool init = true;
+ bool is_folder=false;
+ const char * path;
+
+ if( !input_window )
+ return;
+
+ if( init ){
+ init = false;
+ save_complete_init();
+ }
+
+ do {
+ // TODO: localize string
+ path = file_select("Select folder", "");
+ if (path)
+ is_folder = is_dir(path);
+ } while( !is_folder && path != NULL );
+
+ if( path != NULL ){
+ save_complete( input_window->browser->bw->current_content, path, NULL );
+ }
+
+}
+
+static void __CDECL menu_quit(WINDOW *win, int item, int title, void *data)
+{
+ short buff[8];
+ memset( &buff, 0, sizeof(short)*8 );
+ LOG(("%s", __FUNCTION__));
+ global_evnt_apterm( NULL, buff );
+}
+
+static void __CDECL menu_cut(WINDOW *win, int item, int title, void *data)
+{
+ if( input_window != NULL )
+ browser_window_key_press( input_window->browser->bw, KEY_CUT_SELECTION);
+}
+
+static void __CDECL menu_copy(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window != NULL )
+ browser_window_key_press( input_window->browser->bw, KEY_COPY_SELECTION);
+}
+
+static void __CDECL menu_paste(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window != NULL )
+ browser_window_key_press( input_window->browser->bw, KEY_PASTE);
+}
+
+static void __CDECL menu_find(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window != NULL )
+ open_browser_search( input_window );
+}
+
+static void __CDECL menu_choices(WINDOW *win, int item, int title, void *data)
+{
+ static WINDOW * settings_dlg = NULL;
+ LOG(("%s", __FUNCTION__));
+ settings_dlg = open_settings();
+}
+
+static void __CDECL menu_stop(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
+ return;
+ tb_stop_click( input_window );
+
+}
+
+static void __CDECL menu_reload(WINDOW *win, int item, int title, void *data)
+{
+ if( input_window == NULL)
+ return;
+ tb_reload_click( input_window );
+ LOG(("%s", __FUNCTION__));
+}
+
+static void __CDECL menu_toolbars(WINDOW *win, int item, int title, void *data)
+{
+ static int state = 0;
+ LOG(("%s", __FUNCTION__));
+ if( input_window != null && input_window->root->toolbar != null ){
+ state = !state;
+ tb_hide( input_window, state );
+ }
+}
+
+static void __CDECL menu_savewin(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if (input_window && input_window->browser) {
+ GRECT rect;
+ wind_get_grect(input_window->root->handle->handle, WF_CURRXYWH, &rect);
+ option_window_width = rect.g_w;
+ option_window_height = rect.g_h;
+ option_window_x = rect.g_x;
+ option_window_y = rect.g_y;
+ nsoption_set_int(window_width, rect.g_w);
+ nsoption_set_int(window_height, rect.g_h);
+ nsoption_set_int(window_x, rect.g_x);
+ nsoption_set_int(window_y, rect.g_y);
+ nsoption_write((const char*)&options);
+ }
+
+}
+
+static void __CDECL menu_debug_render(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ html_redraw_debug = !html_redraw_debug;
+ if( input_window != NULL ) {
+ if ( input_window->browser != NULL && input_window->browser->bw != NULL) {
+ LGRECT rect;
+ browser_get_rect( input_window, BR_CONTENT, &rect );
+ browser_window_reformat(input_window->browser->bw, false,
+ rect.g_w, rect.g_h );
+ MenuIcheck(NULL, MAINMENU_M_DEBUG_RENDER,
+ (html_redraw_debug) ? 1 : 0 );
+ }
+ }
+}
+
+static void __CDECL menu_fg_images(WINDOW *win, int item, int title, void *data)
+{
+ nsoption_set_bool(foreground_images, !nsoption_bool(foreground_images));
+ MenuIcheck( NULL, MAINMENU_M_FG_IMAGES, (nsoption_bool(foreground_images)) ? 1 : 0);
+}
+
+static void __CDECL menu_bg_images(WINDOW *win, int item, int title, void *data)
+{
+ nsoption_set_bool(background_images, !nsoption_bool(background_images));
+ MenuIcheck( NULL, MAINMENU_M_BG_IMAGES, (nsoption_bool(background_images)) ? 1 : 0);
+}
+
+static void __CDECL menu_back(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
+ return;
+ tb_back_click( input_window );
+}
+
+static void __CDECL menu_forward(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
+ return;
+ tb_forward_click( input_window );
+}
+
+static void __CDECL menu_home(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
+ return;
+ tb_home_click( input_window );
+}
+
+static void __CDECL menu_lhistory(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
+ return;
+}
+
+static void __CDECL menu_ghistory(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ global_history_open();
+}
+
+static void __CDECL menu_add_bookmark(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window ) {
+ if( input_window->browser->bw->current_content != NULL ){
+ atari_hotlist_add_page(
+ nsurl_access(hlcache_handle_get_url( input_window->browser->bw->current_content)),
+ NULL
+ );
+ }
+ }
+}
+
+static void __CDECL menu_bookmarks(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ hotlist_open();
+}
+
+static void __CDECL menu_vlog(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ verbose_log = !verbose_log;
+ MenuIcheck(NULL, MAINMENU_M_VLOG, (verbose_log) ? 1 : 0 );
+}
+
+static void __CDECL menu_help_content(WINDOW *win, int item, int title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+}
+
+static struct s_menu_item_evnt menu_evnt_tbl[] =
+{
+ {T_ABOUT,MAINMENU_M_ABOUT, menu_about, {0,0,0}, NULL },
+ {T_FILE, MAINMENU_M_NEWWIN, menu_new_win, {0,0,0}, NULL},
+ {T_FILE, MAINMENU_M_OPENURL, menu_open_url, {'G',0,K_CTRL}, NULL},
+ {T_FILE, MAINMENU_M_OPENFILE, menu_open_file, {'O',0,K_CTRL}, NULL},
+ {T_FILE, MAINMENU_M_CLOSEWIN, menu_close_win, {0,0,0}, NULL},
+ {T_FILE, MAINMENU_M_SAVEPAGE, menu_save_page, {0,NK_F3,0}, NULL},
+ {T_FILE, MAINMENU_M_QUIT, menu_quit, {'Q',0,K_CTRL}, NULL},
+ {T_EDIT, MAINMENU_M_CUT, menu_cut, {'X',0,K_CTRL}, NULL},
+ {T_EDIT, MAINMENU_M_COPY, menu_copy, {'C',0,K_CTRL}, NULL},
+ {T_EDIT, MAINMENU_M_PASTE, menu_paste, {'V',0,K_CTRL}, NULL},
+ {T_EDIT, MAINMENU_M_FIND, menu_find, {0,NK_F4,0}, NULL},
+ {T_VIEW, MAINMENU_M_RELOAD, menu_reload, {0,NK_F5,0}, NULL},
+ {T_VIEW, MAINMENU_M_TOOLBARS, menu_toolbars, {0,NK_F1,K_CTRL}, NULL},
+ {T_VIEW, MAINMENU_M_SAVEWIN, menu_savewin, {0,0,0}, NULL},
+ {T_VIEW, MAINMENU_M_DEBUG_RENDER, menu_debug_render, {0,0,0}, NULL},
+ {T_VIEW, MAINMENU_M_FG_IMAGES, menu_fg_images, {0,0,0}, NULL},
+ {T_VIEW, MAINMENU_M_BG_IMAGES, menu_bg_images, {0,0,0}, NULL},
+ {T_VIEW, MAINMENU_M_STOP, menu_stop, {0,NK_ESC,K_ALT}, NULL},
+ {T_NAV, MAINMENU_M_BACK, menu_back, {0,NK_LEFT,K_ALT}, NULL},
+ {T_NAV, MAINMENU_M_FORWARD, menu_forward, {0,NK_RIGHT,K_ALT}, NULL},
+ {T_NAV, MAINMENU_M_HOME, menu_home, {0,NK_CLRHOME,0}, NULL},
+ {T_UTIL, MAINMENU_M_LHISTORY,menu_lhistory, {0,NK_F7,0}, NULL},
+ {T_UTIL, MAINMENU_M_GHISTORY, menu_ghistory, {0,NK_F7,K_CTRL}, NULL},
+ {T_UTIL, MAINMENU_M_ADD_BOOKMARK, menu_add_bookmark, {'D',0,K_CTRL}, NULL},
+ {T_UTIL, MAINMENU_M_BOOKMARKS, menu_bookmarks, {0,NK_F6,0}, NULL},
+ {T_UTIL, MAINMENU_M_CHOICES, menu_choices, {0,0,0}, NULL},
+ {T_UTIL, MAINMENU_M_VLOG, menu_vlog, {'V',0,K_ALT}, NULL},
+ {T_HELP, MAINMENU_M_HELP_CONTENT, menu_help_content, {0,NK_F1,0}, NULL},
+ {T_HELP, -1, NULL,{0,0,0}, NULL }
+};
+
+void __CDECL global_evnt_apterm( WINDOW * win, short buff[8] )
{
int i = 0;
LOG((""));
@@ -58,7 +406,7 @@ void __CDECL global_evnt_apterm(WINDOW * win, short buff[8])
}
-static void __CDECL global_evnt_m1(WINDOW * win, short buff[8])
+static void __CDECL global_evnt_m1( WINDOW * win, short buff[8] )
{
struct gui_window * gw = input_window;
static bool prev_url = false;
@@ -68,23 +416,23 @@ static void __CDECL global_evnt_m1(WINDOW * win, short buff[8])
LGRECT urlbox, bwbox, sbbox;
int nx, ny;
- if (gw == NULL)
+ if( gw == NULL)
return;
- if (prev_x == evnt.mx && prev_y == evnt.my) {
+ if( prev_x == evnt.mx && prev_y == evnt.my ){
return;
}
short ghandle = wind_find( evnt.mx, evnt.my );
- if (input_window->root->handle->handle == ghandle) {
+ if( input_window->root->handle->handle == ghandle ){
// The window found at x,y is an gui_window
// and it's the input window.
browser_get_rect( gw, BR_CONTENT, &bwbox );
- if (evnt.mx > bwbox.g_x && evnt.mx < bwbox.g_x + bwbox.g_w &&
- evnt.my > bwbox.g_y && evnt.my < bwbox.g_y + bwbox.g_h) {
+ if( evnt.mx > bwbox.g_x && evnt.mx < bwbox.g_x + bwbox.g_w &&
+ evnt.my > bwbox.g_y && evnt.my < bwbox.g_y + bwbox.g_h ){
within = true;
browser_window_mouse_track(
input_window->browser->bw,
@@ -94,7 +442,7 @@ static void __CDECL global_evnt_m1(WINDOW * win, short buff[8])
);
}
- if (gw->root->toolbar && within == false) {
+ if( gw->root->toolbar && within == false ) {
mt_CompGetLGrect(&app, gw->root->toolbar->url.comp, WF_WORKXYWH, &urlbox);
if( (evnt.mx > urlbox.g_x && evnt.mx < urlbox.g_x + urlbox.g_w ) &&
(evnt.my > urlbox.g_y && evnt.my < + urlbox.g_y + urlbox.g_h )) {
@@ -118,6 +466,7 @@ static void __CDECL global_evnt_m1(WINDOW * win, short buff[8])
void __CDECL global_evnt_keybd( WINDOW * win, short buff[8], void * data)
{
+ char sascii;
long kstate = 0;
long kcode = 0;
unsigned short nkc = 0;
@@ -151,23 +500,178 @@ void __CDECL global_evnt_keybd( WINDOW * win, short buff[8], void * data)
gw_tmp = gw_tmp->next;
}
}
- }
- if(!done)
- deskmenu_dispatch_keypress(evnt.keybd, kstate, nkc);
+ }
+ sascii = keybd2ascii( evnt.keybd, K_LSHIFT);
+ while( menu_evnt_tbl[i].rid != -1 && done == false) {
+ if( kstate == menu_evnt_tbl[i].accel.mod && menu_evnt_tbl[i].accel.ascii != 0) {
+ if( menu_evnt_tbl[i].accel.ascii == sascii) {
+ menu_evnt_tbl[i].menu_func( NULL, menu_evnt_tbl[i].rid, MAINMENU, buff);
+ done = true;
+ break;
+ }
+ } else {
+ /* the accel code hides in the keycode: */
+ if( menu_evnt_tbl[i].accel.keycode != 0) {
+ if( menu_evnt_tbl[i].accel.keycode == (nkc & 0xFF) &&
+ kstate == menu_evnt_tbl[i].accel.mod &&
+ menu_evnt_tbl[i].menu_func != NULL) {
+ menu_evnt_tbl[i].menu_func( NULL,
+ menu_evnt_tbl[i].rid,
+ MAINMENU, buff
+ );
+ done = true;
+ break;
+ }
+ }
+ }
+ i++;
+ }
}
+/*
+ Parse encoded menu key shortcut
+
+ The format is:
+
+ "[" - marks start of the shortcut
+ "@,^,<" - If the keyshortcut is only valid
+ with modifier keys, one of these characters must directly
+ follow the start mark.
+ Meaning:
+ @ -> Alternate
+ ^ -> Control
+ "#" - keycode or ascii character.
+ The value is handled as keycode if the character value
+ is <= 28 ( Atari chracter table )
+ or if it is interpreted as function key string.
+ (strings: F1 - F10)
+
+*/
+static void register_menu_str( struct s_menu_item_evnt * mi )
+{
+ char * str = ObjcString( h_gem_menu, mi->rid, NULL );
+ int l = strlen(str);
+ int i = l;
+ int x = -1;
+ struct s_accelerator * accel = &mi->accel;
+
+
+
+ while( i>2 ){
+ if( str[i] == '['){
+ x = i;
+ break;
+ }
+ i--;
+ }
+ if( x > -1 ){
+ mi->menustr = malloc( l+1 );
+ strcpy(mi->menustr, str );
+ mi->menustr[x]=' ';
+ x++;
+ if( str[x] == '@' ){
+ accel->mod = K_ALT;
+ mi->menustr[x] = 0x07;
+ x++;
+ }
+ else if( str[x] == '^' ) {
+ accel->mod = K_CTRL;
+ x++;
+ }
+ if( str[x] <= 28 ){
+ // parse symbol
+ unsigned short keycode=0;
+ switch( str[x] ){
+ case 0x03:
+ accel->keycode = NK_RIGHT;
+ break;
+ case 0x04:
+ accel->keycode = NK_LEFT;
+ break;
+ case 0x1B:
+ accel->keycode = NK_ESC;
+ break;
+ default:
+ break;
+ }
+ } else {
+ if(str[x] == 'F' && ( str[x+1] >= '1' && str[x+1] <= '9') ){
+ // parse function key
+ short fkey = atoi( &str[x+1] );
+ if( (fkey >= 0) && (fkey <= 10) ){
+ accel->keycode = NK_F1 - 1 + fkey;
+ }
+ } else {
+ accel->ascii = str[x];
+ }
+ }
+ }
+}
+
+
+void __CDECL global_evnt_menu( WINDOW * win, short buff[8] )
+{
+ int title = buff[ 3];
+ INT16 x,y;
+ char *str;
+ struct gui_window * gw = window_list;
+ int i=0;
+ MenuTnormal( NULL, title, 1);
+ while( gw ) {
+ window_set_focus( gw, WIDGET_NONE, NULL );
+ gw = gw->next;
+ }
+ while( menu_evnt_tbl[i].rid != -1) {
+ if( menu_evnt_tbl[i].rid == buff[4] ) {
+ menu_evnt_tbl[i].menu_func(win, (int)buff[4], (int)buff[3], NULL );
+ break;
+ }
+ i++;
+ }
+}
+
+void main_menu_update( void )
+{
+ MenuIcheck( NULL, MAINMENU_M_DEBUG_RENDER, (html_redraw_debug) ? 1 : 0);
+ MenuIcheck( NULL, MAINMENU_M_FG_IMAGES, (nsoption_bool(foreground_images)) ? 1 : 0);
+ MenuIcheck( NULL, MAINMENU_M_BG_IMAGES, (nsoption_bool(background_images)) ? 1 : 0);
+}
+
/* Bind global and menu events to event handler functions, create accelerators */
void bind_global_events( void )
{
+ int i, len;
+ int maxlen[NUM_MENU_TITLES]={0};
+ char * m, *u, *t;
+ char spare[128];
memset( (void*)&evnt_data, 0, sizeof(struct s_evnt_data) );
EvntDataAttach( NULL, WM_XKEYBD, global_evnt_keybd, (void*)&evnt_data );
- EvntAttach( NULL, AP_TERM, global_evnt_apterm );
+ EvntAttach( NULL, AP_TERM, global_evnt_apterm );
+ EvntAttach( NULL, MN_SELECTED, global_evnt_menu );
EvntAttach( NULL, WM_XM1, global_evnt_m1 );
+
+ /* parse and update menu items: */
+ i = 0;
+ while( menu_evnt_tbl[i].rid != -1 ) {
+ char * str = ObjcString( h_gem_menu, menu_evnt_tbl[i].rid, NULL );
+ register_menu_str( &menu_evnt_tbl[i] );
+ if( menu_evnt_tbl[i].menustr != NULL ){
+ MenuText( NULL, menu_evnt_tbl[i].rid, menu_evnt_tbl[i].menustr );
+ }
+ i++;
+ }
+ main_menu_update();
}
void unbind_global_events( void )
{
-
+ int i;
+ i=0;
+ while(menu_evnt_tbl[i].rid != -1) {
+ if( menu_evnt_tbl[i].menustr != NULL )
+ free(menu_evnt_tbl[i].menustr);
+ i++;
+ }
}
diff --git a/atari/global_evnt.h b/atari/global_evnt.h
index 76e73fc6b..1e13264a2 100755
--- a/atari/global_evnt.h
+++ b/atari/global_evnt.h
@@ -18,8 +18,6 @@
#ifndef NS_ATARI_GLOBAL_EVNT_H
#define NS_ATARI_GLOBAL_EVNT_H
-
-#include <stdbool.h>
struct s_keybd_evnt_data
{
@@ -34,14 +32,31 @@ struct s_evnt_data
} u;
};
-struct s_evnt_data evnt_data;
+struct s_evnt_data evnt_data;
+
+struct s_accelerator
+{
+ char ascii; /* either ascii or */
+ long keycode; /* normalised keycode is valid */
+ short mod; /* shift / ctrl etc */
+};
+
+typedef void __CDECL (*menu_evnt_func)(WINDOW * win, int item, int title, void * data);
+struct s_menu_item_evnt {
+ short title; /* to which menu this item belongs */
+ short rid; /* resource ID */
+ menu_evnt_func menu_func; /* click handler */
+ struct s_accelerator accel; /* accelerator info */
+ char * menustr;
+};
/*
- Global event handlers
+ Global & Menu event handlers
*/
void bind_global_events( void );
void unbind_global_events( void );
+void main_menu_update( void );
#endif
diff --git a/atari/gui.c b/atari/gui.c
index fdcb75275..c2158e05e 100755
--- a/atari/gui.c
+++ b/atari/gui.c
@@ -73,8 +73,7 @@
#include "atari/plot/plot.h"
#include "atari/clipboard.h"
#include "atari/osspec.h"
-#include "atari/search.h"
-#include "atari/deskmenu.h"
+#include "atari/search.h"
#include "cflib.h"
#define TODO() (0)/*printf("%s Unimplemented!\n", __FUNCTION__)*/
@@ -83,8 +82,9 @@ char *tmp_clipboard;
struct gui_window *input_window = NULL;
struct gui_window *window_list = NULL;
void * h_gem_rsrc;
-//OBJECT **rsc_trindex;
-//short rsc_ntree;
+OBJECT * h_gem_menu;
+OBJECT **rsc_trindex;
+short rsc_ntree;
long next_poll;
bool rendering = false;
@@ -789,8 +789,6 @@ void gui_quit(void)
struct gui_window * gw = window_list;
struct gui_window * tmp = window_list;
-
- unbind_global_events();
while( gw ) {
tmp = gw->next;
@@ -804,8 +802,10 @@ void gui_quit(void)
urldb_save_cookies(nsoption_charp(cookie_file));
urldb_save(nsoption_charp(url_file));
-
- deskmenu_destroy();
+
+ RsrcXtype( 0, rsc_trindex, rsc_ntree);
+ unbind_global_events();
+ MenuBar( h_gem_menu , 0 );
if( h_gem_rsrc != NULL ) {
RsrcXfree(h_gem_rsrc );
}
@@ -885,8 +885,7 @@ process_cmdline(int argc, char** argv)
return true;
}
-static inline void create_cursor(int flags, short mode, void * form,
- MFORM_EX * m)
+static inline void create_cursor(int flags, short mode, void * form, MFORM_EX * m)
{
m->flags = flags;
m->number = mode;
@@ -929,18 +928,16 @@ static void gui_init(int argc, char** argv)
OBJECT * cursors;
atari_find_resource(buf, "netsurf.rsc", "./res/netsurf.rsc");
- LOG(("%s ", (char*)&buf));
- if (rsrc_load(buf)==0) {
- die("Uable to open GEM Resource file!");
- }
- //h_gem_rsrc = RsrcXload( (char*) &buf );
+ LOG(("%s ", (char*)&buf));
+ h_gem_rsrc = RsrcXload( (char*) &buf );
- //if( !h_gem_rsrc )
- // die("Uable to open GEM Resource file!");
- //rsc_trindex = RsrcGhdr(h_gem_rsrc)->trindex;
- //rsc_ntree = RsrcGhdr(h_gem_rsrc)->ntree;
+ if( !h_gem_rsrc )
+ die("Uable to open GEM Resource file!");
+ rsc_trindex = RsrcGhdr(h_gem_rsrc)->trindex;
+ rsc_ntree = RsrcGhdr(h_gem_rsrc)->ntree;
- //RsrcXtype( RSRC_XTYPE, rsc_trindex, rsc_ntree);
+ RsrcGaddr( h_gem_rsrc, R_TREE, MAINMENU , &h_gem_menu );
+ RsrcXtype( RSRC_XTYPE, rsc_trindex, rsc_ntree);
create_cursor(0, POINT_HAND, NULL, &gem_cursors.hand );
create_cursor(0, TEXT_CRSR, NULL, &gem_cursors.ibeam );
@@ -984,19 +981,19 @@ static void gui_init(int argc, char** argv)
die("unable to process command line.\n");
nkc_init();
- plot_init(nsoption_charp(atari_font_driver));
- tree_set_icon_dir( nsoption_charp(tree_icons_path) );
+ plot_init(nsoption_charp(atari_font_driver));
}
static char *theapp = (char*)"NetSurf";
static void gui_init2(int argc, char** argv)
{
- deskmenu_init();
+ MenuBar( h_gem_menu , 1 );
+ bind_global_events();
menu_register( -1, theapp);
if (sys_type() & (SYS_MAGIC|SYS_NAES|SYS_XAAES)) {
menu_register( _AESapid, (char*)" NetSurf ");
- }
- bind_global_events();
+ }
+ tree_set_icon_dir( nsoption_charp(tree_icons_path) );
global_history_init();
hotlist_init();
toolbar_init();
diff --git a/atari/misc.c b/atari/misc.c
index e5b0dc137..8b745fd2f 100755
--- a/atari/misc.c
+++ b/atari/misc.c
@@ -273,8 +273,7 @@ char *get_rsc_string( int idx) {
OBJECT *get_tree( int idx) {
OBJECT *tree;
- rsrc_gaddr(R_TREE, idx, &tree);
- //RsrcGaddr( h_gem_rsrc, R_TREE, idx, &tree);
+ RsrcGaddr( h_gem_rsrc, R_TREE, idx, &tree);
return tree;
}
diff --git a/atari/settings.c b/atari/settings.c
index 25e0c0fe1..8143cdcc6 100644
--- a/atari/settings.c
+++ b/atari/settings.c
@@ -31,8 +31,7 @@
#include "desktop/plot_style.h"
#include "atari/res/netsurf.rsh"
#include "atari/settings.h"
-//#include "atari/global_evnt.h"
-#include "atari/deskmenu.h"
+#include "atari/global_evnt.h"
#include "atari/misc.h"
#include "atari/plot/plot.h"
#include "atari/bitmap.h"
@@ -233,7 +232,7 @@ saveform( WINDOW *win, int index, int unused, void *unused2)
close_settings();
ObjcChange( OC_FORM, win, index, NORMAL, TRUE);
form_alert(1, "[1][Some options require an netsurf restart!][OK]");
- deskmenu_update();
+ main_menu_update();
}
static void __CDECL clear_history( WINDOW *win, int index, int unused,
diff --git a/javascript/jsapi.h b/javascript/jsapi.h
index 8b7fe51eb..6b0f1124d 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 6400217c8..6d069b973 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);
diff --git a/javascript/jsapi/console.bnd b/javascript/jsapi/console.bnd
index 6aef9dcb8..7c3484529 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/dom.bnd b/javascript/jsapi/dom.bnd
index 3a355256f..89d0d8449 100644
--- a/javascript/jsapi/dom.bnd
+++ b/javascript/jsapi/dom.bnd
@@ -4,6 +4,51 @@ webidlfile "dom.idl";
/* interface Node members */
+getter nodeType %{
+ dom_exception exc;
+ dom_node_type node_type;
+
+ exc = dom_node_get_node_type(private->node, &node_type);
+ if (exc != DOM_NO_ERR) {
+ return JS_FALSE;
+ }
+ jsret = node_type;
+%}
+
+
+getter nodeName %{
+ dom_exception exc;
+ dom_string *name;
+
+ exc = dom_node_get_node_name(private->node, &name);
+ if (exc != DOM_NO_ERR) {
+ return JS_FALSE;
+ }
+
+ if (name != NULL) {
+ jsret = JS_NewStringCopyN(cx,
+ dom_string_data(name),
+ dom_string_length(name));
+ dom_string_unref(name);
+ }
+%}
+
+getter nodeValue %{
+ dom_exception exc;
+ dom_string *value;
+
+ exc = dom_node_get_node_value(private->node, &value);
+ if (exc != DOM_NO_ERR) {
+ return JS_FALSE;
+ }
+
+ if (value != NULL) {
+ jsret = JS_NewStringCopyN(cx,
+ dom_string_data(value),
+ dom_string_length(value));
+ dom_string_unref(value);
+ }
+%}
getter textContent %{
dom_exception exc;
diff --git a/javascript/jsapi/htmlelement.bnd b/javascript/jsapi/htmlelement.bnd
index 18e343f68..71bb31bc1 100644
--- a/javascript/jsapi/htmlelement.bnd
+++ b/javascript/jsapi/htmlelement.bnd
@@ -20,7 +20,7 @@ hdrcomment " http://www.opensource.org/licenses/mit-license";
preamble %{
#include <dom/dom.h>
-
+
#include "utils/config.h"
#include "utils/log.h"
@@ -35,23 +35,182 @@ binding htmlelement {
interface HTMLElement; /* Web IDL interface to generate */
private "dom_element *" node;
- private "struct html_content *" htmlc;
+ private "struct html_content *" htmlc;
}
api finalise %{
- if (private != NULL) {
- dom_node_unref(private->node);
- }
+ if (private != NULL) {
+ dom_node_unref(private->node);
+ }
%}
+/* interface Element in dom idl */
+
+/*
+ * DOM 3 has these as the element traversal extension
+ *
+ * http://dev.w3.org/2006/webapi/ElementTraversal/publish/ElementTraversal.html
+ */
+
getter firstElementChild %{
+ dom_node *element;
+ dom_exception exc;
+ dom_node_type node_type;
+ dom_node *next_node;
+
+ exc = dom_node_get_first_child(private->node, &element);
+ if (exc != DOM_NO_ERR) {
+ return JS_FALSE;
+ }
+
+ while (element != NULL) {
+ exc = dom_node_get_node_type(element, &node_type);
+ if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) {
+ /* found it */
+ jsret = jsapi_new_HTMLElement(cx,
+ NULL,
+ NULL,
+ (dom_element *)element,
+ private->htmlc);
+ break;
+ }
+
+ exc = dom_node_get_next_sibling(element, &next_node);
+ dom_node_unref(element);
+ if (exc == DOM_NO_ERR) {
+ element = next_node;
+ } else {
+ element = NULL;
+ }
+
+ }
+
+
%}
getter lastElementChild %{
+ dom_node *element;
+ dom_exception exc;
+ dom_node_type node_type;
+ dom_node *sib_node;
+
+ exc = dom_node_get_last_child(private->node, &element);
+ if (exc != DOM_NO_ERR) {
+ return JS_FALSE;
+ }
+
+ while (element != NULL) {
+ exc = dom_node_get_node_type(element, &node_type);
+ if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) {
+ /* found it */
+ jsret = jsapi_new_HTMLElement(cx,
+ NULL,
+ NULL,
+ (dom_element *)element,
+ private->htmlc);
+ break;
+ }
+
+ exc = dom_node_get_previous_sibling(element, &sib_node);
+ dom_node_unref(element);
+ if (exc == DOM_NO_ERR) {
+ element = sib_node;
+ } else {
+ element = NULL;
+ }
+
+ }
%}
getter previousElementSibling %{
- %}
+ dom_node *element;
+ dom_exception exc;
+ dom_node_type node_type;
+ dom_node *sib_node;
+
+ exc = dom_node_get_previous_sibling(private->node, &element);
+ if (exc != DOM_NO_ERR) {
+ return JS_FALSE;
+ }
+
+ while (element != NULL) {
+ exc = dom_node_get_node_type(element, &node_type);
+ if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) {
+ /* found it */
+ jsret = jsapi_new_HTMLElement(cx,
+ NULL,
+ NULL,
+ (dom_element *)element,
+ private->htmlc);
+ break;
+ }
+
+ exc = dom_node_get_previous_sibling(element, &sib_node);
+ dom_node_unref(element);
+ if (exc == DOM_NO_ERR) {
+ element = sib_node;
+ } else {
+ element = NULL;
+ }
+ }
+%}
getter nextElementSibling %{
- %}
+ dom_node *element;
+ dom_exception exc;
+ dom_node_type node_type;
+ dom_node *sib_node;
+
+ exc = dom_node_get_next_sibling(private->node, &element);
+ if (exc != DOM_NO_ERR) {
+ return JS_FALSE;
+ }
+
+ while (element != NULL) {
+ exc = dom_node_get_node_type(element, &node_type);
+ if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) {
+ /* found it */
+ jsret = jsapi_new_HTMLElement(cx,
+ NULL,
+ NULL,
+ (dom_element *)element,
+ private->htmlc);
+ break;
+ }
+
+ exc = dom_node_get_next_sibling(element, &sib_node);
+ dom_node_unref(element);
+ if (exc == DOM_NO_ERR) {
+ element = sib_node;
+ } else {
+ element = NULL;
+ }
+ }
+%}
+
+getter childElementCount %{
+ dom_node *element;
+ dom_exception exc;
+ dom_node_type node_type;
+ dom_node *next_node;
+
+ exc = dom_node_get_first_child(private->node, &element);
+ if (exc != DOM_NO_ERR) {
+ return JS_FALSE;
+ }
+
+ while (element != NULL) {
+ exc = dom_node_get_node_type(element, &node_type);
+ if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) {
+ jsret += 1;
+ }
+
+ exc = dom_node_get_next_sibling(element, &next_node);
+ dom_node_unref(element);
+ if (exc == DOM_NO_ERR) {
+ element = next_node;
+ } else {
+ element = NULL;
+ }
+ }
+%}
diff --git a/javascript/jsapi/location.bnd b/javascript/jsapi/location.bnd
index c83fe46e3..32e38da93 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@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 767b94f1b..e439980b9 100644
--- a/javascript/jsapi/window.bnd
+++ b/javascript/jsapi/window.bnd
@@ -23,19 +23,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 %{
@@ -166,7 +162,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 +199,11 @@ getter window %{
getter self %{
jsret = obj;
%}
+
+getter EventHandler %{
+ JSLOG("propname:%s %s", propname, JS_GetTypeName(cx, JS_TypeOfValue(cx, propname_jsval)));
+%}
+
+setter EventHandler %{
+ JSLOG("propname:%s %s", propname, JS_GetTypeName(cx, JS_TypeOfValue(cx, propname_jsval)));
+%}
diff --git a/render/html.c b/render/html.c
index f6e3fda56..6c6dcdfca 100644
--- a/render/html.c
+++ b/render/html.c
@@ -2622,9 +2622,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/test/js/dom-document-enumerate.html b/test/js/dom-document-enumerate.html
new file mode 100644
index 000000000..18146ab8a
--- /dev/null
+++ b/test/js/dom-document-enumerate.html
@@ -0,0 +1,26 @@
+<html>
+<head>
+<title>document interface enumeration</title>
+<link rel="stylesheet" type="text/css" href="tst.css">
+</head>
+<body>
+<h1>Document interface enumeration</h1>
+
+<script>
+function output(x,y) {
+ document.body.appendChild(document.createTextNode(x));
+ document.body.appendChild(document.createTextNode("("));
+ if (y != undefined) {
+ document.body.appendChild(document.createTextNode(y.length));
+ }
+ document.body.appendChild(document.createTextNode(") = "));
+ document.body.appendChild(document.createTextNode(y));
+ document.body.appendChild(document.createElement('br'));
+}
+
+for(var key in document) {
+ output(key, document[key]);
+}
+</script>
+</body>
+</html>
diff --git a/test/js/dom-element-childElementCount.html b/test/js/dom-element-childElementCount.html
new file mode 100644
index 000000000..ec4b7f89a
--- /dev/null
+++ b/test/js/dom-element-childElementCount.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="tst.css">
+<title>DOM childElementCount reference</title>
+</head>
+<body>
+<h1>DOM childElementCount reference</h1>
+<p><b>head.childElementCount:</b> <script>document.write(document.head.childElementCount);</script></p>
+<p><b>body.childElementCount:</b> <script>document.write(document.body.childElementCount);</script></p>
+</body>
+</html>
diff --git a/test/js/doc-dom1.html b/test/js/dom-element-firstElementChild.html
index 2d7762d00..2d7762d00 100644
--- a/test/js/doc-dom1.html
+++ b/test/js/dom-element-firstElementChild.html
diff --git a/test/js/dom-element-lastElementChild.html b/test/js/dom-element-lastElementChild.html
new file mode 100644
index 000000000..e4e9f11cb
--- /dev/null
+++ b/test/js/dom-element-lastElementChild.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="tst.css">
+<title>DOM lastElementChild reference</title>
+</head>
+<body>
+<h1>DOM lastElementChild reference</h1>
+<p><b>head.lastElementChild:</b> <script>document.write(document.head.lastElementChild.textContent);</script></p>
+<p><b>body.lastElementChild:</b> <script>document.write(document.body.lastElementChild.textContent);</script></p>
+</body>
+</html>
diff --git a/test/js/dom-element-next_prev_ElementSibling.html b/test/js/dom-element-next_prev_ElementSibling.html
new file mode 100644
index 000000000..85263cc17
--- /dev/null
+++ b/test/js/dom-element-next_prev_ElementSibling.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+<title>DOM previousElementSibling and nextElementSibling reference</title>
+<!-- comment node should be skipped -->
+<link rel="stylesheet" type="text/css" href="tst.css">
+</head>
+<body>
+<h1>DOM previousElementSibling and nextElementSibling reference</h1>
+<!-- comment node should be skipped -->
+<p><b>head.lastElementChild.previousElementSibling:</b> <script>document.write(document.head.lastElementChild.previousElementSibling.textContent);</script></p>
+<!-- comment node should be skipped -->
+<p><b>body.firstElementChild.nextElementSibling:</b> <script>document.write(document.body.firstElementChild.nextElementSibling.textContent);</script></p>
+</body>
+</html>
diff --git a/test/js/event-onload.html b/test/js/event-onload.html
new file mode 100644
index 000000000..aede985a4
--- /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 f02c4df32..7a17c95d3 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>
@@ -24,7 +25,10 @@
<h2>DOM tests</h2>
<h3>Reference method tests</h3>
<ul>
-<li><a href="doc-dom1.html">firstElementChild</a></li>
+<li><a href="dom-element-firstElementChild.html">firstElementChild</a></li>
+<li><a href="dom-element-lastElementChild.html">lastElementChild</a></li>
+<li><a href="dom-element-next_prev_ElementSibling.html">previousElementSibling nextElementSibling</a></li>
+<li><a href="dom-element-childElementCount.html">childElementCount</a></li>
<li><a href="doc-dom2.html">getElementById</a></li>
<li><a href="dom-getElementsByTagName.html">getElementsByTagName</a></li>
@@ -33,6 +37,7 @@
<ul>
<li><a href="dom-node-enumerate.html">Node element interface</a></li>
<li><a href="dom-body-enumerate.html">Body element interface</a></li>
+<li><a href="dom-document-enumerate.html">Document interface</a></li>
</ul>
<h3>Document element specific</h3>
<ul>
diff --git a/test/js/location-enumerate.html b/test/js/location-enumerate.html
new file mode 100644
index 000000000..d455c7535
--- /dev/null
+++ b/test/js/location-enumerate.html
@@ -0,0 +1,26 @@
+<html>
+<head>
+<title>location interface enumeration</title>
+<link rel="stylesheet" type="text/css" href="tst.css">
+</head>
+<body>
+<h1>location interface enumeration</h1>
+
+<script>
+function output(x,y) {
+ document.body.appendChild(document.createTextNode(x));
+ document.body.appendChild(document.createTextNode("("));
+ if (y != undefined) {
+ document.body.appendChild(document.createTextNode(y.length));
+ }
+ document.body.appendChild(document.createTextNode(") = "));
+ document.body.appendChild(document.createTextNode(y));
+ document.body.appendChild(document.createElement('br'));
+}
+
+for(var key in location) {
+ output(key, location[key]);
+}
+</script>
+</body>
+</html>
diff --git a/test/js/window-enumerate.html b/test/js/window-enumerate.html
new file mode 100644
index 000000000..92a3111ae
--- /dev/null
+++ b/test/js/window-enumerate.html
@@ -0,0 +1,26 @@
+<html>
+<head>
+<title>window interface enumeration</title>
+<link rel="stylesheet" type="text/css" href="tst.css">
+</head>
+<body>
+<h1>window interface enumeration</h1>
+
+<script>
+function output(x,y) {
+ document.body.appendChild(document.createTextNode(x));
+ document.body.appendChild(document.createTextNode("("));
+ if (y != undefined) {
+ document.body.appendChild(document.createTextNode(y.length));
+ }
+ document.body.appendChild(document.createTextNode(") = "));
+ document.body.appendChild(document.createTextNode(y));
+ document.body.appendChild(document.createElement('br'));
+}
+
+for(var key in window) {
+ output(key, window[key]);
+}
+</script>
+</body>
+</html>