⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 location.c

📁 elinks下lynx是最重要的二个文本浏览器, 在linux下非常实用, elinks也是gentoo安装过程中默认使用的浏览器, 这是elinks源代码
💻 C
字号:
/* The SpiderMonkey location and history objects implementation. */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <stdio.h>#include <stdlib.h>#include <string.h>#include "elinks.h"#include "ecmascript/spidermonkey/util.h"#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/spidermonkey/location.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 JSBool history_back(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool history_forward(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool history_go(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);const JSClass history_class = {	"history",	JSCLASS_HAS_PRIVATE,	JS_PropertyStub, JS_PropertyStub,	JS_PropertyStub, JS_PropertyStub,	JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub};const JSFunctionSpec history_funcs[] = {	{ "back",		history_back,		0 },	{ "forward",		history_forward,	0 },	{ "go",			history_go,		1 },	{ NULL }};static JSBoolhistory_back(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);	struct document_view *doc_view = interpreter->vs->doc_view;	struct session *ses = doc_view->session;	go_back(ses);/* history_back() must return 0 for onClick to cause displaying previous page * and return non zero for <a href="javascript:history.back()"> to prevent * "calculating" new link. Returned value 2 is changed to 0 in function * spidermonkey_eval_boolback */	return 2;}static JSBoolhistory_forward(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);	struct document_view *doc_view = interpreter->vs->doc_view;	struct session *ses = doc_view->session;	go_unback(ses);	return 2;}static JSBoolhistory_go(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);	struct document_view *doc_view = interpreter->vs->doc_view;	struct session *ses = doc_view->session;	int index;	struct location *loc;	if (argc != 1)		return JS_TRUE;	index  = atol(jsval_to_string(ctx, &argv[0]));	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;	}	return 2;}static JSBool location_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp);static JSBool location_set_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp);const JSClass location_class = {	"location",	JSCLASS_HAS_PRIVATE,	JS_PropertyStub, JS_PropertyStub,	location_get_property, location_set_property,	JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub};enum location_prop { JSP_LOC_HREF };const JSPropertySpec location_props[] = {	{ "href",	JSP_LOC_HREF,	JSPROP_ENUMERATE },	{ NULL }};static JSBoollocation_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp){	JSObject *parent = JS_GetParent(ctx, obj);	struct view_state *vs = JS_GetPrivate(ctx, parent);	if (!JSVAL_IS_INT(id))		return JS_TRUE;	undef_to_jsval(ctx, vp);	switch (JSVAL_TO_INT(id)) {	case JSP_LOC_HREF:		astring_to_jsval(ctx, vp, get_uri_string(vs->uri, URI_ORIGINAL));		break;	default:		INTERNAL("Invalid ID %d in location_get_property().", JSVAL_TO_INT(id));		break;	}	return JS_TRUE;}static JSBoollocation_set_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp){	JSObject *parent = JS_GetParent(ctx, obj);	struct view_state *vs = JS_GetPrivate(ctx, parent);	struct document_view *doc_view = vs->doc_view;	if (!JSVAL_IS_INT(id))		return JS_TRUE;	switch (JSVAL_TO_INT(id)) {	case JSP_LOC_HREF:		location_goto(doc_view, jsval_to_string(ctx, vp));		break;	}	return JS_TRUE;}static JSBool location_toString(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);const JSFunctionSpec location_funcs[] = {	{ "toString",		location_toString,	0 },	{ "toLocaleString",	location_toString,	0 },	{ NULL }};static JSBoollocation_toString(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return JS_GetProperty(ctx, obj, "href", rval);}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;};static voiddelayed_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);}voidlocation_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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -