summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2014-11-02 15:46:42 +0000
committerVincent Sanders <vince@kyllikki.org>2014-11-02 15:46:42 +0000
commitc31c4babe172ab581a3196536d47fc2558a01acd (patch)
tree62d8630490f7969d0e690ba881d7b956e53d7561
parent1794ac0d333acc61eda3424141d4722b7eab9a2b (diff)
downloadnetsurf-c31c4babe172ab581a3196536d47fc2558a01acd.tar.gz
netsurf-c31c4babe172ab581a3196536d47fc2558a01acd.tar.bz2
Change contextual content retrieval to browser features.
Update the API which allows frontends to acquire the page features (images, link urls or form elements) present at the given coordinates within a browser window. By making this an explicit browser_window API and using the browser.h header for the associated data structure with a more appropriate API naming the usage is much more obvious and contained. Additionally the link url is now passed around as a nsurl stopping it being converted from nsurl to text and back again several times.
-rw-r--r--amiga/context_menu.c8
-rw-r--r--amiga/gui.c4
-rw-r--r--atari/ctxmenu.c61
-rw-r--r--cocoa/BrowserView.m8
-rw-r--r--content/content.c15
-rw-r--r--content/content.h17
-rw-r--r--content/content_protected.h4
-rw-r--r--desktop/browser.c52
-rw-r--r--desktop/browser.h44
-rw-r--r--desktop/textarea.h2
-rw-r--r--gtk/scaffolding.c95
-rw-r--r--render/html.c36
-rw-r--r--riscos/window.c23
-rw-r--r--utils/types.h15
14 files changed, 190 insertions, 194 deletions
diff --git a/amiga/context_menu.c b/amiga/context_menu.c
index a9a5f63f7..0e5512e8f 100644
--- a/amiga/context_menu.c
+++ b/amiga/context_menu.c
@@ -585,7 +585,7 @@ void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y)
struct hlcache_handle *cc = gwin->bw->current_content;
bool no_more_menus = false;
bool menuhascontent = false;
- struct contextual_content ccdata;
+ struct browser_window_features ccdata;
if(!cc) return;
if(ctxmenuobj) DisposeObject(ctxmenuobj);
@@ -648,7 +648,7 @@ void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y)
{
if(no_more_menus == false)
{
- browser_window_get_contextual_content(gwin->bw, x, y, &ccdata);
+ browser_window_get_features(gwin->bw, x, y, &ccdata);
ami_context_menu_add_submenu(ctxmenuobj, CMSUB_PAGE, cc);
menuhascontent = true;
@@ -659,9 +659,9 @@ void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y)
menuhascontent = true;
}
- if(ccdata.link_url)
+ if(ccdata.link)
{
- ami_context_menu_add_submenu(ctxmenuobj, CMSUB_URL, (char *)ccdata.link_url);
+ ami_context_menu_add_submenu(ctxmenuobj, CMSUB_URL, (char *)nsurl_access(ccdata.link));
menuhascontent = true;
}
diff --git a/amiga/gui.c b/amiga/gui.c
index aef075967..1c15b4a83 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -5032,7 +5032,7 @@ bool ami_text_box_at_point(struct gui_window_2 *gwin, ULONG *x, ULONG *y)
{
struct IBox *bbox;
ULONG xs, ys, width, height;
- struct contextual_content data;
+ struct browser_window_features data;
GetAttr(SPACE_AreaBox, (Object *)gwin->objects[GID_BROWSER],
(ULONG *)&bbox);
@@ -5046,7 +5046,7 @@ bool ami_text_box_at_point(struct gui_window_2 *gwin, ULONG *x, ULONG *y)
width=bbox->Width;
height=bbox->Height;
- browser_window_get_contextual_content(gwin->bw, *x, *y, &data);
+ browser_window_get_features(gwin->bw, *x, *y, &data);
if (data.form_features == CTX_FORM_TEXT)
return true;
diff --git a/atari/ctxmenu.c b/atari/ctxmenu.c
index e9c10807a..907e65d97 100644
--- a/atari/ctxmenu.c
+++ b/atari/ctxmenu.c
@@ -58,7 +58,7 @@ bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy);
struct s_context_info {
unsigned long flags;
- struct contextual_content ccdata;
+ struct browser_window_features ccdata;
};
struct s_context_info ctxinfo;
@@ -86,14 +86,12 @@ static struct s_context_info * get_context_info( struct gui_window * gw, short m
ctxinfo.flags |= CNT_BROWSER;
- memset( &ctxinfo.ccdata, sizeof(struct contextual_content), 0 );
-
gui_window_get_scroll(gw, &sx, &sy);
- browser_window_get_contextual_content( gw->browser->bw, mx+sx, my+sy,
- (struct contextual_content*)&ctxinfo.ccdata);
+ browser_window_get_features( gw->browser->bw, mx+sx, my+sy,
+ &ctxinfo.ccdata);
- if( ctxinfo.ccdata.link_url ){
+ if( ctxinfo.ccdata.link ){
ctxinfo.flags |= CNT_HREF;
}
if( ctxinfo.ccdata.object) {
@@ -242,23 +240,18 @@ void context_popup(struct gui_window * gw, short x, short y)
}
case POP_CTX_SAVE_LINK_AS:
- if (ctx->ccdata.link_url != NULL) {
- nsurl *url;
+ if (ctx->ccdata.link != NULL) {
nserror error;
- error = nsurl_create(ctx->ccdata.link_url, &url);
- if (error == NSERROR_OK) {
- error = browser_window_navigate(
- gw->browser->bw,
- url,
- browser_window_get_url(gw->browser->bw),
- BW_NAVIGATE_DOWNLOAD,
- NULL,
- NULL,
- NULL
- );
- nsurl_unref(url);
- }
+ error = browser_window_navigate(
+ gw->browser->bw,
+ ctx->ccdata.link,
+ browser_window_get_url(gw->browser->bw),
+ BW_NAVIGATE_DOWNLOAD,
+ NULL,
+ NULL,
+ NULL);
+
if (error != NSERROR_OK) {
warn_user(messages_get_errorcode(error), 0);
}
@@ -276,27 +269,23 @@ void context_popup(struct gui_window * gw, short x, short y)
break;
case POP_CTX_COPY_LINK:
- if ((ctx->flags & CNT_HREF) && ctx->ccdata.link_url != NULL) {
- scrap_txt_write((char*)ctx->ccdata.link_url);
+ if ((ctx->flags & CNT_HREF) &&
+ (ctx->ccdata.link != NULL)) {
+ scrap_txt_write((char*)nsurl_access(ctx->ccdata.link));
}
break;
case POP_CTX_OPEN_NEW:
- if ((ctx->flags & CNT_HREF) && ctx->ccdata.link_url) {
- nsurl *url;
+ if ((ctx->flags & CNT_HREF) &&
+ (ctx->ccdata.link != NULL)) {
nserror error;
- error = nsurl_create(ctx->ccdata.link_url, &url);
- if (error == NSERROR_OK) {
- error = browser_window_create(
- BW_CREATE_HISTORY | BW_CREATE_CLONE,
- url,
- browser_window_get_url(gw->browser->bw),
- gw->browser->bw,
- NULL
- );
- nsurl_unref(url);
- }
+ error = browser_window_create(
+ BW_CREATE_HISTORY | BW_CREATE_CLONE,
+ ctx->ccdata.link,
+ browser_window_get_url(gw->browser->bw),
+ gw->browser->bw,
+ NULL);
if (error != NSERROR_OK) {
warn_user(messages_get_errorcode(error), 0);
}
diff --git a/cocoa/BrowserView.m b/cocoa/BrowserView.m
index 2a3382c8c..d07cb5411 100644
--- a/cocoa/BrowserView.m
+++ b/cocoa/BrowserView.m
@@ -490,9 +490,9 @@ static browser_mouse_state cocoa_mouse_flags_for_event( NSEvent *evt )
NSMenu *popupMenu = [[NSMenu alloc] initWithTitle: @""];
NSPoint point = [self convertMousePoint: event];
- struct contextual_content cont;
+ struct browser_window_features;
- browser_window_get_contextual_content( browser, point.x, point.y, &cont);
+ browser_window_get_features(browser, point.x, point.y, &cont);
if (cont.object != NULL) {
NSString *imageURL = [NSString stringWithUTF8String: nsurl_access(hlcache_handle_get_url( cont.object ))];
@@ -513,8 +513,8 @@ static browser_mouse_state cocoa_mouse_flags_for_event( NSEvent *evt )
[popupMenu addItem: [NSMenuItem separatorItem]];
}
- if (cont.link_url != NULL) {
- NSString *target = [NSString stringWithUTF8String: cont.link_url];
+ if (cont.link != NULL) {
+ NSString *target = [NSString stringWithUTF8String: nsurl_access(cont.link)];
[[popupMenu addItemWithTitle: NSLocalizedString( @"Open link in new tab", @"Context menu" )
action: @selector(cmOpenURLInTab:)
diff --git a/content/content.c b/content/content.c
index 4641571bd..ee6ff818f 100644
--- a/content/content.c
+++ b/content/content.c
@@ -795,20 +795,19 @@ char * content_get_selection(hlcache_handle *h)
return NULL;
}
-
-void content_get_contextual_content(struct hlcache_handle *h,
- int x, int y, struct contextual_content *data)
+/* exported interface documented in content/content.h */
+nserror content_get_contextual_content(struct hlcache_handle *h,
+ int x, int y, struct browser_window_features *data)
{
struct content *c = hlcache_handle_get_content(h);
assert(c != 0);
if (c->handler->get_contextual_content != NULL) {
- c->handler->get_contextual_content(c, x, y, data);
- return;
- } else {
- data->object = h;
- return;
+ return c->handler->get_contextual_content(c, x, y, data);
}
+
+ data->object = h;
+ return NSERROR_OK;
}
diff --git a/content/content.h b/content/content.h
index 45c9c0452..d78e3d96b 100644
--- a/content/content.h
+++ b/content/content.h
@@ -35,7 +35,6 @@
#include "utils/errors.h"
#include "utils/http.h"
#include "utils/nsurl.h"
-#include "utils/types.h"
#include "content/content_factory.h"
#include "content/content_type.h"
#include "desktop/search.h"
@@ -43,6 +42,7 @@
#include "desktop/plot_style.h"
struct browser_window;
+struct browser_window_features;
struct content;
struct llcache_handle;
struct hlcache_handle;
@@ -50,7 +50,6 @@ struct object_params;
struct rect;
struct redraw_context;
-
/** Status of a content */
typedef enum {
CONTENT_STATUS_LOADING, /**< Content is being fetched or
@@ -271,8 +270,18 @@ void content_open(struct hlcache_handle *h, struct browser_window *bw,
void content_close(struct hlcache_handle *h);
void content_clear_selection(struct hlcache_handle *h);
char * content_get_selection(struct hlcache_handle *h);
-void content_get_contextual_content(struct hlcache_handle *h,
- int x, int y, struct contextual_content *data);
+
+/**
+ * Get positional contextural information for a content.
+ *
+ * \param[in] h Handle to content to examine.
+ * \param[in] x The x coordinate to examine.
+ * \param[in] y The y coordinate to examine.
+ * \param[out] data The context structure to fill in.
+ */
+nserror content_get_contextual_content(struct hlcache_handle *h,
+ int x, int y, struct browser_window_features *data);
+
bool content_scroll_at_point(struct hlcache_handle *h,
int x, int y, int scrx, int scry);
bool content_drop_file_at_point(struct hlcache_handle *h,
diff --git a/content/content_protected.h b/content/content_protected.h
index 7d51e1b8c..84b401f00 100644
--- a/content/content_protected.h
+++ b/content/content_protected.h
@@ -67,8 +67,8 @@ struct content_handler {
void (*close)(struct content *c);
void (*clear_selection)(struct content *c);
char * (*get_selection)(struct content *c);
- void (*get_contextual_content)(struct content *c, int x, int y,
- struct contextual_content *data);
+ nserror (*get_contextual_content)(struct content *c, int x, int y,
+ struct browser_window_features *data);
bool (*scroll_at_point)(struct content *c, int x, int y,
int scrx, int scry);
bool (*drop_file_at_point)(struct content *c, int x, int y,
diff --git a/desktop/browser.c b/desktop/browser.c
index b1c4044c2..82585ab0d 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -560,18 +560,28 @@ void browser_window_set_scroll(struct browser_window *bw, int x, int y)
}
/**
- * Internal helper for browser_window_get_contextual_content
+ * Internal helper for getting the positional features
+ *
+ * \param[in] bw browser window to examine.
+ * \param[in] x x-coordinate of point of interest
+ * \param[in] y y-coordinate of point of interest
+ * \param[out] data Feature structure to update.
+ * \return NSERROR_OK or appropriate error code on faliure.
*/
-static void browser_window__get_contextual_content(struct browser_window *bw,
- int x, int y, struct contextual_content *data)
+static nserror
+browser_window__get_contextual_content(struct browser_window *bw,
+ int x, int y, struct browser_window_features *data)
{
+ nserror ret = NSERROR_OK;
+
/* Handle (i)frame scroll offset (core-managed browser windows only) */
x += scrollbar_get_offset(bw->scroll_x);
y += scrollbar_get_offset(bw->scroll_y);
if (bw->children) {
/* Browser window has children, so pass request on to
- * appropriate child */
+ * appropriate child.
+ */
struct browser_window *bwc;
int cur_child;
int children = bw->rows * bw->cols;
@@ -582,39 +592,41 @@ static void browser_window__get_contextual_content(struct browser_window *bw,
bwc = &bw->children[cur_child];
/* Skip this frame if (x, y) coord lies outside */
- if (x < bwc->x || bwc->x + bwc->width < x ||
- y < bwc->y || bwc->y + bwc->height < y)
+ if ((x < bwc->x) ||
+ (bwc->x + bwc->width < x) ||
+ (y < bwc->y) ||
+ (bwc->y + bwc->height < y)) {
continue;
+ }
/* Pass request into this child */
- browser_window__get_contextual_content(bwc,
+ return browser_window__get_contextual_content(bwc,
(x - bwc->x), (y - bwc->y), data);
- return;
}
/* Coordinate not contained by any frame */
- return;
- }
- if (bw->current_content == NULL)
- /* No content; nothing to set */
- return;
+ } else if (bw->current_content != NULL) {
+ /* Pass request to content */
+ ret = content_get_contextual_content(bw->current_content,
+ x, y, data);
+ data->main = bw->current_content;
+ }
- /* Pass request to content */
- content_get_contextual_content(bw->current_content, x, y, data);
- data->main = bw->current_content;
+ return ret;
}
/* exported interface, documented in browser.h */
-void browser_window_get_contextual_content(struct browser_window *bw,
- int x, int y, struct contextual_content *data)
+nserror browser_window_get_features(struct browser_window *bw,
+ int x, int y, struct browser_window_features *data)
{
- data->link_url = NULL;
+ /* clear the features structure to empty values */
+ data->link = NULL;
data->object = NULL;
data->main = NULL;
data->form_features = CTX_FORM_NONE;
- browser_window__get_contextual_content(bw, x, y, data);
+ return browser_window__get_contextual_content(bw, x, y, data);
}
/* exported interface, documented in browser.h */
diff --git a/desktop/browser.h b/desktop/browser.h
index 5a1d70d7b..1d896dd72 100644
--- a/desktop/browser.h
+++ b/desktop/browser.h
@@ -117,6 +117,27 @@ enum browser_window_nav_flags {
};
/**
+ * Page features at a specific spatial location.
+ */
+struct browser_window_features {
+ /** URL of a link or NULL. */
+ struct nsurl *link;
+
+ /** Object at position or NULL. */
+ struct hlcache_handle *object;
+
+ /** handle of top level content. */
+ struct hlcache_handle *main;
+
+ /** type of form feature. */
+ enum {
+ CTX_FORM_NONE,
+ CTX_FORM_TEXT,
+ CTX_FORM_FILE
+ } form_features;
+};
+
+/**
* Create and open a new root browser window with the given page.
*
* \param flags Flags to control operation
@@ -302,17 +323,22 @@ void browser_window_set_scale(struct browser_window *bw, float scale, bool all);
float browser_window_get_scale(struct browser_window *bw);
/**
- * Get access to any content, link URLs and objects (images) currently
- * at the given (x, y) coordinates.
+ * Get access to any page features at the given coordinates.
*
- * \param bw browser window to look inside
- * \param x x-coordinate of point of interest
- * \param y y-coordinate of point of interest
- * \param data pointer to contextual_content struct. Its fields are updated
- * with pointers to any relevent content, or set to NULL if none.
+ * Fetches page features like content, link URLs and objects (images)
+ * at the specified co-ordinates within the browsing context.
+ *
+ * Fields within the supplied features structure are updated with
+ * pointers to any relevent content, or set to NULL if none.
+ *
+ * \param[in] bw browser window to examine.
+ * \param[in] x x-coordinate of point of interest
+ * \param[in] y y-coordinate of point of interest
+ * \param[out] data Feature structure to update.
+ * \return NSERROR_OK or appropriate error code on faliure.
*/
-void browser_window_get_contextual_content(struct browser_window *bw,
- int x, int y, struct contextual_content *data);
+nserror browser_window_get_features(struct browser_window *bw,
+ int x, int y, struct browser_window_features *data);
/**
* Send a scroll request to a browser window at a particular point. The
diff --git a/desktop/textarea.h b/desktop/textarea.h
index 0927f4bbb..de63b3ffb 100644
--- a/desktop/textarea.h
+++ b/desktop/textarea.h
@@ -27,6 +27,8 @@
#include <stdint.h>
#include <stdbool.h>
+#include "utils/types.h"
+
struct textarea;
/* Text area flags */
diff --git a/gtk/scaffolding.c b/gtk/scaffolding.c
index 6e9ec53c3..e5da52be4 100644
--- a/gtk/scaffolding.c
+++ b/gtk/scaffolding.c
@@ -143,8 +143,9 @@ static struct nsgtk_scaffolding *scaf_current;
static struct nsgtk_scaffolding *scaf_list = NULL;
/** holds the context data for what's under the pointer, when the contextual
- * menu is opened. */
-static struct contextual_content current_menu_ctx;
+ * menu is opened.
+ */
+static struct browser_window_features current_menu_features;
/**
@@ -917,23 +918,23 @@ MULTIHANDLER(quit)
MENUHANDLER(savelink)
{
- nsurl *url;
struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *) data;
struct gui_window *gui = g->top_level;
struct browser_window *bw = nsgtk_get_browser_window(gui);
+ nserror err;
- if (current_menu_ctx.link_url == NULL)
+ if (current_menu_features.link == NULL)
return FALSE;
- if (nsurl_create(current_menu_ctx.link_url, &url) == NSERROR_OK) {
- browser_window_navigate(bw,
- url,
- NULL,
- BW_NAVIGATE_DOWNLOAD,
- NULL,
- NULL,
- NULL);
- nsurl_unref(url);
+ err = browser_window_navigate(bw,
+ current_menu_features.link,
+ NULL,
+ BW_NAVIGATE_DOWNLOAD,
+ NULL,
+ NULL,
+ NULL);
+ if (err != NSERROR_OK) {
+ warn_user(messages_get_errorcode(err), 0);
}
return TRUE;
@@ -947,21 +948,15 @@ MENUHANDLER(link_openwin)
struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *) data;
struct gui_window *gui = g->top_level;
struct browser_window *bw = nsgtk_get_browser_window(gui);
- nsurl *url;
- nserror error;
+ nserror err;
- if (current_menu_ctx.link_url == NULL)
+ if (current_menu_features.link == NULL)
return FALSE;
- error = nsurl_create(current_menu_ctx.link_url, &url);
- if (error == NSERROR_OK) {
- error = browser_window_create(
- BW_CREATE_CLONE | BW_CREATE_HISTORY,
- url, NULL, bw, NULL);
- nsurl_unref(url);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
+ err = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY,
+ current_menu_features.link, NULL, bw, NULL);
+ if (err != NSERROR_OK) {
+ warn_user(messages_get_errorcode(err), 0);
}
return TRUE;
@@ -975,23 +970,19 @@ MENUHANDLER(link_opentab)
struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *) data;
struct gui_window *gui = g->top_level;
struct browser_window *bw = nsgtk_get_browser_window(gui);
- nsurl *url;
- nserror error;
+ nserror err;
- if (current_menu_ctx.link_url == NULL)
+ if (current_menu_features.link == NULL)
return FALSE;
temp_open_background = 1;
- error = nsurl_create(current_menu_ctx.link_url, &url);
- if (error == NSERROR_OK) {
- error = browser_window_create(BW_CREATE_CLONE |
- BW_CREATE_HISTORY | BW_CREATE_TAB,
- url, NULL, bw, NULL);
- nsurl_unref(url);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
+ err = browser_window_create(BW_CREATE_CLONE |
+ BW_CREATE_HISTORY |
+ BW_CREATE_TAB,
+ current_menu_features.link, NULL, bw, NULL);
+ if (err != NSERROR_OK) {
+ warn_user(messages_get_errorcode(err), 0);
}
temp_open_background = -1;
@@ -1004,20 +995,10 @@ MENUHANDLER(link_opentab)
*/
MENUHANDLER(link_bookmark)
{
- nsurl *url;
- nserror error;
-
- if (current_menu_ctx.link_url == NULL)
+ if (current_menu_features.link == NULL)
return FALSE;
- error = nsurl_create(current_menu_ctx.link_url, &url);
- if (error == NSERROR_OK) {
- hotlist_add_url(url);
- nsurl_unref(url);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
+ hotlist_add_url(current_menu_features.link);
return TRUE;
}
@@ -1029,11 +1010,13 @@ MENUHANDLER(link_copy)
{
GtkClipboard *clipboard;
- if (current_menu_ctx.link_url == NULL)
+ if (current_menu_features.link == NULL)
return FALSE;
clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
- gtk_clipboard_set_text(clipboard, current_menu_ctx.link_url, -1);
+ gtk_clipboard_set_text(clipboard,
+ nsurl_access(current_menu_features.link), -1);
+
return TRUE;
}
@@ -2692,13 +2675,11 @@ void nsgtk_scaffolding_context_menu(struct nsgtk_scaffolding *g,
{
GtkMenu *gtkmenu;
- /* update the global current_menu_ctx */
- browser_window_get_contextual_content(
- nsgtk_get_browser_window(g->top_level),
- x, y, &current_menu_ctx);
-
+ /* update the global context menu features */
+ browser_window_get_features(nsgtk_get_browser_window(g->top_level),
+ x, y, &current_menu_features);
- if (current_menu_ctx.link_url != NULL) {
+ if (current_menu_features.link != NULL) {
/* menu is opening over a link */
gtkmenu = g->link_menu->link_menu;
} else {
diff --git a/render/html.c b/render/html.c
index 9e025fd3b..854d892cd 100644
--- a/render/html.c
+++ b/render/html.c
@@ -36,7 +36,6 @@
#include "utils/messages.h"
#include "utils/talloc.h"
#include "utils/utf8.h"
-#include "utils/utils.h"
#include "utils/nsoption.h"
#include "content/content_protected.h"
#include "content/fetch.h"
@@ -1617,17 +1616,16 @@ static char *html_get_selection(struct content *c)
* Get access to any content, link URLs and objects (images) currently
* at the given (x, y) coordinates.
*
- * \param c html content to look inside
- * \param x x-coordinate of point of interest
- * \param y y-coordinate of point of interest
- * \param data pointer to contextual_content struct. Its fields are updated
- * with pointers to any relevent content, or set to NULL if none.
+ * \param[in] c html content to look inside
+ * \param[in] x x-coordinate of point of interest
+ * \param[in] y y-coordinate of point of interest
+ * \param[out] data Positional features struct to be updated with any
+ * relevent content, or set to NULL if none.
+ * \return NSERROR_OK on success else appropriate error code.
*/
-static void
-html_get_contextual_content(struct content *c,
- int x,
- int y,
- struct contextual_content *data)
+static nserror
+html_get_contextual_content(struct content *c, int x, int y,
+ struct browser_window_features *data)
{
html_content *html = (html_content *) c;
@@ -1638,13 +1636,16 @@ html_get_contextual_content(struct content *c,
while ((next = box_at_point(box, x, y, &box_x, &box_y)) != NULL) {
box = next;
- if (box->style && css_computed_visibility(box->style) ==
- CSS_VISIBILITY_HIDDEN)
+ /* hidden boxes are ignored */
+ if ((box->style != NULL) &&
+ css_computed_visibility(box->style) == CSS_VISIBILITY_HIDDEN) {
continue;
+ }
- if (box->iframe)
- browser_window_get_contextual_content(box->iframe,
+ if (box->iframe) {
+ browser_window_get_features(box->iframe,
x - box_x, y - box_y, data);
+ }
if (box->object)
content_get_contextual_content(box->object,
@@ -1654,7 +1655,7 @@ html_get_contextual_content(struct content *c,
data->object = box->object;
if (box->href)
- data->link_url = nsurl_access(box->href);
+ data->link = box->href;
if (box->usemap) {
const char *target = NULL;
@@ -1663,7 +1664,7 @@ html_get_contextual_content(struct content *c,
/* Box might have imagemap, but no actual link area
* at point */
if (url != NULL)
- data->link_url = nsurl_access(url);
+ data->link = url;
}
if (box->gadget) {
switch (box->gadget->type) {
@@ -1683,6 +1684,7 @@ html_get_contextual_content(struct content *c,
}
}
}
+ return NSERROR_OK;
}
diff --git a/riscos/window.c b/riscos/window.c
index 5c47e115c..74d514693 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -1868,7 +1868,7 @@ bool ro_gui_window_toolbar_keypress(void *data, wimp_key *key)
bool ro_gui_window_handle_local_keypress(struct gui_window *g, wimp_key *key,
bool is_toolbar)
{
- struct contextual_content cont;
+ struct browser_window_features cont;
os_error *ro_error;
wimp_pointer pointer;
os_coord pos;
@@ -1892,7 +1892,7 @@ bool ro_gui_window_handle_local_keypress(struct gui_window *g, wimp_key *key,
if (!ro_gui_window_to_window_pos(g, pointer.pos.x, pointer.pos.y, &pos))
return false;
- browser_window_get_contextual_content(g->bw, pos.x, pos.y, &cont);
+ browser_window_get_features(g->bw, pos.x, pos.y, &cont);
switch (c) {
case IS_WIMP_KEY + wimp_KEY_F1: /* Help. */
@@ -2144,7 +2144,7 @@ bool ro_gui_window_menu_prepare(wimp_w w, wimp_i i, wimp_menu *menu,
struct gui_window *g;
struct browser_window *bw;
struct toolbar *toolbar;
- struct contextual_content cont;
+ struct browser_window_features cont;
bool export_sprite, export_draw, have_content;
os_coord pos;
browser_editor_flags editor_flags;
@@ -2176,21 +2176,15 @@ bool ro_gui_window_menu_prepare(wimp_w w, wimp_i i, wimp_menu *menu,
current_menu_main = NULL;
current_menu_object = NULL;
- if (current_menu_url != NULL) {
- nsurl_unref(current_menu_url);
- current_menu_url = NULL;
- }
+ current_menu_url = NULL;
if (ro_gui_window_to_window_pos(g, pointer->pos.x,
pointer->pos.y, &pos)) {
- browser_window_get_contextual_content(bw,
- pos.x, pos.y, &cont);
+ browser_window_get_features(bw, pos.x, pos.y, &cont);
current_menu_main = cont.main;
current_menu_object = cont.object;
- if (cont.link_url != NULL) {
- nsurl_create(cont.link_url, &current_menu_url);
- }
+ current_menu_url = cont.link;
}
}
@@ -3049,10 +3043,7 @@ void ro_gui_window_menu_close(wimp_w w, wimp_i i, wimp_menu *menu)
{
if (menu == ro_gui_browser_window_menu) {
current_menu_object = NULL;
- if (current_menu_url != NULL) {
- nsurl_unref(current_menu_url);
- current_menu_url = NULL;
- }
+ current_menu_url = NULL;
} else if (menu == gui_form_select_menu) {
gui_form_select_control = NULL;
}
diff --git a/utils/types.h b/utils/types.h
index 035ff76cb..3c78124e3 100644
--- a/utils/types.h
+++ b/utils/types.h
@@ -49,20 +49,5 @@ struct redraw_context {
};
-/**
- * Content located at a specific spatial location.
- *
- * \todo This structure should contain a nsurl not a string.
- */
-struct contextual_content {
- const char *link_url;
- struct hlcache_handle *object;
- struct hlcache_handle *main;
- enum {
- CTX_FORM_NONE,
- CTX_FORM_TEXT,
- CTX_FORM_FILE
- } form_features;
-};
#endif