diff --git a/configure.in b/configure.in index 0e1682c7..caa1e9e4 100644 --- a/configure.in +++ b/configure.in @@ -571,54 +571,6 @@ if test "$CONFIG_OS_WIN32" = yes; then EL_CONFIG_OS_WIN32 fi -# =================================================================== -# Check for SEE (Simple Ecmascript Engine) -# =================================================================== -AC_ARG_WITH(see, [ --with-see enable Simple Ecmascript Engine (SEE) support], - [ if test "x$withval" != xno; then enable_see=yes; fi ]) - -# The following is probably bad, ugly and so on. Stolen from Guile's (1.4) -# GUILE_FLAGS but I really don't want to require people to have Guile in order -# to compile CVS. Also, the macro seems to be really stupid regarding searching -# for Guile in $PATH etc. --pasky - -CONFIG_ECMASCRIPT_SEE=no - -if test "$enable_see" = "yes"; then - if test -d "$withval"; then - SEE_PATH="$withval:$PATH" - else - SEE_PATH="$PATH" - fi - - AC_PATH_PROG(SEE_CONFIG, libsee-config, no, $SEE_PATH) - AC_MSG_CHECKING([for SEE (2.0.1131 or later)]) - if test "$SEE_CONFIG" != no; then - EL_SAVE_FLAGS - SEE_LIBS="`$SEE_CONFIG --libs`" - SEE_CFLAGS="`$SEE_CONFIG --cppflags`" - CPPFLAGS="$SEE_CFLAGS $CPPFLAGS" - LIBS="$SEE_LIBS $LIBS_X" - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[#if SEE_VERSION_API_MAJOR < 2 - #error SEE too old - #endif - ]])],[cf_result=yes],[cf_result=no]) - EL_RESTORE_FLAGS - if test "$cf_result" = yes; then - LIBS="$SEE_LIBS $LIBS" - EL_CONFIG(CONFIG_ECMASCRIPT_SEE, [SEE]) - AC_SUBST(SEE_CFLAGS) - fi - AC_MSG_RESULT($cf_result) - else - if test -n "$withval" && test "x$withval" != xno; then - AC_MSG_ERROR([SEE not found]) - else - AC_MSG_WARN([SEE support disabled]) - fi - fi -fi - # =================================================================== # Check for SpiderMonkey, optional even if installed. # =================================================================== @@ -708,15 +660,13 @@ elif test -n "$with_spidermonkey" && test "x$with_spidermonkey" != "xno"; then fi EL_RESTORE_FLAGS -if test "x$CONFIG_SPIDERMONKEY" = xyes && - test "x$CONFIG_ECMASCRIPT_SEE" != xyes; then +if test "x$CONFIG_SPIDERMONKEY" = xyes; then EL_CONFIG(CONFIG_ECMASCRIPT_SMJS, [SpiderMonkey document scripting]) else CONFIG_ECMASCRIPT_SMJS=no fi -EL_CONFIG_DEPENDS(CONFIG_ECMASCRIPT, [CONFIG_ECMASCRIPT_SEE CONFIG_ECMASCRIPT_SMJS], [ECMAScript (JavaScript)]) -AC_SUBST(CONFIG_ECMASCRIPT_SEE) +EL_CONFIG_DEPENDS(CONFIG_ECMASCRIPT, [CONFIG_ECMASCRIPT_SMJS], [ECMAScript (JavaScript)]) AC_SUBST(CONFIG_ECMASCRIPT_SMJS) if test "x$CONFIG_ECMASCRIPT_SMJS" = xyes && diff --git a/src/ecmascript/Makefile b/src/ecmascript/Makefile index ab936a02..0e5ae66e 100644 --- a/src/ecmascript/Makefile +++ b/src/ecmascript/Makefile @@ -1,11 +1,9 @@ top_builddir=../.. include $(top_builddir)/Makefile.config -INCLUDES += $(SPIDERMONKEY_CFLAGS) $(SEE_CFLAGS) +INCLUDES += $(SPIDERMONKEY_CFLAGS) -SUBDIRS-$(CONFIG_ECMASCRIPT_SEE) += see SUBDIRS-$(CONFIG_ECMASCRIPT_SMJS) += spidermonkey -OBJS-$(CONFIG_ECMASCRIPT_SEE) += see.o OBJS-$(CONFIG_ECMASCRIPT_SMJS) += spidermonkey.o ifeq ($(CONFIG_ECMASCRIPT_SMJS), yes) diff --git a/src/ecmascript/ecmascript.c b/src/ecmascript/ecmascript.c index 9fa6cf2f..3df8e981 100644 --- a/src/ecmascript/ecmascript.c +++ b/src/ecmascript/ecmascript.c @@ -12,7 +12,6 @@ #include "document/document.h" #include "document/view.h" #include "ecmascript/ecmascript.h" -#include "ecmascript/see.h" #include "ecmascript/spidermonkey.h" #include "intl/gettext/libintl.h" #include "main/module.h" @@ -86,11 +85,7 @@ ecmascript_get_interpreter(struct view_state *vs) init_list(interpreter->onload_snippets); /* The following backend call reads interpreter->vs. */ if ( -#ifdef CONFIG_ECMASCRIPT_SEE - !see_get_interpreter(interpreter) -#else !spidermonkey_get_interpreter(interpreter) -#endif ) { /* Undo what was done above. */ interpreter->vs->ecmascript_fragile = 1; @@ -112,11 +107,7 @@ ecmascript_put_interpreter(struct ecmascript_interpreter *interpreter) * interpreter than to corrupt memory. */ if_assert_failed return; -#ifdef CONFIG_ECMASCRIPT_SEE - see_put_interpreter(interpreter); -#else spidermonkey_put_interpreter(interpreter); -#endif free_string_list(&interpreter->onload_snippets); done_string(&interpreter->code); /* Is it superfluous? */ @@ -142,11 +133,7 @@ ecmascript_eval(struct ecmascript_interpreter *interpreter, return; assert(interpreter); interpreter->backend_nesting++; -#ifdef CONFIG_ECMASCRIPT_SEE - see_eval(interpreter, code, ret); -#else spidermonkey_eval(interpreter, code, ret); -#endif interpreter->backend_nesting--; } @@ -160,11 +147,7 @@ ecmascript_eval_stringback(struct ecmascript_interpreter *interpreter, return NULL; assert(interpreter); interpreter->backend_nesting++; -#ifdef CONFIG_ECMASCRIPT_SEE - result = see_eval_stringback(interpreter, code); -#else result = spidermonkey_eval_stringback(interpreter, code); -#endif interpreter->backend_nesting--; return result; } @@ -179,11 +162,7 @@ ecmascript_eval_boolback(struct ecmascript_interpreter *interpreter, return -1; assert(interpreter); interpreter->backend_nesting++; -#ifdef CONFIG_ECMASCRIPT_SEE - result = see_eval_boolback(interpreter, code); -#else result = spidermonkey_eval_boolback(interpreter, code); -#endif interpreter->backend_nesting--; return result; } @@ -191,29 +170,17 @@ ecmascript_eval_boolback(struct ecmascript_interpreter *interpreter, void ecmascript_detach_form_view(struct form_view *fv) { -#ifdef CONFIG_ECMASCRIPT_SEE - see_detach_form_view(fv); -#else spidermonkey_detach_form_view(fv); -#endif } void ecmascript_detach_form_state(struct form_state *fs) { -#ifdef CONFIG_ECMASCRIPT_SEE - see_detach_form_state(fs); -#else spidermonkey_detach_form_state(fs); -#endif } void ecmascript_moved_form_state(struct form_state *fs) { -#ifdef CONFIG_ECMASCRIPT_SEE - see_moved_form_state(fs); -#else spidermonkey_moved_form_state(fs); -#endif } void @@ -359,9 +326,7 @@ ecmascript_set_timeout(struct ecmascript_interpreter *interpreter, unsigned char } static struct module *ecmascript_modules[] = { -#ifdef CONFIG_ECMASCRIPT_SEE - &see_module, -#elif defined(CONFIG_ECMASCRIPT_SMJS) +#ifdef CONFIG_ECMASCRIPT_SMJS &spidermonkey_module, #endif NULL, diff --git a/src/ecmascript/see.c b/src/ecmascript/see.c deleted file mode 100644 index 9472e032..00000000 --- a/src/ecmascript/see.c +++ /dev/null @@ -1,194 +0,0 @@ -/* The SEE ECMAScript backend. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -#include "elinks.h" - -#include - -#include "bfu/dialog.h" -#include "cache/cache.h" -#include "cookies/cookies.h" -#include "dialogs/menu.h" -#include "dialogs/status.h" -#include "document/html/frames.h" -#include "document/document.h" -#include "document/forms.h" -#include "document/view.h" -#include "ecmascript/ecmascript.h" -#include "ecmascript/see.h" -#include "ecmascript/see/document.h" -#include "ecmascript/see/form.h" -#include "ecmascript/see/input.h" -#include "ecmascript/see/location.h" -#include "ecmascript/see/navigator.h" -#include "ecmascript/see/strings.h" -#include "ecmascript/see/unibar.h" -#include "ecmascript/see/window.h" -#include "intl/gettext/libintl.h" -#include "main/select.h" -#include "osdep/newwin.h" -#include "osdep/sysname.h" -#include "protocol/http/http.h" -#include "protocol/uri.h" -#include "session/history.h" -#include "session/location.h" -#include "session/session.h" -#include "session/task.h" -#include "terminal/tab.h" -#include "terminal/terminal.h" -#include "util/conv.h" -#include "util/string.h" -#include "viewer/text/draw.h" -#include "viewer/text/form.h" -#include "viewer/text/link.h" -#include "viewer/text/vs.h" - - -/*** Global methods */ - - -/* TODO? Are there any which need to be implemented? */ - -static void -see_init(struct module *xxx) -{ - init_intern_strings(); - SEE_system.periodic = checktime; -} - -static void -see_done(struct module *xxx) -{ -} - -void * -see_get_interpreter(struct ecmascript_interpreter *interpreter) -{ - struct global_object *g = SEE_NEW(NULL, struct global_object); - struct SEE_interpreter *interp = &g->interp; - - interpreter->backend_data = g; - g->max_exec_time = get_opt_int("ecmascript.max_exec_time", - interpreter->vs->doc_view->session); - g->exec_start = time(NULL); - /* used by setTimeout */ - g->interpreter = interpreter; - SEE_interpreter_init(interp); - init_js_window_object(interpreter); - init_js_menubar_object(interpreter); - init_js_statusbar_object(interpreter); - init_js_navigator_object(interpreter); - init_js_history_object(interpreter); - init_js_location_object(interpreter); - init_js_document_object(interpreter); - init_js_forms_object(interpreter); - return interp; -} - -void -see_put_interpreter(struct ecmascript_interpreter *interpreter) -{ - interpreter->backend_data = NULL; -} - -void -see_eval(struct ecmascript_interpreter *interpreter, - struct string *code, struct string *ret) -{ - - struct SEE_interpreter *interp = interpreter->backend_data; - struct global_object *g = (struct global_object *)interp; - struct SEE_input *input = see_input_elinks(interp, code->source); - SEE_try_context_t try_ctxt; - struct SEE_value result; - - g->exec_start = time(NULL); - g->ret = ret; - SEE_TRY(interp, try_ctxt) { - SEE_Global_eval(interp, input, &result); - } - - SEE_INPUT_CLOSE(input); - SEE_CAUGHT(try_ctxt); -} - - -unsigned char * -see_eval_stringback(struct ecmascript_interpreter *interpreter, - struct string *code) -{ - struct SEE_interpreter *interp = interpreter->backend_data; - struct global_object *g = (struct global_object *)interp; - struct SEE_input *input = see_input_elinks(interp, code->source); - SEE_try_context_t try_ctxt; - struct SEE_value result; - /* 'volatile' qualifier prevents register allocation which fixes: - * warning: variable 'xxx' might be clobbered by 'longjmp' or 'vfork' - */ - unsigned char *volatile string = NULL; - - g->exec_start = time(NULL); - g->ret = NULL; - SEE_TRY(interp, try_ctxt) { - SEE_Global_eval(interp, input, &result); - if (SEE_VALUE_GET_TYPE(&result) == SEE_STRING) - string = see_value_to_unsigned_char(interp, &result); - - } - SEE_INPUT_CLOSE(input); - if (SEE_CAUGHT(try_ctxt)) { - return NULL; - } - return string; -} - -int -see_eval_boolback(struct ecmascript_interpreter *interpreter, - struct string *code) -{ - struct SEE_interpreter *interp = interpreter->backend_data; - struct global_object *g = (struct global_object *)interp; - struct SEE_input *input = see_input_elinks(interp, code->source); - struct SEE_object *fun; - SEE_try_context_t try_ctxt; - struct SEE_value result; - /* 'volatile' qualifier prevents register allocation which fixes: - * warning: variable 'xxx' might be clobbered by 'longjmp' or 'vfork' - */ - SEE_int32_t volatile res = 0; - - g->exec_start = time(NULL); - g->ret = NULL; - SEE_TRY(interp, try_ctxt) { - fun = SEE_Function_new(interp, NULL, NULL, input); - SEE_OBJECT_CALL(interp, fun, NULL, 0, NULL, &result); - /* history.back() returns SEE_NULL */ - if (SEE_VALUE_GET_TYPE(&result) == SEE_NULL) - res = 0; - else - res = SEE_ToInt32(interp, &result); - } - - SEE_INPUT_CLOSE(input); - if (SEE_CAUGHT(try_ctxt)) { - return -1; - } - return res; -} - -struct module see_module = struct_module( - /* name: */ N_("SEE"), - /* options: */ NULL, - /* events: */ NULL, - /* submodules: */ NULL, - /* data: */ NULL, - /* init: */ see_init, - /* done: */ see_done -); diff --git a/src/ecmascript/see.h b/src/ecmascript/see.h deleted file mode 100644 index fa211c7d..00000000 --- a/src/ecmascript/see.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef EL__ECMASCRIPT_SEE_H -#define EL__ECMASCRIPT_SEE_H - -struct ecmascript_interpreter; -struct string; - -void *see_get_interpreter(struct ecmascript_interpreter *interpreter); -void see_put_interpreter(struct ecmascript_interpreter *interpreter); - -void see_detach_form_view(struct form_view *fv); -void see_detach_form_state(struct form_state *fs); -void see_moved_form_state(struct form_state *fs); - -void see_eval(struct ecmascript_interpreter *interpreter, struct string *code, struct string *ret); -unsigned char *see_eval_stringback(struct ecmascript_interpreter *interpreter, struct string *code); -int see_eval_boolback(struct ecmascript_interpreter *interpreter, struct string *code); - -extern struct module see_module; -#endif diff --git a/src/ecmascript/see/Makefile b/src/ecmascript/see/Makefile deleted file mode 100644 index f933a548..00000000 --- a/src/ecmascript/see/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -top_builddir=../../.. -include $(top_builddir)/Makefile.config -INCLUDES += $(SEE_CFLAGS) - -OBJS = checktype.o document.o form.o input.o location.o navigator.o strings.o unibar.o window.o - -include $(top_srcdir)/Makefile.lib diff --git a/src/ecmascript/see/checktype.c b/src/ecmascript/see/checktype.c deleted file mode 100644 index 6c1fc700..00000000 --- a/src/ecmascript/see/checktype.c +++ /dev/null @@ -1,20 +0,0 @@ -/* Check the type of a SEE object so it's safe to cast */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "ecmascript/see/checktype.h" - -void -see_check_class(struct SEE_interpreter *interp, - const struct SEE_object *object, - const struct SEE_objectclass *class) -{ - if (object->objectclass != class) - SEE_error_throw(interp, interp->TypeError, - "got %s, expected %s", - object->objectclass->Class, - class->Class); -} diff --git a/src/ecmascript/see/checktype.h b/src/ecmascript/see/checktype.h deleted file mode 100644 index a5aa972d..00000000 --- a/src/ecmascript/see/checktype.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef EL__ECMASCRIPT_SEE_CHECKTYPE_H -#define EL__ECMASCRIPT_SEE_CHECKTYPE_H - -struct SEE_interpreter; -struct SEE_object; -struct SEE_objectclass; - -void see_check_class(struct SEE_interpreter *interp, - const struct SEE_object *object, - const struct SEE_objectclass *class); - -#endif diff --git a/src/ecmascript/see/document.c b/src/ecmascript/see/document.c deleted file mode 100644 index 3509126a..00000000 --- a/src/ecmascript/see/document.c +++ /dev/null @@ -1,297 +0,0 @@ -/* The SEE document object implementation. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -#include "elinks.h" - -#include - -#include "bfu/dialog.h" -#include "cache/cache.h" -#include "cookies/cookies.h" -#include "dialogs/menu.h" -#include "dialogs/status.h" -#include "document/html/frames.h" -#include "document/document.h" -#include "document/forms.h" -#include "document/view.h" -#include "ecmascript/ecmascript.h" -#include "ecmascript/see/checktype.h" -#include "ecmascript/see/document.h" -#include "ecmascript/see/form.h" -#include "ecmascript/see/input.h" -#include "ecmascript/see/strings.h" -#include "ecmascript/see/window.h" -#include "intl/gettext/libintl.h" -#include "main/select.h" -#include "osdep/newwin.h" -#include "osdep/sysname.h" -#include "protocol/http/http.h" -#include "protocol/uri.h" -#include "session/history.h" -#include "session/location.h" -#include "session/session.h" -#include "session/task.h" -#include "terminal/tab.h" -#include "terminal/terminal.h" -#include "util/conv.h" -#include "util/memory.h" -#include "util/string.h" -#include "viewer/text/draw.h" -#include "viewer/text/form.h" -#include "viewer/text/link.h" -#include "viewer/text/vs.h" - -static void document_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); -static void document_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); -static int document_canput(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static int document_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static void js_document_write(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_document_writeln(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); - -void location_goto(struct document_view *, unsigned char *); - -struct SEE_objectclass js_document_object_class = { - "document", - document_get, - document_put, - document_canput, - document_hasproperty, - SEE_no_delete, - SEE_no_defaultvalue, - SEE_no_enumerator, - NULL, - NULL, - NULL -}; - -static void -document_get(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct js_window_object *win = g->win; - struct view_state *vs = win->vs; - struct document_view *doc_view = vs->doc_view; - struct document *document = doc_view->document; - struct js_document_object *doc = (struct js_document_object *)o; - struct session *ses = doc_view->session; - struct SEE_string *str; - unsigned char *string; - - SEE_SET_UNDEFINED(res); - - if (p == s_cookie) { -#ifdef CONFIG_COOKIES - struct string *cookies = send_cookies(vs->uri); - - if (cookies) { - static unsigned char cookiestr[1024]; - strncpy(cookiestr, cookies->source, 1024); - done_string(cookies); - - str = string_to_SEE_string(interp, cookiestr); - } else { - str = string_to_SEE_string(interp, ""); - } - SEE_SET_STRING(res, str); -#endif - } else if (p == s_title) { - str = string_to_SEE_string(interp, document->title); - SEE_SET_STRING(res, str); - } else if (p == s_url) { - string = get_uri_string(document->uri, URI_ORIGINAL); - str = string_to_SEE_string(interp, string); - mem_free_if(string); - SEE_SET_STRING(res, str); - } else if (p == s_location) { - SEE_OBJECT_GET(interp, interp->Global, s_location, res); - } else if (p == s_referrer) { - switch (get_opt_int("protocol.http.referer.policy", NULL)) { - case REFERER_NONE: - SEE_SET_UNDEFINED(res); - break; - case REFERER_FAKE: - str = string_to_SEE_string(interp, - get_opt_str("protocol.http.referer.fake", - NULL)); - SEE_SET_STRING(res, str); - break; - case REFERER_TRUE: - if (ses->referrer) { - string = get_uri_string(ses->referrer, URI_HTTP_REFERRER); - str = string_to_SEE_string(interp, string); - mem_free_if(string); - SEE_SET_STRING(res, str); - } - break; - case REFERER_SAME_URL: - string = get_uri_string(document->uri, URI_HTTP_REFERRER); - str = string_to_SEE_string(interp, string); - mem_free_if(string); - SEE_SET_STRING(res, str); - break; - - } - } else if (p == s_forms) { - SEE_SET_OBJECT(res, doc->forms); - } else if (p == s_write) { - SEE_SET_OBJECT(res, doc->write); - } else if (p == s_writeln) { - SEE_SET_OBJECT(res, doc->writeln); - } else { - struct form *form; - unsigned char *string = see_string_to_unsigned_char(p); - struct form_view *form_view; - struct js_form *form_object; - - if (!string) return; - - foreach (form, document->forms) { - if (!form->name || c_strcasecmp(string, form->name)) - continue; - form_view = find_form_view(doc_view, form); - form_object = js_get_form_object(interp, doc, form_view); - SEE_SET_OBJECT(res, (struct SEE_object *)form_object); - break; - } - mem_free(string); - } -} - -static void -document_put(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *val, int attr) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct document *document = doc_view->document; - struct js_document_object *doc = (struct js_document_object *)o; - struct SEE_value res; - unsigned char *string; - - if (p == s_forms) { - SEE_ToObject(interp, val, &res); - doc->forms = res.u.object; - } else if (p == s_title) { - string = see_value_to_unsigned_char(interp, val); - mem_free_set(&document->title, string); - print_screen_status(doc_view->session); - } else if (p == s_location || p == s_url) { - /* According to the specs this should be readonly but some - * broken sites still assign to it (i.e. - * http://www.e-handelsfonden.dk/validering.asp?URL=www.polyteknisk.dk). - * So emulate window.location. */ - string = see_value_to_unsigned_char(interp, val); - location_goto(doc_view, string); - mem_free_if(string); - } else if (p == s_cookie) { -#ifdef CONFIG_COOKIES - string = see_value_to_unsigned_char(interp, val); - set_cookie(vs->uri, string); - mem_free_if(string); -#endif - } - - -} - -static void -js_document_write_do(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res, int newline) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct string *ret = g->ret; - - see_check_class(interp, thisobj, &js_document_object_class); - - if (argc >= 1 && ret) { - int i = 0; - - for (; i < argc; ++i) { - unsigned char *code; - - code = see_value_to_unsigned_char(interp, argv[i]); - - if (code) { - add_to_string(ret, code); - mem_free(code); - } - } - - if (newline) - add_char_to_string(ret, '\n'); - } -#ifdef CONFIG_LEDS - /* XXX: I don't know about you, but I have *ENOUGH* of those 'Undefined - * function' errors, I want to see just the useful ones. So just - * lighting a led and going away, no muss, no fuss. --pasky */ - /* TODO: Perhaps we can introduce ecmascript.error_report_unsupported - * -> "Show information about the document using some valid, - * nevertheless unsupported methods/properties." --pasky too */ - - set_led_value(vs->doc_view->session->status.ecmascript_led, 'J'); -#endif - SEE_SET_BOOLEAN(res, 0); -} - -static void -js_document_write(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - js_document_write_do(interp, self, thisobj, argc, argv, res, 0); -} - -static void -js_document_writeln(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - js_document_write_do(interp, self, thisobj, argc, argv, res, 1); -} - -static int -document_canput(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - if (p == s_location || p == s_url || p == s_cookie) - return 1; - return 0; -} - -static int -document_hasproperty(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - /* all unknown properties return UNDEFINED value */ - return 1; -} - - -void -init_js_document_object(struct ecmascript_interpreter *interpreter) -{ - struct global_object *g = interpreter->backend_data; - struct SEE_interpreter *interp = &g->interp; - struct SEE_value v; - struct js_document_object *doc = SEE_NEW(interp, - struct js_document_object); - - doc->object.objectclass = &js_document_object_class; - doc->object.Prototype = NULL; - - SEE_SET_OBJECT(&v, (struct SEE_object *)doc); - SEE_OBJECT_PUT(interp, interp->Global, s_document, &v, 0); - - doc->write = SEE_cfunction_make(interp, js_document_write, s_write, 1); - doc->writeln = SEE_cfunction_make(interp, js_document_writeln, s_writeln, 1); -} diff --git a/src/ecmascript/see/document.h b/src/ecmascript/see/document.h deleted file mode 100644 index 34eb0ee5..00000000 --- a/src/ecmascript/see/document.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef EL__ECMASCRIPT_SEE_DOCUMENT_H -#define EL__ECMASCRIPT_SEE_DOCUMENT_H - -struct ecmascript_interpreter; - -struct js_document_object { - struct SEE_object object; - struct SEE_object *write; - struct SEE_object *writeln; - struct SEE_object *forms; -}; - -void init_js_document_object(struct ecmascript_interpreter *); - -#endif diff --git a/src/ecmascript/see/form.c b/src/ecmascript/see/form.c deleted file mode 100644 index 0724e115..00000000 --- a/src/ecmascript/see/form.c +++ /dev/null @@ -1,1176 +0,0 @@ -/* The SEE form object implementation. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -#include "elinks.h" - -#include - -#include "bfu/dialog.h" -#include "cache/cache.h" -#include "cookies/cookies.h" -#include "dialogs/menu.h" -#include "dialogs/status.h" -#include "document/html/frames.h" -#include "document/document.h" -#include "document/forms.h" -#include "document/view.h" -#include "ecmascript/ecmascript.h" -#include "ecmascript/see.h" -#include "ecmascript/see/checktype.h" -#include "ecmascript/see/document.h" -#include "ecmascript/see/form.h" -#include "ecmascript/see/input.h" -#include "ecmascript/see/strings.h" -#include "ecmascript/see/window.h" -#include "intl/gettext/libintl.h" -#include "main/select.h" -#include "osdep/newwin.h" -#include "osdep/sysname.h" -#include "protocol/http/http.h" -#include "protocol/uri.h" -#include "session/history.h" -#include "session/location.h" -#include "session/session.h" -#include "session/task.h" -#include "terminal/tab.h" -#include "terminal/terminal.h" -#include "util/conv.h" -#include "util/memory.h" -#include "util/string.h" -#include "viewer/text/draw.h" -#include "viewer/text/form.h" -#include "viewer/text/link.h" -#include "viewer/text/vs.h" - -static void input_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); -static void input_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); -static void js_input_blur(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_input_click(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_input_focus(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_input_select(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static int input_canput(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static int input_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static struct js_input *js_get_input_object(struct SEE_interpreter *, struct js_form *, struct form_state *); -static void input_finalize(struct SEE_interpreter *, void *, void *); -static struct js_input *js_get_form_control_object(struct SEE_interpreter *, struct js_form *, enum form_type, struct form_state *); - -static void js_form_elems_item(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_form_elems_namedItem(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void form_elems_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); -static int form_elems_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); - -static void js_forms_item(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_forms_namedItem(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void forms_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); -static int forms_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); - -static void form_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); -static void form_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); -static int form_canput(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static int form_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static void js_form_reset(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_form_submit(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void form_finalize(struct SEE_interpreter *, void *, void *); - - -struct SEE_objectclass js_input_object_class = { - "input", - input_get, - input_put, - input_canput, - input_hasproperty, - SEE_no_delete, - SEE_no_defaultvalue, - SEE_no_enumerator, - NULL, - NULL, - NULL -}; - -struct SEE_objectclass js_form_elems_class = { - "elements", - form_elems_get, - SEE_no_put, - SEE_no_canput, - form_elems_hasproperty, - SEE_no_delete, - SEE_no_defaultvalue, - SEE_no_enumerator, - NULL, - NULL, - NULL -}; - -struct SEE_objectclass js_forms_object_class = { - "forms", - forms_get, - SEE_no_put, - SEE_no_canput, - forms_hasproperty, - SEE_no_delete, - SEE_no_defaultvalue, - SEE_no_enumerator, - NULL, - NULL, - NULL -}; - -struct SEE_objectclass js_form_class = { - "form", - form_get, - form_put, - form_canput, - form_hasproperty, - SEE_no_delete, - SEE_no_defaultvalue, - SEE_no_enumerator, - NULL, - NULL, - NULL -}; - -struct js_input { - struct SEE_object object; - struct js_form *parent; - struct SEE_object *blur; - struct SEE_object *click; - struct SEE_object *focus; - struct SEE_object *select; - struct form_state *fs; -}; - -struct js_forms_object { - struct SEE_object object; - struct js_document_object *parent; - struct SEE_object *item; - struct SEE_object *namedItem; -}; - -struct js_form_elems { - struct SEE_object object; - struct js_form *parent; - struct SEE_object *item; - struct SEE_object *namedItem; -}; - - -static inline struct form_state * -form_state_of_js_input(struct SEE_interpreter *interp, - const struct js_input *input) -{ - struct form_state *fs = input->fs; - - if (!fs) - SEE_error_throw(interp, interp->Error, - "Input field has been destroyed"); - - assert(fs->ecmascript_obj == input); - if_assert_failed - SEE_error_throw(interp, interp->Error, - "Internal corruption"); - - return fs; -} - -static void -input_get(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct document *document = doc_view->document; - struct js_input *input = (struct js_input *)o; - struct js_form *parent = input->parent; - struct form_state *fs = form_state_of_js_input(interp, input); - struct form_control *fc = find_form_control(document, fs); - int linknum; - struct link *link = NULL; - struct SEE_string *str; - - assert(fc); - assert(fc->form && fs); - - linknum = get_form_control_link(document, fc); - /* Hiddens have no link. */ - if (linknum >= 0) link = &document->links[linknum]; - SEE_SET_UNDEFINED(res); - - if (p == s_accessKey) { - struct SEE_string *keystr; - if (!link) - return; - - keystr = SEE_string_new(interp, 0); - if (link->accesskey) - append_unicode_to_SEE_string(interp, keystr, - link->accesskey); - SEE_SET_STRING(res, keystr); - } else if (p == s_alt) { - str = string_to_SEE_string(interp, fc->alt); - SEE_SET_STRING(res, str); - } else if (p == s_checked) { - SEE_SET_BOOLEAN(res, fs->state); - } else if (p == s_defaultChecked) { - SEE_SET_BOOLEAN(res, fc->default_state); - } else if (p == s_defaultValue) { - /* FIXME (bug 805): convert from the charset of the document */ - str = string_to_SEE_string(interp, fc->default_value); - SEE_SET_STRING(res, str); - } else if (p == s_disabled) { - /* FIXME: --pasky */ - SEE_SET_BOOLEAN(res, fc->mode == FORM_MODE_DISABLED); - } else if (p == s_form) { - SEE_SET_OBJECT(res, (struct SEE_object *)parent); - } else if (p == s_maxLength) { - SEE_SET_NUMBER(res, fc->maxlength); - } else if (p == s_name) { - str = string_to_SEE_string(interp, fc->name); - SEE_SET_STRING(res, str); - } else if (p == s_readonly) { - /* FIXME: --pasky */ - SEE_SET_BOOLEAN(res, fc->mode == FORM_MODE_READONLY); - } else if (p == s_size) { - SEE_SET_NUMBER(res, fc->size); - } else if (p == s_src) { - if (link && link->where_img) { - str = string_to_SEE_string(interp, link->where_img); - SEE_SET_STRING(res, str); - } - } else if (p == s_tabindex) { - if (link) { - /* FIXME: This is WRONG. --pasky */ - SEE_SET_NUMBER(res, link->number); - } - } else if (p == s_type) { - switch (fc->type) { - case FC_TEXT: str = s_text; break; - case FC_PASSWORD: str = s_password; break; - case FC_FILE: str = s_file; break; - case FC_CHECKBOX: str = s_checkbox; break; - case FC_RADIO: str = s_radio; break; - case FC_SUBMIT: str = s_submit; break; - case FC_IMAGE: str = s_image; break; - case FC_RESET: str = s_reset; break; - case FC_BUTTON: str = s_button; break; - case FC_HIDDEN: str = s_hidden; break; - case FC_SELECT: str = s_select; break; - default: str = NULL; - } - if (str) { - SEE_SET_STRING(res, str); - } - } else if (p == s_value) { - str = string_to_SEE_string(interp, fs->value); - SEE_SET_STRING(res, str); - } else if (p == s_selectedIndex) { - if (fc->type == FC_SELECT) SEE_SET_NUMBER(res, fs->state); - } else if (p == s_blur) { - SEE_SET_OBJECT(res, input->blur); - } else if (p == s_click) { - SEE_SET_OBJECT(res, input->click); - } else if (p == s_focus) { - SEE_SET_OBJECT(res, input->focus); - } else if (p == s_select) { - SEE_SET_OBJECT(res, input->select); - } -} - -static void -input_put(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *val, int attr) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct document *document = doc_view->document; - struct js_input *input = (struct js_input *)o; - struct form_state *fs = form_state_of_js_input(interp, input); - struct form_control *fc = find_form_control(document, fs); - int linknum; - struct link *link = NULL; - unsigned char *string = NULL; - - assert(fc); - assert(fc->form && fs); - - linknum = get_form_control_link(document, fc); - /* Hiddens have no link. */ - if (linknum >= 0) link = &document->links[linknum]; - - if (p == s_accessKey) { - struct SEE_value conv; - unicode_val_T accesskey; - - SEE_ToString(interp, val, &conv); - if (conv.u.string->length) - accesskey = see_string_to_unicode(interp, conv.u.string); - else - accesskey = 0; - - if (link) - link->accesskey = accesskey; - } else if (p == s_alt) { - string = see_value_to_unsigned_char(interp, val); - mem_free_set(&fc->alt, string); - } else if (p == s_checked) { - if (fc->type != FC_CHECKBOX && fc->type != FC_RADIO) - return; - fs->state = SEE_ToUint32(interp, val); - } else if (p == s_disabled) { - /* FIXME: --pasky */ - SEE_uint32_t boo = SEE_ToUint32(interp, val); - fc->mode = (boo ? FORM_MODE_DISABLED - : (fc->mode == FORM_MODE_READONLY ? FORM_MODE_READONLY - : FORM_MODE_NORMAL)); - } else if (p == s_maxLength) { - string = see_value_to_unsigned_char(interp, val); - if (!string) - return; - fc->maxlength = atol(string); - mem_free(string); - } else if (p == s_name) { - string = see_value_to_unsigned_char(interp, val); - mem_free_set(&fc->name, string); - } else if (p == s_readonly) { - SEE_uint32_t boo = SEE_ToUint32(interp, val); - fc->mode = (boo ? FORM_MODE_READONLY - : fc->mode == FORM_MODE_DISABLED ? FORM_MODE_DISABLED - : FORM_MODE_NORMAL); - } else if (p == s_src) { - if (link) { - string = see_value_to_unsigned_char(interp, val); - mem_free_set(&link->where_img, string); - } - } else if (p == s_value) { - if (fc->type == FC_FILE) - return; - string = see_value_to_unsigned_char(interp, val); - mem_free_set(&fs->value, string); - if (fc->type == FC_TEXT || fc->type == FC_PASSWORD) - fs->state = strlen(fs->value); - } else if (p == s_selectedIndex) { - if (fc->type == FC_SELECT) { - SEE_uint32_t item = SEE_ToUint32(interp, val); - - if (item >=0 && item < fc->nvalues) { - fs->state = item; - mem_free_set(&fs->value, stracpy(fc->values[item])); - } - } - } -} - -static void -js_input_blur(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - see_check_class(interp, thisobj, &js_input_object_class); - SEE_SET_BOOLEAN(res, 0); - /* We are a text-mode browser and there *always* has to be something - * selected. So we do nothing for now. (That was easy.) */ -} - -static void -js_input_click(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct document *document = doc_view->document; - struct session *ses = doc_view->session; - struct js_input *input = ( - see_check_class(interp, thisobj, &js_input_object_class), - (struct js_input *)thisobj); - struct form_state *fs = form_state_of_js_input(interp, input); - struct form_control *fc; - int linknum; - - SEE_SET_BOOLEAN(res, 0); - assert(fs); - fc = find_form_control(document, fs); - assert(fc); - - linknum = get_form_control_link(document, fc); - /* Hiddens have no link. */ - if (linknum < 0) - return; - - /* Restore old current_link afterwards? */ - jump_to_link_number(ses, doc_view, linknum); - if (enter(ses, doc_view, 0) == FRAME_EVENT_REFRESH) - refresh_view(ses, doc_view, 0); - else - print_screen_status(ses); -} - -static void -js_input_focus(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct document *document = doc_view->document; - struct session *ses = doc_view->session; - struct js_input *input = ( - see_check_class(interp, thisobj, &js_input_object_class), - (struct js_input *)thisobj); - struct form_state *fs = form_state_of_js_input(interp, input); - struct form_control *fc; - int linknum; - - SEE_SET_BOOLEAN(res, 0); - assert(fs); - fc = find_form_control(document, fs); - assert(fc); - - linknum = get_form_control_link(document, fc); - /* Hiddens have no link. */ - if (linknum < 0) - return; - - jump_to_link_number(ses, doc_view, linknum); - -} - -static void -js_input_select(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - see_check_class(interp, thisobj, &js_input_object_class); - SEE_SET_BOOLEAN(res, 0); - /* We support no text selecting yet. So we do nothing for now. - * (That was easy, too.) */ -} - -static int -input_canput(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - return 1; -} - -static int -input_hasproperty(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - /* all unknown properties return UNDEFINED value */ - return 1; -} - -static struct js_input * -js_get_input_object(struct SEE_interpreter *interp, struct js_form *jsform, - struct form_state *fs) -{ - struct js_input *jsinput = fs->ecmascript_obj; - - if (jsinput) { - assert(jsinput->fs == fs); - if_assert_failed return NULL; - - return jsinput; - } - - /* jsform ('form') is input's parent */ - /* FIXME: That is NOT correct since the real containing element - * should be its parent, but gimme DOM first. --pasky */ - jsinput = SEE_NEW_FINALIZE(interp, struct js_input, - input_finalize, NULL); - - jsinput->object.objectclass = &js_input_object_class; - jsinput->object.Prototype = NULL; - - jsinput->blur = SEE_cfunction_make(interp, js_input_blur, s_blur, 0); - jsinput->click = SEE_cfunction_make(interp, js_input_click, s_click, 0); - jsinput->focus = SEE_cfunction_make(interp, js_input_focus, s_focus, 0); - jsinput->select = SEE_cfunction_make(interp, js_input_select, s_select, 0); - - jsinput->parent = jsform; - jsinput->fs = fs; - fs->ecmascript_obj = jsinput; - return jsinput; -} - -static struct js_input * -js_get_form_control_object(struct SEE_interpreter *interp, struct js_form *jsform, - enum form_type type, struct form_state *fs) -{ - switch (type) { - case FC_TEXT: - case FC_PASSWORD: - case FC_FILE: - case FC_CHECKBOX: - case FC_RADIO: - case FC_SUBMIT: - case FC_IMAGE: - case FC_RESET: - case FC_BUTTON: - case FC_HIDDEN: - case FC_SELECT: - return js_get_input_object(interp, jsform, fs); - - case FC_TEXTAREA: - /* TODO */ - return NULL; - - default: - INTERNAL("Weird fc->type %d", type); - return NULL; - } -} - -static void -input_finalize(struct SEE_interpreter *interp, void *jsinput_void, void *dummy) -{ - struct js_input *jsinput = jsinput_void; - struct form_state *fs = jsinput->fs; - - if (fs) { - /* Reset jsinput->fs in case some ELinks code uses it - * even after this finalizer has run. Such use should - * not be possible but the explanation is somewhat - * complex so it seems safest to do this. - * - * Unlike SpiderMonkey, Boehm's GC allows a finalizer - * to resurrect the object by making something point - * to it. And it's a conservative GC so it can see - * such a pointer where none actually exists. However - * it also implicitly unregisters the finalizer before - * calling it, so the object becomes just a chunk of - * memory that nothing really uses, even if the GC - * never realizes it is garbage. */ - jsinput->fs = NULL; - - /* If this assertion fails, leave fs->ecmascript_obj - * unchanged, because it may point to a different - * structure whose js_input.fs pointer will later have - * to be updated to avoid crashes. - * - * If the assertion fails and we leave jsinput->fs - * unchanged, and something then deletes fs, - * jsinput->fs becomes a dangling pointer because fs - * does not know about jsinput. So that's why the - * assertion comes after the jsinput->fs assignment - * above. */ - assert(fs->ecmascript_obj == jsinput); - if_assert_failed return; - - fs->ecmascript_obj = NULL; - } -} - -void -see_detach_form_state(struct form_state *fs) -{ - struct js_input *jsinput = fs->ecmascript_obj; - - if (jsinput) { - /* If this assertion fails, it is not clear whether - * jsinput->fs should be reset; crashes seem possible - * either way. Resetting it is easiest. */ - assert(jsinput->fs == fs); - if_assert_failed {} - - jsinput->fs = NULL; - fs->ecmascript_obj = NULL; - } -} - -void -see_moved_form_state(struct form_state *fs) -{ - struct js_input *jsinput = fs->ecmascript_obj; - - if (jsinput) - jsinput->fs = fs; -} - - -static inline struct form_view * -form_view_of_js_form(struct SEE_interpreter *interp, - const struct js_form *jsform) -{ - struct form_view *fv = jsform->fv; - - if (!fv) - SEE_error_throw(interp, interp->Error, - "Form has been destroyed"); - - assert(fv->ecmascript_obj == jsform); - if_assert_failed - SEE_error_throw(interp, interp->Error, - "Internal corruption"); - - return fv; -} - -static void -js_form_elems_item(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct document *document = doc_view->document; - struct js_form_elems *jsfe = ( - see_check_class(interp, thisobj, &js_form_elems_class), - (struct js_form_elems *)thisobj); - struct js_form *parent_form = jsfe->parent; - struct form_view *fv = form_view_of_js_form(interp, parent_form); - struct form *form = find_form_by_form_view(document, fv); - struct form_control *fc; - unsigned char *string; - int counter = -1; - int index; - - SEE_SET_UNDEFINED(res); - if (argc < 1) - return; - string = see_value_to_unsigned_char(interp, argv[0]); - if (!string) - return; - index = atol(string); - mem_free(string); - - foreach (fc, form->items) { - counter++; - if (counter == index) { - struct form_state *fs = find_form_state(doc_view, fc); - - if (fs) { - struct js_input *fcobj = js_get_form_control_object(interp, parent_form, fc->type, fs); - - if (fcobj) - SEE_SET_OBJECT(res, (struct SEE_object *)fcobj); - } - break; - } - } - -} - -static void -js_form_elems_namedItem(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct document *document = doc_view->document; - struct js_form_elems *jsfe = ( - see_check_class(interp, thisobj, &js_form_elems_class), - (struct js_form_elems *)thisobj); - struct js_form *parent_form = jsfe->parent; - struct form_view *fv = form_view_of_js_form(interp, parent_form); - struct form *form = find_form_by_form_view(document, fv); - struct form_control *fc; - unsigned char *string; - - SEE_SET_UNDEFINED(res); - if (argc < 1) - return; - string = see_value_to_unsigned_char(interp, argv[0]); - if (!string) - return; - - foreach (fc, form->items) { - if ((fc->id && !c_strcasecmp(string, fc->id)) || (fc->name && !c_strcasecmp(string, fc->name))) { - struct form_state *fs = find_form_state(doc_view, fc); - - if (fs) { - struct js_input *fcobj = js_get_form_control_object(interp, parent_form, fc->type, fs); - - if (fcobj) - SEE_SET_OBJECT(res, (struct SEE_object *)fcobj); - } - break; - } - } - mem_free(string); -} - -static void -form_elems_get(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct document *document = doc_view->document; - struct js_form_elems *jsfe = (struct js_form_elems *)o; - struct js_form *parent_form = jsfe->parent; - struct form_view *fv = form_view_of_js_form(interp, parent_form); - struct form *form = find_form_by_form_view(document, fv); - - if (p == s_length) { - SEE_number_t length = list_size(&form->items); - SEE_SET_NUMBER(res, length); - } else if (p == s_item) { - SEE_SET_OBJECT(res, jsfe->item); - } else if (p == s_namedItem) { - SEE_SET_OBJECT(res, jsfe->namedItem); - } else { - unsigned char *string = see_string_to_unsigned_char(p); - struct SEE_value arg0; - struct SEE_value *argv[1] = { &arg0 }; - - if (!string) { - SEE_SET_UNDEFINED(res); - return; - } - SEE_SET_STRING(&arg0, p); - if (string[0] >= '0' && string[0] <= '9') { - js_form_elems_item(interp, jsfe->item, o, 1, - argv, res); - } else { - js_form_elems_namedItem(interp, jsfe->namedItem, o, 1, - argv, res); - } - mem_free(string); - } -} - -static int -form_elems_hasproperty(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - /* all unknown properties return UNDEFINED value */ - return 1; -} - - -static void -js_forms_item(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct js_forms_object *fo = ( - see_check_class(interp, thisobj, &js_forms_object_class), - (struct js_forms_object *)thisobj); - struct js_document_object *doc = fo->parent; - struct form_view *fv; - unsigned char *string; - int counter = -1; - int index; - - SEE_SET_UNDEFINED(res); - if (argc < 1) - return; - - string = see_value_to_unsigned_char(interp, argv[0]); - if (!string) - return; - index = atol(string); - mem_free(string); - - foreach (fv, vs->forms) { - counter++; - if (counter == index) { - struct js_form *obj = js_get_form_object(interp, doc, fv); - - SEE_SET_OBJECT(res, (struct SEE_object *)obj); - break; - } - } -} - -static void -js_forms_namedItem(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct document *document = doc_view->document; - struct js_forms_object *fo = ( - see_check_class(interp, thisobj, &js_forms_object_class), - (struct js_forms_object *)thisobj); - struct js_document_object *doc = fo->parent; - struct form *form; - unsigned char *string; - - SEE_SET_UNDEFINED(res); - if (argc < 1) - return; - - string = see_value_to_unsigned_char(interp, argv[0]); - if (!string) - return; - foreach (form, document->forms) { - if (form->name && !c_strcasecmp(string, form->name)) { - struct form_view *fv = find_form_view(doc_view, form); - struct js_form *obj = js_get_form_object(interp, - doc, fv); - - SEE_SET_OBJECT(res, (struct SEE_object *)obj); - break; - - } - } - mem_free(string); -} - -static void -forms_get(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct document *document = doc_view->document; - struct js_forms_object *fo = (struct js_forms_object *)o; - - if (p == s_length) { - SEE_number_t length = list_size(&document->forms); - SEE_SET_NUMBER(res, length); - } else if (p == s_item) { - SEE_SET_OBJECT(res, fo->item); - } else if (p == s_namedItem) { - SEE_SET_OBJECT(res, fo->namedItem); - } else { - unsigned char *string = see_string_to_unsigned_char(p); - struct SEE_value arg0; - struct SEE_value *argv[1] = { &arg0 }; - - if (!string) { - SEE_SET_UNDEFINED(res); - return; - } - SEE_SET_STRING(&arg0, p); - if (string[0] >= '0' && string[0] <= '9') { - js_forms_item(interp, fo->item, o, 1, argv, res); - } else { - js_forms_namedItem(interp, fo->namedItem, o, 1, argv, res); - } - mem_free(string); - } -} - -static int -forms_hasproperty(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - /* all unknown properties return UNDEFINED value */ - return 1; -} - - - -static void -form_get(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct js_form *js_form = (struct js_form *)o; - struct form_view *fv = form_view_of_js_form(interp, js_form); - struct form *form = find_form_by_form_view(doc_view->document, fv); - struct SEE_string *str; - - SEE_SET_UNDEFINED(res); - - if (p == s_action) { - str = string_to_SEE_string(interp, form->action); - SEE_SET_STRING(res, str); - } else if (p == s_encoding) { - switch (form->method) { - case FORM_METHOD_GET: - case FORM_METHOD_POST: - /* "application/x-www-form-urlencoded" */ - SEE_SET_STRING(res, s_application_); - break; - case FORM_METHOD_POST_MP: - /* "multipart/form-data" */ - SEE_SET_STRING(res, s_multipart_); - break; - case FORM_METHOD_POST_TEXT_PLAIN: - /* "text/plain") */ - SEE_SET_STRING(res, s_textplain); - break; - } - } else if (p == s_length) { - SEE_number_t num = list_size(&form->items); - SEE_SET_NUMBER(res, num); - } else if (p == s_method) { - switch (form->method) { - case FORM_METHOD_GET: - SEE_SET_STRING(res, s_GET); - break; - - case FORM_METHOD_POST: - case FORM_METHOD_POST_MP: - case FORM_METHOD_POST_TEXT_PLAIN: - SEE_SET_STRING(res, s_POST); - break; - } - } else if (p == s_name) { - str = string_to_SEE_string(interp, form->name); - SEE_SET_STRING(res, str); - } else if (p == s_target) { - str = string_to_SEE_string(interp, form->target); - SEE_SET_STRING(res, str); - } else if (p == s_elements) { - struct js_form_elems *jsfe = SEE_NEW(interp, struct js_form_elems); - - jsfe->object.objectclass = &js_form_elems_class; - jsfe->object.Prototype = NULL; - jsfe->parent = js_form; - jsfe->item = SEE_cfunction_make(interp, js_form_elems_item, s_item, 1); - jsfe->namedItem = SEE_cfunction_make(interp, js_form_elems_namedItem, s_namedItem, 1); - SEE_SET_OBJECT(res, (struct SEE_object *)jsfe); - } else if (p == s_submit) { - SEE_SET_OBJECT(res, js_form->submit); - } else if (p == s_reset) { - SEE_SET_OBJECT(res, js_form->reset); - } else { - unsigned char *string = see_string_to_unsigned_char(p); - struct form_control *fc; - - if (!string) - return; - - foreach(fc, form->items) { - struct js_input *fcobj = NULL; - struct form_state *fs; - - if ((!fc->id || c_strcasecmp(string, fc->id)) && (!fc->name || c_strcasecmp(string, fc->name))) - continue; - fs = find_form_state(doc_view, fc); - if (fs) { - fcobj = js_get_form_control_object(interp, js_form, fc->type, fs); - - if (fcobj) - SEE_SET_OBJECT(res, (struct SEE_object *)fcobj); - } - break; - } - mem_free(string); - } -} - -static void -form_put(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *val, int attr) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct js_form *js_form = (struct js_form *)o; - struct form_view *fv = form_view_of_js_form(interp, js_form); - struct form *form = find_form_by_form_view(doc_view->document, fv); - unsigned char *string = see_value_to_unsigned_char(interp, val); - - if (!string) - return; - - if (p == s_action) { - if (form->action) { - ecmascript_set_action(&form->action, string); - } else { - mem_free_set(&form->action, string); - } - } else if (p == s_encoding) { - if (!c_strcasecmp(string, "application/x-www-form-urlencoded")) { - form->method = form->method == FORM_METHOD_GET ? FORM_METHOD_GET - : FORM_METHOD_POST; - } else if (!c_strcasecmp(string, "multipart/form-data")) { - form->method = FORM_METHOD_POST_MP; - } else if (!c_strcasecmp(string, "text/plain")) { - form->method = FORM_METHOD_POST_TEXT_PLAIN; - } - mem_free(string); - } else if (p == s_method) { - if (!c_strcasecmp(string, "GET")) { - form->method = FORM_METHOD_GET; - } else if (!c_strcasecmp(string, "POST")) { - form->method = FORM_METHOD_POST; - } - mem_free(string); - } else if (p == s_name) { - mem_free_set(&form->name, string); - } else if (p == s_target) { - mem_free_set(&form->target, string); - } -} - -static int -form_canput(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - return 1; -} - -static int -form_hasproperty(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - return 1; -} - -static void -js_form_reset(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct js_form *js_form = ( - see_check_class(interp, thisobj, &js_form_class), - (struct js_form *)thisobj); - struct form_view *fv = form_view_of_js_form(interp, js_form); - struct form *form = find_form_by_form_view(doc_view->document, fv); - - assert(form); - - do_reset_form(doc_view, form); - draw_forms(doc_view->session->tab->term, doc_view); - SEE_SET_BOOLEAN(res, 0); -} - -static void -js_form_submit(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct session *ses = doc_view->session; - struct js_form *js_form = ( - see_check_class(interp, thisobj, &js_form_class), - (struct js_form *)thisobj); - struct form_view *fv = form_view_of_js_form(interp, js_form); - struct form *form = find_form_by_form_view(doc_view->document, fv); - - assert(form); - submit_given_form(ses, doc_view, form, 0); - SEE_SET_BOOLEAN(res, 0); -} - -struct js_form *js_get_form_object(struct SEE_interpreter *interp, - struct js_document_object *doc, struct form_view *fv) -{ - struct js_form *js_form = fv->ecmascript_obj; - - if (js_form) { - assert(js_form->fv == fv); - if_assert_failed return NULL; - - return js_form; - } - - /* jsdoc ('document') is fv's parent */ - /* FIXME: That is NOT correct since the real containing element - * should be its parent, but gimme DOM first. --pasky */ - js_form = SEE_NEW_FINALIZE(interp, struct js_form, - form_finalize, NULL); - js_form->object.objectclass = &js_form_class; - js_form->object.Prototype = NULL; /* TODO: use prototype for form */ - js_form->parent = doc; - js_form->reset = SEE_cfunction_make(interp, js_form_reset, s_reset, 0); - js_form->submit = SEE_cfunction_make(interp, js_form_submit, s_submit, 0); - - js_form->fv = fv; - fv->ecmascript_obj = js_form; - return js_form; -} - -static void -form_finalize(struct SEE_interpreter *interp, void *jsform_void, void *dummy) -{ - struct js_form *jsform = jsform_void; - struct form_view *fv = jsform->fv; - - if (fv) { - /* Reset jsform->fv in case some ELinks code uses it - * even after this finalizer has run. Such use should - * not be possible but the explanation is somewhat - * complex so it seems safest to do this. - * - * Unlike SpiderMonkey, Boehm's GC allows a finalizer - * to resurrect the object by making something point - * to it. And it's a conservative GC so it can see - * such a pointer where none actually exists. However - * it also implicitly unregisters the finalizer before - * calling it, so the object becomes just a chunk of - * memory that nothing really uses, even if the GC - * never realizes it is garbage. */ - jsform->fv = NULL; - - /* If this assertion fails, leave fv->ecmascript_obj - * unchanged, because it may point to a different - * structure whose js_form.fv pointer will later have - * to be updated to avoid crashes. - * - * If the assertion fails and we leave jsform->fv - * unchanged, and something then deletes fv, - * jsform->fv becomes a dangling pointer because fv - * does not know about jsform. So that's why the - * assertion comes after the jsform->fv assignment - * above. */ - assert(fv->ecmascript_obj == jsform); - if_assert_failed return; - - fv->ecmascript_obj = NULL; - } -} - -void -see_detach_form_view(struct form_view *fv) -{ - struct js_form *jsform = fv->ecmascript_obj; - - if (jsform) { - /* If this assertion fails, it is not clear whether - * jsform->fv should be reset; crashes seem possible - * either way. Resetting it is easiest. */ - assert(jsform->fv == fv); - if_assert_failed {} - - jsform->fv = NULL; - fv->ecmascript_obj = NULL; - } -} - - -void -init_js_forms_object(struct ecmascript_interpreter *interpreter) -{ - struct global_object *g = interpreter->backend_data; - struct SEE_interpreter *interp = &g->interp; - struct SEE_value v, document; - struct js_forms_object *forms = SEE_NEW(interp, - struct js_forms_object); - - forms->object.objectclass = &js_forms_object_class; - forms->object.Prototype = NULL; - - SEE_OBJECT_GET(interp, interp->Global, s_document, &document); - SEE_SET_OBJECT(&v, (struct SEE_object *)forms); - SEE_OBJECT_PUT(interp, document.u.object, s_forms, &v, 0); - - forms->item = SEE_cfunction_make(interp, js_forms_item, s_item, 1); - forms->namedItem = SEE_cfunction_make(interp, js_forms_namedItem, - s_namedItem, 1); - forms->parent = (struct js_document_object *)document.u.object; -} diff --git a/src/ecmascript/see/form.h b/src/ecmascript/see/form.h deleted file mode 100644 index 707f0d3b..00000000 --- a/src/ecmascript/see/form.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef EL__ECMASCRIPT_SEE_FORM_H -#define EL__ECMASCRIPT_SEE_FORM_H - -struct js_document_object; -struct ecmascript_interpreter; -struct form_view; - -struct js_form { - struct SEE_object object; - struct js_document_object *parent; - struct form_view *fv; - struct SEE_object *reset; - struct SEE_object *submit; -}; - -struct js_form *js_get_form_object(struct SEE_interpreter *, struct js_document_object*, struct form_view *); -void init_js_forms_object(struct ecmascript_interpreter *); - -#endif diff --git a/src/ecmascript/see/input.c b/src/ecmascript/see/input.c deleted file mode 100644 index 1fcc3265..00000000 --- a/src/ecmascript/see/input.c +++ /dev/null @@ -1,146 +0,0 @@ -/* Input for SEE */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -#include "elinks.h" - -#include "ecmascript/see/input.h" -#include "util/memory.h" - -static SEE_unicode_t input_elinks_next(struct SEE_input *); -static void input_elinks_close(struct SEE_input *); - -static struct SEE_inputclass input_elinks_class = { - input_elinks_next, - input_elinks_close -}; - -struct input_elinks { - struct SEE_input inp; - unsigned char *s; -}; - -static SEE_unicode_t -input_elinks_next(struct SEE_input *inp) -{ - struct input_elinks *input = (struct input_elinks*)inp; - SEE_unicode_t next; - - next = input->inp.lookahead; - - if (*input->s == '\0') { - input->inp.eof = 1; - } else { - input->inp.lookahead = *input->s++; - input->inp.eof = 0; - } - return next; -} - -static void -input_elinks_close(struct SEE_input *inp) -{ - /* nothing */ -} - -struct SEE_input * -see_input_elinks(struct SEE_interpreter *interp, unsigned char *s) -{ - struct input_elinks *input; - - input = SEE_NEW(interp, struct input_elinks); - input->inp.interpreter = interp; - input->inp.inputclass = &input_elinks_class; - input->inp.filename = NULL; - input->inp.first_lineno = 1; - input->s = s; - SEE_INPUT_NEXT((struct SEE_input *)input); /* prime */ - return (struct SEE_input *)input; -} - -unsigned char * -see_string_to_unsigned_char(struct SEE_string *S) -{ - int i; - unsigned char *str = mem_alloc(S->length + 1); - - if (!str) - return NULL; - - for (i = 0; i < S->length; i++) - str[i] = (unsigned char)S->data[i]; - str[S->length] = '\0'; - return str; -} - -unsigned char * -see_value_to_unsigned_char(struct SEE_interpreter *interp, struct SEE_value *val) -{ - struct SEE_value result; - - SEE_ToString(interp, val, &result); - return see_string_to_unsigned_char(result.u.string); -} - -struct SEE_string * -string_to_SEE_string(struct SEE_interpreter *interp, unsigned char *s) -{ - unsigned int len; - unsigned int i; - struct SEE_string *str; - - len = s ? strlen(s) : 0; - str = SEE_string_new(interp, len); - str->length = len; - for (i = 0; i < len; i++) - str->data[i] = s[i]; - return str; -} - -void -append_unicode_to_SEE_string(struct SEE_interpreter *interp, - struct SEE_string *str, - unicode_val_T u) -{ - /* This is supposed to make a string from which - * SEE_string_to_unicode() can get the original @u back. - * If @u is a surrogate, then that is not possible, so - * throw an error instead. */ - if (u <= 0xFFFF && !is_utf16_surrogate(u)) { - SEE_string_addch(str, u); - } else if (needs_utf16_surrogates(u)) { - SEE_string_addch(str, get_utf16_high_surrogate(u)); - SEE_string_addch(str, get_utf16_low_surrogate(u)); - } else { - /* str->interpreter exists but is not documented, so don't - * use it; use a separate @interp parameter instead. - * Also, SEE does not support "%lX". */ - SEE_error_throw(interp, interp->RangeError, - "UTF-16 cannot encode U+%.4X", - (unsigned int) u); - } -} - -unicode_val_T -see_string_to_unicode(struct SEE_interpreter *interp, struct SEE_string *S) -{ - /* This implementation ignores extra characters in the string. */ - if (S->length < 1) { - SEE_error_throw(interp, interp->Error, - "String is empty"); - } else if (!is_utf16_surrogate(S->data[0])) { - return S->data[0]; - } else if (S->length >= 2 - && is_utf16_high_surrogate(S->data[0]) - && is_utf16_low_surrogate(S->data[1])) { - return join_utf16_surrogates(S->data[0], S->data[1]); - } else { - SEE_error_throw(interp, interp->Error, - "Invalid UTF-16 sequence"); - } -} diff --git a/src/ecmascript/see/input.h b/src/ecmascript/see/input.h deleted file mode 100644 index c8a2d82b..00000000 --- a/src/ecmascript/see/input.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef EL__ECMASCRIPT_SEE_INPUT_H -#define EL__ECMASCRIPT_SEE_INPUT_H - -#include "intl/charsets.h" - -struct SEE_interpreter; -struct SEE_string; -struct SEE_value; - -struct SEE_input *see_input_elinks(struct SEE_interpreter *, unsigned char *); -unsigned char *see_string_to_unsigned_char(struct SEE_string *); -unsigned char *see_value_to_unsigned_char(struct SEE_interpreter *, struct SEE_value *); -struct SEE_string *string_to_SEE_string(struct SEE_interpreter *, unsigned char *); -void append_unicode_to_SEE_string(struct SEE_interpreter *, struct SEE_string *, - unicode_val_T); -unicode_val_T see_string_to_unicode(struct SEE_interpreter *, struct SEE_string *); - -#endif diff --git a/src/ecmascript/see/location.c b/src/ecmascript/see/location.c deleted file mode 100644 index 88f56a44..00000000 --- a/src/ecmascript/see/location.c +++ /dev/null @@ -1,361 +0,0 @@ -/* The SEE location and history objects implementation. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -#include "elinks.h" - -#include - -#include "bfu/dialog.h" -#include "cache/cache.h" -#include "cookies/cookies.h" -#include "dialogs/menu.h" -#include "dialogs/status.h" -#include "document/html/frames.h" -#include "document/document.h" -#include "document/forms.h" -#include "document/view.h" -#include "ecmascript/ecmascript.h" -#include "ecmascript/see/checktype.h" -#include "ecmascript/see/input.h" -#include "ecmascript/see/location.h" -#include "ecmascript/see/strings.h" -#include "ecmascript/see/window.h" -#include "intl/gettext/libintl.h" -#include "main/select.h" -#include "osdep/newwin.h" -#include "osdep/sysname.h" -#include "protocol/http/http.h" -#include "protocol/uri.h" -#include "session/history.h" -#include "session/location.h" -#include "session/session.h" -#include "session/task.h" -#include "terminal/tab.h" -#include "terminal/terminal.h" -#include "util/conv.h" -#include "util/memory.h" -#include "util/string.h" -#include "viewer/text/draw.h" -#include "viewer/text/form.h" -#include "viewer/text/link.h" -#include "viewer/text/vs.h" - -static void delayed_goto(void *); -static void history_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); -static int history_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static void js_history_back(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_history_forward(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_history_go(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_location_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void location_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); -static void location_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); -static int location_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static int location_canput(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); - -void location_goto(struct document_view *, unsigned char *); - -struct js_history_object { - struct SEE_object object; - struct SEE_object *back; - struct SEE_object *forward; - struct SEE_object *go; -}; - -struct js_location_object { - struct SEE_object object; - struct SEE_object *toString; -}; - -struct delayed_goto { - /* It might look more convenient to pass doc_view around but it could - * disappear during wild dances inside of frames or so. */ - struct view_state *vs; - struct uri *uri; -}; - -struct SEE_objectclass js_history_object_class = { - "history", - history_get, - SEE_no_put, - SEE_no_canput, - history_hasproperty, - SEE_no_delete, - SEE_no_defaultvalue, - SEE_no_enumerator, - NULL, - NULL, - NULL -}; - -struct SEE_objectclass js_location_object_class = { - "location", - location_get, - location_put, - location_canput, - location_hasproperty, - SEE_no_delete, - SEE_no_defaultvalue, - SEE_no_enumerator, - NULL, - NULL, - NULL -}; - -static void -delayed_goto(void *data) -{ - struct delayed_goto *deg = data; - - assert(deg); - if (deg->vs->doc_view - && deg->vs->doc_view == deg->vs->doc_view->session->doc_view) { - goto_uri_frame(deg->vs->doc_view->session, deg->uri, - deg->vs->doc_view->name, - CACHE_MODE_NORMAL); - } - done_uri(deg->uri); - mem_free(deg); -} - -void -location_goto(struct document_view *doc_view, unsigned char *url) -{ - unsigned char *new_abs_url; - struct uri *new_uri; - struct delayed_goto *deg; - - /* Workaround for bug 611. Does not crash, but may lead to infinite loop.*/ - if (!doc_view) return; - new_abs_url = join_urls(doc_view->document->uri, - trim_chars(url, ' ', 0)); - if (!new_abs_url) - return; - new_uri = get_uri(new_abs_url, 0); - mem_free(new_abs_url); - if (!new_uri) - return; - deg = mem_calloc(1, sizeof(*deg)); - if (!deg) { - done_uri(new_uri); - return; - } - assert(doc_view->vs); - deg->vs = doc_view->vs; - deg->uri = new_uri; - /* It does not seem to be very safe inside of frames to - * call goto_uri() right away. */ - register_bottom_half(delayed_goto, deg); -} - - -static void -history_get(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *res) -{ - struct js_history_object *history = (struct js_history_object *)o; - - if (p == s_back) { - SEE_SET_OBJECT(res, history->back); - } else if (p == s_forward) { - SEE_SET_OBJECT(res, history->forward); - } else if (p == s_go) { - SEE_SET_OBJECT(res, history->go); - } else { - SEE_SET_UNDEFINED(res); - } -} - -static int -history_hasproperty(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - if (p == s_back || p == s_forward || p == s_go) - return 1; - return 0; -} - -static void -js_history_back(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct session *ses = doc_view->session; - - see_check_class(interp, thisobj, &js_history_object_class); - - SEE_SET_NULL(res); - go_back(ses); -} - -static void -js_history_forward(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct session *ses = doc_view->session; - - see_check_class(interp, thisobj, &js_history_object_class); - - SEE_SET_NULL(res); - go_unback(ses); -} - -static void -js_history_go(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct session *ses = doc_view->session; - unsigned char *str; - int index; - struct location *loc; - - see_check_class(interp, thisobj, &js_history_object_class); - - SEE_SET_NULL(res); - if (argc < 1) - return; - - str = see_value_to_unsigned_char(interp, argv[0]); - if (!str) - return; - - index = atol(str); - mem_free(str); - - for (loc = cur_loc(ses); - loc != (struct location *) &ses->history.history; - loc = index > 0 ? loc->next : loc->prev) { - if (!index) { - go_history(ses, loc); - break; - } - - index += index > 0 ? -1 : 1; - } -} - -static void -js_location_toString(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - unsigned char *string = get_uri_string(vs->uri, URI_ORIGINAL); - struct SEE_string *str = string_to_SEE_string(interp, string); - - see_check_class(interp, thisobj, &js_location_object_class); - - mem_free_if(string); - - SEE_SET_STRING(res, str); -} - -static void -location_get(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *res) -{ - struct js_location_object *loc = (struct js_location_object *)o; - - if (p == s_toString || p == s_toLocaleString) { - SEE_SET_OBJECT(res, loc->toString); - } else if (p == s_href) { - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - unsigned char *string = get_uri_string(vs->uri, URI_ORIGINAL); - struct SEE_string *str = string_to_SEE_string(interp, string); - - mem_free_if(string); - SEE_SET_STRING(res, str); - } else { - SEE_SET_UNDEFINED(res); - } -} - -static void -location_put(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *val, int attr) -{ - if (p == s_href) { - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - unsigned char *url = see_value_to_unsigned_char(interp, val); - - location_goto(doc_view, url); - mem_free(url); - } -} - -static int -location_hasproperty(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - if (p == s_toString || p == s_toLocaleString || p == s_href) - return 1; - return 0; -} - -static int -location_canput(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - if (p == s_href) - return 1; - return 0; -} - -void -init_js_history_object(struct ecmascript_interpreter *interpreter) -{ - struct global_object *g = interpreter->backend_data; - struct SEE_interpreter *interp = &g->interp; - struct SEE_value v; - struct js_history_object *history = SEE_NEW(interp, - struct js_history_object); - - history->object.objectclass = &js_history_object_class; - history->object.Prototype = NULL; - - SEE_SET_OBJECT(&v, (struct SEE_object *)history); - SEE_OBJECT_PUT(interp, interp->Global, s_history, &v, 0); - - history->back = SEE_cfunction_make(interp, js_history_back, s_back, 0); - history->forward = SEE_cfunction_make(interp, js_history_forward, s_forward, 0); - history->go = SEE_cfunction_make(interp, js_history_go, s_go, 1); -} - -void -init_js_location_object(struct ecmascript_interpreter *interpreter) -{ - struct global_object *g = interpreter->backend_data; - struct SEE_interpreter *interp = &g->interp; - struct SEE_value v; - struct js_location_object *loc = SEE_NEW(interp, - struct js_location_object); - - loc->object.objectclass = &js_location_object_class; - loc->object.Prototype = NULL; - - SEE_SET_OBJECT(&v, (struct SEE_object *)loc); - SEE_OBJECT_PUT(interp, interp->Global, s_location, &v, 0); - - loc->toString = SEE_cfunction_make(interp, js_location_toString, s_toString, 0); -} diff --git a/src/ecmascript/see/location.h b/src/ecmascript/see/location.h deleted file mode 100644 index 9a4c096e..00000000 --- a/src/ecmascript/see/location.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef EL__ECMASCRIPT_SEE_LOCATION_H -#define EL__ECMASCRIPT_SEE_LOCATION_H - -struct ecmascript_interpreter; - -void init_js_history_object(struct ecmascript_interpreter *); -void init_js_location_object(struct ecmascript_interpreter *); - -#endif diff --git a/src/ecmascript/see/navigator.c b/src/ecmascript/see/navigator.c deleted file mode 100644 index 01c4d5e0..00000000 --- a/src/ecmascript/see/navigator.c +++ /dev/null @@ -1,150 +0,0 @@ -/* The SEE navigator objects implementation. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -#include "elinks.h" - -#include - -#include "bfu/dialog.h" -#include "cache/cache.h" -#include "cookies/cookies.h" -#include "dialogs/menu.h" -#include "dialogs/status.h" -#include "document/html/frames.h" -#include "document/document.h" -#include "document/forms.h" -#include "document/view.h" -#include "ecmascript/ecmascript.h" -#include "ecmascript/see/input.h" -#include "ecmascript/see/navigator.h" -#include "ecmascript/see/strings.h" -#include "ecmascript/see/window.h" -#include "intl/gettext/libintl.h" -#include "main/select.h" -#include "osdep/newwin.h" -#include "osdep/sysname.h" -#include "protocol/http/http.h" -#include "protocol/uri.h" -#include "session/history.h" -#include "session/location.h" -#include "session/session.h" -#include "session/task.h" -#include "terminal/tab.h" -#include "terminal/terminal.h" -#include "util/conv.h" -#include "util/memory.h" -#include "util/string.h" -#include "viewer/text/draw.h" -#include "viewer/text/form.h" -#include "viewer/text/link.h" -#include "viewer/text/vs.h" - -static void navigator_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); -static int navigator_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); - -struct SEE_objectclass js_navigator_object_class = { - "navigator", - navigator_get, - SEE_no_put, - SEE_no_canput, - navigator_hasproperty, - SEE_no_delete, - SEE_no_defaultvalue, - SEE_no_enumerator, - NULL, - NULL, - NULL -}; - -static void -navigator_get(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *res) -{ - struct SEE_string *str; - - SEE_SET_UNDEFINED(res); - if (p == s_appCodeName) { - SEE_SET_STRING(res, s_Mozilla); - } else if (p == s_appName) { - SEE_SET_STRING(res, s_ELinks_); - } else if (p == s_appVersion) { - str = string_to_SEE_string(interp, VERSION); - SEE_SET_STRING(res, str); - } else if (p == s_language) { -#ifdef CONFIG_NLS - if (get_opt_bool("protocol.http.accept_ui_language", NULL)) { - str = string_to_SEE_string(interp, - language_to_iso639(current_language)); - SEE_SET_STRING(res, str); - } -#endif - } else if (p == s_platform) { - str = string_to_SEE_string(interp, system_name); - SEE_SET_STRING(res, str); - } else if (p == s_userAgent) { - /* FIXME: Code duplication. */ - unsigned char *optstr = get_opt_str("protocol.http.user_agent", - NULL); - - if (*optstr && strcmp(optstr, " ")) { - unsigned char *ustr, ts[64] = ""; - static unsigned char custr[256]; - /* TODO: Somehow get the terminal in which the - * document is actually being displayed. */ - struct terminal *term = get_default_terminal(); - - if (term) { - unsigned int tslen = 0; - - ulongcat(ts, &tslen, term->width, 3, 0); - ts[tslen++] = 'x'; - ulongcat(ts, &tslen, term->height, 3, 0); - } - ustr = subst_user_agent(optstr, VERSION_STRING, system_name, ts); - - if (ustr) { - safe_strncpy(custr, ustr, 256); - mem_free(ustr); - str = string_to_SEE_string(interp, custr); - SEE_SET_STRING(res, str); - } - } - } -} - - -static int -navigator_hasproperty(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - if (p == s_appCodeName || p == s_appName || p == s_appVersion - || p == s_language || p == s_platform || p == s_userAgent) - return 1; - return 0; -} - - - -void -init_js_navigator_object(struct ecmascript_interpreter *interpreter) -{ - struct global_object *g = interpreter->backend_data; - struct SEE_interpreter *interp = &g->interp; - struct SEE_value v; - struct SEE_object *navigator; - - navigator = SEE_NEW(interp, struct SEE_object); - - navigator->objectclass = &js_navigator_object_class; - navigator->Prototype = NULL; - - SEE_SET_OBJECT(&v, navigator); - SEE_OBJECT_PUT(interp, interp->Global, s_navigator, &v, 0); -} diff --git a/src/ecmascript/see/navigator.h b/src/ecmascript/see/navigator.h deleted file mode 100644 index d5411aca..00000000 --- a/src/ecmascript/see/navigator.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef EL__ECMASCRIPT_SEE_NAVIGATOR_H -#define EL__ECMASCRIPT_SEE_NAVIGATOR_H - -struct ecmascript_interpreter; - -void init_js_navigator_object(struct ecmascript_interpreter *); - -#endif diff --git a/src/ecmascript/see/strings.c b/src/ecmascript/see/strings.c deleted file mode 100644 index cdfec845..00000000 --- a/src/ecmascript/see/strings.c +++ /dev/null @@ -1,200 +0,0 @@ -#include -#include "ecmascript/see/strings.h" - -struct SEE_string *s_window; -struct SEE_string *s_closed; -struct SEE_string *s_parent; -struct SEE_string *s_self; -struct SEE_string *s_top; -struct SEE_string *s_alert; -struct SEE_string *s_open; - -struct SEE_string *s_menubar; - -struct SEE_string *s_statusbar; -struct SEE_string *s_visible; - -struct SEE_string *s_navigator; -struct SEE_string *s_appCodeName; -struct SEE_string *s_appName; -struct SEE_string *s_appVersion; -struct SEE_string *s_language; -struct SEE_string *s_platform; -struct SEE_string *s_userAgent; - -struct SEE_string *s_history; -struct SEE_string *s_back; -struct SEE_string *s_forward; -struct SEE_string *s_go; - -struct SEE_string *s_location; -struct SEE_string *s_href; -struct SEE_string *s_toString; -struct SEE_string *s_toLocaleString; - -struct SEE_string *s_input; -struct SEE_string *s_accessKey; -struct SEE_string *s_alt; -struct SEE_string *s_checked; -struct SEE_string *s_defaultChecked; -struct SEE_string *s_defaultValue; -struct SEE_string *s_disabled; -struct SEE_string *s_form; -struct SEE_string *s_maxLength; -struct SEE_string *s_name; -struct SEE_string *s_readonly; -struct SEE_string *s_size; -struct SEE_string *s_src; -struct SEE_string *s_tabindex; -struct SEE_string *s_type; -struct SEE_string *s_value; -struct SEE_string *s_blur; -struct SEE_string *s_click; -struct SEE_string *s_focus; -struct SEE_string *s_select; -struct SEE_string *s_selectedIndex; - -struct SEE_string *s_elements; -struct SEE_string *s_item; -struct SEE_string *s_namedItem; -struct SEE_string *s_length; - -struct SEE_string *s_action; -struct SEE_string *s_encoding; -struct SEE_string *s_method; -struct SEE_string *s_target; -struct SEE_string *s_reset; -struct SEE_string *s_submit; - -struct SEE_string *s_forms; - -struct SEE_string *s_document; -struct SEE_string *s_referrer; -struct SEE_string *s_title; -struct SEE_string *s_url; -struct SEE_string *s_write; -struct SEE_string *s_writeln; - -struct SEE_string *s_Mozilla; -struct SEE_string *s_ELinks_; -struct SEE_string *s_cookie; - -struct SEE_string *s_GET; -struct SEE_string *s_POST; -struct SEE_string *s_application_; -struct SEE_string *s_multipart_; -struct SEE_string *s_textplain; - -struct SEE_string *s_text; -struct SEE_string *s_password; -struct SEE_string *s_file; -struct SEE_string *s_checkbox; -struct SEE_string *s_radio; -struct SEE_string *s_image; -struct SEE_string *s_button; -struct SEE_string *s_hidden; - -struct SEE_string *s_timeout; -struct SEE_string *s_setTimeout; -struct SEE_string *s_status; - -void -init_intern_strings(void) -{ - s_window = SEE_intern_global("window"); - s_closed = SEE_intern_global("closed"); - s_parent = SEE_intern_global("parent"); - s_self = SEE_intern_global("self"); - s_top = SEE_intern_global("top"); - s_alert = SEE_intern_global("alert"); - s_open = SEE_intern_global("open"); - - s_menubar = SEE_intern_global("menubar"); - - s_statusbar = SEE_intern_global("statusbar"); - s_visible = SEE_intern_global("visible"); - - s_navigator = SEE_intern_global("navigator"); - s_appCodeName = SEE_intern_global("appCodeName"); - s_appName = SEE_intern_global("appName"); - s_appVersion = SEE_intern_global("appVersion"); - s_language = SEE_intern_global("language"); - s_platform = SEE_intern_global("platform"); - s_userAgent = SEE_intern_global("userAgent"); - - s_history = SEE_intern_global("history"); - s_back = SEE_intern_global("back"); - s_forward = SEE_intern_global("forward"); - s_go = SEE_intern_global("go"); - - s_location = SEE_intern_global("location"); - s_href = SEE_intern_global("href"); - s_toString = SEE_intern_global("toString"); - s_toLocaleString = SEE_intern_global("toLocaleString"); - - s_input = SEE_intern_global("input"); - s_accessKey = SEE_intern_global("accessKey"); - s_alt = SEE_intern_global("alt"); - s_checked = SEE_intern_global("checked"); - s_defaultChecked = SEE_intern_global("defaultChecked"); - s_defaultValue = SEE_intern_global("defaultValue"); - s_disabled = SEE_intern_global("disabled"); - s_form = SEE_intern_global("form"); - s_maxLength = SEE_intern_global("maxLength"); - s_name = SEE_intern_global("name"); - s_readonly = SEE_intern_global("readonly"); - s_size = SEE_intern_global("size"); - s_src = SEE_intern_global("src"); - s_tabindex = SEE_intern_global("tabindex"); - s_type = SEE_intern_global("type"); - s_value = SEE_intern_global("value"); - s_blur = SEE_intern_global("blur"); - s_click = SEE_intern_global("click"); - s_focus = SEE_intern_global("focus"); - s_select = SEE_intern_global("select"); - s_selectedIndex = SEE_intern_global("selectedIndex"); - - s_elements = SEE_intern_global("elements"); - s_item = SEE_intern_global("item"); - s_namedItem = SEE_intern_global("namedItem"); - s_length = SEE_intern_global("length"); - - s_action = SEE_intern_global("action"); - s_encoding = SEE_intern_global("encoding"); - s_method = SEE_intern_global("method"); - s_target = SEE_intern_global("target"); - s_reset = SEE_intern_global("reset"); - s_submit = SEE_intern_global("submit"); - - s_forms = SEE_intern_global("forms"); - - s_document = SEE_intern_global("document"); - s_referrer = SEE_intern_global("referrer"); - s_title = SEE_intern_global("title"); - s_url = SEE_intern_global("url"); - s_write = SEE_intern_global("write"); - s_writeln = SEE_intern_global("writeln"); - - s_Mozilla = SEE_intern_global("Mozilla"); - s_ELinks_ = SEE_intern_global("ELinks (roughly compatible with Netscape Navigator Mozilla and Microsoft Internet Explorer)"); - s_cookie = SEE_intern_global("cookie"); - - s_GET = SEE_intern_global("GET"); - s_POST = SEE_intern_global("POST"); - s_application_ = SEE_intern_global("application/x-www-form-urlencoded"); - s_multipart_ = SEE_intern_global("multipart/form-data"); - s_textplain = SEE_intern_global("text/plain"); - - s_text = SEE_intern_global("text"); - s_password = SEE_intern_global("password"); - s_file = SEE_intern_global("file"); - s_checkbox = SEE_intern_global("checkbox"); - s_radio = SEE_intern_global("radio"); - s_image = SEE_intern_global("image"); - s_button = SEE_intern_global("button"); - s_hidden = SEE_intern_global("hidden"); - - s_timeout = SEE_intern_global("timeout"); - s_setTimeout = SEE_intern_global("setTimeout"); - s_status = SEE_intern_global("status"); -} diff --git a/src/ecmascript/see/strings.h b/src/ecmascript/see/strings.h deleted file mode 100644 index 5bce77f8..00000000 --- a/src/ecmascript/see/strings.h +++ /dev/null @@ -1,105 +0,0 @@ - -#ifndef EL__ECMASCRIPT_SEE_STRINGS_H -#define EL__ECMASCRIPT_SEE_STRINGS_H - -struct SEE_string; - -void init_intern_strings(void); - -extern struct SEE_string *s_window; -extern struct SEE_string *s_closed; -extern struct SEE_string *s_parent; -extern struct SEE_string *s_self; -extern struct SEE_string *s_top; -extern struct SEE_string *s_alert; -extern struct SEE_string *s_open; - -extern struct SEE_string *s_menubar; - -extern struct SEE_string *s_statusbar; -extern struct SEE_string *s_visible; - -extern struct SEE_string *s_navigator; -extern struct SEE_string *s_appCodeName; -extern struct SEE_string *s_appName; -extern struct SEE_string *s_appVersion; -extern struct SEE_string *s_language; -extern struct SEE_string *s_platform; -extern struct SEE_string *s_userAgent; - -extern struct SEE_string *s_history; -extern struct SEE_string *s_back; -extern struct SEE_string *s_forward; -extern struct SEE_string *s_go; - -extern struct SEE_string *s_location; -extern struct SEE_string *s_href; -extern struct SEE_string *s_toString; -extern struct SEE_string *s_toLocaleString; - -extern struct SEE_string *s_input; -extern struct SEE_string *s_accessKey; -extern struct SEE_string *s_alt; -extern struct SEE_string *s_checked; -extern struct SEE_string *s_defaultChecked; -extern struct SEE_string *s_defaultValue; -extern struct SEE_string *s_disabled; -extern struct SEE_string *s_form; -extern struct SEE_string *s_maxLength; -extern struct SEE_string *s_name; -extern struct SEE_string *s_readonly; -extern struct SEE_string *s_size; -extern struct SEE_string *s_src; -extern struct SEE_string *s_tabindex; -extern struct SEE_string *s_type; -extern struct SEE_string *s_value; -extern struct SEE_string *s_blur; -extern struct SEE_string *s_click; -extern struct SEE_string *s_focus; -extern struct SEE_string *s_select; -extern struct SEE_string *s_selectedIndex; - -extern struct SEE_string *s_elements; -extern struct SEE_string *s_item; -extern struct SEE_string *s_namedItem; -extern struct SEE_string *s_length; - -extern struct SEE_string *s_action; -extern struct SEE_string *s_encoding; -extern struct SEE_string *s_method; -extern struct SEE_string *s_target; -extern struct SEE_string *s_reset; -extern struct SEE_string *s_submit; - -extern struct SEE_string *s_forms; - -extern struct SEE_string *s_document; -extern struct SEE_string *s_referrer; -extern struct SEE_string *s_title; -extern struct SEE_string *s_url; -extern struct SEE_string *s_write; -extern struct SEE_string *s_writeln; - -extern struct SEE_string *s_Mozilla; -extern struct SEE_string *s_ELinks_; -extern struct SEE_string *s_cookie; - -extern struct SEE_string *s_GET; -extern struct SEE_string *s_POST; -extern struct SEE_string *s_application_; -extern struct SEE_string *s_multipart_; -extern struct SEE_string *s_textplain; - -extern struct SEE_string *s_text; -extern struct SEE_string *s_password; -extern struct SEE_string *s_file; -extern struct SEE_string *s_checkbox; -extern struct SEE_string *s_radio; -extern struct SEE_string *s_image; -extern struct SEE_string *s_button; -extern struct SEE_string *s_hidden; - -extern struct SEE_string *s_timeout; -extern struct SEE_string *s_setTimeout; -extern struct SEE_string *s_status; -#endif diff --git a/src/ecmascript/see/unibar.c b/src/ecmascript/see/unibar.c deleted file mode 100644 index 5cd1f828..00000000 --- a/src/ecmascript/see/unibar.c +++ /dev/null @@ -1,200 +0,0 @@ -/* The SEE location and history objects implementation. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -#include "elinks.h" - -#include - -#include "bfu/dialog.h" -#include "cache/cache.h" -#include "cookies/cookies.h" -#include "dialogs/menu.h" -#include "dialogs/status.h" -#include "document/html/frames.h" -#include "document/document.h" -#include "document/forms.h" -#include "document/view.h" -#include "ecmascript/ecmascript.h" -#include "ecmascript/see/input.h" -#include "ecmascript/see/strings.h" -#include "ecmascript/see/unibar.h" -#include "ecmascript/see/window.h" -#include "intl/gettext/libintl.h" -#include "main/select.h" -#include "osdep/newwin.h" -#include "osdep/sysname.h" -#include "protocol/http/http.h" -#include "protocol/uri.h" -#include "session/history.h" -#include "session/location.h" -#include "session/session.h" -#include "session/task.h" -#include "terminal/tab.h" -#include "terminal/terminal.h" -#include "util/conv.h" -#include "util/memory.h" -#include "util/string.h" -#include "viewer/text/draw.h" -#include "viewer/text/form.h" -#include "viewer/text/link.h" -#include "viewer/text/vs.h" - -static void unibar_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); -static void unibar_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); -static int unibar_canput(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static int unibar_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); - -struct js_unibar_object { - struct SEE_object object; - unsigned char bar; -}; - -struct SEE_objectclass js_menubar_object_class = { - "menubar", - unibar_get, - unibar_put, - unibar_canput, - unibar_hasproperty, - SEE_no_delete, - SEE_no_defaultvalue, - SEE_no_enumerator, - NULL, - NULL, - NULL -}; - -struct SEE_objectclass js_statusbar_object_class = { - "statusbar", - unibar_get, - unibar_put, - unibar_canput, - unibar_hasproperty, - SEE_no_delete, - SEE_no_defaultvalue, - SEE_no_enumerator, - NULL, - NULL, - NULL -}; - -static void -unibar_get(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct session_status *status = &doc_view->session->status; - struct js_unibar_object *obj = (struct js_unibar_object *)o; - unsigned char bar = obj->bar; - - if (p == s_visible) { -#define unibar_fetch(bar) \ - SEE_SET_BOOLEAN(res, status->force_show_##bar##_bar >= 0 \ - ? status->force_show_##bar##_bar \ - : status->show_##bar##_bar) - switch (bar) { - case 's': - unibar_fetch(status); - break; - case 't': - unibar_fetch(title); - break; - default: - SEE_SET_BOOLEAN(res, 0); - break; - } -#undef unibar_fetch - return; - } - SEE_SET_UNDEFINED(res); -} - -static void -unibar_put(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *val, int attr) -{ - if (p == s_visible) { - struct global_object *g = (struct global_object *)interp; - struct view_state *vs = g->win->vs; - struct document_view *doc_view = vs->doc_view; - struct session_status *status = &doc_view->session->status; - struct js_unibar_object *obj = (struct js_unibar_object *)o; - unsigned char bar = obj->bar; - - switch (bar) { - case 's': - status->force_show_status_bar = - SEE_ToUint32(interp, val); - break; - case 't': - status->force_show_title_bar = - SEE_ToUint32(interp, val); - break; - default: - break; - - } - } -} - -static int -unibar_canput(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - if (p == s_visible) - return 1; - return 0; -} - -static int -unibar_hasproperty(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - if (p == s_visible) - return 1; - return 0; -} - -void -init_js_menubar_object(struct ecmascript_interpreter *interpreter) -{ - struct global_object *g = interpreter->backend_data; - struct SEE_interpreter *interp = &g->interp; - struct SEE_value v; - struct js_unibar_object *menu; - - menu = SEE_NEW(interp, struct js_unibar_object); - - menu->object.objectclass = &js_menubar_object_class; - menu->object.Prototype = NULL; - menu->bar = 't'; - - SEE_SET_OBJECT(&v, (struct SEE_object *)menu); - SEE_OBJECT_PUT(interp, interp->Global, s_menubar, &v, 0); -} - -void -init_js_statusbar_object(struct ecmascript_interpreter *interpreter) -{ - struct global_object *g = interpreter->backend_data; - struct SEE_interpreter *interp = &g->interp; - struct SEE_value v; - struct js_unibar_object *status; - - status = SEE_NEW(interp, struct js_unibar_object); - - status->object.objectclass = &js_statusbar_object_class; - status->object.Prototype = NULL; - status->bar = 's'; - - SEE_SET_OBJECT(&v, (struct SEE_object *)status); - SEE_OBJECT_PUT(interp, interp->Global, s_statusbar, &v, 0); -} diff --git a/src/ecmascript/see/unibar.h b/src/ecmascript/see/unibar.h deleted file mode 100644 index 7eaf6e76..00000000 --- a/src/ecmascript/see/unibar.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef EL__ECMASCRIPT_SEE_UNIBAR_H -#define EL__ECMASCRIPT_SEE_UNIBAR_H - -struct emascript_interpreter; - -void init_js_menubar_object(struct ecmascript_interpreter *); -void init_js_statusbar_object(struct ecmascript_interpreter *); - -#endif diff --git a/src/ecmascript/see/window.c b/src/ecmascript/see/window.c deleted file mode 100644 index 859d0417..00000000 --- a/src/ecmascript/see/window.c +++ /dev/null @@ -1,408 +0,0 @@ -/* The SEE window object implementation. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include - -#include "elinks.h" - -#include - -#include "bfu/dialog.h" -#include "cache/cache.h" -#include "cookies/cookies.h" -#include "dialogs/menu.h" -#include "dialogs/status.h" -#include "document/html/frames.h" -#include "document/document.h" -#include "document/forms.h" -#include "document/view.h" -#include "ecmascript/ecmascript.h" -#include "ecmascript/see/checktype.h" -#include "ecmascript/see/input.h" -#include "ecmascript/see/strings.h" -#include "ecmascript/see/window.h" -#include "intl/gettext/libintl.h" -#include "main/select.h" -#include "osdep/newwin.h" -#include "osdep/sysname.h" -#include "protocol/http/http.h" -#include "protocol/uri.h" -#include "session/history.h" -#include "session/location.h" -#include "session/session.h" -#include "session/task.h" -#include "terminal/tab.h" -#include "terminal/terminal.h" -#include "util/conv.h" -#include "util/memory.h" -#include "util/string.h" -#include "viewer/text/draw.h" -#include "viewer/text/form.h" -#include "viewer/text/link.h" -#include "viewer/text/vs.h" - -static struct js_window_object *js_get_global_object(void *); -static struct js_window_object *js_try_resolve_frame(struct document_view *, unsigned char *); -static void window_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); -static void window_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); -static int window_canput(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static int window_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static void js_window_alert(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_window_open(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); -static void js_setTimeout(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); - -void location_goto(struct document_view *, unsigned char *); - -struct SEE_objectclass js_window_object_class = { - "window", - window_get, - window_put, - window_canput, - window_hasproperty, - SEE_no_delete, - SEE_no_defaultvalue, - SEE_no_enumerator, - NULL, - NULL, - NULL -}; - -static struct js_window_object * -js_get_global_object(void *data) -{ - struct global_object *g = (struct global_object *)data; - return g->win; -} - -static struct js_window_object * -js_try_resolve_frame(struct document_view *doc_view, unsigned char *id) -{ - struct session *ses = doc_view->session; - struct frame *target; - - assert(ses); - target = ses_find_frame(ses, id); - if (!target) return NULL; - if (target->vs.ecmascript_fragile) - ecmascript_reset_state(&target->vs); - if (!target->vs.ecmascript) return NULL; - return js_get_global_object(target->vs.ecmascript->backend_data); -} - -static void -window_get(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *res) -{ - struct js_window_object *win = (struct js_window_object *)o; - struct view_state *vs = win->vs; - - if (p == s_closed) { - SEE_SET_BOOLEAN(res, 0); - } else if (p == s_self || p == s_parent || p == s_top || p == s_status) { - SEE_SET_OBJECT(res, o); -#if 0 - } else if (p == s_parent || p == s_top) { - struct document_view *doc_view = vs->doc_view; - struct document_view *top_view = doc_view->session->doc_view; - struct js_window_object *newjsframe; - - assert(top_view && top_view->vs); - if (top_view->vs->ecmascript_fragile) - ecmascript_reset_state(top_view->vs); - if (!top_view->vs->ecmascript) { - SEE_SET_UNDEFINED(res); - return; - } - newjsframe = js_get_global_object( - top_view->vs->ecmascript->backend_data); - - /* Keep this unrolled this way. Will have to check document.domain - * JS property. */ - /* Note that this check is perhaps overparanoid. If top windows - * is alien but some other child window is not, we should still - * let the script walk thru. That'd mean moving the check to - * other individual properties in this switch. */ - if (compare_uri(vs->uri, top_view->vs->uri, URI_HOST)) { - SEE_SET_OBJECT(res, (struct SEE_object *)newjsframe); - } -#endif - } else if (p == s_alert) { - SEE_SET_OBJECT(res, win->alert); - } else if (p == s_open) { - SEE_SET_OBJECT(res, win->open); - } else if (p == s_setTimeout) { - SEE_SET_OBJECT(res, win->setTimeout); - } else if (p == s_location) { - SEE_OBJECT_GET(interp, interp->Global, s_location, res); - } else if (p == s_navigator) { - SEE_OBJECT_GET(interp, interp->Global, s_navigator, res); - } else { - unsigned char *frame = see_string_to_unsigned_char(p); - struct document_view *doc_view = vs->doc_view; - struct js_window_object *obj; - - if (frame && (obj = js_try_resolve_frame(doc_view, frame))) { - SEE_SET_OBJECT(res, (struct SEE_object *)obj); - } else { - SEE_SET_UNDEFINED(res); - } - mem_free_if(frame); - } -} - -static void -window_put(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p, struct SEE_value *val, int attr) -{ - if (p == s_location) { - struct js_window_object *win = (struct js_window_object *)o; - struct view_state *vs = win->vs; - struct document_view *doc_view = vs->doc_view; - unsigned char *str = see_value_to_unsigned_char(interp, val); - - if (str) { - location_goto(doc_view, str); - mem_free(str); - } - } else if (p == s_status) { - struct global_object *g = (struct global_object *)interp; - struct js_window_object *win = g->win; - struct view_state *vs = win->vs; - struct document_view *doc_view = vs->doc_view; - struct session *ses = doc_view->session; - unsigned char *stat = see_value_to_unsigned_char(interp, val); - - mem_free_set(&ses->status.window_status, stat); - print_screen_status(ses); - } -} - -static int -window_canput(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - if (p == s_location || p == s_status) - return 1; - return 0; -} - -static int -window_hasproperty(struct SEE_interpreter *interp, struct SEE_object *o, - struct SEE_string *p) -{ - /* all unknown properties return UNDEFINED value */ - return 1; -} - - -static void -js_window_alert(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct js_window_object *win = g->win; - struct view_state *vs = win->vs; - unsigned char *string; - - /* Do not check thisobj->objectclass. ELinks sets this - * function as a property of both the window object and the - * global object, so thisobj may validly refer to either. */ - - SEE_SET_BOOLEAN(res, 1); - if (argc < 1) - return; - - string = see_value_to_unsigned_char(interp, argv[0]); - if (!string || !*string) { - mem_free_if(string); - return; - } - - info_box(vs->doc_view->session->tab->term, MSGBOX_FREE_TEXT, - N_("JavaScript Alert"), ALIGN_CENTER, string); - - -} - -static void -js_window_open(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct global_object *g = (struct global_object *)interp; - struct js_window_object *win = g->win; - struct view_state *vs = win->vs; - struct document_view *doc_view = vs->doc_view; - struct session *ses = doc_view->session; - unsigned char *frame = NULL; - unsigned char *url, *url2; - struct uri *uri; - struct SEE_value url_value; - static time_t ratelimit_start; - static int ratelimit_count; - - /* Do not check thisobj->objectclass. ELinks sets this - * function as a property of both the window object and the - * global object, so thisobj may validly refer to either. */ - - SEE_SET_OBJECT(res, (struct SEE_object *)win); - if (get_opt_bool("ecmascript.block_window_opening", ses)) { -#ifdef CONFIG_LEDS - set_led_value(ses->status.popup_led, 'P'); -#endif - return; - } - - if (argc < 1) return; - - /* Ratelimit window opening. Recursive window.open() is very nice. - * We permit at most 20 tabs in 2 seconds. The ratelimiter is very - * rough but shall suffice against the usual cases. */ - - if (!ratelimit_start || time(NULL) - ratelimit_start > 2) { - ratelimit_start = time(NULL); - ratelimit_count = 0; - } else { - ratelimit_count++; - if (ratelimit_count > 20) - return; - } - - SEE_ToString(interp, argv[0], &url_value); - url = see_string_to_unsigned_char(url_value.u.string); - if (!url) return; - trim_chars(url, ' ', 0); - if (argc > 1) { - struct SEE_value target_value; - - SEE_ToString(interp, argv[1], &target_value); - frame = see_string_to_unsigned_char(target_value.u.string); - if (!frame) { - mem_free(url); - return; - } - } - /* TODO: Support for window naming and perhaps some window features? */ - - url2 = join_urls(doc_view->document->uri, url); - mem_free(url); - if (!url2) { - mem_free_if(frame); - return; - } - uri = get_uri(url2, 0); - mem_free(url2); - if (!uri) { - mem_free_if(frame); - return; - } - - if (frame && *frame && c_strcasecmp(frame, "_blank")) { - struct delayed_open *deo = mem_calloc(1, sizeof(*deo)); - - if (deo) { - deo->ses = ses; - deo->uri = get_uri_reference(uri); - deo->target = stracpy(frame); - /* target will be freed in delayed_goto_uri_frame */ - register_bottom_half(delayed_goto_uri_frame, deo); - goto end; - } - } - - if (!get_cmd_opt_bool("no-connect") - && !get_cmd_opt_bool("no-home") - && !get_cmd_opt_bool("anonymous") - && can_open_in_new(ses->tab->term)) { - open_uri_in_new_window(ses, uri, NULL, ENV_ANY, - CACHE_MODE_NORMAL, TASK_NONE); - } else { - /* When opening a new tab, we might get rerendered, losing our - * context and triggerring a disaster, so postpone that. */ - struct delayed_open *deo = mem_calloc(1, sizeof(*deo)); - - if (deo) { - deo->ses = ses; - deo->uri = get_uri_reference(uri); - register_bottom_half(delayed_open, deo); - } - } - -end: - done_uri(uri); - mem_free_if(frame); -} - -static void -js_setTimeout(struct SEE_interpreter *interp, struct SEE_object *self, - struct SEE_object *thisobj, int argc, struct SEE_value **argv, - struct SEE_value *res) -{ - struct ecmascript_interpreter *ei; - unsigned char *code; - int timeout; - - /* Do not check thisobj->objectclass. ELinks sets this - * function as a property of both the window object and the - * global object, so thisobj may validly refer to either. */ - - if (argc != 2) return; - ei = ((struct global_object *)interp)->interpreter; - code = see_value_to_unsigned_char(interp, argv[0]); - timeout = SEE_ToInt32(interp, argv[1]); - ecmascript_set_timeout(ei, code, timeout); -} - -void -init_js_window_object(struct ecmascript_interpreter *interpreter) -{ - struct global_object *g = interpreter->backend_data; - struct SEE_interpreter *interp = &g->interp; - struct SEE_value v; - - g->win = SEE_NEW(interp, struct js_window_object); - - g->win->object.objectclass = &js_window_object_class; - g->win->object.Prototype = NULL; - g->win->vs = interpreter->vs; - - SEE_SET_OBJECT(&v, (struct SEE_object *)g->win); - SEE_OBJECT_PUT(interp, interp->Global, s_window, &v, 0); - - g->win->alert = SEE_cfunction_make(interp, js_window_alert, s_alert, 1); - g->win->open = SEE_cfunction_make(interp, js_window_open, s_open, 3); - g->win->setTimeout = SEE_cfunction_make(interp, js_setTimeout, s_setTimeout, 2); - - SEE_OBJECT_GET(interp, (struct SEE_object *)g->win, s_top, &v); - SEE_OBJECT_PUT(interp, interp->Global, s_top, &v, 0); - - SEE_OBJECT_GET(interp, (struct SEE_object *)g->win, s_self, &v); - SEE_OBJECT_PUT(interp, interp->Global, s_self, &v, 0); - - SEE_OBJECT_GET(interp, (struct SEE_object *)g->win, s_alert, &v); - SEE_OBJECT_PUT(interp, interp->Global, s_alert, &v, 0); - SEE_OBJECT_GET(interp, (struct SEE_object *)g->win, s_open, &v); - SEE_OBJECT_PUT(interp, interp->Global, s_open, &v, 0); - SEE_OBJECT_GET(interp, (struct SEE_object *)g->win, s_setTimeout, &v); - SEE_OBJECT_PUT(interp, interp->Global, s_setTimeout, &v, 0); -} - -void -checktime(struct SEE_interpreter *interp) -{ - struct global_object *g = (struct global_object *)interp; - - if (time(NULL) - g->exec_start > g->max_exec_time) { - struct terminal *term = g->win->vs->doc_view->session->tab->term; - /* A killer script! Alert! */ - ecmascript_timeout_dialog(term, g->max_exec_time); - SEE_error_throw_string(interp, interp->Error, s_timeout); - } -} diff --git a/src/ecmascript/see/window.h b/src/ecmascript/see/window.h deleted file mode 100644 index 0511c53b..00000000 --- a/src/ecmascript/see/window.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef EL__ECMASCRIPT_SEE_WINDOW_H -#define EL__ECMASCRIPT_SEE_WINDOW_H - -struct SEE_object; -struct SEE_interpreter; -struct ecmascript_interpreter; -struct string; -struct view_state; - - -struct js_window_object { - struct SEE_object object; - struct view_state *vs; - struct SEE_object *alert; - struct SEE_object *open; - struct SEE_object *setTimeout; -}; - -struct global_object { - struct SEE_interpreter interp; - /* used by setTimeout */ - struct ecmascript_interpreter *interpreter; - struct js_window_object *win; - struct string *ret; - int exec_start; - int max_exec_time; -}; - -void init_js_window_object(struct ecmascript_interpreter *); -void checktime(struct SEE_interpreter *interp); - -#endif