netsurf: branch master updated. release/3.3-351-g4bdd4cf
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/4bdd4cf7b604b140ed203...
...commit http://git.netsurf-browser.org/netsurf.git/commit/4bdd4cf7b604b140ed203d3...
...tree http://git.netsurf-browser.org/netsurf.git/tree/4bdd4cf7b604b140ed203d30b...
The branch, master has been updated
via 4bdd4cf7b604b140ed203d30b5730879de92bdd6 (commit)
from 51c2dd70e2bb8da61f683916111f083ec0263953 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=4bdd4cf7b604b140ed2...
commit 4bdd4cf7b604b140ed203d30b5730879de92bdd6
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Update bindings to cope with improved nsgenbind syntax
diff --git a/javascript/duktape/Console.bnd b/javascript/duktape/Console.bnd
index cb96cec..734f003 100644
--- a/javascript/duktape/Console.bnd
+++ b/javascript/duktape/Console.bnd
@@ -10,7 +10,7 @@
*/
class Console {
- private "unsigned int" group;
+ private unsigned int group;
prologue %{
#include <nsutils/time.h>
@@ -38,7 +38,7 @@ write_log_entry(duk_context *ctx, unsigned int group, char logtype)
}
%};
-}
+};
init Console ()
%{
@@ -174,4 +174,4 @@ method Console::trace ()
duk_set_top(ctx, 1);
write_log_entry(ctx, priv->group, 'S');
return 0;
-%}
\ No newline at end of file
+%}
diff --git a/javascript/duktape/Document.bnd b/javascript/duktape/Document.bnd
index dce110c..49740c9 100644
--- a/javascript/duktape/Document.bnd
+++ b/javascript/duktape/Document.bnd
@@ -14,9 +14,9 @@ class Document {
#include "render/html_internal.h"
#include "utils/libdom.h"
%};
-}
+};
-init Document("struct dom_document *" document::node);
+init Document(struct dom_document *document::node);
method Document::write()
%{
diff --git a/javascript/duktape/Element.bnd b/javascript/duktape/Element.bnd
index 7607f84..bd11e2a 100644
--- a/javascript/duktape/Element.bnd
+++ b/javascript/duktape/Element.bnd
@@ -11,9 +11,9 @@
class Element {
prologue %{
%};
-}
+};
-init Element("struct dom_element *" element::node);
+init Element(struct dom_element *element::node);
getter Element::firstElementChild()
%{
diff --git a/javascript/duktape/HTMLCollection.bnd b/javascript/duktape/HTMLCollection.bnd
index 08a162d..2ffe702 100644
--- a/javascript/duktape/HTMLCollection.bnd
+++ b/javascript/duktape/HTMLCollection.bnd
@@ -9,10 +9,10 @@
*/
class HTMLCollection {
- private "struct dom_html_collection *" coll;
-}
+ private struct dom_html_collection *coll;
+};
-init HTMLCollection("struct dom_html_collection *" coll)
+init HTMLCollection(struct dom_html_collection *coll)
%{
priv->coll = coll;
dom_html_collection_ref(coll);
diff --git a/javascript/duktape/Location.bnd b/javascript/duktape/Location.bnd
index 8c79cd4..fbb0e4a 100644
--- a/javascript/duktape/Location.bnd
+++ b/javascript/duktape/Location.bnd
@@ -10,13 +10,15 @@
*/
class Location {
- private "nsurl *" url;
- prologue %{
+ private nsurl *url;
+};
+
+prologue Location()
+%{
#include "desktop/browser.h"
-%};
-}
+%}
-init Location("nsurl *" url)
+init Location(nsurl *url)
%{
priv->url = url;
nsurl_ref(url);
diff --git a/javascript/duktape/Node.bnd b/javascript/duktape/Node.bnd
index 2328710..b936064 100644
--- a/javascript/duktape/Node.bnd
+++ b/javascript/duktape/Node.bnd
@@ -9,10 +9,10 @@
*/
class Node {
- private "dom_node *" node;
-}
+ private dom_node *node;
+};
-init Node("struct dom_node *" node)
+init Node(struct dom_node *node)
%{
priv->node = node;
dom_node_ref(node);
diff --git a/javascript/duktape/NodeList.bnd b/javascript/duktape/NodeList.bnd
index e085b6c..7ddf56d 100644
--- a/javascript/duktape/NodeList.bnd
+++ b/javascript/duktape/NodeList.bnd
@@ -9,10 +9,10 @@
*/
class NodeList {
- private "struct dom_nodelist *" nodes;
-}
+ private struct dom_nodelist *nodes;
+};
-init NodeList("struct dom_nodelist *" nodes)
+init NodeList(struct dom_nodelist *nodes)
%{
priv->nodes = nodes;
dom_nodelist_ref(nodes);
diff --git a/javascript/duktape/Window.bnd b/javascript/duktape/Window.bnd
index 4121ac6..81f6059 100644
--- a/javascript/duktape/Window.bnd
+++ b/javascript/duktape/Window.bnd
@@ -9,17 +9,17 @@
*/
class Window {
- private "struct browser_window *" win;
- private "struct html_content *" htmlc;
+ private struct browser_window * win;
+ private struct html_content * htmlc;
prologue %{
#include "utils/nsurl.h"
#include "desktop/browser.h"
#include "render/html.h"
#include "render/html_internal.h"
%};
-}
+};
-init Window("struct browser_window *" win, "struct html_content *" htmlc)
+init Window(struct browser_window *win, struct html_content *htmlc)
%{
/* element window */
priv->win = win;
diff --git a/javascript/duktape/netsurf.bnd b/javascript/duktape/netsurf.bnd
index 56107b9..91133ca 100644
--- a/javascript/duktape/netsurf.bnd
+++ b/javascript/duktape/netsurf.bnd
@@ -50,7 +50,7 @@ struct dom_html_br_element;
#include "javascript/dukky.h"
%};
-}
+};
#include "Console.bnd"
#include "Window.bnd"
@@ -62,103 +62,103 @@ struct dom_html_br_element;
#include "Location.bnd"
/* specialisations of html_element */
-init HTMLUnknownElement("struct dom_html_element *" html_unknown_element::html_element);
-init HTMLFontElement("struct dom_html_element *" html_font_element::html_element);
-init HTMLDirectoryElement("struct dom_html_element *" html_directory_element::html_element);
-init HTMLFrameElement("struct dom_html_element *" html_frame_element::html_element);
-init HTMLFrameSetElement("struct dom_html_element *" html_frame_set_element::html_element);
-init HTMLMarqueeElement("struct dom_html_element *" html_marquee_element::html_element);
-init HTMLAppletElement("struct dom_html_element *" html_applet_element::html_element);
-init HTMLCanvasElement("struct dom_html_element *" html_canvas_element::html_element);
-init HTMLTemplateElement("struct dom_html_element *" html_template_element::html_element);
-init HTMLScriptElement("struct dom_html_element *" html_script_element::html_element);
-init HTMLDialogElement("struct dom_html_element *" html_dialog_element::html_element);
-init HTMLMenuItemElement("struct dom_html_element *" html_menu_item_element::html_element);
-init HTMLMenuElement("struct dom_html_element *" html_menu_element::html_element);
-init HTMLDetailsElement("struct dom_html_element *" html_details_element::html_element);
-init HTMLLegendElement("struct dom_html_element *" html_legend_element::html_element);
-init HTMLFieldSetElement("struct dom_html_element *" html_field_set_element::html_element);
-init HTMLMeterElement("struct dom_html_element *" html_meter_element::html_element);
-init HTMLProgressElement("struct dom_html_element *" html_progress_element::html_element);
-init HTMLOutputElement("struct dom_html_element *" html_output_element::html_element);
-init HTMLKeygenElement("struct dom_html_element *" html_keygen_element::html_element);
-init HTMLTextAreaElement("struct dom_html_element *" html_text_area_element::html_element);
-init HTMLOptionElement("struct dom_html_element *" html_option_element::html_element);
-init HTMLOptGroupElement("struct dom_html_element *" html_opt_group_element::html_element);
-init HTMLDataListElement("struct dom_html_element *" html_data_list_element::html_element);
-init HTMLSelectElement("struct dom_html_element *" html_select_element::html_element);
-init HTMLButtonElement("struct dom_html_element *" html_button_element::html_element);
-init HTMLInputElement("struct dom_html_element *" html_input_element::html_element);
-init HTMLLabelElement("struct dom_html_element *" html_label_element::html_element);
-init HTMLFormElement("struct dom_html_element *" html_form_element::html_element);
-init HTMLTableCellElement("struct dom_html_element *" html_table_cell_element::html_element);
-init HTMLTableRowElement("struct dom_html_element *" html_table_row_element::html_element);
-init HTMLTableSectionElement("struct dom_html_element *" html_table_section_element::html_element);
-init HTMLTableColElement("struct dom_html_element *" html_table_col_element::html_element);
-init HTMLTableCaptionElement("struct dom_html_element *" html_table_caption_element::html_element);
-init HTMLTableElement("struct dom_html_element *" html_table_element::html_element);
-init HTMLAreaElement("struct dom_html_element *" html_area_element::html_element);
-init HTMLMapElement("struct dom_html_element *" html_map_element::html_element);
-init HTMLMediaElement("struct dom_html_element *" html_media_element::html_element);
-init HTMLTrackElement("struct dom_html_element *" html_track_element::html_element);
-init HTMLParamElement("struct dom_html_element *" html_param_element::html_element);
-init HTMLObjectElement("struct dom_html_element *" html_object_element::html_element);
-init HTMLEmbedElement("struct dom_html_element *" html_embed_element::html_element);
-init HTMLIFrameElement("struct dom_html_element *" html_i_frame_element::html_element);
-init HTMLImageElement("struct dom_html_element *" html_image_element::html_element);
-init HTMLSourceElement("struct dom_html_element *" html_source_element::html_element);
-init HTMLPictureElement("struct dom_html_element *" html_picture_element::html_element);
-init HTMLModElement("struct dom_html_element *" html_mod_element::html_element);
-init HTMLBRElement("struct dom_html_element *" html_br_element::html_element);
-init HTMLSpanElement("struct dom_html_element *" html_span_element::html_element);
-init HTMLTimeElement("struct dom_html_element *" html_time_element::html_element);
-init HTMLDataElement("struct dom_html_element *" html_data_element::html_element);
-init HTMLAnchorElement("struct dom_html_element *" html_anchor_element::html_element);
-init HTMLDivElement("struct dom_html_element *" html_div_element::html_element);
-init HTMLDListElement("struct dom_html_element *" html_d_list_element::html_element);
-init HTMLLIElement("struct dom_html_element *" html_li_element::html_element);
-init HTMLUListElement("struct dom_html_element *" html_u_list_element::html_element);
-init HTMLOListElement("struct dom_html_element *" html_o_list_element::html_element);
-init HTMLQuoteElement("struct dom_html_element *" html_quote_element::html_element);
-init HTMLPreElement("struct dom_html_element *" html_pre_element::html_element);
-init HTMLHRElement("struct dom_html_element *" html_hr_element::html_element);
-init HTMLParagraphElement("struct dom_html_element *" html_paragraph_element::html_element);
-init HTMLHeadingElement("struct dom_html_element *" html_heading_element::html_element);
-init HTMLBodyElement("struct dom_html_element *" html_body_element::html_element);
-init HTMLStyleElement("struct dom_html_element *" html_style_element::html_element);
-init HTMLMetaElement("struct dom_html_element *" html_meta_element::html_element);
-init HTMLLinkElement("struct dom_html_element *" html_link_element::html_element);
-init HTMLBaseElement("struct dom_html_element *" html_base_element::html_element);
-init HTMLTitleElement("struct dom_html_element *" html_title_element::html_element);
-init HTMLHeadElement("struct dom_html_element *" html_head_element::html_element);
-init HTMLHtmlElement("struct dom_html_element *" html_html_element::html_element);
+init HTMLUnknownElement(struct dom_html_element *html_unknown_element::html_element);
+init HTMLFontElement(struct dom_html_element *html_font_element::html_element);
+init HTMLDirectoryElement(struct dom_html_element *html_directory_element::html_element);
+init HTMLFrameElement(struct dom_html_element *html_frame_element::html_element);
+init HTMLFrameSetElement(struct dom_html_element *html_frame_set_element::html_element);
+init HTMLMarqueeElement(struct dom_html_element *html_marquee_element::html_element);
+init HTMLAppletElement(struct dom_html_element *html_applet_element::html_element);
+init HTMLCanvasElement(struct dom_html_element *html_canvas_element::html_element);
+init HTMLTemplateElement(struct dom_html_element *html_template_element::html_element);
+init HTMLScriptElement(struct dom_html_element *html_script_element::html_element);
+init HTMLDialogElement(struct dom_html_element *html_dialog_element::html_element);
+init HTMLMenuItemElement(struct dom_html_element *html_menu_item_element::html_element);
+init HTMLMenuElement(struct dom_html_element *html_menu_element::html_element);
+init HTMLDetailsElement(struct dom_html_element *html_details_element::html_element);
+init HTMLLegendElement(struct dom_html_element *html_legend_element::html_element);
+init HTMLFieldSetElement(struct dom_html_element *html_field_set_element::html_element);
+init HTMLMeterElement(struct dom_html_element *html_meter_element::html_element);
+init HTMLProgressElement(struct dom_html_element *html_progress_element::html_element);
+init HTMLOutputElement(struct dom_html_element *html_output_element::html_element);
+init HTMLKeygenElement(struct dom_html_element *html_keygen_element::html_element);
+init HTMLTextAreaElement(struct dom_html_element *html_text_area_element::html_element);
+init HTMLOptionElement(struct dom_html_element *html_option_element::html_element);
+init HTMLOptGroupElement(struct dom_html_element *html_opt_group_element::html_element);
+init HTMLDataListElement(struct dom_html_element *html_data_list_element::html_element);
+init HTMLSelectElement(struct dom_html_element *html_select_element::html_element);
+init HTMLButtonElement(struct dom_html_element *html_button_element::html_element);
+init HTMLInputElement(struct dom_html_element *html_input_element::html_element);
+init HTMLLabelElement(struct dom_html_element *html_label_element::html_element);
+init HTMLFormElement(struct dom_html_element *html_form_element::html_element);
+init HTMLTableCellElement(struct dom_html_element *html_table_cell_element::html_element);
+init HTMLTableRowElement(struct dom_html_element *html_table_row_element::html_element);
+init HTMLTableSectionElement(struct dom_html_element *html_table_section_element::html_element);
+init HTMLTableColElement(struct dom_html_element *html_table_col_element::html_element);
+init HTMLTableCaptionElement(struct dom_html_element *html_table_caption_element::html_element);
+init HTMLTableElement(struct dom_html_element *html_table_element::html_element);
+init HTMLAreaElement(struct dom_html_element *html_area_element::html_element);
+init HTMLMapElement(struct dom_html_element *html_map_element::html_element);
+init HTMLMediaElement(struct dom_html_element *html_media_element::html_element);
+init HTMLTrackElement(struct dom_html_element *html_track_element::html_element);
+init HTMLParamElement(struct dom_html_element *html_param_element::html_element);
+init HTMLObjectElement(struct dom_html_element *html_object_element::html_element);
+init HTMLEmbedElement(struct dom_html_element *html_embed_element::html_element);
+init HTMLIFrameElement(struct dom_html_element *html_i_frame_element::html_element);
+init HTMLImageElement(struct dom_html_element *html_image_element::html_element);
+init HTMLSourceElement(struct dom_html_element *html_source_element::html_element);
+init HTMLPictureElement(struct dom_html_element *html_picture_element::html_element);
+init HTMLModElement(struct dom_html_element *html_mod_element::html_element);
+init HTMLBRElement(struct dom_html_element *html_br_element::html_element);
+init HTMLSpanElement(struct dom_html_element *html_span_element::html_element);
+init HTMLTimeElement(struct dom_html_element *html_time_element::html_element);
+init HTMLDataElement(struct dom_html_element *html_data_element::html_element);
+init HTMLAnchorElement(struct dom_html_element *html_anchor_element::html_element);
+init HTMLDivElement(struct dom_html_element *html_div_element::html_element);
+init HTMLDListElement(struct dom_html_element *html_d_list_element::html_element);
+init HTMLLIElement(struct dom_html_element *html_li_element::html_element);
+init HTMLUListElement(struct dom_html_element *html_u_list_element::html_element);
+init HTMLOListElement(struct dom_html_element *html_o_list_element::html_element);
+init HTMLQuoteElement(struct dom_html_element *html_quote_element::html_element);
+init HTMLPreElement(struct dom_html_element *html_pre_element::html_element);
+init HTMLHRElement(struct dom_html_element *html_hr_element::html_element);
+init HTMLParagraphElement(struct dom_html_element *html_paragraph_element::html_element);
+init HTMLHeadingElement(struct dom_html_element *html_heading_element::html_element);
+init HTMLBodyElement(struct dom_html_element *html_body_element::html_element);
+init HTMLStyleElement(struct dom_html_element *html_style_element::html_element);
+init HTMLMetaElement(struct dom_html_element *html_meta_element::html_element);
+init HTMLLinkElement(struct dom_html_element *html_link_element::html_element);
+init HTMLBaseElement(struct dom_html_element *html_base_element::html_element);
+init HTMLTitleElement(struct dom_html_element *html_title_element::html_element);
+init HTMLHeadElement(struct dom_html_element *html_head_element::html_element);
+init HTMLHtmlElement(struct dom_html_element *html_html_element::html_element);
/* specialisations of HTMLTableCellElement */
-init HTMLTableHeaderCellElement("struct dom_html_element *" html_table_header_cell_element::html_table_cell_element);
-init HTMLTableDataCellElement("struct dom_html_element *" html_table_data_cell_element::html_table_cell_element);
+init HTMLTableHeaderCellElement(struct dom_html_element *html_table_header_cell_element::html_table_cell_element);
+init HTMLTableDataCellElement(struct dom_html_element *html_table_data_cell_element::html_table_cell_element);
/* specialisations of html_media_element */
-init HTMLAudioElement("struct dom_html_element *" html_audio_element::html_media_element);
-init HTMLVideoElement("struct dom_html_element *" html_video_element::html_media_element);
+init HTMLAudioElement(struct dom_html_element *html_audio_element::html_media_element);
+init HTMLVideoElement(struct dom_html_element *html_video_element::html_media_element);
-init HTMLElement("struct dom_html_element *" html_element::element);
+init HTMLElement(struct dom_html_element *html_element::element);
-init Text("struct dom_node_text *" text::character_data);
-init Comment("struct dom_node_comment *" comment::character_data);
-init ProcessingInstruction("struct dom_node_text *" text::character_data);
+init Text(struct dom_node_text *text::character_data);
+init Comment(struct dom_node_comment *comment::character_data);
+init ProcessingInstruction(struct dom_node_text *text::character_data);
-init XMLDocument("struct dom_document *" document);
+init XMLDocument(struct dom_document *document);
-init CharacterData("struct dom_node_character_data *" character_data::node);
-init DocumentFragment("struct dom_document *" document::node);
-init DocumentType("struct dom_document *" document::node);
+init CharacterData(struct dom_node_character_data *character_data::node);
+init DocumentFragment(struct dom_document *document::node);
+init DocumentType(struct dom_document *document::node);
-init PropertyNodeList("struct dom_nodelist *" nodes);
-init RadioNodeList("struct dom_nodelist *" nodes);
+init PropertyNodeList(struct dom_nodelist *nodes);
+init RadioNodeList(struct dom_nodelist *nodes);
-init HTMLAllCollection("struct dom_html_collection *" coll);
-init HTMLFormControlsCollection("struct dom_html_collection *" coll);
-init HTMLOptionsCollection("struct dom_html_collection *" coll);
-init HTMLPropertiesCollection("struct dom_html_collection *" coll);
+init HTMLAllCollection(struct dom_html_collection *coll);
+init HTMLFormControlsCollection(struct dom_html_collection *coll);
+init HTMLOptionsCollection(struct dom_html_collection *coll);
+init HTMLPropertiesCollection(struct dom_html_collection *coll);
-----------------------------------------------------------------------
Summary of changes:
javascript/duktape/Console.bnd | 6 +-
javascript/duktape/Document.bnd | 4 +-
javascript/duktape/Element.bnd | 4 +-
javascript/duktape/HTMLCollection.bnd | 6 +-
javascript/duktape/Location.bnd | 12 ++-
javascript/duktape/Node.bnd | 6 +-
javascript/duktape/NodeList.bnd | 6 +-
javascript/duktape/Window.bnd | 8 +-
javascript/duktape/netsurf.bnd | 178 ++++++++++++++++-----------------
9 files changed, 116 insertions(+), 114 deletions(-)
diff --git a/javascript/duktape/Console.bnd b/javascript/duktape/Console.bnd
index cb96cec..734f003 100644
--- a/javascript/duktape/Console.bnd
+++ b/javascript/duktape/Console.bnd
@@ -10,7 +10,7 @@
*/
class Console {
- private "unsigned int" group;
+ private unsigned int group;
prologue %{
#include <nsutils/time.h>
@@ -38,7 +38,7 @@ write_log_entry(duk_context *ctx, unsigned int group, char logtype)
}
%};
-}
+};
init Console ()
%{
@@ -174,4 +174,4 @@ method Console::trace ()
duk_set_top(ctx, 1);
write_log_entry(ctx, priv->group, 'S');
return 0;
-%}
\ No newline at end of file
+%}
diff --git a/javascript/duktape/Document.bnd b/javascript/duktape/Document.bnd
index dce110c..49740c9 100644
--- a/javascript/duktape/Document.bnd
+++ b/javascript/duktape/Document.bnd
@@ -14,9 +14,9 @@ class Document {
#include "render/html_internal.h"
#include "utils/libdom.h"
%};
-}
+};
-init Document("struct dom_document *" document::node);
+init Document(struct dom_document *document::node);
method Document::write()
%{
diff --git a/javascript/duktape/Element.bnd b/javascript/duktape/Element.bnd
index 7607f84..bd11e2a 100644
--- a/javascript/duktape/Element.bnd
+++ b/javascript/duktape/Element.bnd
@@ -11,9 +11,9 @@
class Element {
prologue %{
%};
-}
+};
-init Element("struct dom_element *" element::node);
+init Element(struct dom_element *element::node);
getter Element::firstElementChild()
%{
diff --git a/javascript/duktape/HTMLCollection.bnd b/javascript/duktape/HTMLCollection.bnd
index 08a162d..2ffe702 100644
--- a/javascript/duktape/HTMLCollection.bnd
+++ b/javascript/duktape/HTMLCollection.bnd
@@ -9,10 +9,10 @@
*/
class HTMLCollection {
- private "struct dom_html_collection *" coll;
-}
+ private struct dom_html_collection *coll;
+};
-init HTMLCollection("struct dom_html_collection *" coll)
+init HTMLCollection(struct dom_html_collection *coll)
%{
priv->coll = coll;
dom_html_collection_ref(coll);
diff --git a/javascript/duktape/Location.bnd b/javascript/duktape/Location.bnd
index 8c79cd4..fbb0e4a 100644
--- a/javascript/duktape/Location.bnd
+++ b/javascript/duktape/Location.bnd
@@ -10,13 +10,15 @@
*/
class Location {
- private "nsurl *" url;
- prologue %{
+ private nsurl *url;
+};
+
+prologue Location()
+%{
#include "desktop/browser.h"
-%};
-}
+%}
-init Location("nsurl *" url)
+init Location(nsurl *url)
%{
priv->url = url;
nsurl_ref(url);
diff --git a/javascript/duktape/Node.bnd b/javascript/duktape/Node.bnd
index 2328710..b936064 100644
--- a/javascript/duktape/Node.bnd
+++ b/javascript/duktape/Node.bnd
@@ -9,10 +9,10 @@
*/
class Node {
- private "dom_node *" node;
-}
+ private dom_node *node;
+};
-init Node("struct dom_node *" node)
+init Node(struct dom_node *node)
%{
priv->node = node;
dom_node_ref(node);
diff --git a/javascript/duktape/NodeList.bnd b/javascript/duktape/NodeList.bnd
index e085b6c..7ddf56d 100644
--- a/javascript/duktape/NodeList.bnd
+++ b/javascript/duktape/NodeList.bnd
@@ -9,10 +9,10 @@
*/
class NodeList {
- private "struct dom_nodelist *" nodes;
-}
+ private struct dom_nodelist *nodes;
+};
-init NodeList("struct dom_nodelist *" nodes)
+init NodeList(struct dom_nodelist *nodes)
%{
priv->nodes = nodes;
dom_nodelist_ref(nodes);
diff --git a/javascript/duktape/Window.bnd b/javascript/duktape/Window.bnd
index 4121ac6..81f6059 100644
--- a/javascript/duktape/Window.bnd
+++ b/javascript/duktape/Window.bnd
@@ -9,17 +9,17 @@
*/
class Window {
- private "struct browser_window *" win;
- private "struct html_content *" htmlc;
+ private struct browser_window * win;
+ private struct html_content * htmlc;
prologue %{
#include "utils/nsurl.h"
#include "desktop/browser.h"
#include "render/html.h"
#include "render/html_internal.h"
%};
-}
+};
-init Window("struct browser_window *" win, "struct html_content *" htmlc)
+init Window(struct browser_window *win, struct html_content *htmlc)
%{
/* element window */
priv->win = win;
diff --git a/javascript/duktape/netsurf.bnd b/javascript/duktape/netsurf.bnd
index 56107b9..91133ca 100644
--- a/javascript/duktape/netsurf.bnd
+++ b/javascript/duktape/netsurf.bnd
@@ -50,7 +50,7 @@ struct dom_html_br_element;
#include "javascript/dukky.h"
%};
-}
+};
#include "Console.bnd"
#include "Window.bnd"
@@ -62,103 +62,103 @@ struct dom_html_br_element;
#include "Location.bnd"
/* specialisations of html_element */
-init HTMLUnknownElement("struct dom_html_element *" html_unknown_element::html_element);
-init HTMLFontElement("struct dom_html_element *" html_font_element::html_element);
-init HTMLDirectoryElement("struct dom_html_element *" html_directory_element::html_element);
-init HTMLFrameElement("struct dom_html_element *" html_frame_element::html_element);
-init HTMLFrameSetElement("struct dom_html_element *" html_frame_set_element::html_element);
-init HTMLMarqueeElement("struct dom_html_element *" html_marquee_element::html_element);
-init HTMLAppletElement("struct dom_html_element *" html_applet_element::html_element);
-init HTMLCanvasElement("struct dom_html_element *" html_canvas_element::html_element);
-init HTMLTemplateElement("struct dom_html_element *" html_template_element::html_element);
-init HTMLScriptElement("struct dom_html_element *" html_script_element::html_element);
-init HTMLDialogElement("struct dom_html_element *" html_dialog_element::html_element);
-init HTMLMenuItemElement("struct dom_html_element *" html_menu_item_element::html_element);
-init HTMLMenuElement("struct dom_html_element *" html_menu_element::html_element);
-init HTMLDetailsElement("struct dom_html_element *" html_details_element::html_element);
-init HTMLLegendElement("struct dom_html_element *" html_legend_element::html_element);
-init HTMLFieldSetElement("struct dom_html_element *" html_field_set_element::html_element);
-init HTMLMeterElement("struct dom_html_element *" html_meter_element::html_element);
-init HTMLProgressElement("struct dom_html_element *" html_progress_element::html_element);
-init HTMLOutputElement("struct dom_html_element *" html_output_element::html_element);
-init HTMLKeygenElement("struct dom_html_element *" html_keygen_element::html_element);
-init HTMLTextAreaElement("struct dom_html_element *" html_text_area_element::html_element);
-init HTMLOptionElement("struct dom_html_element *" html_option_element::html_element);
-init HTMLOptGroupElement("struct dom_html_element *" html_opt_group_element::html_element);
-init HTMLDataListElement("struct dom_html_element *" html_data_list_element::html_element);
-init HTMLSelectElement("struct dom_html_element *" html_select_element::html_element);
-init HTMLButtonElement("struct dom_html_element *" html_button_element::html_element);
-init HTMLInputElement("struct dom_html_element *" html_input_element::html_element);
-init HTMLLabelElement("struct dom_html_element *" html_label_element::html_element);
-init HTMLFormElement("struct dom_html_element *" html_form_element::html_element);
-init HTMLTableCellElement("struct dom_html_element *" html_table_cell_element::html_element);
-init HTMLTableRowElement("struct dom_html_element *" html_table_row_element::html_element);
-init HTMLTableSectionElement("struct dom_html_element *" html_table_section_element::html_element);
-init HTMLTableColElement("struct dom_html_element *" html_table_col_element::html_element);
-init HTMLTableCaptionElement("struct dom_html_element *" html_table_caption_element::html_element);
-init HTMLTableElement("struct dom_html_element *" html_table_element::html_element);
-init HTMLAreaElement("struct dom_html_element *" html_area_element::html_element);
-init HTMLMapElement("struct dom_html_element *" html_map_element::html_element);
-init HTMLMediaElement("struct dom_html_element *" html_media_element::html_element);
-init HTMLTrackElement("struct dom_html_element *" html_track_element::html_element);
-init HTMLParamElement("struct dom_html_element *" html_param_element::html_element);
-init HTMLObjectElement("struct dom_html_element *" html_object_element::html_element);
-init HTMLEmbedElement("struct dom_html_element *" html_embed_element::html_element);
-init HTMLIFrameElement("struct dom_html_element *" html_i_frame_element::html_element);
-init HTMLImageElement("struct dom_html_element *" html_image_element::html_element);
-init HTMLSourceElement("struct dom_html_element *" html_source_element::html_element);
-init HTMLPictureElement("struct dom_html_element *" html_picture_element::html_element);
-init HTMLModElement("struct dom_html_element *" html_mod_element::html_element);
-init HTMLBRElement("struct dom_html_element *" html_br_element::html_element);
-init HTMLSpanElement("struct dom_html_element *" html_span_element::html_element);
-init HTMLTimeElement("struct dom_html_element *" html_time_element::html_element);
-init HTMLDataElement("struct dom_html_element *" html_data_element::html_element);
-init HTMLAnchorElement("struct dom_html_element *" html_anchor_element::html_element);
-init HTMLDivElement("struct dom_html_element *" html_div_element::html_element);
-init HTMLDListElement("struct dom_html_element *" html_d_list_element::html_element);
-init HTMLLIElement("struct dom_html_element *" html_li_element::html_element);
-init HTMLUListElement("struct dom_html_element *" html_u_list_element::html_element);
-init HTMLOListElement("struct dom_html_element *" html_o_list_element::html_element);
-init HTMLQuoteElement("struct dom_html_element *" html_quote_element::html_element);
-init HTMLPreElement("struct dom_html_element *" html_pre_element::html_element);
-init HTMLHRElement("struct dom_html_element *" html_hr_element::html_element);
-init HTMLParagraphElement("struct dom_html_element *" html_paragraph_element::html_element);
-init HTMLHeadingElement("struct dom_html_element *" html_heading_element::html_element);
-init HTMLBodyElement("struct dom_html_element *" html_body_element::html_element);
-init HTMLStyleElement("struct dom_html_element *" html_style_element::html_element);
-init HTMLMetaElement("struct dom_html_element *" html_meta_element::html_element);
-init HTMLLinkElement("struct dom_html_element *" html_link_element::html_element);
-init HTMLBaseElement("struct dom_html_element *" html_base_element::html_element);
-init HTMLTitleElement("struct dom_html_element *" html_title_element::html_element);
-init HTMLHeadElement("struct dom_html_element *" html_head_element::html_element);
-init HTMLHtmlElement("struct dom_html_element *" html_html_element::html_element);
+init HTMLUnknownElement(struct dom_html_element *html_unknown_element::html_element);
+init HTMLFontElement(struct dom_html_element *html_font_element::html_element);
+init HTMLDirectoryElement(struct dom_html_element *html_directory_element::html_element);
+init HTMLFrameElement(struct dom_html_element *html_frame_element::html_element);
+init HTMLFrameSetElement(struct dom_html_element *html_frame_set_element::html_element);
+init HTMLMarqueeElement(struct dom_html_element *html_marquee_element::html_element);
+init HTMLAppletElement(struct dom_html_element *html_applet_element::html_element);
+init HTMLCanvasElement(struct dom_html_element *html_canvas_element::html_element);
+init HTMLTemplateElement(struct dom_html_element *html_template_element::html_element);
+init HTMLScriptElement(struct dom_html_element *html_script_element::html_element);
+init HTMLDialogElement(struct dom_html_element *html_dialog_element::html_element);
+init HTMLMenuItemElement(struct dom_html_element *html_menu_item_element::html_element);
+init HTMLMenuElement(struct dom_html_element *html_menu_element::html_element);
+init HTMLDetailsElement(struct dom_html_element *html_details_element::html_element);
+init HTMLLegendElement(struct dom_html_element *html_legend_element::html_element);
+init HTMLFieldSetElement(struct dom_html_element *html_field_set_element::html_element);
+init HTMLMeterElement(struct dom_html_element *html_meter_element::html_element);
+init HTMLProgressElement(struct dom_html_element *html_progress_element::html_element);
+init HTMLOutputElement(struct dom_html_element *html_output_element::html_element);
+init HTMLKeygenElement(struct dom_html_element *html_keygen_element::html_element);
+init HTMLTextAreaElement(struct dom_html_element *html_text_area_element::html_element);
+init HTMLOptionElement(struct dom_html_element *html_option_element::html_element);
+init HTMLOptGroupElement(struct dom_html_element *html_opt_group_element::html_element);
+init HTMLDataListElement(struct dom_html_element *html_data_list_element::html_element);
+init HTMLSelectElement(struct dom_html_element *html_select_element::html_element);
+init HTMLButtonElement(struct dom_html_element *html_button_element::html_element);
+init HTMLInputElement(struct dom_html_element *html_input_element::html_element);
+init HTMLLabelElement(struct dom_html_element *html_label_element::html_element);
+init HTMLFormElement(struct dom_html_element *html_form_element::html_element);
+init HTMLTableCellElement(struct dom_html_element *html_table_cell_element::html_element);
+init HTMLTableRowElement(struct dom_html_element *html_table_row_element::html_element);
+init HTMLTableSectionElement(struct dom_html_element *html_table_section_element::html_element);
+init HTMLTableColElement(struct dom_html_element *html_table_col_element::html_element);
+init HTMLTableCaptionElement(struct dom_html_element *html_table_caption_element::html_element);
+init HTMLTableElement(struct dom_html_element *html_table_element::html_element);
+init HTMLAreaElement(struct dom_html_element *html_area_element::html_element);
+init HTMLMapElement(struct dom_html_element *html_map_element::html_element);
+init HTMLMediaElement(struct dom_html_element *html_media_element::html_element);
+init HTMLTrackElement(struct dom_html_element *html_track_element::html_element);
+init HTMLParamElement(struct dom_html_element *html_param_element::html_element);
+init HTMLObjectElement(struct dom_html_element *html_object_element::html_element);
+init HTMLEmbedElement(struct dom_html_element *html_embed_element::html_element);
+init HTMLIFrameElement(struct dom_html_element *html_i_frame_element::html_element);
+init HTMLImageElement(struct dom_html_element *html_image_element::html_element);
+init HTMLSourceElement(struct dom_html_element *html_source_element::html_element);
+init HTMLPictureElement(struct dom_html_element *html_picture_element::html_element);
+init HTMLModElement(struct dom_html_element *html_mod_element::html_element);
+init HTMLBRElement(struct dom_html_element *html_br_element::html_element);
+init HTMLSpanElement(struct dom_html_element *html_span_element::html_element);
+init HTMLTimeElement(struct dom_html_element *html_time_element::html_element);
+init HTMLDataElement(struct dom_html_element *html_data_element::html_element);
+init HTMLAnchorElement(struct dom_html_element *html_anchor_element::html_element);
+init HTMLDivElement(struct dom_html_element *html_div_element::html_element);
+init HTMLDListElement(struct dom_html_element *html_d_list_element::html_element);
+init HTMLLIElement(struct dom_html_element *html_li_element::html_element);
+init HTMLUListElement(struct dom_html_element *html_u_list_element::html_element);
+init HTMLOListElement(struct dom_html_element *html_o_list_element::html_element);
+init HTMLQuoteElement(struct dom_html_element *html_quote_element::html_element);
+init HTMLPreElement(struct dom_html_element *html_pre_element::html_element);
+init HTMLHRElement(struct dom_html_element *html_hr_element::html_element);
+init HTMLParagraphElement(struct dom_html_element *html_paragraph_element::html_element);
+init HTMLHeadingElement(struct dom_html_element *html_heading_element::html_element);
+init HTMLBodyElement(struct dom_html_element *html_body_element::html_element);
+init HTMLStyleElement(struct dom_html_element *html_style_element::html_element);
+init HTMLMetaElement(struct dom_html_element *html_meta_element::html_element);
+init HTMLLinkElement(struct dom_html_element *html_link_element::html_element);
+init HTMLBaseElement(struct dom_html_element *html_base_element::html_element);
+init HTMLTitleElement(struct dom_html_element *html_title_element::html_element);
+init HTMLHeadElement(struct dom_html_element *html_head_element::html_element);
+init HTMLHtmlElement(struct dom_html_element *html_html_element::html_element);
/* specialisations of HTMLTableCellElement */
-init HTMLTableHeaderCellElement("struct dom_html_element *" html_table_header_cell_element::html_table_cell_element);
-init HTMLTableDataCellElement("struct dom_html_element *" html_table_data_cell_element::html_table_cell_element);
+init HTMLTableHeaderCellElement(struct dom_html_element *html_table_header_cell_element::html_table_cell_element);
+init HTMLTableDataCellElement(struct dom_html_element *html_table_data_cell_element::html_table_cell_element);
/* specialisations of html_media_element */
-init HTMLAudioElement("struct dom_html_element *" html_audio_element::html_media_element);
-init HTMLVideoElement("struct dom_html_element *" html_video_element::html_media_element);
+init HTMLAudioElement(struct dom_html_element *html_audio_element::html_media_element);
+init HTMLVideoElement(struct dom_html_element *html_video_element::html_media_element);
-init HTMLElement("struct dom_html_element *" html_element::element);
+init HTMLElement(struct dom_html_element *html_element::element);
-init Text("struct dom_node_text *" text::character_data);
-init Comment("struct dom_node_comment *" comment::character_data);
-init ProcessingInstruction("struct dom_node_text *" text::character_data);
+init Text(struct dom_node_text *text::character_data);
+init Comment(struct dom_node_comment *comment::character_data);
+init ProcessingInstruction(struct dom_node_text *text::character_data);
-init XMLDocument("struct dom_document *" document);
+init XMLDocument(struct dom_document *document);
-init CharacterData("struct dom_node_character_data *" character_data::node);
-init DocumentFragment("struct dom_document *" document::node);
-init DocumentType("struct dom_document *" document::node);
+init CharacterData(struct dom_node_character_data *character_data::node);
+init DocumentFragment(struct dom_document *document::node);
+init DocumentType(struct dom_document *document::node);
-init PropertyNodeList("struct dom_nodelist *" nodes);
-init RadioNodeList("struct dom_nodelist *" nodes);
+init PropertyNodeList(struct dom_nodelist *nodes);
+init RadioNodeList(struct dom_nodelist *nodes);
-init HTMLAllCollection("struct dom_html_collection *" coll);
-init HTMLFormControlsCollection("struct dom_html_collection *" coll);
-init HTMLOptionsCollection("struct dom_html_collection *" coll);
-init HTMLPropertiesCollection("struct dom_html_collection *" coll);
+init HTMLAllCollection(struct dom_html_collection *coll);
+init HTMLFormControlsCollection(struct dom_html_collection *coll);
+init HTMLOptionsCollection(struct dom_html_collection *coll);
+init HTMLPropertiesCollection(struct dom_html_collection *coll);
--
NetSurf Browser
8 years, 1 month
nsgenbind: branch master updated. release/0.1.2-67-gf9dacdd
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/nsgenbind.git/shortlog/f9dacddfe39ba67a708...
...commit http://git.netsurf-browser.org/nsgenbind.git/commit/f9dacddfe39ba67a70890...
...tree http://git.netsurf-browser.org/nsgenbind.git/tree/f9dacddfe39ba67a70890b2...
The branch, master has been updated
via f9dacddfe39ba67a70890b2bde2e3ddb8d1b0705 (commit)
via ac6ae0a7b545dbf3391760cfe9e6b86ce0c579db (commit)
via 476bc961ae4c490dfa0f09293c5611451bb42599 (commit)
via c80955dcc6b663c250a1f2552b626770fbd46a94 (commit)
via 767e69459ca7b4c13fe93875177040ab3eec8b56 (commit)
via 017eb2ef4da167466c05ad83eb0714129a2e46ff (commit)
via 53acb5a29b8eb4fe89dd2e8bc3b808d5e7183b81 (commit)
via 4a7185fd4a25b1456737b8fa2ac6a770a3e1721e (commit)
from 5b0ac4502fd4407d51c165e0ea4ef814b3253fa9 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/nsgenbind.git/commit/?id=f9dacddfe39ba67a7...
commit f9dacddfe39ba67a70890b2bde2e3ddb8d1b0705
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Process extended attributes for constructors
Extended attributes for constructors and named constructors are now
parsed into the AST as operations ready to be used to generate output.
diff --git a/src/webidl-lexer.l b/src/webidl-lexer.l
index 4788610..a857654 100644
--- a/src/webidl-lexer.l
+++ b/src/webidl-lexer.l
@@ -215,6 +215,10 @@ legacyiterable return TOK_LEGACYITERABLE;
required return TOK_REQUIRED;
+Constructor return TOK_CONSTRUCTOR;
+
+NamedConstructor return TOK_NAMEDCONSTRUCTOR;
+
{identifier} {
/* A leading "_" is used to escape an identifier from
* looking like a reserved word terminal. */
diff --git a/src/webidl-parser.y b/src/webidl-parser.y
index 406962f..b48b449 100644
--- a/src/webidl-parser.y
+++ b/src/webidl-parser.y
@@ -67,6 +67,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char *str)
%token TOK_BYTE
%token TOK_CALLBACK
%token TOK_CONST
+%token TOK_CONSTRUCTOR
%token TOK_CREATOR
%token TOK_DATE
%token TOK_DELETER
@@ -92,6 +93,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char *str)
%token TOK_MODULE
%token TOK_NAN
%token TOK_NATIVE
+%token TOK_NAMEDCONSTRUCTOR
%token TOK_NULL_LITERAL
%token TOK_OBJECT
%token TOK_OCTET
@@ -580,12 +582,12 @@ PartialDictionary:
Default:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'=' DefaultValue
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -619,12 +621,12 @@ ExceptionMembers:
Inheritance:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
':' TOK_IDENTIFIER
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -632,7 +634,7 @@ Inheritance:
Enum:
TOK_ENUM TOK_IDENTIFIER '{' EnumValueList '}' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -662,7 +664,7 @@ EnumValueListString:
CallbackRest:
TOK_IDENTIFIER '=' ReturnType '(' ArgumentList ')' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -670,7 +672,7 @@ CallbackRest:
Typedef:
TOK_TYPEDEF ExtendedAttributeList Type TOK_IDENTIFIER ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -732,12 +734,14 @@ ConstValue:
|
TOK_INT_LITERAL
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_INT, NULL, (void *)$1);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_INT,
+ NULL,
+ (void *)$1);
}
|
TOK_NULL_LITERAL
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_NULL, NULL, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_NULL, NULL, NULL);
}
;
@@ -745,12 +749,16 @@ ConstValue:
BooleanLiteral:
TOK_TRUE
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL, NULL, (void *)true);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+ NULL,
+ (void *)true);
}
|
TOK_FALSE
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL, NULL, (void *)false);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+ NULL,
+ (void *)false);
}
;
@@ -758,34 +766,42 @@ BooleanLiteral:
FloatLiteral:
TOK_FLOAT_LITERAL
{
- float *value;
- value = malloc(sizeof(float));
- *value = strtof($1, NULL);
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = strtof($1, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
'-' TOK_INFINITY
{
- float *value;
- value = malloc(sizeof(float));
- *value = -INFINITY;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = -INFINITY;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
TOK_INFINITY
{
- float *value;
- value = malloc(sizeof(float));
- *value = INFINITY;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = INFINITY;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
TOK_NAN
{
- float *value;
- value = malloc(sizeof(float));
- *value = NAN;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = NAN;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
;
@@ -793,7 +809,7 @@ FloatLiteral:
AttributeOrOperation:
TOK_STRINGIFIER StringifierAttributeOrOperation
{
- $$ = $2;
+ $$ = $2;
}
|
Attribute
@@ -807,13 +823,13 @@ StringifierAttributeOrOperation:
|
OperationRest
{
- /* @todo deal with stringifier */
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION, NULL, $1);
+ /* @todo deal with stringifier */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION, NULL, $1);
}
|
';'
{
- $$=NULL;
+ $$=NULL;
}
;
@@ -915,7 +931,7 @@ AttributeName:
AttributeNameKeyword:
TOK_REQUIRED
{
- $$ = strdup("required");
+ $$ = strdup("required");
}
/* [33]
@@ -924,12 +940,12 @@ AttributeNameKeyword:
Inherit:
/* empty */
{
- $$ = false;
+ $$ = false;
}
|
TOK_INHERIT
{
- $$ = true;
+ $$ = true;
}
;
@@ -940,12 +956,12 @@ Inherit:
ReadOnly:
/* empty */
{
- $$ = false;
+ $$ = false;
}
|
TOK_READONLY
{
- $$ = true;
+ $$ = true;
}
;
@@ -999,34 +1015,39 @@ Special:
TOK_GETTER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_GETTER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_GETTER);
}
|
TOK_SETTER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_SETTER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_SETTER);
}
|
TOK_CREATOR
{
- /* second edition removed this special but teh
- specifications still use it!
- */
+ /* second edition removed this special but the
+ * specifications still use it!
+ */
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_CREATOR);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_CREATOR);
}
|
TOK_DELETER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_DELETER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_DELETER);
}
|
TOK_LEGACYCALLER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
}
;
@@ -1034,10 +1055,10 @@ Special:
OperationRest:
OptionalIdentifier '(' ArgumentList ')' ';'
{
- /* argument list */
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, $3);
+ /* argument list */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, $3);
- $$ = webidl_node_prepend($1, $$); /* identifier */
+ $$ = webidl_node_prepend($1, $$); /* identifier */
}
;
@@ -1045,12 +1066,12 @@ OperationRest:
OptionalIdentifier:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_IDENTIFIER
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1);
}
;
@@ -1061,12 +1082,12 @@ OptionalIdentifier:
ArgumentList:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
Argument Arguments
{
- $$ = webidl_node_append($2, $1);
+ $$ = webidl_node_append($2, $1);
}
;
@@ -1074,12 +1095,12 @@ ArgumentList:
Arguments:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' Argument Arguments
{
- $$ = webidl_node_append($3, $2);
+ $$ = webidl_node_append($3, $2);
}
;
@@ -1088,7 +1109,7 @@ Arguments:
Argument:
ExtendedAttributeList OptionalOrRequiredArgument
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -1124,12 +1145,12 @@ ArgumentName:
Ellipsis:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_ELLIPSIS
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_ELLIPSIS, NULL, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_ELLIPSIS, NULL, NULL);
}
;
@@ -1137,12 +1158,12 @@ Ellipsis:
Iterable:
TOK_ITERABLE '<' Type OptionalType '>' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_LEGACYITERABLE '<' Type '>' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -1150,12 +1171,12 @@ Iterable:
OptionalType:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' Type
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -1175,12 +1196,14 @@ ExceptionField:
ExtendedAttributeList:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'[' ExtendedAttribute ExtendedAttributes ']'
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $3, $2);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ $3,
+ $2);
}
;
@@ -1188,12 +1211,14 @@ ExtendedAttributeList:
ExtendedAttributes:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' ExtendedAttribute ExtendedAttributes
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $3, $2);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ $3,
+ $2);
}
;
@@ -1218,10 +1243,46 @@ ExtendedAttribute:
$$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $4, $2);
}
|
+ TOK_CONSTRUCTOR
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("Constructor"));
+ }
+ |
+ TOK_CONSTRUCTOR '(' ArgumentList ')'
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("Constructor")),
+ webidl_node_new(WEBIDL_NODE_TYPE_LIST,
+ NULL,
+ $3));
+ }
+ |
+ TOK_NAMEDCONSTRUCTOR '=' TOK_IDENTIFIER '(' ArgumentList ')'
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("NamedConstructor")),
+ webidl_node_new(WEBIDL_NODE_TYPE_LIST,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $3),
+ $5));
+ }
+ |
Other ExtendedAttributeRest
{
- $$ = webidl_node_append($2,
- webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1));
+ $$ = webidl_node_append($2,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $1));
}
;
@@ -1229,12 +1290,12 @@ ExtendedAttribute:
ExtendedAttributeRest:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
ExtendedAttribute
{
- $$ = $1;
+ $$ = $1;
}
;
@@ -1242,16 +1303,16 @@ ExtendedAttributeRest:
ExtendedAttributeInner:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'(' ExtendedAttributeInner ')' ExtendedAttributeInner
{
- $$ = webidl_node_prepend(
- webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
- NULL,
- $2),
- $4);
+ $$ = webidl_node_prepend(
+ webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ NULL,
+ $2),
+ $4);
}
|
'[' ExtendedAttributeInner ']' ExtendedAttributeInner
@@ -1276,8 +1337,10 @@ ExtendedAttributeInner:
|
OtherOrComma ExtendedAttributeInner
{
- $$ = webidl_node_append($2,
- webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1));
+ $$ = webidl_node_append($2,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $1));
}
;
@@ -1285,119 +1348,119 @@ ExtendedAttributeInner:
Other:
TOK_INT_LITERAL
{
- /* @todo loosing base info here might break the attribute */
- $$ = calloc(1, 32);
- snprintf($$, 32, "%ld", $1);
+ /* @todo loosing base info here might break the attribute */
+ $$ = calloc(1, 32);
+ snprintf($$, 32, "%ld", $1);
}
|
TOK_FLOAT_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_IDENTIFIER
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_STRING_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_OTHER_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
'-'
{
- $$ = strdup("-");
+ $$ = strdup("-");
}
|
'.'
{
- $$ = strdup(".");
+ $$ = strdup(".");
}
|
TOK_ELLIPSIS
{
- $$ = strdup("...");
+ $$ = strdup("...");
}
|
':'
{
- $$ = strdup(":");
+ $$ = strdup(":");
}
|
';'
{
- $$ = strdup(";");
+ $$ = strdup(";");
}
|
'<'
{
- $$ = strdup("<");
+ $$ = strdup("<");
}
|
'='
{
- $$ = strdup("=");
+ $$ = strdup("=");
}
|
'>'
{
- $$ = strdup(">");
+ $$ = strdup(">");
}
|
'?'
{
- $$ = strdup("?");
+ $$ = strdup("?");
}
|
TOK_DATE
{
- $$ = strdup("Date");
+ $$ = strdup("Date");
}
|
TOK_STRING
{
- $$ = strdup("DOMString");
+ $$ = strdup("DOMString");
}
|
TOK_INFINITY
{
- $$ = strdup("Infinity");
+ $$ = strdup("Infinity");
}
|
TOK_NAN
{
- $$ = strdup("NaN");
+ $$ = strdup("NaN");
}
|
TOK_ANY
{
- $$ = strdup("any");
+ $$ = strdup("any");
}
|
TOK_BOOLEAN
{
- $$ = strdup("boolean");
+ $$ = strdup("boolean");
}
|
TOK_BYTE
{
- $$ = strdup("byte");
+ $$ = strdup("byte");
}
|
TOK_DOUBLE
{
- $$ = strdup("double");
+ $$ = strdup("double");
}
|
TOK_FALSE
{
- $$ = strdup("false");
+ $$ = strdup("false");
}
|
TOK_FLOAT
commitdiff http://git.netsurf-browser.org/nsgenbind.git/commit/?id=ac6ae0a7b545dbf33...
commit ac6ae0a7b545dbf3391760cfe9e6b86ce0c579db
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Implement putforwards processing.
interface attributes with the putforwards extended attribute call the
setter specified in that extended attribute.
The WebIDL is supposed to ensure the attribute is readonly before
allowing a putforwards but we only warn about this as there are
several examples where readonly is omitted.
diff --git a/src/duk-libdom-dictionary.c b/src/duk-libdom-dictionary.c
index 65a140a..09e4379 100644
--- a/src/duk-libdom-dictionary.c
+++ b/src/duk-libdom-dictionary.c
@@ -267,7 +267,7 @@ output_member_acessor(FILE* outf,
default:
WARN(WARNING_UNIMPLEMENTED,
- "Dictionary %s:%s unhandled type (%d)\n",
+ "Dictionary %s:%s unhandled type (%d)",
dictionarye->name,
membere->name,
*argument_type);
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index 0fef35b..96e41ad 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -619,7 +619,8 @@ output_prototype_attribute(FILE *outf,
struct ir_entry *interfacee,
struct ir_attribute_entry *attributee)
{
- if (attributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY) {
+ if ((attributee->putforwards == NULL) &&
+ (attributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY)) {
return output_populate_ro_property(outf,
interfacee->class_name,
attributee->name);
@@ -1193,28 +1194,29 @@ output_interface_operations(FILE* outf, struct ir_entry *ife)
return res;
}
+
/**
- * Generate class property getter/setter for a single attribute
+ * Generate class property setter for a single attribute
*/
static int
-output_interface_attribute(FILE* outf,
- struct ir_entry *interfacee,
- struct ir_attribute_entry *atributee)
+output_attribute_setter(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
{
int cdatac;
- /* getter definition */
+ /* setter definition */
fprintf(outf,
- "static duk_ret_t %s_%s_%s_getter(duk_context *ctx)\n",
+ "static duk_ret_t %s_%s_%s_setter(duk_context *ctx)\n",
DLPFX, interfacee->class_name, atributee->name);
fprintf(outf,"{\n");
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_ccode(outf, atributee->getter);
+ cdatac = output_ccode(outf, atributee->setter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
- "Unimplemented: getter %s::%s();",
+ "Unimplemented: setter %s::%s();",
interfacee->name, atributee->name);
/* no implementation so generate default */
@@ -1223,23 +1225,80 @@ output_interface_attribute(FILE* outf,
fprintf(outf, "}\n\n");
- /* readonly attributes have no setter */
- if (atributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY) {
- return 0;
+ return 0;
+}
+
+/**
+ * Generate class property setter for a putforwards attribute
+ */
+static int
+output_putforwards_setter(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
+{
+ /* use explicit implementation in bindings if present */
+ if (atributee->setter != NULL) {
+ return output_attribute_setter(outf, interfacee, atributee);
}
- /* setter definition */
+ /* generate autogenerated putforwards */
+
fprintf(outf,
"static duk_ret_t %s_%s_%s_setter(duk_context *ctx)\n",
DLPFX, interfacee->class_name, atributee->name);
fprintf(outf,"{\n");
+ fprintf(outf,"\tduk_ret_t get_ret;\n\n");
+
+ fprintf(outf,
+ "\tget_ret = %s_%s_%s_getter(ctx);\n",
+ DLPFX, interfacee->class_name, atributee->name);
+
+ fprintf(outf,
+ "\tif (get_ret != 1) {\n"
+ "\t\treturn 0;\n"
+ "\t}\n\n"
+ "\t/* parameter attribute */\n\n"
+ "\tduk_swap(ctx, 0, 1);\n"
+ "\t/* attribute parameter */\n\n"
+ "\t/* call the putforward */\n");
+
+ fprintf(outf,
+ "\tduk_put_prop_string(ctx, 0, \"%s\");\n\n",
+ atributee->putforwards);
+
+ fprintf(outf,
+ "\tduk_pop(ctx);\n\n"
+ "\treturn 0;\n");
+
+ fprintf(outf, "}\n\n");
+
+ return 0;
+}
+
+/**
+ * Generate class property getter/setter for a single attribute
+ */
+static int
+output_interface_attribute(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
+{
+ int cdatac;
+ int res = 0;
+
+ /* getter definition */
+ fprintf(outf,
+ "static duk_ret_t %s_%s_%s_getter(duk_context *ctx)\n",
+ DLPFX, interfacee->class_name, atributee->name);
+ fprintf(outf,"{\n");
+
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_ccode(outf, atributee->setter);
+ cdatac = output_ccode(outf, atributee->getter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
- "Unimplemented: setter %s::%s();",
+ "Unimplemented: getter %s::%s();",
interfacee->name, atributee->name);
/* no implementation so generate default */
@@ -1248,7 +1307,18 @@ output_interface_attribute(FILE* outf,
fprintf(outf, "}\n\n");
- return 0;
+ if (atributee->putforwards != NULL) {
+ res = output_putforwards_setter(outf, interfacee, atributee);
+ } else {
+ /* readonly attributes have no setter */
+ if (atributee->modifier != WEBIDL_TYPE_MODIFIER_READONLY) {
+ res = output_attribute_setter(outf,
+ interfacee,
+ atributee);
+ }
+ }
+
+ return res;
}
/**
diff --git a/src/ir.c b/src/ir.c
index b3631f4..6dc2d2a 100644
--- a/src/ir.c
+++ b/src/ir.c
@@ -377,6 +377,56 @@ operation_map_new(struct webidl_node *interface,
return 0;
}
+/**
+ * get the value of an extended attribute key/value item
+ */
+static char *
+get_extended_value(struct webidl_node *node, const char *key)
+{
+ char *ident;
+ struct webidl_node *ext_attr;
+ struct webidl_node *elem;
+
+ /* walk each extended attribute */
+ ext_attr = webidl_node_find_type(
+ webidl_node_getnode(node),
+ NULL,
+ WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE);
+ while (ext_attr != NULL) {
+
+ elem = webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ NULL,
+ WEBIDL_NODE_TYPE_IDENT);
+ ident = webidl_node_gettext(elem);
+
+ if ((ident != NULL) && (strcmp(ident, key) == 0)) {
+ /* first identifier matches */
+
+ elem = webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ elem,
+ WEBIDL_NODE_TYPE_IDENT);
+ ident = webidl_node_gettext(elem);
+
+ if ((ident != NULL) && (*ident == '=')) {
+ return webidl_node_gettext(
+ webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ elem,
+ WEBIDL_NODE_TYPE_IDENT));
+ }
+ }
+
+ ext_attr = webidl_node_find_type(
+ webidl_node_getnode(node),
+ ext_attr,
+ WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE);
+ }
+
+ return NULL;
+}
+
static int
attribute_map_new(struct webidl_node *interface,
struct genbind_node *class,
@@ -399,8 +449,7 @@ attribute_map_new(struct webidl_node *interface,
return 0;
}
- attributev = calloc(attributec,
- sizeof(struct ir_attribute_entry));
+ attributev = calloc(attributec, sizeof(struct ir_attribute_entry));
if (attributev == NULL) {
return -1;
};
@@ -436,7 +485,7 @@ attribute_map_new(struct webidl_node *interface,
GENBIND_METHOD_TYPE_GETTER,
cure->name);
- /* check fo readonly attributes */
+ /* check for readonly attributes */
modifier = (enum webidl_type_modifier *)webidl_node_getint(
webidl_node_find_type(
webidl_node_getnode(at_node),
@@ -454,9 +503,20 @@ attribute_map_new(struct webidl_node *interface,
cure->name);
}
- cure++;
+ /* check for putforwards extended attribute */
+ cure->putforwards = get_extended_value(at_node,
+ "PutForwards");
+
+ if ((cure->putforwards != NULL) &&
+ (cure->modifier != WEBIDL_TYPE_MODIFIER_READONLY)) {
+ WARN(WARNING_WEBIDL,
+ "putforwards on a writable attribute (%s) is prohibited",
+ cure->name);
+ }
/* move to next attribute */
+ cure++;
+
at_node = webidl_node_find_type(
webidl_node_getnode(list_node),
at_node,
diff --git a/src/ir.h b/src/ir.h
index 1092fab..ecedc95 100644
--- a/src/ir.h
+++ b/src/ir.h
@@ -53,6 +53,8 @@ struct ir_attribute_entry {
struct webidl_node *node; /**< AST attribute node */
enum webidl_type_modifier modifier;
+ const char *putforwards;
+
struct genbind_node *getter; /**< getter from binding */
struct genbind_node *setter; /**< getter from binding */
};
diff --git a/src/options.h b/src/options.h
index 5b7d73d..d452c17 100644
--- a/src/options.h
+++ b/src/options.h
@@ -28,9 +28,10 @@ extern struct options *options;
enum opt_warnings {
WARNING_UNIMPLEMENTED = 1,
WARNING_DUPLICATED = 2,
+ WARNING_WEBIDL = 4,
};
-#define WARNING_ALL (WARNING_UNIMPLEMENTED | WARNING_DUPLICATED)
+#define WARNING_ALL (WARNING_UNIMPLEMENTED | WARNING_DUPLICATED | WARNING_WEBIDL)
#define WARN(flags, msg, args...) do { \
if ((options->warnings & flags) != 0) { \
commitdiff http://git.netsurf-browser.org/nsgenbind.git/commit/?id=476bc961ae4c490df...
commit 476bc961ae4c490dfa0f09293c5611451bb42599
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Allow empty classes
diff --git a/README b/README
index f2a8bf3..4d08ff2 100644
--- a/README
+++ b/README
@@ -118,7 +118,7 @@ The binding file consists of three types of element:
but without at least one the binding is not very useful as
it will generate no output.
- preface
+ preface
This takes a cdata block. There may only be one of these per
binding, subsequent directives will be ignored.
@@ -160,6 +160,10 @@ The binding file consists of three types of element:
private member variables are declared here and header and
footer elements specific to this class.
+ Although not generally useful, because methods that reference a
+ class cause it to be implicitly created, empty definitions are
+ permitted.
+
private
variables added to the private structure for the class.
@@ -219,6 +223,54 @@ The binding file consists of three types of element:
binding but they will almost certainly have to be translated
into more suitable class names for generated output.
+
+ preface
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The preface is emitted in every generated source file after
+ the binding preface and tool preamble.
+
+
+ prologue
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The prologue is emitted in every generated source file after
+ the binding prologue has been generated.
+
+
+ epilogue
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The epilogue is emitted after the generated code and before
+ the binding epilogue
+
+
+ postface
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The postface is emitted after the binding epilogue.
+
+
init
The declarator for this method type need only identify the
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index a3e5609..88c69b1 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -55,9 +55,9 @@ typedef struct YYLTYPE {
}
%initial-action {
- yylloc.first_line = yylloc.last_line = 1;
- yylloc.first_column = yylloc.last_column = 1;
- yylloc.filename = filename;
+ yylloc.first_line = yylloc.last_line = 1;
+ yylloc.first_column = yylloc.last_column = 1;
+ yylloc.filename = filename;
}
%code {
@@ -105,7 +105,7 @@ add_method(struct genbind_node **genbind_ast,
long methodtype,
struct genbind_node *declarator,
char *cdata,
- int lineno,
+ long lineno,
char *filename)
{
struct genbind_node *res_node;
@@ -134,7 +134,6 @@ add_method(struct genbind_node **genbind_ast,
cdata);
}
-
location_node = genbind_new_node(GENBIND_NODE_TYPE_FILE,
genbind_new_node(GENBIND_NODE_TYPE_LINE,
cdata_node,
@@ -522,6 +521,11 @@ Class:
;
ClassArgs:
+ /* empty */
+ {
+ $$ = NULL;
+ }
+ |
ClassArg
|
ClassArgs ClassArg
diff --git a/test/data/bindings/browser-duk.bnd b/test/data/bindings/browser-duk.bnd
index cef3563..3113891 100644
--- a/test/data/bindings/browser-duk.bnd
+++ b/test/data/bindings/browser-duk.bnd
@@ -39,6 +39,10 @@ binding duk_libdom {
%};
};
+class empty_class {
+};
+
+
#include "HTMLUnknownElement.bnd"
/* specialisations of html_element */
commitdiff http://git.netsurf-browser.org/nsgenbind.git/commit/?id=c80955dcc6b663c25...
commit c80955dcc6b663c250a1f2552b626770fbd46a94
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
annotates binding AST with source linenumber and file
Uses annotated AST to put line directives in the generated source so
any code errors in the binding can be easily located.
diff --git a/src/duk-libdom-common.c b/src/duk-libdom-common.c
index fc62863..fb97fe3 100644
--- a/src/duk-libdom-common.c
+++ b/src/duk-libdom-common.c
@@ -58,6 +58,29 @@ int output_cdata(FILE* outf,
}
/* exported interface documented in duk-libdom.h */
+int output_ccode(FILE* outf, struct genbind_node *node)
+{
+ int *line;
+ char *filename;
+
+ line = genbind_node_getint(
+ genbind_node_find_type(
+ genbind_node_getnode(node),
+ NULL, GENBIND_NODE_TYPE_LINE));
+
+ filename = genbind_node_gettext(
+ genbind_node_find_type(
+ genbind_node_getnode(node),
+ NULL, GENBIND_NODE_TYPE_FILE));
+
+ if ((line != NULL) && (filename != NULL)) {
+ fprintf(outf, "#line %d \"%s\"\n", *line, filename);
+ }
+
+ return output_cdata(outf, node, GENBIND_NODE_TYPE_CDATA);
+}
+
+/* exported interface documented in duk-libdom.h */
int output_tool_prologue(FILE* outf)
{
char *fpath;
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index 997cb9a..0fef35b 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -517,7 +517,7 @@ output_interface_init(FILE* outf,
}
/* output the initaliser code from the binding */
- output_cdata(outf, init_node, GENBIND_NODE_TYPE_CDATA);
+ output_ccode(outf, init_node);
fprintf(outf, "}\n\n");
@@ -1157,10 +1157,7 @@ output_interface_operation(FILE* outf,
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_cdata(outf,
- operatione->method,
- GENBIND_NODE_TYPE_CDATA);
-
+ cdatac = output_ccode(outf, operatione->method);
if (cdatac == 0) {
/* no implementation so generate default */
WARN(WARNING_UNIMPLEMENTED,
@@ -1214,8 +1211,7 @@ output_interface_attribute(FILE* outf,
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_cdata(outf, atributee->getter, GENBIND_NODE_TYPE_CDATA);
-
+ cdatac = output_ccode(outf, atributee->getter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
"Unimplemented: getter %s::%s();",
@@ -1240,8 +1236,7 @@ output_interface_attribute(FILE* outf,
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_cdata(outf, atributee->setter, GENBIND_NODE_TYPE_CDATA);
-
+ cdatac = output_ccode(outf, atributee->setter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
"Unimplemented: setter %s::%s();",
@@ -1251,7 +1246,6 @@ output_interface_attribute(FILE* outf,
fprintf(outf,"\treturn 0;\n");
}
-
fprintf(outf, "}\n\n");
return 0;
diff --git a/src/duk-libdom.h b/src/duk-libdom.h
index b9eeea3..dd27420 100644
--- a/src/duk-libdom.h
+++ b/src/duk-libdom.h
@@ -56,6 +56,19 @@ int output_tool_prologue(FILE* outf);
*/
int output_cdata(FILE* outf, struct genbind_node *node, enum genbind_node_type nodetype);
+
+/**
+ * output c code with line directives if possible.
+ *
+ * used for any cdata sections
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to search.
+ * \param nodetype the type of child node to search for.
+ * \return The number of nodes written or 0 for none.
+ */
+int output_ccode(FILE* outf, struct genbind_node *node);
+
/**
* output character data of method node of given type.
*
diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c
index 749d3e8..9be8bc7 100644
--- a/src/nsgenbind-ast.c
+++ b/src/nsgenbind-ast.c
@@ -341,6 +341,7 @@ char *genbind_node_gettext(struct genbind_node *node)
case GENBIND_NODE_TYPE_IDENT:
case GENBIND_NODE_TYPE_NAME:
case GENBIND_NODE_TYPE_CDATA:
+ case GENBIND_NODE_TYPE_FILE:
return node->r.text;
default:
@@ -377,6 +378,7 @@ int *genbind_node_getint(struct genbind_node *node)
if (node != NULL) {
switch(node->type) {
case GENBIND_NODE_TYPE_METHOD_TYPE:
+ case GENBIND_NODE_TYPE_LINE:
case GENBIND_NODE_TYPE_MODIFIER:
return &node->r.number;
@@ -408,6 +410,12 @@ static const char *genbind_node_type_to_str(enum genbind_node_type type)
case GENBIND_NODE_TYPE_NAME:
return "TypeName";
+ case GENBIND_NODE_TYPE_LINE:
+ return "Linenumber";
+
+ case GENBIND_NODE_TYPE_FILE:
+ return "Filename";
+
case GENBIND_NODE_TYPE_PRIVATE:
return "Private";
diff --git a/src/nsgenbind-ast.h b/src/nsgenbind-ast.h
index b130db2..49db23b 100644
--- a/src/nsgenbind-ast.h
+++ b/src/nsgenbind-ast.h
@@ -16,6 +16,8 @@ enum genbind_node_type {
GENBIND_NODE_TYPE_MODIFIER, /**< node modifier */
GENBIND_NODE_TYPE_CDATA, /**< verbatim block of character data */
GENBIND_NODE_TYPE_STRING, /**< text string */
+ GENBIND_NODE_TYPE_LINE, /**< linenumber */
+ GENBIND_NODE_TYPE_FILE, /**< file name */
GENBIND_NODE_TYPE_BINDING, /**< Binding */
GENBIND_NODE_TYPE_WEBIDL,
@@ -28,6 +30,7 @@ enum genbind_node_type {
GENBIND_NODE_TYPE_METHOD, /**< binding method */
GENBIND_NODE_TYPE_METHOD_TYPE, /**< binding method type */
+
GENBIND_NODE_TYPE_PARAMETER, /**< method parameter */
};
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index b52d0d0..a3e5609 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -104,12 +104,15 @@ static struct genbind_node *
add_method(struct genbind_node **genbind_ast,
long methodtype,
struct genbind_node *declarator,
- char *cdata)
+ char *cdata,
+ int lineno,
+ char *filename)
{
struct genbind_node *res_node;
struct genbind_node *method_node;
struct genbind_node *class_node;
struct genbind_node *cdata_node;
+ struct genbind_node *location_node;
char *class_name;
/* extract the class name from the declarator */
@@ -131,11 +134,18 @@ add_method(struct genbind_node **genbind_ast,
cdata);
}
+
+ location_node = genbind_new_node(GENBIND_NODE_TYPE_FILE,
+ genbind_new_node(GENBIND_NODE_TYPE_LINE,
+ cdata_node,
+ (void *)lineno),
+ strdup(filename));
+
/* generate method node */
method_node = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
NULL,
genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
- cdata_node,
+ location_node,
(void *)methodtype));
class_node = genbind_node_find_type_ident(*genbind_ast,
@@ -396,12 +406,12 @@ ParameterList:
Method:
MethodType MethodDeclarator CBlock
{
- $$ = add_method(genbind_ast, $1, $2, $3);
+ $$ = add_method(genbind_ast, $1, $2, $3, @1.first_line, @1.filename);
}
|
MethodType MethodDeclarator ';'
{
- $$ = add_method(genbind_ast, $1, $2, NULL);
+ $$ = add_method(genbind_ast, $1, $2, NULL, @1.first_line, @1.filename);
}
;
commitdiff http://git.netsurf-browser.org/nsgenbind.git/commit/?id=767e69459ca7b4c13...
commit 767e69459ca7b4c13fe93875177040ab3eec8b56
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Improve the parser error reporting
The parser now reports the correct file and line number for
errors. Additionally the @n location structure in rules now has a
filename member in addition to first_line. These members are useful
for adding location information in generated source.
diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c
index 2915010..749d3e8 100644
--- a/src/nsgenbind-ast.c
+++ b/src/nsgenbind-ast.c
@@ -29,7 +29,7 @@ static FILE *genbind_parsetracef;
extern int nsgenbind_debug;
extern int nsgenbind__flex_debug;
extern void nsgenbind_restart(FILE*);
-extern int nsgenbind_parse(struct genbind_node **genbind_ast);
+extern int nsgenbind_parse(char *filename, struct genbind_node **genbind_ast);
/* terminal nodes have a value only */
struct genbind_node {
@@ -515,12 +515,6 @@ FILE *genbindopen(const char *filename)
}
prevfilepath = strndup(filename,fulllen);
}
-#if 0
- if (options->depfilehandle != NULL) {
- fprintf(options->depfilehandle, " \\\n\t%s",
- filename);
- }
-#endif
return genfile;
}
@@ -529,7 +523,7 @@ FILE *genbindopen(const char *filename)
fulllen = strlen(prevfilepath) + strlen(filename) + 2;
fullname = malloc(fulllen);
snprintf(fullname, fulllen, "%s/%s", prevfilepath, filename);
- if (options->debug) {
+ if (options->verbose) {
printf("Attempting to open Genbind file %s\n", fullname);
}
genfile = fopen(fullname, "r");
@@ -537,12 +531,6 @@ FILE *genbindopen(const char *filename)
if (options->verbose) {
printf("Opened Genbind file %s\n", fullname);
}
-#if 0
- if (options->depfilehandle != NULL) {
- fprintf(options->depfilehandle, " \\\n\t%s",
- fullname);
- }
-#endif
free(fullname);
return genfile;
}
@@ -599,7 +587,7 @@ int genbind_parsefile(char *infilename, struct genbind_node **ast)
nsgenbind_restart(infile);
/* process binding */
- ret = nsgenbind_parse(ast);
+ ret = nsgenbind_parse(infilename, ast);
/* close tracefile if open */
if (genbind_parsetracef != NULL) {
diff --git a/src/nsgenbind-lexer.l b/src/nsgenbind-lexer.l
index f32a948..af77368 100644
--- a/src/nsgenbind-lexer.l
+++ b/src/nsgenbind-lexer.l
@@ -15,9 +15,10 @@
#include "nsgenbind-parser.h"
#include "nsgenbind-ast.h"
-#define YY_USER_ACTION yylloc->first_line = yylloc->last_line; \
- yylloc->first_column = yylloc->last_column + 1; \
- yylloc->last_column += yyleng;
+#define YY_USER_ACTION \
+ yylloc->first_line = yylloc->last_line = yylineno; \
+ yylloc->first_column = yylloc->last_column + 1; \
+ yylloc->last_column += yyleng;
/* Ensure compatability with bison 2.6 and later */
@@ -29,6 +30,43 @@
#define YYLTYPE NSGENBIND_LTYPE
#endif
+static struct YYLTYPE *locations = NULL;
+
+static struct YYLTYPE *push_location(struct YYLTYPE *head,
+ struct YYLTYPE *loc,
+ const char *filename)
+{
+ struct YYLTYPE *res;
+ res = calloc(1, sizeof(struct YYLTYPE));
+ /* copy current location and line number */
+ *res = *loc;
+ res->start_line = yylineno;
+ res->next = head;
+
+ /* reset current location */
+ loc->first_line = loc->last_line = 1;
+ loc->first_column = loc->last_column = 1;
+ loc->filename = strdup(filename);
+ yylineno = 1;
+
+ return res;
+}
+
+static struct YYLTYPE *pop_location(struct YYLTYPE *head, struct YYLTYPE *loc)
+{
+ struct YYLTYPE *res = NULL;
+
+ if (head != NULL) {
+ res = head->next;
+ *loc = *head;
+ free(head);
+
+ yylineno = loc->start_line;
+ }
+ return res;
+}
+
+
%}
/* lexer options */
@@ -165,8 +203,10 @@ unsigned return TOK_UNSIGNED;
fprintf(stderr, "Unable to open include %s\n", yytext);
exit(3);
}
- yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
-
+
+ locations = push_location(locations, yylloc, yytext);
+
+ yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));
BEGIN(INITIAL);
}
@@ -178,9 +218,10 @@ unsigned return TOK_UNSIGNED;
yypop_buffer_state();
if ( !YY_CURRENT_BUFFER ) {
- yyterminate();
+ yyterminate();
} else {
- BEGIN(incl);
+ locations = pop_location(locations, yylloc);
+ BEGIN(incl);
}
}
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index 247a047..b52d0d0 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -1,4 +1,66 @@
-%{
+/* binding parser
+ *
+ * This file is part of nsgenbind.
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>
+ */
+
+ /* bison prior to 2.4 cannot cope with %define api.pure so we use the
+ * deprecated directive
+ */
+%pure-parser
+
+%locations
+
+%error-verbose
+ /* would use api.prefix but it needs to be different between bison
+ * 2.5 and 2.6
+ */
+
+%code requires {
+
+#define YYLTYPE YYLTYPE
+typedef struct YYLTYPE {
+ struct YYLTYPE *next;
+ int start_line;
+ char *filename;
+
+ int first_line;
+ int first_column;
+ int last_line;
+ int last_column;
+} YYLTYPE;
+
+
+#define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (N) { \
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+ (Current).filename = YYRHSLOC (Rhs, 1).filename; \
+ (Current).start_line = YYRHSLOC (Rhs, 1).start_line; \
+ } else { /* empty RHS */ \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC (Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC (Rhs, 0).last_column; \
+ (Current).filename = YYRHSLOC (Rhs, 0).filename; \
+ (Current).start_line = YYRHSLOC (Rhs, 0).start_line; \
+ } \
+ while (0)
+
+}
+
+%initial-action {
+ yylloc.first_line = yylloc.last_line = 1;
+ yylloc.first_column = yylloc.last_column = 1;
+ yylloc.filename = filename;
+}
+
+%code {
/* parser for the binding generation config file
*
* This file is part of nsgenbind.
@@ -16,7 +78,6 @@
(Loc).first_line, (Loc).first_column, \
(Loc).last_line, (Loc).last_column)
-#include "nsgenbind-parser.h"
#include "nsgenbind-lexer.h"
#include "webidl-ast.h"
#include "nsgenbind-ast.h"
@@ -24,12 +85,19 @@
char *errtxt;
static void nsgenbind_error(YYLTYPE *locp,
+ char *filename,
struct genbind_node **genbind_ast,
const char *str)
{
- locp = locp;
+ int errlen;
+ errlen = snprintf(NULL, 0, "%s:%d:%s",
+ locp->filename, locp->first_line, str);
+ errtxt = malloc(errlen + 1);
+ snprintf(errtxt, errlen + 1, "%s:%d:%s",
+ locp->filename, locp->first_line, str);
+
genbind_ast = genbind_ast;
- errtxt = strdup(str);
+ filename = filename;
}
static struct genbind_node *
@@ -91,14 +159,9 @@ add_method(struct genbind_node **genbind_ast,
return res_node;
}
-%}
+}
-%locations
- /* bison prior to 2.4 cannot cope with %define api.pure so we use the
- * deprecated directive
- */
-%pure-parser
-%error-verbose
+%parse-param { char *filename }
%parse-param { struct genbind_node **genbind_ast }
%union
@@ -188,7 +251,7 @@ Statements:
|
error ';'
{
- fprintf(stderr, "%d: %s\n", yylloc.first_line, errtxt);
+ fprintf(stderr, "%s\n", errtxt);
free(errtxt);
YYABORT ;
}
commitdiff http://git.netsurf-browser.org/nsgenbind.git/commit/?id=017eb2ef4da167466...
commit 017eb2ef4da167466c05ad83eb0714129a2e46ff
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Simplify genbind AST handling of preface, prologue, epilogue and postface
diff --git a/src/duk-libdom-common.c b/src/duk-libdom-common.c
index a1298e9..fc62863 100644
--- a/src/duk-libdom-common.c
+++ b/src/duk-libdom-common.c
@@ -115,3 +115,35 @@ int output_ctype(FILE *outf, struct genbind_node *node, bool identifier)
return 0;
}
+
+/* exported interface documented in duk-libdom.h */
+int output_method_cdata(FILE* outf,
+ struct genbind_node *node,
+ enum genbind_method_type sel_method_type)
+{
+ struct genbind_node *method;
+
+ method = genbind_node_find_type(genbind_node_getnode(node),
+ NULL,
+ GENBIND_NODE_TYPE_METHOD);
+
+ while (method != NULL) {
+ enum genbind_method_type *method_type;
+
+ method_type = (enum genbind_method_type *)genbind_node_getint(
+ genbind_node_find_type(
+ genbind_node_getnode(method),
+ NULL,
+ GENBIND_NODE_TYPE_METHOD_TYPE));
+ if ((method_type != NULL) &&
+ (*method_type == sel_method_type)) {
+ output_cdata(outf, method, GENBIND_NODE_TYPE_CDATA);
+ }
+
+ method = genbind_node_find_type(genbind_node_getnode(node),
+ method,
+ GENBIND_NODE_TYPE_METHOD);
+ }
+
+ return 0;
+}
diff --git a/src/duk-libdom-dictionary.c b/src/duk-libdom-dictionary.c
index 69ce8aa..65a140a 100644
--- a/src/duk-libdom-dictionary.c
+++ b/src/duk-libdom-dictionary.c
@@ -323,23 +323,27 @@ int output_dictionary(struct ir *ir, struct ir_entry *dictionarye)
output_tool_preface(ifacef);
/* binding preface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* class preface */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_PREFACE);
/* tool prologue */
output_tool_prologue(ifacef);
/* binding prologue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
/* class prologue */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(ifacef, "\n");
@@ -352,20 +356,24 @@ int output_dictionary(struct ir *ir, struct ir_entry *dictionarye)
fprintf(ifacef, "\n");
/* class epilogue */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* binding epilogue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* class postface */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_POSTFACE);
/* binding postface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
op_error:
genb_fclose_tmp(ifacef, dictionarye->filename);
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index 38e1277..997cb9a 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -1296,23 +1296,27 @@ int output_interface(struct ir *ir, struct ir_entry *interfacee)
output_tool_preface(ifacef);
/* binding preface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* class preface */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_PREFACE);
/* tool prologue */
output_tool_prologue(ifacef);
/* binding prologue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
/* class prologue */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(ifacef, "\n");
@@ -1343,20 +1347,24 @@ int output_interface(struct ir *ir, struct ir_entry *interfacee)
fprintf(ifacef, "\n");
/* class epilogue */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* binding epilogue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* class postface */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_POSTFACE);
/* binding postface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
op_error:
genb_fclose_tmp(ifacef, interfacee->filename);
diff --git a/src/duk-libdom.c b/src/duk-libdom.c
index ee7cc3b..fcd55da 100644
--- a/src/duk-libdom.c
+++ b/src/duk-libdom.c
@@ -136,9 +136,9 @@ static FILE *open_header(struct ir *ir, const char *name)
output_tool_preface(hdrf);
/* binding preface */
- output_cdata(hdrf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(hdrf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* header guard */
fprintf(hdrf, "\n#ifndef %s_%s_h\n", DLPFX, name);
@@ -161,9 +161,9 @@ static int close_header(struct ir *ir,
fprintf(hdrf, "\n#endif\n");
/* binding postface */
- output_cdata(hdrf,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(hdrf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
genb_fclose_tmp(hdrf, fname);
free(fname);
@@ -401,17 +401,17 @@ output_binding_src(struct ir *ir)
output_tool_preface(bindf);
/* binding preface */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
+ /* tool prologue */
output_tool_prologue(bindf);
/* binding prologue */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
-
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(bindf, "\n");
@@ -582,9 +582,9 @@ output_binding_src(struct ir *ir)
fprintf(bindf, "}\n");
/* binding postface */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
genb_fclose_tmp(bindf, "binding.c");
diff --git a/src/duk-libdom.h b/src/duk-libdom.h
index 3b07009..b9eeea3 100644
--- a/src/duk-libdom.h
+++ b/src/duk-libdom.h
@@ -47,7 +47,7 @@ int output_tool_prologue(FILE* outf);
/**
* output character data of node of given type.
*
- * used for any cdata including pre/pro/epi/post sections
+ * used for any cdata sections
*
* \param outf The file handle to write output.
* \param node The node to search.
@@ -57,6 +57,18 @@ int output_tool_prologue(FILE* outf);
int output_cdata(FILE* outf, struct genbind_node *node, enum genbind_node_type nodetype);
/**
+ * output character data of method node of given type.
+ *
+ * used for any cdata including pre/pro/epi/post sections
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to search.
+ * \param nodetype the type of child node to search for.
+ * \return The number of nodes written or 0 for none.
+ */
+int output_method_cdata(FILE* outf, struct genbind_node *node, enum genbind_method_type sel_method_type);
+
+/**
* output a C variable type
*
* Used to output c type and optionlly identifier declarations for parameters
diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c
index 6b39461..2915010 100644
--- a/src/nsgenbind-ast.c
+++ b/src/nsgenbind-ast.c
@@ -338,10 +338,6 @@ char *genbind_node_gettext(struct genbind_node *node)
switch(node->type) {
case GENBIND_NODE_TYPE_WEBIDL:
case GENBIND_NODE_TYPE_STRING:
- case GENBIND_NODE_TYPE_PREFACE:
- case GENBIND_NODE_TYPE_PROLOGUE:
- case GENBIND_NODE_TYPE_EPILOGUE:
- case GENBIND_NODE_TYPE_POSTFACE:
case GENBIND_NODE_TYPE_IDENT:
case GENBIND_NODE_TYPE_NAME:
case GENBIND_NODE_TYPE_CDATA:
@@ -406,18 +402,6 @@ static const char *genbind_node_type_to_str(enum genbind_node_type type)
case GENBIND_NODE_TYPE_STRING:
return "String";
- case GENBIND_NODE_TYPE_PREFACE:
- return "Preface";
-
- case GENBIND_NODE_TYPE_POSTFACE:
- return "Postface";
-
- case GENBIND_NODE_TYPE_PROLOGUE:
- return "Prologue";
-
- case GENBIND_NODE_TYPE_EPILOGUE:
- return "Epilogue";
-
case GENBIND_NODE_TYPE_BINDING:
return "Binding";
diff --git a/src/nsgenbind-ast.h b/src/nsgenbind-ast.h
index 282544e..b130db2 100644
--- a/src/nsgenbind-ast.h
+++ b/src/nsgenbind-ast.h
@@ -17,12 +17,8 @@ enum genbind_node_type {
GENBIND_NODE_TYPE_CDATA, /**< verbatim block of character data */
GENBIND_NODE_TYPE_STRING, /**< text string */
- GENBIND_NODE_TYPE_BINDING,
+ GENBIND_NODE_TYPE_BINDING, /**< Binding */
GENBIND_NODE_TYPE_WEBIDL,
- GENBIND_NODE_TYPE_PREFACE,
- GENBIND_NODE_TYPE_PROLOGUE,
- GENBIND_NODE_TYPE_EPILOGUE,
- GENBIND_NODE_TYPE_POSTFACE,
GENBIND_NODE_TYPE_CLASS, /**< class definition */
GENBIND_NODE_TYPE_PRIVATE,
@@ -45,12 +41,16 @@ enum genbind_type_modifier {
/* binding method types */
enum genbind_method_type {
- GENBIND_METHOD_TYPE_INIT = 0, /**< binding method is initialiser */
- GENBIND_METHOD_TYPE_FINI, /**< binding method is finalizer */
- GENBIND_METHOD_TYPE_METHOD, /**< binding method is a method */
- GENBIND_METHOD_TYPE_GETTER, /**< binding method is a getter */
- GENBIND_METHOD_TYPE_SETTER, /**< binding method is a setter */
- GENBIND_METHOD_TYPE_PROTOTYPE, /**< binding method is a prototype */
+ GENBIND_METHOD_TYPE_INIT = 0, /**< method is initialiser */
+ GENBIND_METHOD_TYPE_FINI, /**< method is finalizer */
+ GENBIND_METHOD_TYPE_METHOD, /**< method is a method */
+ GENBIND_METHOD_TYPE_GETTER, /**< method is a getter */
+ GENBIND_METHOD_TYPE_SETTER, /**< method is a setter */
+ GENBIND_METHOD_TYPE_PROTOTYPE, /**< method is a prototype */
+ GENBIND_METHOD_TYPE_PREFACE, /**< method is a preface */
+ GENBIND_METHOD_TYPE_PROLOGUE, /**< method is a prologue */
+ GENBIND_METHOD_TYPE_EPILOGUE, /**< method is a epilogue */
+ GENBIND_METHOD_TYPE_POSTFACE, /**< method is a postface */
};
struct genbind_node;
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index b883833..247a047 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -80,7 +80,6 @@ add_method(struct genbind_node **genbind_ast,
genbind_new_node(GENBIND_NODE_TYPE_IDENT,
method_node,
class_name));
-
} else {
/* update the existing class */
@@ -156,21 +155,14 @@ add_method(struct genbind_node **genbind_ast,
%type <node> Class
%type <node> ClassArgs
%type <node> ClassArg
-%type <node> ClassFlag
%type <node> ClassFlags
%type <node> Method
%type <node> MethodDeclarator
%type <value> MethodType
+%type <value> BindingAndMethodType
%type <node> WebIDL
-%type <node> Preface
-%type <node> Prologue
-%type <node> Epilogue
-%type <node> Postface
-%type <node> Private
-%type <node> Internal
-%type <node> Property
%type <node> ParameterList
%type <node> CTypeIdent
@@ -188,7 +180,7 @@ Input:
Statements:
Statement
- |
+ |
Statements Statement
{
$$ = *genbind_ast = genbind_node_prepend($2, $1);
@@ -225,23 +217,26 @@ BindingArgs:
|
BindingArgs BindingArg
{
- $$ = genbind_node_link($2, $1);
+ $$ = genbind_node_link($2, $1);
}
;
BindingArg:
WebIDL
|
- Preface
- |
- Prologue
- |
- Epilogue
- |
- Postface
+ BindingAndMethodType CBlock ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
+ genbind_new_node(GENBIND_NODE_TYPE_CDATA,
+ NULL,
+ $2),
+ (void *)$1));
+ }
;
- /* a web IDL file specifier */
+/* a web IDL file specifier */
WebIDL:
TOK_WEBIDL TOK_STRING_LITERAL ';'
{
@@ -308,40 +303,42 @@ CTypeIdent:
}
;
-Preface:
- TOK_PREFACE CBlock ';'
+
+CBlock:
+ TOK_CCODE_LITERAL
+ |
+ CBlock TOK_CCODE_LITERAL
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2);
+ $$ = genbind_strapp($1, $2);
}
;
-Prologue:
- TOK_PROLOGUE CBlock ';'
+
+ParameterList:
+ CTypeIdent
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PROLOGUE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
}
- ;
-
-Epilogue:
- TOK_EPILOGUE CBlock ';'
+ |
+ ParameterList ',' CTypeIdent
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_EPILOGUE, NULL, $2);
+ $$ = genbind_node_prepend($1,
+ genbind_new_node(
+ GENBIND_NODE_TYPE_PARAMETER,
+ NULL,
+ $3));
}
;
-Postface:
- TOK_POSTFACE CBlock ';'
+Method:
+ MethodType MethodDeclarator CBlock
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_POSTFACE, NULL, $2);
+ $$ = add_method(genbind_ast, $1, $2, $3);
}
- ;
-
-CBlock:
- TOK_CCODE_LITERAL
|
- CBlock TOK_CCODE_LITERAL
+ MethodType MethodDeclarator ';'
{
- $$ = genbind_strapp($1, $2);
+ $$ = add_method(genbind_ast, $1, $2, NULL);
}
;
@@ -375,21 +372,29 @@ MethodType:
{
$$ = GENBIND_METHOD_TYPE_PROTOTYPE;
}
+ |
+ BindingAndMethodType
;
-ParameterList:
- CTypeIdent
+BindingAndMethodType:
+ TOK_PREFACE
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
+ $$ = GENBIND_METHOD_TYPE_PREFACE;
}
|
- ParameterList ',' CTypeIdent
+ TOK_PROLOGUE
{
- $$ = genbind_node_prepend($1,
- genbind_new_node(
- GENBIND_NODE_TYPE_PARAMETER,
- NULL,
- $3));
+ $$ = GENBIND_METHOD_TYPE_PROLOGUE;
+ }
+ |
+ TOK_EPILOGUE
+ {
+ $$ = GENBIND_METHOD_TYPE_EPILOGUE;
+ }
+ |
+ TOK_POSTFACE
+ {
+ $$ = GENBIND_METHOD_TYPE_POSTFACE;
}
;
@@ -434,17 +439,6 @@ MethodDeclarator:
}
;
-Method:
- MethodType MethodDeclarator CBlock
- {
- $$ = add_method(genbind_ast, $1, $2, $3);
- }
- |
- MethodType MethodDeclarator ';'
- {
- $$ = add_method(genbind_ast, $1, $2, NULL);
- }
- ;
Class:
TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}' ';'
@@ -464,43 +458,41 @@ ClassArgs:
;
ClassArg:
- Private
- |
- Internal
- |
- Property
- |
- ClassFlag
- |
- Preface
- |
- Prologue
- |
- Epilogue
- |
- Postface
- ;
-
-
-Private:
TOK_PRIVATE CTypeIdent ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
}
- ;
-
-Internal:
+ |
TOK_INTERNAL CTypeIdent ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
}
- ;
-
-ClassFlag:
+ |
+ TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_MODIFIER,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ NULL,
+ $3),
+ (void *)$2));
+ }
+ |
TOK_FLAGS ClassFlags ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
}
+ |
+ BindingAndMethodType CBlock ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
+ genbind_new_node(GENBIND_NODE_TYPE_CDATA,
+ NULL,
+ $2),
+ (void *)$1));
+ }
;
ClassFlags:
@@ -515,18 +507,6 @@ ClassFlags:
}
;
-Property:
- TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
- {
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL,
- genbind_new_node(GENBIND_NODE_TYPE_MODIFIER,
- genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- NULL,
- $3),
- (void *)$2));
- }
- ;
-
Modifiers:
/* empty */
{
commitdiff http://git.netsurf-browser.org/nsgenbind.git/commit/?id=53acb5a29b8eb4fe8...
commit 53acb5a29b8eb4fe89dd2e8bc3b808d5e7183b81
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Improve documentation on webidl type specifiers
diff --git a/src/webidl-ast.h b/src/webidl-ast.h
index 9ae2ebb..59dfcac 100644
--- a/src/webidl-ast.h
+++ b/src/webidl-ast.h
@@ -49,21 +49,21 @@ enum webidl_node_type {
};
enum webidl_type {
- WEBIDL_TYPE_ANY, /**< The type is unconstrained */
- WEBIDL_TYPE_USER,
- WEBIDL_TYPE_BOOL,
- WEBIDL_TYPE_BYTE,
- WEBIDL_TYPE_OCTET,
- WEBIDL_TYPE_FLOAT,
- WEBIDL_TYPE_DOUBLE,
- WEBIDL_TYPE_SHORT,
- WEBIDL_TYPE_LONG,
- WEBIDL_TYPE_LONGLONG,
- WEBIDL_TYPE_STRING,
- WEBIDL_TYPE_SEQUENCE,
- WEBIDL_TYPE_OBJECT,
- WEBIDL_TYPE_DATE,
- WEBIDL_TYPE_VOID,
+ WEBIDL_TYPE_ANY, /**< 0 - The type is unconstrained */
+ WEBIDL_TYPE_USER, /**< 1 - The type is a dictionary or interface */
+ WEBIDL_TYPE_BOOL, /**< 2 - The type is boolean */
+ WEBIDL_TYPE_BYTE, /**< 3 - The type is a byte */
+ WEBIDL_TYPE_OCTET, /**< 4 - The type is a octet */
+ WEBIDL_TYPE_FLOAT, /**< 5 - The type is a float point number */
+ WEBIDL_TYPE_DOUBLE, /**< 6 - The type is a double */
+ WEBIDL_TYPE_SHORT, /**< 7 - The type is a signed 16bit */
+ WEBIDL_TYPE_LONG, /**< 8 - The type is a signed 32bit */
+ WEBIDL_TYPE_LONGLONG, /**< 9 - The type is a signed 64bit */
+ WEBIDL_TYPE_STRING, /**< 10 - The type is a string */
+ WEBIDL_TYPE_SEQUENCE, /**< 11 - The type is a sequence */
+ WEBIDL_TYPE_OBJECT, /**< 12 - The type is a object */
+ WEBIDL_TYPE_DATE, /**< 13 - The type is a date */
+ WEBIDL_TYPE_VOID, /**< 14 - The type is void */
};
/** modifiers for operations, attributes and arguments */
commitdiff http://git.netsurf-browser.org/nsgenbind.git/commit/?id=4a7185fd4a25b1456...
commit 4a7185fd4a25b1456737b8fa2ac6a770a3e1721e
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Make the binding parser understand c types
Instead of c types being opaque strings this makes the bindig parser
understand them. This is necessary for extended attribute parsing in
future but also makes the binding more easily understandable.
diff --git a/src/duk-libdom-common.c b/src/duk-libdom-common.c
index 9a0f660..a1298e9 100644
--- a/src/duk-libdom-common.c
+++ b/src/duk-libdom-common.c
@@ -76,3 +76,42 @@ int output_tool_prologue(FILE* outf)
return 0;
}
+
+
+/* exported interface documented in duk-libdom.h */
+int output_ctype(FILE *outf, struct genbind_node *node, bool identifier)
+{
+ const char *type_cdata = NULL;
+ struct genbind_node *typename_node;
+
+ typename_node = genbind_node_find_type(genbind_node_getnode(node),
+ NULL,
+ GENBIND_NODE_TYPE_NAME);
+ while (typename_node != NULL) {
+ type_cdata = genbind_node_gettext(typename_node);
+
+ fprintf(outf, "%s", type_cdata);
+
+ typename_node = genbind_node_find_type(
+ genbind_node_getnode(node),
+ typename_node,
+ GENBIND_NODE_TYPE_NAME);
+
+ /* separate all but the last entry with spaces */
+ if (typename_node != NULL) {
+ fputc(' ', outf);
+ }
+ }
+
+ if (identifier) {
+ if ((type_cdata != NULL) &&
+ (type_cdata[0] != '*') &&
+ (type_cdata[0] != ' ')) {
+ fputc(' ', outf);
+ }
+
+ output_cdata(outf, node, GENBIND_NODE_TYPE_IDENT);
+ }
+
+ return 0;
+}
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index ad40741..38e1277 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -328,6 +328,42 @@ output_interface_destructor(FILE* outf, struct ir_entry *interfacee)
}
/**
+ * Compare two nodes to check their c types match.
+ */
+static bool compare_ctypes(struct genbind_node *a, struct genbind_node *b)
+{
+ struct genbind_node *ta;
+ struct genbind_node *tb;
+
+ ta = genbind_node_find_type(genbind_node_getnode(a),
+ NULL, GENBIND_NODE_TYPE_NAME);
+ tb = genbind_node_find_type(genbind_node_getnode(b),
+ NULL, GENBIND_NODE_TYPE_NAME);
+
+ while ((ta != NULL) && (tb != NULL)) {
+ char *txt_a;
+ char *txt_b;
+
+ txt_a = genbind_node_gettext(ta);
+ txt_b = genbind_node_gettext(tb);
+
+ if (strcmp(txt_a, txt_b) != 0) {
+ return false; /* missmatch */
+ }
+
+ ta = genbind_node_find_type(genbind_node_getnode(a),
+ ta, GENBIND_NODE_TYPE_NAME);
+ tb = genbind_node_find_type(genbind_node_getnode(b),
+ tb, GENBIND_NODE_TYPE_NAME);
+ }
+ if (ta != tb) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
* generate an initialisor call to parent interface
*/
static int
@@ -389,26 +425,14 @@ output_interface_inherit_init(FILE* outf,
param_name);
return -1;
} else {
- char *param_type;
- char *inh_param_type;
-
fprintf(outf, ", ");
/* cast the parameter if required */
- param_type = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(param_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- inh_param_type = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(inh_param_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- if (strcmp(param_type, inh_param_type) != 0) {
- fprintf(outf, "(%s)", inh_param_type);
+ if (compare_ctypes(param_node,
+ inh_param_node) == false) {
+ fputc('(', outf);
+ output_ctype(outf, inh_param_node, false);
+ fputc(')', outf);
}
/* output the parameter identifier */
@@ -449,8 +473,8 @@ output_interface_init_declaration(FILE* outf,
while (param_node != NULL) {
interfacee->class_init_argc++;
fprintf(outf, ", ");
- output_cdata(outf, param_node, GENBIND_NODE_TYPE_TYPE);
- output_cdata(outf, param_node, GENBIND_NODE_TYPE_IDENT);
+
+ output_ctype(outf, param_node, true);
param_node = genbind_node_find_type(
genbind_node_getnode(init_node),
diff --git a/src/duk-libdom.c b/src/duk-libdom.c
index 084a68f..ee7cc3b 100644
--- a/src/duk-libdom.c
+++ b/src/duk-libdom.c
@@ -228,25 +228,10 @@ output_private_header(struct ir *ir)
NULL,
GENBIND_NODE_TYPE_PRIVATE);
while (priv_node != NULL) {
- /* generate the private variable definition ensuring
- * the type is separated from the identifier with
- * either a * or space.
- */
- const char *type_cdata;
- char cdatae;
- type_cdata = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(priv_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- fprintf(privf, "\t%s", type_cdata);
- cdatae = type_cdata[strlen(type_cdata) - 1];
- if ((cdatae != '*') && (cdatae != ' ')) {
- fputc(' ', privf);
- }
+ fprintf(privf, "\t");
+
+ output_ctype(privf, priv_node, true);
- output_cdata(privf, priv_node, GENBIND_NODE_TYPE_IDENT);
fprintf(privf, ";\n");
priv_node = genbind_node_find_type(
diff --git a/src/duk-libdom.h b/src/duk-libdom.h
index 79b440e..3b07009 100644
--- a/src/duk-libdom.h
+++ b/src/duk-libdom.h
@@ -56,4 +56,19 @@ int output_tool_prologue(FILE* outf);
*/
int output_cdata(FILE* outf, struct genbind_node *node, enum genbind_node_type nodetype);
+/**
+ * output a C variable type
+ *
+ * Used to output c type and optionlly identifier declarations for parameters
+ * and structure entries.
+ * If the optional identifier is output it is ensured the type is separated
+ * from the identifier with either a * or space.
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to generate content for.
+ * \param identifier If the indentifier should be output.
+ * \return 0 on success.
+ */
+int output_ctype(FILE *outf, struct genbind_node *node, bool identifier);
+
#endif
diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c
index 4f0654a..6b39461 100644
--- a/src/nsgenbind-ast.c
+++ b/src/nsgenbind-ast.c
@@ -259,34 +259,6 @@ genbind_node_find_type_ident(struct genbind_node *node,
return found_node;
}
-/* exported interface documented in nsgenbind-ast.h */
-struct genbind_node *
-genbind_node_find_type_type(struct genbind_node *node,
- struct genbind_node *prev,
- enum genbind_node_type type,
- const char *ident)
-{
- struct genbind_node *found_node;
- struct genbind_node *ident_node;
-
- found_node = genbind_node_find_type(node, prev, type);
-
-
- while (found_node != NULL) {
- /* look for a type node */
- ident_node = genbind_node_find_type(genbind_node_getnode(found_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE);
- if (ident_node != NULL) {
- if (strcmp(ident_node->r.text, ident) == 0)
- break;
- }
-
- /* look for next matching node */
- found_node = genbind_node_find_type(node, found_node, type);
- }
- return found_node;
-}
/* exported interface documented in nsgenbind-ast.h */
@@ -371,7 +343,7 @@ char *genbind_node_gettext(struct genbind_node *node)
case GENBIND_NODE_TYPE_EPILOGUE:
case GENBIND_NODE_TYPE_POSTFACE:
case GENBIND_NODE_TYPE_IDENT:
- case GENBIND_NODE_TYPE_TYPE:
+ case GENBIND_NODE_TYPE_NAME:
case GENBIND_NODE_TYPE_CDATA:
return node->r.text;
@@ -449,8 +421,8 @@ static const char *genbind_node_type_to_str(enum genbind_node_type type)
case GENBIND_NODE_TYPE_BINDING:
return "Binding";
- case GENBIND_NODE_TYPE_TYPE:
- return "Type";
+ case GENBIND_NODE_TYPE_NAME:
+ return "TypeName";
case GENBIND_NODE_TYPE_PRIVATE:
return "Private";
diff --git a/src/nsgenbind-ast.h b/src/nsgenbind-ast.h
index 2a384b2..282544e 100644
--- a/src/nsgenbind-ast.h
+++ b/src/nsgenbind-ast.h
@@ -12,7 +12,7 @@
enum genbind_node_type {
GENBIND_NODE_TYPE_ROOT = 0,
GENBIND_NODE_TYPE_IDENT, /**< generic identifier string */
- GENBIND_NODE_TYPE_TYPE, /**< generic type string */
+ GENBIND_NODE_TYPE_NAME, /**< generic type string */
GENBIND_NODE_TYPE_MODIFIER, /**< node modifier */
GENBIND_NODE_TYPE_CDATA, /**< verbatim block of character data */
GENBIND_NODE_TYPE_STRING, /**< text string */
@@ -152,30 +152,6 @@ genbind_node_find_type_ident(struct genbind_node *node,
/**
- * Returning node of the specified type with a GENBIND_NODE_TYPE_TYPE
- * subnode with matching text.
- *
- * This is a conveniance wrapper around nested calls to
- * genbind_node_find_type() which performs a depth first left hand
- * search returning nodes of the specified type and a child node of
- * GENBIND_NODE_TYPE_TYPE with matching text.
- *
- *
- * @param node The node to start the search from
- * @param prev The node at which to stop the search, either NULL to
- * search the full tree depth (initial search) or the result
- * of a previous search to continue.
- * @param nodetype The type of node to seach for.
- * @param type The text to match the type child node to.
- */
-struct genbind_node *
-genbind_node_find_type_type(struct genbind_node *node,
- struct genbind_node *prev,
- enum genbind_node_type nodetype,
- const char *type_text);
-
-
-/**
* Find a method node of a given method type
*
* \param node A node of type GENBIND_NODE_TYPE_CLASS to search for methods.
diff --git a/src/nsgenbind-lexer.l b/src/nsgenbind-lexer.l
index d092195..f32a948 100644
--- a/src/nsgenbind-lexer.l
+++ b/src/nsgenbind-lexer.l
@@ -93,50 +93,39 @@ dblcolon \:\:
/* binding terminals */
binding return TOK_BINDING;
-
webidl return TOK_WEBIDL;
-
preface return TOK_PREFACE;
-
prologue return TOK_PROLOGUE;
-
epilogue return TOK_EPILOGUE;
-
postface return TOK_POSTFACE;
/* class member terminals */
class return TOK_CLASS;
-
private return TOK_PRIVATE;
-
internal return TOK_INTERNAL;
-
flags return TOK_FLAGS;
-
type return TOK_TYPE;
-
unshared return TOK_UNSHARED;
-
shared return TOK_SHARED;
-
property return TOK_PROPERTY;
/* implementation terminals */
init return TOK_INIT;
-
fini return TOK_FINI;
-
method return TOK_METHOD;
-
getter return TOK_GETTER;
-
setter return TOK_SETTER;
-
prototype return TOK_PROTOTYPE;
+ /* c type terminals */
+
+struct return TOK_STRUCT;
+union return TOK_UNION;
+unsigned return TOK_UNSIGNED;
+
/* other terminals */
{dblcolon} return TOK_DBLCOLON;
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index 1462b39..b883833 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -27,9 +27,9 @@ static void nsgenbind_error(YYLTYPE *locp,
struct genbind_node **genbind_ast,
const char *str)
{
- locp = locp;
- genbind_ast = genbind_ast;
- errtxt = strdup(str);
+ locp = locp;
+ genbind_ast = genbind_ast;
+ errtxt = strdup(str);
}
static struct genbind_node *
@@ -104,9 +104,9 @@ add_method(struct genbind_node **genbind_ast,
%union
{
- char *text;
- struct genbind_node *node;
- long value;
+ char *text;
+ struct genbind_node *node;
+ long value;
}
%token TOK_BINDING
@@ -135,6 +135,10 @@ add_method(struct genbind_node **genbind_ast,
%token TOK_DBLCOLON
+%token TOK_STRUCT
+%token TOK_UNION
+%token TOK_UNSIGNED
+
%token <text> TOK_IDENTIFIER
%token <text> TOK_STRING_LITERAL
%token <text> TOK_CCODE_LITERAL
@@ -169,38 +173,36 @@ add_method(struct genbind_node **genbind_ast,
%type <node> Property
%type <node> ParameterList
-%type <node> TypeIdent
+%type <node> CTypeIdent
+%type <node> CType
+%type <node> CTypeSpecifier
%%
-Input
- :
+Input:
Statements
- {
- *genbind_ast = $1;
+ {
+ *genbind_ast = $1;
}
;
-
-Statements
- :
- Statement
+Statements:
+ Statement
|
- Statements Statement
+ Statements Statement
{
- $$ = *genbind_ast = genbind_node_prepend($2, $1);
+ $$ = *genbind_ast = genbind_node_prepend($2, $1);
}
- |
- error ';'
- {
- fprintf(stderr, "%d: %s\n", yylloc.first_line, errtxt);
- free(errtxt);
- YYABORT ;
+ |
+ error ';'
+ {
+ fprintf(stderr, "%d: %s\n", yylloc.first_line, errtxt);
+ free(errtxt);
+ YYABORT ;
}
;
-Statement
- :
+Statement:
Binding
|
Class
@@ -208,18 +210,17 @@ Statement
Method
;
-Binding
- :
- TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}'
+Binding:
+ TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}' ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING,
- NULL,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE, $4, $2));
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ $4, $2));
}
;
-BindingArgs
- :
+BindingArgs:
BindingArg
|
BindingArgs BindingArg
@@ -228,8 +229,7 @@ BindingArgs
}
;
-BindingArg
- :
+BindingArg:
WebIDL
|
Preface
@@ -241,71 +241,102 @@ BindingArg
Postface
;
- /* [3] a web IDL file specifier */
-WebIDL
- :
+ /* a web IDL file specifier */
+WebIDL:
TOK_WEBIDL TOK_STRING_LITERAL ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDL, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDL, NULL, $2);
}
;
+ /* parse a c type specifier. This probably also needs to cope with
+ * void, char, short, int, long, float, double, signed, enum
+ */
+CTypeSpecifier:
+ TOK_UNSIGNED TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("unsigned")),
+ $2);
+ }
+ |
+ TOK_STRUCT TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("struct")),
+ $2);
+ }
+ |
+ TOK_UNION TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("union")),
+ $2);
+ }
+ |
+ TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME, NULL, $1);
+ }
+ ;
+
+CType:
+ CTypeSpecifier
+ |
+ CTypeSpecifier '*'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME, $1, strdup("*"));
+ }
/* type and identifier of a variable */
-TypeIdent
- :
- TOK_STRING_LITERAL TOK_IDENTIFIER
+CTypeIdent:
+ CType TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE, NULL, $1), $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $2);
}
|
- TOK_STRING_LITERAL TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER
+ CType TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE,
- NULL,
- $1),
- $2),
- $4);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $2), $4);
}
;
-Preface
- :
+Preface:
TOK_PREFACE CBlock ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2);
}
;
-Prologue
- :
+Prologue:
TOK_PROLOGUE CBlock ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PROLOGUE, NULL, $2);
}
;
-Epilogue
- :
+Epilogue:
TOK_EPILOGUE CBlock ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_EPILOGUE, NULL, $2);
}
;
-Postface
- :
+Postface:
TOK_POSTFACE CBlock ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_POSTFACE, NULL, $2);
}
;
-CBlock
- :
+CBlock:
TOK_CCODE_LITERAL
|
CBlock TOK_CCODE_LITERAL
@@ -314,8 +345,7 @@ CBlock
}
;
-MethodType
- :
+MethodType:
TOK_INIT
{
$$ = GENBIND_METHOD_TYPE_INIT;
@@ -347,14 +377,13 @@ MethodType
}
;
-ParameterList
- :
- TypeIdent
+ParameterList:
+ CTypeIdent
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
}
|
- ParameterList ',' TypeIdent
+ ParameterList ',' CTypeIdent
{
$$ = genbind_node_prepend($1,
genbind_new_node(
@@ -364,8 +393,7 @@ ParameterList
}
;
-MethodDeclarator
- :
+MethodDeclarator:
TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER '(' ParameterList ')'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS,
@@ -406,8 +434,7 @@ MethodDeclarator
}
;
-Method
- :
+Method:
MethodType MethodDeclarator CBlock
{
$$ = add_method(genbind_ast, $1, $2, $3);
@@ -419,17 +446,15 @@ Method
}
;
-Class
- :
- TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}'
+Class:
+ TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}' ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS, NULL,
genbind_new_node(GENBIND_NODE_TYPE_IDENT, $4, $2));
}
;
-ClassArgs
- :
+ClassArgs:
ClassArg
|
ClassArgs ClassArg
@@ -438,8 +463,7 @@ ClassArgs
}
;
-ClassArg
- :
+ClassArg:
Private
|
Internal
@@ -458,45 +482,40 @@ ClassArg
;
-Private
- :
- TOK_PRIVATE TypeIdent ';'
+Private:
+ TOK_PRIVATE CTypeIdent ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
}
;
-Internal
- :
- TOK_INTERNAL TypeIdent ';'
+Internal:
+ TOK_INTERNAL CTypeIdent ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
}
;
-ClassFlag
- :
+ClassFlag:
TOK_FLAGS ClassFlags ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
}
;
-ClassFlags
- :
+ClassFlags:
TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1);
}
|
ClassFlags ',' TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3);
}
;
-Property
- :
+Property:
TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL,
@@ -508,8 +527,7 @@ Property
}
;
-Modifiers
- :
+Modifiers:
/* empty */
{
$$ = GENBIND_TYPE_NONE;
@@ -521,8 +539,7 @@ Modifiers
}
;
-Modifier
- :
+Modifier:
TOK_TYPE
{
$$ = GENBIND_TYPE_TYPE;
diff --git a/src/nsgenbind.c b/src/nsgenbind.c
index 135c5c0..09d4c29 100644
--- a/src/nsgenbind.c
+++ b/src/nsgenbind.c
@@ -168,7 +168,7 @@ static enum bindingtype_e genbind_get_type(struct genbind_node *node)
genbind_node_find_type(
genbind_node_getnode(binding_node),
NULL,
- GENBIND_NODE_TYPE_TYPE));
+ GENBIND_NODE_TYPE_NAME));
if (binding_type == NULL) {
fprintf(stderr, "Error: missing binding type\n");
return BINDINGTYPE_UNKNOWN;
diff --git a/test/data/bindings/HTMLUnknownElement.bnd b/test/data/bindings/HTMLUnknownElement.bnd
index faabaec..d44018b 100644
--- a/test/data/bindings/HTMLUnknownElement.bnd
+++ b/test/data/bindings/HTMLUnknownElement.bnd
@@ -14,6 +14,6 @@ class HTMLUnknownElement {
postface %{
/* class post */
%};
-}
+};
-init HTMLUnknownElement("struct dom_html_element *" html_unknown_element::html_element);
+init HTMLUnknownElement(struct dom_html_element *html_unknown_element::html_element);
diff --git a/test/data/bindings/browser-duk.bnd b/test/data/bindings/browser-duk.bnd
index 44497a1..cef3563 100644
--- a/test/data/bindings/browser-duk.bnd
+++ b/test/data/bindings/browser-duk.bnd
@@ -37,108 +37,108 @@ binding duk_libdom {
postface %{
/* binding postface */
%};
-}
+};
#include "HTMLUnknownElement.bnd"
/* specialisations of html_element */
-init HTMLFontElement("struct dom_html_element *" html_font_element::html_element);
-init HTMLDirectoryElement("struct dom_html_element *" html_directory_element::html_element);
-init HTMLFrameElement("struct dom_html_element *" html_frame_element::html_element);
-init HTMLFrameSetElement("struct dom_html_element *" html_frame_set_element::html_element);
-init HTMLMarqueeElement("struct dom_html_element *" html_marquee_element::html_element);
-init HTMLAppletElement("struct dom_html_element *" html_applet_element::html_element);
-init HTMLCanvasElement("struct dom_html_element *" html_canvas_element::html_element);
-init HTMLTemplateElement("struct dom_html_element *" html_template_element::html_element);
-init HTMLScriptElement("struct dom_html_element *" html_script_element::html_element);
-init HTMLDialogElement("struct dom_html_element *" html_dialog_element::html_element);
-init HTMLMenuItemElement("struct dom_html_element *" html_menu_item_element::html_element);
-init HTMLMenuElement("struct dom_html_element *" html_menu_element::html_element);
-init HTMLDetailsElement("struct dom_html_element *" html_details_element::html_element);
-init HTMLLegendElement("struct dom_html_element *" html_legend_element::html_element);
-init HTMLFieldSetElement("struct dom_html_element *" html_field_set_element::html_element);
-init HTMLMeterElement("struct dom_html_element *" html_meter_element::html_element);
-init HTMLProgressElement("struct dom_html_element *" html_progress_element::html_element);
-init HTMLOutputElement("struct dom_html_element *" html_output_element::html_element);
-init HTMLKeygenElement("struct dom_html_element *" html_keygen_element::html_element);
-init HTMLTextAreaElement("struct dom_html_element *" html_text_area_element::html_element);
-init HTMLOptionElement("struct dom_html_element *" html_option_element::html_element);
-init HTMLOptGroupElement("struct dom_html_element *" html_opt_group_element::html_element);
-init HTMLDataListElement("struct dom_html_element *" html_data_list_element::html_element);
-init HTMLSelectElement("struct dom_html_element *" html_select_element::html_element);
-init HTMLButtonElement("struct dom_html_element *" html_button_element::html_element);
-init HTMLInputElement("struct dom_html_element *" html_input_element::html_element);
-init HTMLLabelElement("struct dom_html_element *" html_label_element::html_element);
-init HTMLFormElement("struct dom_html_element *" html_form_element::html_element);
-init HTMLTableCellElement("struct dom_html_element *" html_table_cell_element::html_element);
-init HTMLTableRowElement("struct dom_html_element *" html_table_row_element::html_element);
-init HTMLTableSectionElement("struct dom_html_element *" html_table_section_element::html_element);
-init HTMLTableColElement("struct dom_html_element *" html_table_col_element::html_element);
-init HTMLTableCaptionElement("struct dom_html_element *" html_table_caption_element::html_element);
-init HTMLTableElement("struct dom_html_element *" html_table_element::html_element);
-init HTMLAreaElement("struct dom_html_element *" html_area_element::html_element);
-init HTMLMapElement("struct dom_html_element *" html_map_element::html_element);
-init HTMLMediaElement("struct dom_html_element *" html_media_element::html_element);
-init HTMLTrackElement("struct dom_html_element *" html_track_element::html_element);
-init HTMLParamElement("struct dom_html_element *" html_param_element::html_element);
-init HTMLObjectElement("struct dom_html_element *" html_object_element::html_element);
-init HTMLEmbedElement("struct dom_html_element *" html_embed_element::html_element);
-init HTMLIFrameElement("struct dom_html_element *" html_i_frame_element::html_element);
-init HTMLImageElement("struct dom_html_element *" html_image_element::html_element);
-init HTMLSourceElement("struct dom_html_element *" html_source_element::html_element);
-init HTMLPictureElement("struct dom_html_element *" html_picture_element::html_element);
-init HTMLModElement("struct dom_html_element *" html_mod_element::html_element);
-init HTMLBRElement("struct dom_html_element *" html_br_element::html_element);
-init HTMLSpanElement("struct dom_html_element *" html_span_element::html_element);
-init HTMLTimeElement("struct dom_html_element *" html_time_element::html_element);
-init HTMLDataElement("struct dom_html_element *" html_data_element::html_element);
-init HTMLAnchorElement("struct dom_html_element *" html_anchor_element::html_element);
-init HTMLDivElement("struct dom_html_element *" html_div_element::html_element);
-init HTMLDListElement("struct dom_html_element *" html_d_list_element::html_element);
-init HTMLLIElement("struct dom_html_element *" html_li_element::html_element);
-init HTMLUListElement("struct dom_html_element *" html_u_list_element::html_element);
-init HTMLOListElement("struct dom_html_element *" html_o_list_element::html_element);
-init HTMLQuoteElement("struct dom_html_element *" html_quote_element::html_element);
-init HTMLPreElement("struct dom_html_element *" html_pre_element::html_element);
-init HTMLHRElement("struct dom_html_element *" html_hr_element::html_element);
-init HTMLParagraphElement("struct dom_html_element *" html_paragraph_element::html_element);
-init HTMLHeadingElement("struct dom_html_element *" html_heading_element::html_element);
-init HTMLBodyElement("struct dom_html_element *" html_body_element::html_element);
-init HTMLStyleElement("struct dom_html_element *" html_style_element::html_element);
-init HTMLMetaElement("struct dom_html_element *" html_meta_element::html_element);
-init HTMLLinkElement("struct dom_html_element *" html_link_element::html_element);
-init HTMLBaseElement("struct dom_html_element *" html_base_element::html_element);
-init HTMLTitleElement("struct dom_html_element *" html_title_element::html_element);
-init HTMLHeadElement("struct dom_html_element *" html_head_element::html_element);
-init HTMLHtmlElement("struct dom_html_element *" html_html_element::html_element);
+init HTMLFontElement(struct dom_html_element *html_font_element::html_element);
+init HTMLDirectoryElement(struct dom_html_element *html_directory_element::html_element);
+init HTMLFrameElement(struct dom_html_element *html_frame_element::html_element);
+init HTMLFrameSetElement(struct dom_html_element *html_frame_set_element::html_element);
+init HTMLMarqueeElement(struct dom_html_element *html_marquee_element::html_element);
+init HTMLAppletElement(struct dom_html_element *html_applet_element::html_element);
+init HTMLCanvasElement(struct dom_html_element *html_canvas_element::html_element);
+init HTMLTemplateElement(struct dom_html_element *html_template_element::html_element);
+init HTMLScriptElement(struct dom_html_element *html_script_element::html_element);
+init HTMLDialogElement(struct dom_html_element *html_dialog_element::html_element);
+init HTMLMenuItemElement(struct dom_html_element *html_menu_item_element::html_element);
+init HTMLMenuElement(struct dom_html_element *html_menu_element::html_element);
+init HTMLDetailsElement(struct dom_html_element *html_details_element::html_element);
+init HTMLLegendElement(struct dom_html_element *html_legend_element::html_element);
+init HTMLFieldSetElement(struct dom_html_element *html_field_set_element::html_element);
+init HTMLMeterElement(struct dom_html_element *html_meter_element::html_element);
+init HTMLProgressElement(struct dom_html_element *html_progress_element::html_element);
+init HTMLOutputElement(struct dom_html_element *html_output_element::html_element);
+init HTMLKeygenElement(struct dom_html_element *html_keygen_element::html_element);
+init HTMLTextAreaElement(struct dom_html_element *html_text_area_element::html_element);
+init HTMLOptionElement(struct dom_html_element *html_option_element::html_element);
+init HTMLOptGroupElement(struct dom_html_element *html_opt_group_element::html_element);
+init HTMLDataListElement(struct dom_html_element *html_data_list_element::html_element);
+init HTMLSelectElement(struct dom_html_element *html_select_element::html_element);
+init HTMLButtonElement(struct dom_html_element *html_button_element::html_element);
+init HTMLInputElement(struct dom_html_element *html_input_element::html_element);
+init HTMLLabelElement(struct dom_html_element *html_label_element::html_element);
+init HTMLFormElement(struct dom_html_element *html_form_element::html_element);
+init HTMLTableCellElement(struct dom_html_element *html_table_cell_element::html_element);
+init HTMLTableRowElement(struct dom_html_element *html_table_row_element::html_element);
+init HTMLTableSectionElement(struct dom_html_element *html_table_section_element::html_element);
+init HTMLTableColElement(struct dom_html_element *html_table_col_element::html_element);
+init HTMLTableCaptionElement(struct dom_html_element *html_table_caption_element::html_element);
+init HTMLTableElement(struct dom_html_element *html_table_element::html_element);
+init HTMLAreaElement(struct dom_html_element *html_area_element::html_element);
+init HTMLMapElement(struct dom_html_element *html_map_element::html_element);
+init HTMLMediaElement(struct dom_html_element *html_media_element::html_element);
+init HTMLTrackElement(struct dom_html_element *html_track_element::html_element);
+init HTMLParamElement(struct dom_html_element *html_param_element::html_element);
+init HTMLObjectElement(struct dom_html_element *html_object_element::html_element);
+init HTMLEmbedElement(struct dom_html_element *html_embed_element::html_element);
+init HTMLIFrameElement(struct dom_html_element *html_i_frame_element::html_element);
+init HTMLImageElement(struct dom_html_element *html_image_element::html_element);
+init HTMLSourceElement(struct dom_html_element *html_source_element::html_element);
+init HTMLPictureElement(struct dom_html_element *html_picture_element::html_element);
+init HTMLModElement(struct dom_html_element *html_mod_element::html_element);
+init HTMLBRElement(struct dom_html_element *html_br_element::html_element);
+init HTMLSpanElement(struct dom_html_element *html_span_element::html_element);
+init HTMLTimeElement(struct dom_html_element *html_time_element::html_element);
+init HTMLDataElement(struct dom_html_element *html_data_element::html_element);
+init HTMLAnchorElement(struct dom_html_element *html_anchor_element::html_element);
+init HTMLDivElement(struct dom_html_element *html_div_element::html_element);
+init HTMLDListElement(struct dom_html_element *html_d_list_element::html_element);
+init HTMLLIElement(struct dom_html_element *html_li_element::html_element);
+init HTMLUListElement(struct dom_html_element *html_u_list_element::html_element);
+init HTMLOListElement(struct dom_html_element *html_o_list_element::html_element);
+init HTMLQuoteElement(struct dom_html_element *html_quote_element::html_element);
+init HTMLPreElement(struct dom_html_element *html_pre_element::html_element);
+init HTMLHRElement(struct dom_html_element *html_hr_element::html_element);
+init HTMLParagraphElement(struct dom_html_element *html_paragraph_element::html_element);
+init HTMLHeadingElement(struct dom_html_element *html_heading_element::html_element);
+init HTMLBodyElement(struct dom_html_element *html_body_element::html_element);
+init HTMLStyleElement(struct dom_html_element *html_style_element::html_element);
+init HTMLMetaElement(struct dom_html_element *html_meta_element::html_element);
+init HTMLLinkElement(struct dom_html_element *html_link_element::html_element);
+init HTMLBaseElement(struct dom_html_element *html_base_element::html_element);
+init HTMLTitleElement(struct dom_html_element *html_title_element::html_element);
+init HTMLHeadElement(struct dom_html_element *html_head_element::html_element);
+init HTMLHtmlElement(struct dom_html_element *html_html_element::html_element);
/* specialisations of HTMLTableCellElement */
-init HTMLTableHeaderCellElement("struct dom_html_element *" html_table_header_cell_element::html_table_cell_element);
-init HTMLTableDataCellElement("struct dom_html_element *" html_table_data_cell_element::html_table_cell_element);
+init HTMLTableHeaderCellElement(struct dom_html_element *html_table_header_cell_element::html_table_cell_element);
+init HTMLTableDataCellElement(struct dom_html_element *html_table_data_cell_element::html_table_cell_element);
/* specialisations of html_media_element */
-init HTMLAudioElement("struct dom_html_element *" html_audio_element::html_media_element);
-init HTMLVideoElement("struct dom_html_element *" html_video_element::html_media_element);
+init HTMLAudioElement(struct dom_html_element *html_audio_element::html_media_element);
+init HTMLVideoElement(struct dom_html_element *html_video_element::html_media_element);
-init HTMLElement("struct dom_html_element *" html_element::element);
+init HTMLElement(struct dom_html_element *html_element::element);
-init Text("struct dom_node_text *" text::character_data);
-init Comment("struct dom_node_comment *" comment::character_data);
-init ProcessingInstruction("struct dom_node_text *" text::character_data);
+init Text(struct dom_node_text *text::character_data);
+init Comment(struct dom_node_comment *comment::character_data);
+init ProcessingInstruction(struct dom_node_text *text::character_data);
-init XMLDocument("struct dom_document *" document);
+init XMLDocument(struct dom_document * document);
-init Element("struct dom_element *" element::node);
-init CharacterData("struct dom_node_character_data *" character_data::node);
-init DocumentFragment("struct dom_document *" document::node);
-init DocumentType("struct dom_document *" document::node);
-init Document("struct dom_document *" document::node);
+init Element(struct dom_element *element::node);
+init CharacterData(struct dom_node_character_data *character_data::node);
+init DocumentFragment(struct dom_document *document::node);
+init DocumentType(struct dom_document *document::node);
+init Document(struct dom_document *document::node);
class Node {
- private "dom_node *" node;
-}
+ private dom_node *node;
+};
-init Node("struct dom_node *" node)
+init Node(struct dom_node *node)
%{
priv->node = node;
dom_node_ref(node);
-----------------------------------------------------------------------
Summary of changes:
README | 54 +++-
src/duk-libdom-common.c | 94 ++++++
src/duk-libdom-dictionary.c | 42 +--
src/duk-libdom-interface.c | 214 ++++++++++----
src/duk-libdom.c | 53 ++--
src/duk-libdom.h | 42 ++-
src/ir.c | 68 ++++-
src/ir.h | 2 +
src/nsgenbind-ast.c | 76 +----
src/nsgenbind-ast.h | 51 +---
src/nsgenbind-lexer.l | 78 +++--
src/nsgenbind-parser.y | 456 +++++++++++++++++------------
src/nsgenbind.c | 2 +-
src/options.h | 3 +-
src/webidl-ast.h | 30 +-
src/webidl-lexer.l | 4 +
src/webidl-parser.y | 265 ++++++++++-------
test/data/bindings/HTMLUnknownElement.bnd | 4 +-
test/data/bindings/browser-duk.bnd | 178 +++++------
19 files changed, 1080 insertions(+), 636 deletions(-)
diff --git a/README b/README
index f2a8bf3..4d08ff2 100644
--- a/README
+++ b/README
@@ -118,7 +118,7 @@ The binding file consists of three types of element:
but without at least one the binding is not very useful as
it will generate no output.
- preface
+ preface
This takes a cdata block. There may only be one of these per
binding, subsequent directives will be ignored.
@@ -160,6 +160,10 @@ The binding file consists of three types of element:
private member variables are declared here and header and
footer elements specific to this class.
+ Although not generally useful, because methods that reference a
+ class cause it to be implicitly created, empty definitions are
+ permitted.
+
private
variables added to the private structure for the class.
@@ -219,6 +223,54 @@ The binding file consists of three types of element:
binding but they will almost certainly have to be translated
into more suitable class names for generated output.
+
+ preface
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The preface is emitted in every generated source file after
+ the binding preface and tool preamble.
+
+
+ prologue
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The prologue is emitted in every generated source file after
+ the binding prologue has been generated.
+
+
+ epilogue
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The epilogue is emitted after the generated code and before
+ the binding epilogue
+
+
+ postface
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The postface is emitted after the binding epilogue.
+
+
init
The declarator for this method type need only identify the
diff --git a/src/duk-libdom-common.c b/src/duk-libdom-common.c
index 9a0f660..fb97fe3 100644
--- a/src/duk-libdom-common.c
+++ b/src/duk-libdom-common.c
@@ -58,6 +58,29 @@ int output_cdata(FILE* outf,
}
/* exported interface documented in duk-libdom.h */
+int output_ccode(FILE* outf, struct genbind_node *node)
+{
+ int *line;
+ char *filename;
+
+ line = genbind_node_getint(
+ genbind_node_find_type(
+ genbind_node_getnode(node),
+ NULL, GENBIND_NODE_TYPE_LINE));
+
+ filename = genbind_node_gettext(
+ genbind_node_find_type(
+ genbind_node_getnode(node),
+ NULL, GENBIND_NODE_TYPE_FILE));
+
+ if ((line != NULL) && (filename != NULL)) {
+ fprintf(outf, "#line %d \"%s\"\n", *line, filename);
+ }
+
+ return output_cdata(outf, node, GENBIND_NODE_TYPE_CDATA);
+}
+
+/* exported interface documented in duk-libdom.h */
int output_tool_prologue(FILE* outf)
{
char *fpath;
@@ -76,3 +99,74 @@ int output_tool_prologue(FILE* outf)
return 0;
}
+
+
+/* exported interface documented in duk-libdom.h */
+int output_ctype(FILE *outf, struct genbind_node *node, bool identifier)
+{
+ const char *type_cdata = NULL;
+ struct genbind_node *typename_node;
+
+ typename_node = genbind_node_find_type(genbind_node_getnode(node),
+ NULL,
+ GENBIND_NODE_TYPE_NAME);
+ while (typename_node != NULL) {
+ type_cdata = genbind_node_gettext(typename_node);
+
+ fprintf(outf, "%s", type_cdata);
+
+ typename_node = genbind_node_find_type(
+ genbind_node_getnode(node),
+ typename_node,
+ GENBIND_NODE_TYPE_NAME);
+
+ /* separate all but the last entry with spaces */
+ if (typename_node != NULL) {
+ fputc(' ', outf);
+ }
+ }
+
+ if (identifier) {
+ if ((type_cdata != NULL) &&
+ (type_cdata[0] != '*') &&
+ (type_cdata[0] != ' ')) {
+ fputc(' ', outf);
+ }
+
+ output_cdata(outf, node, GENBIND_NODE_TYPE_IDENT);
+ }
+
+ return 0;
+}
+
+/* exported interface documented in duk-libdom.h */
+int output_method_cdata(FILE* outf,
+ struct genbind_node *node,
+ enum genbind_method_type sel_method_type)
+{
+ struct genbind_node *method;
+
+ method = genbind_node_find_type(genbind_node_getnode(node),
+ NULL,
+ GENBIND_NODE_TYPE_METHOD);
+
+ while (method != NULL) {
+ enum genbind_method_type *method_type;
+
+ method_type = (enum genbind_method_type *)genbind_node_getint(
+ genbind_node_find_type(
+ genbind_node_getnode(method),
+ NULL,
+ GENBIND_NODE_TYPE_METHOD_TYPE));
+ if ((method_type != NULL) &&
+ (*method_type == sel_method_type)) {
+ output_cdata(outf, method, GENBIND_NODE_TYPE_CDATA);
+ }
+
+ method = genbind_node_find_type(genbind_node_getnode(node),
+ method,
+ GENBIND_NODE_TYPE_METHOD);
+ }
+
+ return 0;
+}
diff --git a/src/duk-libdom-dictionary.c b/src/duk-libdom-dictionary.c
index 69ce8aa..09e4379 100644
--- a/src/duk-libdom-dictionary.c
+++ b/src/duk-libdom-dictionary.c
@@ -267,7 +267,7 @@ output_member_acessor(FILE* outf,
default:
WARN(WARNING_UNIMPLEMENTED,
- "Dictionary %s:%s unhandled type (%d)\n",
+ "Dictionary %s:%s unhandled type (%d)",
dictionarye->name,
membere->name,
*argument_type);
@@ -323,23 +323,27 @@ int output_dictionary(struct ir *ir, struct ir_entry *dictionarye)
output_tool_preface(ifacef);
/* binding preface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* class preface */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_PREFACE);
/* tool prologue */
output_tool_prologue(ifacef);
/* binding prologue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
/* class prologue */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(ifacef, "\n");
@@ -352,20 +356,24 @@ int output_dictionary(struct ir *ir, struct ir_entry *dictionarye)
fprintf(ifacef, "\n");
/* class epilogue */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* binding epilogue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* class postface */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_POSTFACE);
/* binding postface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
op_error:
genb_fclose_tmp(ifacef, dictionarye->filename);
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index ad40741..96e41ad 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -328,6 +328,42 @@ output_interface_destructor(FILE* outf, struct ir_entry *interfacee)
}
/**
+ * Compare two nodes to check their c types match.
+ */
+static bool compare_ctypes(struct genbind_node *a, struct genbind_node *b)
+{
+ struct genbind_node *ta;
+ struct genbind_node *tb;
+
+ ta = genbind_node_find_type(genbind_node_getnode(a),
+ NULL, GENBIND_NODE_TYPE_NAME);
+ tb = genbind_node_find_type(genbind_node_getnode(b),
+ NULL, GENBIND_NODE_TYPE_NAME);
+
+ while ((ta != NULL) && (tb != NULL)) {
+ char *txt_a;
+ char *txt_b;
+
+ txt_a = genbind_node_gettext(ta);
+ txt_b = genbind_node_gettext(tb);
+
+ if (strcmp(txt_a, txt_b) != 0) {
+ return false; /* missmatch */
+ }
+
+ ta = genbind_node_find_type(genbind_node_getnode(a),
+ ta, GENBIND_NODE_TYPE_NAME);
+ tb = genbind_node_find_type(genbind_node_getnode(b),
+ tb, GENBIND_NODE_TYPE_NAME);
+ }
+ if (ta != tb) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
* generate an initialisor call to parent interface
*/
static int
@@ -389,26 +425,14 @@ output_interface_inherit_init(FILE* outf,
param_name);
return -1;
} else {
- char *param_type;
- char *inh_param_type;
-
fprintf(outf, ", ");
/* cast the parameter if required */
- param_type = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(param_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- inh_param_type = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(inh_param_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- if (strcmp(param_type, inh_param_type) != 0) {
- fprintf(outf, "(%s)", inh_param_type);
+ if (compare_ctypes(param_node,
+ inh_param_node) == false) {
+ fputc('(', outf);
+ output_ctype(outf, inh_param_node, false);
+ fputc(')', outf);
}
/* output the parameter identifier */
@@ -449,8 +473,8 @@ output_interface_init_declaration(FILE* outf,
while (param_node != NULL) {
interfacee->class_init_argc++;
fprintf(outf, ", ");
- output_cdata(outf, param_node, GENBIND_NODE_TYPE_TYPE);
- output_cdata(outf, param_node, GENBIND_NODE_TYPE_IDENT);
+
+ output_ctype(outf, param_node, true);
param_node = genbind_node_find_type(
genbind_node_getnode(init_node),
@@ -493,7 +517,7 @@ output_interface_init(FILE* outf,
}
/* output the initaliser code from the binding */
- output_cdata(outf, init_node, GENBIND_NODE_TYPE_CDATA);
+ output_ccode(outf, init_node);
fprintf(outf, "}\n\n");
@@ -595,7 +619,8 @@ output_prototype_attribute(FILE *outf,
struct ir_entry *interfacee,
struct ir_attribute_entry *attributee)
{
- if (attributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY) {
+ if ((attributee->putforwards == NULL) &&
+ (attributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY)) {
return output_populate_ro_property(outf,
interfacee->class_name,
attributee->name);
@@ -1133,10 +1158,7 @@ output_interface_operation(FILE* outf,
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_cdata(outf,
- operatione->method,
- GENBIND_NODE_TYPE_CDATA);
-
+ cdatac = output_ccode(outf, operatione->method);
if (cdatac == 0) {
/* no implementation so generate default */
WARN(WARNING_UNIMPLEMENTED,
@@ -1172,29 +1194,29 @@ output_interface_operations(FILE* outf, struct ir_entry *ife)
return res;
}
+
/**
- * Generate class property getter/setter for a single attribute
+ * Generate class property setter for a single attribute
*/
static int
-output_interface_attribute(FILE* outf,
- struct ir_entry *interfacee,
- struct ir_attribute_entry *atributee)
+output_attribute_setter(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
{
int cdatac;
- /* getter definition */
+ /* setter definition */
fprintf(outf,
- "static duk_ret_t %s_%s_%s_getter(duk_context *ctx)\n",
+ "static duk_ret_t %s_%s_%s_setter(duk_context *ctx)\n",
DLPFX, interfacee->class_name, atributee->name);
fprintf(outf,"{\n");
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_cdata(outf, atributee->getter, GENBIND_NODE_TYPE_CDATA);
-
+ cdatac = output_ccode(outf, atributee->setter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
- "Unimplemented: getter %s::%s();",
+ "Unimplemented: setter %s::%s();",
interfacee->name, atributee->name);
/* no implementation so generate default */
@@ -1203,34 +1225,100 @@ output_interface_attribute(FILE* outf,
fprintf(outf, "}\n\n");
- /* readonly attributes have no setter */
- if (atributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY) {
- return 0;
+ return 0;
+}
+
+/**
+ * Generate class property setter for a putforwards attribute
+ */
+static int
+output_putforwards_setter(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
+{
+ /* use explicit implementation in bindings if present */
+ if (atributee->setter != NULL) {
+ return output_attribute_setter(outf, interfacee, atributee);
}
- /* setter definition */
+ /* generate autogenerated putforwards */
+
fprintf(outf,
"static duk_ret_t %s_%s_%s_setter(duk_context *ctx)\n",
DLPFX, interfacee->class_name, atributee->name);
fprintf(outf,"{\n");
- output_get_method_private(outf, interfacee->class_name);
+ fprintf(outf,"\tduk_ret_t get_ret;\n\n");
+
+ fprintf(outf,
+ "\tget_ret = %s_%s_%s_getter(ctx);\n",
+ DLPFX, interfacee->class_name, atributee->name);
+
+ fprintf(outf,
+ "\tif (get_ret != 1) {\n"
+ "\t\treturn 0;\n"
+ "\t}\n\n"
+ "\t/* parameter attribute */\n\n"
+ "\tduk_swap(ctx, 0, 1);\n"
+ "\t/* attribute parameter */\n\n"
+ "\t/* call the putforward */\n");
+
+ fprintf(outf,
+ "\tduk_put_prop_string(ctx, 0, \"%s\");\n\n",
+ atributee->putforwards);
+
+ fprintf(outf,
+ "\tduk_pop(ctx);\n\n"
+ "\treturn 0;\n");
+
+ fprintf(outf, "}\n\n");
+
+ return 0;
+}
+
+/**
+ * Generate class property getter/setter for a single attribute
+ */
+static int
+output_interface_attribute(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
+{
+ int cdatac;
+ int res = 0;
- cdatac = output_cdata(outf, atributee->setter, GENBIND_NODE_TYPE_CDATA);
+ /* getter definition */
+ fprintf(outf,
+ "static duk_ret_t %s_%s_%s_getter(duk_context *ctx)\n",
+ DLPFX, interfacee->class_name, atributee->name);
+ fprintf(outf,"{\n");
+ output_get_method_private(outf, interfacee->class_name);
+
+ cdatac = output_ccode(outf, atributee->getter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
- "Unimplemented: setter %s::%s();",
+ "Unimplemented: getter %s::%s();",
interfacee->name, atributee->name);
/* no implementation so generate default */
fprintf(outf,"\treturn 0;\n");
}
-
fprintf(outf, "}\n\n");
- return 0;
+ if (atributee->putforwards != NULL) {
+ res = output_putforwards_setter(outf, interfacee, atributee);
+ } else {
+ /* readonly attributes have no setter */
+ if (atributee->modifier != WEBIDL_TYPE_MODIFIER_READONLY) {
+ res = output_attribute_setter(outf,
+ interfacee,
+ atributee);
+ }
+ }
+
+ return res;
}
/**
@@ -1272,23 +1360,27 @@ int output_interface(struct ir *ir, struct ir_entry *interfacee)
output_tool_preface(ifacef);
/* binding preface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* class preface */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_PREFACE);
/* tool prologue */
output_tool_prologue(ifacef);
/* binding prologue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
/* class prologue */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(ifacef, "\n");
@@ -1319,20 +1411,24 @@ int output_interface(struct ir *ir, struct ir_entry *interfacee)
fprintf(ifacef, "\n");
/* class epilogue */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* binding epilogue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* class postface */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_POSTFACE);
/* binding postface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
op_error:
genb_fclose_tmp(ifacef, interfacee->filename);
diff --git a/src/duk-libdom.c b/src/duk-libdom.c
index 084a68f..fcd55da 100644
--- a/src/duk-libdom.c
+++ b/src/duk-libdom.c
@@ -136,9 +136,9 @@ static FILE *open_header(struct ir *ir, const char *name)
output_tool_preface(hdrf);
/* binding preface */
- output_cdata(hdrf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(hdrf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* header guard */
fprintf(hdrf, "\n#ifndef %s_%s_h\n", DLPFX, name);
@@ -161,9 +161,9 @@ static int close_header(struct ir *ir,
fprintf(hdrf, "\n#endif\n");
/* binding postface */
- output_cdata(hdrf,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(hdrf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
genb_fclose_tmp(hdrf, fname);
free(fname);
@@ -228,25 +228,10 @@ output_private_header(struct ir *ir)
NULL,
GENBIND_NODE_TYPE_PRIVATE);
while (priv_node != NULL) {
- /* generate the private variable definition ensuring
- * the type is separated from the identifier with
- * either a * or space.
- */
- const char *type_cdata;
- char cdatae;
- type_cdata = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(priv_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- fprintf(privf, "\t%s", type_cdata);
- cdatae = type_cdata[strlen(type_cdata) - 1];
- if ((cdatae != '*') && (cdatae != ' ')) {
- fputc(' ', privf);
- }
+ fprintf(privf, "\t");
+
+ output_ctype(privf, priv_node, true);
- output_cdata(privf, priv_node, GENBIND_NODE_TYPE_IDENT);
fprintf(privf, ";\n");
priv_node = genbind_node_find_type(
@@ -416,17 +401,17 @@ output_binding_src(struct ir *ir)
output_tool_preface(bindf);
/* binding preface */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
+ /* tool prologue */
output_tool_prologue(bindf);
/* binding prologue */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
-
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(bindf, "\n");
@@ -597,9 +582,9 @@ output_binding_src(struct ir *ir)
fprintf(bindf, "}\n");
/* binding postface */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
genb_fclose_tmp(bindf, "binding.c");
diff --git a/src/duk-libdom.h b/src/duk-libdom.h
index 79b440e..dd27420 100644
--- a/src/duk-libdom.h
+++ b/src/duk-libdom.h
@@ -47,7 +47,7 @@ int output_tool_prologue(FILE* outf);
/**
* output character data of node of given type.
*
- * used for any cdata including pre/pro/epi/post sections
+ * used for any cdata sections
*
* \param outf The file handle to write output.
* \param node The node to search.
@@ -56,4 +56,44 @@ int output_tool_prologue(FILE* outf);
*/
int output_cdata(FILE* outf, struct genbind_node *node, enum genbind_node_type nodetype);
+
+/**
+ * output c code with line directives if possible.
+ *
+ * used for any cdata sections
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to search.
+ * \param nodetype the type of child node to search for.
+ * \return The number of nodes written or 0 for none.
+ */
+int output_ccode(FILE* outf, struct genbind_node *node);
+
+/**
+ * output character data of method node of given type.
+ *
+ * used for any cdata including pre/pro/epi/post sections
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to search.
+ * \param nodetype the type of child node to search for.
+ * \return The number of nodes written or 0 for none.
+ */
+int output_method_cdata(FILE* outf, struct genbind_node *node, enum genbind_method_type sel_method_type);
+
+/**
+ * output a C variable type
+ *
+ * Used to output c type and optionlly identifier declarations for parameters
+ * and structure entries.
+ * If the optional identifier is output it is ensured the type is separated
+ * from the identifier with either a * or space.
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to generate content for.
+ * \param identifier If the indentifier should be output.
+ * \return 0 on success.
+ */
+int output_ctype(FILE *outf, struct genbind_node *node, bool identifier);
+
#endif
diff --git a/src/ir.c b/src/ir.c
index b3631f4..6dc2d2a 100644
--- a/src/ir.c
+++ b/src/ir.c
@@ -377,6 +377,56 @@ operation_map_new(struct webidl_node *interface,
return 0;
}
+/**
+ * get the value of an extended attribute key/value item
+ */
+static char *
+get_extended_value(struct webidl_node *node, const char *key)
+{
+ char *ident;
+ struct webidl_node *ext_attr;
+ struct webidl_node *elem;
+
+ /* walk each extended attribute */
+ ext_attr = webidl_node_find_type(
+ webidl_node_getnode(node),
+ NULL,
+ WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE);
+ while (ext_attr != NULL) {
+
+ elem = webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ NULL,
+ WEBIDL_NODE_TYPE_IDENT);
+ ident = webidl_node_gettext(elem);
+
+ if ((ident != NULL) && (strcmp(ident, key) == 0)) {
+ /* first identifier matches */
+
+ elem = webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ elem,
+ WEBIDL_NODE_TYPE_IDENT);
+ ident = webidl_node_gettext(elem);
+
+ if ((ident != NULL) && (*ident == '=')) {
+ return webidl_node_gettext(
+ webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ elem,
+ WEBIDL_NODE_TYPE_IDENT));
+ }
+ }
+
+ ext_attr = webidl_node_find_type(
+ webidl_node_getnode(node),
+ ext_attr,
+ WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE);
+ }
+
+ return NULL;
+}
+
static int
attribute_map_new(struct webidl_node *interface,
struct genbind_node *class,
@@ -399,8 +449,7 @@ attribute_map_new(struct webidl_node *interface,
return 0;
}
- attributev = calloc(attributec,
- sizeof(struct ir_attribute_entry));
+ attributev = calloc(attributec, sizeof(struct ir_attribute_entry));
if (attributev == NULL) {
return -1;
};
@@ -436,7 +485,7 @@ attribute_map_new(struct webidl_node *interface,
GENBIND_METHOD_TYPE_GETTER,
cure->name);
- /* check fo readonly attributes */
+ /* check for readonly attributes */
modifier = (enum webidl_type_modifier *)webidl_node_getint(
webidl_node_find_type(
webidl_node_getnode(at_node),
@@ -454,9 +503,20 @@ attribute_map_new(struct webidl_node *interface,
cure->name);
}
- cure++;
+ /* check for putforwards extended attribute */
+ cure->putforwards = get_extended_value(at_node,
+ "PutForwards");
+
+ if ((cure->putforwards != NULL) &&
+ (cure->modifier != WEBIDL_TYPE_MODIFIER_READONLY)) {
+ WARN(WARNING_WEBIDL,
+ "putforwards on a writable attribute (%s) is prohibited",
+ cure->name);
+ }
/* move to next attribute */
+ cure++;
+
at_node = webidl_node_find_type(
webidl_node_getnode(list_node),
at_node,
diff --git a/src/ir.h b/src/ir.h
index 1092fab..ecedc95 100644
--- a/src/ir.h
+++ b/src/ir.h
@@ -53,6 +53,8 @@ struct ir_attribute_entry {
struct webidl_node *node; /**< AST attribute node */
enum webidl_type_modifier modifier;
+ const char *putforwards;
+
struct genbind_node *getter; /**< getter from binding */
struct genbind_node *setter; /**< getter from binding */
};
diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c
index 4f0654a..9be8bc7 100644
--- a/src/nsgenbind-ast.c
+++ b/src/nsgenbind-ast.c
@@ -29,7 +29,7 @@ static FILE *genbind_parsetracef;
extern int nsgenbind_debug;
extern int nsgenbind__flex_debug;
extern void nsgenbind_restart(FILE*);
-extern int nsgenbind_parse(struct genbind_node **genbind_ast);
+extern int nsgenbind_parse(char *filename, struct genbind_node **genbind_ast);
/* terminal nodes have a value only */
struct genbind_node {
@@ -259,34 +259,6 @@ genbind_node_find_type_ident(struct genbind_node *node,
return found_node;
}
-/* exported interface documented in nsgenbind-ast.h */
-struct genbind_node *
-genbind_node_find_type_type(struct genbind_node *node,
- struct genbind_node *prev,
- enum genbind_node_type type,
- const char *ident)
-{
- struct genbind_node *found_node;
- struct genbind_node *ident_node;
-
- found_node = genbind_node_find_type(node, prev, type);
-
-
- while (found_node != NULL) {
- /* look for a type node */
- ident_node = genbind_node_find_type(genbind_node_getnode(found_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE);
- if (ident_node != NULL) {
- if (strcmp(ident_node->r.text, ident) == 0)
- break;
- }
-
- /* look for next matching node */
- found_node = genbind_node_find_type(node, found_node, type);
- }
- return found_node;
-}
/* exported interface documented in nsgenbind-ast.h */
@@ -366,13 +338,10 @@ char *genbind_node_gettext(struct genbind_node *node)
switch(node->type) {
case GENBIND_NODE_TYPE_WEBIDL:
case GENBIND_NODE_TYPE_STRING:
- case GENBIND_NODE_TYPE_PREFACE:
- case GENBIND_NODE_TYPE_PROLOGUE:
- case GENBIND_NODE_TYPE_EPILOGUE:
- case GENBIND_NODE_TYPE_POSTFACE:
case GENBIND_NODE_TYPE_IDENT:
- case GENBIND_NODE_TYPE_TYPE:
+ case GENBIND_NODE_TYPE_NAME:
case GENBIND_NODE_TYPE_CDATA:
+ case GENBIND_NODE_TYPE_FILE:
return node->r.text;
default:
@@ -409,6 +378,7 @@ int *genbind_node_getint(struct genbind_node *node)
if (node != NULL) {
switch(node->type) {
case GENBIND_NODE_TYPE_METHOD_TYPE:
+ case GENBIND_NODE_TYPE_LINE:
case GENBIND_NODE_TYPE_MODIFIER:
return &node->r.number;
@@ -434,23 +404,17 @@ static const char *genbind_node_type_to_str(enum genbind_node_type type)
case GENBIND_NODE_TYPE_STRING:
return "String";
- case GENBIND_NODE_TYPE_PREFACE:
- return "Preface";
-
- case GENBIND_NODE_TYPE_POSTFACE:
- return "Postface";
-
- case GENBIND_NODE_TYPE_PROLOGUE:
- return "Prologue";
-
- case GENBIND_NODE_TYPE_EPILOGUE:
- return "Epilogue";
-
case GENBIND_NODE_TYPE_BINDING:
return "Binding";
- case GENBIND_NODE_TYPE_TYPE:
- return "Type";
+ case GENBIND_NODE_TYPE_NAME:
+ return "TypeName";
+
+ case GENBIND_NODE_TYPE_LINE:
+ return "Linenumber";
+
+ case GENBIND_NODE_TYPE_FILE:
+ return "Filename";
case GENBIND_NODE_TYPE_PRIVATE:
return "Private";
@@ -559,12 +523,6 @@ FILE *genbindopen(const char *filename)
}
prevfilepath = strndup(filename,fulllen);
}
-#if 0
- if (options->depfilehandle != NULL) {
- fprintf(options->depfilehandle, " \\\n\t%s",
- filename);
- }
-#endif
return genfile;
}
@@ -573,7 +531,7 @@ FILE *genbindopen(const char *filename)
fulllen = strlen(prevfilepath) + strlen(filename) + 2;
fullname = malloc(fulllen);
snprintf(fullname, fulllen, "%s/%s", prevfilepath, filename);
- if (options->debug) {
+ if (options->verbose) {
printf("Attempting to open Genbind file %s\n", fullname);
}
genfile = fopen(fullname, "r");
@@ -581,12 +539,6 @@ FILE *genbindopen(const char *filename)
if (options->verbose) {
printf("Opened Genbind file %s\n", fullname);
}
-#if 0
- if (options->depfilehandle != NULL) {
- fprintf(options->depfilehandle, " \\\n\t%s",
- fullname);
- }
-#endif
free(fullname);
return genfile;
}
@@ -643,7 +595,7 @@ int genbind_parsefile(char *infilename, struct genbind_node **ast)
nsgenbind_restart(infile);
/* process binding */
- ret = nsgenbind_parse(ast);
+ ret = nsgenbind_parse(infilename, ast);
/* close tracefile if open */
if (genbind_parsetracef != NULL) {
diff --git a/src/nsgenbind-ast.h b/src/nsgenbind-ast.h
index 2a384b2..49db23b 100644
--- a/src/nsgenbind-ast.h
+++ b/src/nsgenbind-ast.h
@@ -12,17 +12,15 @@
enum genbind_node_type {
GENBIND_NODE_TYPE_ROOT = 0,
GENBIND_NODE_TYPE_IDENT, /**< generic identifier string */
- GENBIND_NODE_TYPE_TYPE, /**< generic type string */
+ GENBIND_NODE_TYPE_NAME, /**< generic type string */
GENBIND_NODE_TYPE_MODIFIER, /**< node modifier */
GENBIND_NODE_TYPE_CDATA, /**< verbatim block of character data */
GENBIND_NODE_TYPE_STRING, /**< text string */
+ GENBIND_NODE_TYPE_LINE, /**< linenumber */
+ GENBIND_NODE_TYPE_FILE, /**< file name */
- GENBIND_NODE_TYPE_BINDING,
+ GENBIND_NODE_TYPE_BINDING, /**< Binding */
GENBIND_NODE_TYPE_WEBIDL,
- GENBIND_NODE_TYPE_PREFACE,
- GENBIND_NODE_TYPE_PROLOGUE,
- GENBIND_NODE_TYPE_EPILOGUE,
- GENBIND_NODE_TYPE_POSTFACE,
GENBIND_NODE_TYPE_CLASS, /**< class definition */
GENBIND_NODE_TYPE_PRIVATE,
@@ -32,6 +30,7 @@ enum genbind_node_type {
GENBIND_NODE_TYPE_METHOD, /**< binding method */
GENBIND_NODE_TYPE_METHOD_TYPE, /**< binding method type */
+
GENBIND_NODE_TYPE_PARAMETER, /**< method parameter */
};
@@ -45,12 +44,16 @@ enum genbind_type_modifier {
/* binding method types */
enum genbind_method_type {
- GENBIND_METHOD_TYPE_INIT = 0, /**< binding method is initialiser */
- GENBIND_METHOD_TYPE_FINI, /**< binding method is finalizer */
- GENBIND_METHOD_TYPE_METHOD, /**< binding method is a method */
- GENBIND_METHOD_TYPE_GETTER, /**< binding method is a getter */
- GENBIND_METHOD_TYPE_SETTER, /**< binding method is a setter */
- GENBIND_METHOD_TYPE_PROTOTYPE, /**< binding method is a prototype */
+ GENBIND_METHOD_TYPE_INIT = 0, /**< method is initialiser */
+ GENBIND_METHOD_TYPE_FINI, /**< method is finalizer */
+ GENBIND_METHOD_TYPE_METHOD, /**< method is a method */
+ GENBIND_METHOD_TYPE_GETTER, /**< method is a getter */
+ GENBIND_METHOD_TYPE_SETTER, /**< method is a setter */
+ GENBIND_METHOD_TYPE_PROTOTYPE, /**< method is a prototype */
+ GENBIND_METHOD_TYPE_PREFACE, /**< method is a preface */
+ GENBIND_METHOD_TYPE_PROLOGUE, /**< method is a prologue */
+ GENBIND_METHOD_TYPE_EPILOGUE, /**< method is a epilogue */
+ GENBIND_METHOD_TYPE_POSTFACE, /**< method is a postface */
};
struct genbind_node;
@@ -152,30 +155,6 @@ genbind_node_find_type_ident(struct genbind_node *node,
/**
- * Returning node of the specified type with a GENBIND_NODE_TYPE_TYPE
- * subnode with matching text.
- *
- * This is a conveniance wrapper around nested calls to
- * genbind_node_find_type() which performs a depth first left hand
- * search returning nodes of the specified type and a child node of
- * GENBIND_NODE_TYPE_TYPE with matching text.
- *
- *
- * @param node The node to start the search from
- * @param prev The node at which to stop the search, either NULL to
- * search the full tree depth (initial search) or the result
- * of a previous search to continue.
- * @param nodetype The type of node to seach for.
- * @param type The text to match the type child node to.
- */
-struct genbind_node *
-genbind_node_find_type_type(struct genbind_node *node,
- struct genbind_node *prev,
- enum genbind_node_type nodetype,
- const char *type_text);
-
-
-/**
* Find a method node of a given method type
*
* \param node A node of type GENBIND_NODE_TYPE_CLASS to search for methods.
diff --git a/src/nsgenbind-lexer.l b/src/nsgenbind-lexer.l
index d092195..af77368 100644
--- a/src/nsgenbind-lexer.l
+++ b/src/nsgenbind-lexer.l
@@ -15,9 +15,10 @@
#include "nsgenbind-parser.h"
#include "nsgenbind-ast.h"
-#define YY_USER_ACTION yylloc->first_line = yylloc->last_line; \
- yylloc->first_column = yylloc->last_column + 1; \
- yylloc->last_column += yyleng;
+#define YY_USER_ACTION \
+ yylloc->first_line = yylloc->last_line = yylineno; \
+ yylloc->first_column = yylloc->last_column + 1; \
+ yylloc->last_column += yyleng;
/* Ensure compatability with bison 2.6 and later */
@@ -29,6 +30,43 @@
#define YYLTYPE NSGENBIND_LTYPE
#endif
+static struct YYLTYPE *locations = NULL;
+
+static struct YYLTYPE *push_location(struct YYLTYPE *head,
+ struct YYLTYPE *loc,
+ const char *filename)
+{
+ struct YYLTYPE *res;
+ res = calloc(1, sizeof(struct YYLTYPE));
+ /* copy current location and line number */
+ *res = *loc;
+ res->start_line = yylineno;
+ res->next = head;
+
+ /* reset current location */
+ loc->first_line = loc->last_line = 1;
+ loc->first_column = loc->last_column = 1;
+ loc->filename = strdup(filename);
+ yylineno = 1;
+
+ return res;
+}
+
+static struct YYLTYPE *pop_location(struct YYLTYPE *head, struct YYLTYPE *loc)
+{
+ struct YYLTYPE *res = NULL;
+
+ if (head != NULL) {
+ res = head->next;
+ *loc = *head;
+ free(head);
+
+ yylineno = loc->start_line;
+ }
+ return res;
+}
+
+
%}
/* lexer options */
@@ -93,50 +131,39 @@ dblcolon \:\:
/* binding terminals */
binding return TOK_BINDING;
-
webidl return TOK_WEBIDL;
-
preface return TOK_PREFACE;
-
prologue return TOK_PROLOGUE;
-
epilogue return TOK_EPILOGUE;
-
postface return TOK_POSTFACE;
/* class member terminals */
class return TOK_CLASS;
-
private return TOK_PRIVATE;
-
internal return TOK_INTERNAL;
-
flags return TOK_FLAGS;
-
type return TOK_TYPE;
-
unshared return TOK_UNSHARED;
-
shared return TOK_SHARED;
-
property return TOK_PROPERTY;
/* implementation terminals */
init return TOK_INIT;
-
fini return TOK_FINI;
-
method return TOK_METHOD;
-
getter return TOK_GETTER;
-
setter return TOK_SETTER;
-
prototype return TOK_PROTOTYPE;
+ /* c type terminals */
+
+struct return TOK_STRUCT;
+union return TOK_UNION;
+unsigned return TOK_UNSIGNED;
+
/* other terminals */
{dblcolon} return TOK_DBLCOLON;
@@ -176,8 +203,10 @@ prototype return TOK_PROTOTYPE;
fprintf(stderr, "Unable to open include %s\n", yytext);
exit(3);
}
- yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
-
+
+ locations = push_location(locations, yylloc, yytext);
+
+ yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));
BEGIN(INITIAL);
}
@@ -189,9 +218,10 @@ prototype return TOK_PROTOTYPE;
yypop_buffer_state();
if ( !YY_CURRENT_BUFFER ) {
- yyterminate();
+ yyterminate();
} else {
- BEGIN(incl);
+ locations = pop_location(locations, yylloc);
+ BEGIN(incl);
}
}
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index 1462b39..88c69b1 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -1,4 +1,66 @@
-%{
+/* binding parser
+ *
+ * This file is part of nsgenbind.
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>
+ */
+
+ /* bison prior to 2.4 cannot cope with %define api.pure so we use the
+ * deprecated directive
+ */
+%pure-parser
+
+%locations
+
+%error-verbose
+ /* would use api.prefix but it needs to be different between bison
+ * 2.5 and 2.6
+ */
+
+%code requires {
+
+#define YYLTYPE YYLTYPE
+typedef struct YYLTYPE {
+ struct YYLTYPE *next;
+ int start_line;
+ char *filename;
+
+ int first_line;
+ int first_column;
+ int last_line;
+ int last_column;
+} YYLTYPE;
+
+
+#define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (N) { \
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+ (Current).filename = YYRHSLOC (Rhs, 1).filename; \
+ (Current).start_line = YYRHSLOC (Rhs, 1).start_line; \
+ } else { /* empty RHS */ \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC (Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC (Rhs, 0).last_column; \
+ (Current).filename = YYRHSLOC (Rhs, 0).filename; \
+ (Current).start_line = YYRHSLOC (Rhs, 0).start_line; \
+ } \
+ while (0)
+
+}
+
+%initial-action {
+ yylloc.first_line = yylloc.last_line = 1;
+ yylloc.first_column = yylloc.last_column = 1;
+ yylloc.filename = filename;
+}
+
+%code {
/* parser for the binding generation config file
*
* This file is part of nsgenbind.
@@ -16,7 +78,6 @@
(Loc).first_line, (Loc).first_column, \
(Loc).last_line, (Loc).last_column)
-#include "nsgenbind-parser.h"
#include "nsgenbind-lexer.h"
#include "webidl-ast.h"
#include "nsgenbind-ast.h"
@@ -24,24 +85,34 @@
char *errtxt;
static void nsgenbind_error(YYLTYPE *locp,
+ char *filename,
struct genbind_node **genbind_ast,
const char *str)
{
- locp = locp;
- genbind_ast = genbind_ast;
- errtxt = strdup(str);
+ int errlen;
+ errlen = snprintf(NULL, 0, "%s:%d:%s",
+ locp->filename, locp->first_line, str);
+ errtxt = malloc(errlen + 1);
+ snprintf(errtxt, errlen + 1, "%s:%d:%s",
+ locp->filename, locp->first_line, str);
+
+ genbind_ast = genbind_ast;
+ filename = filename;
}
static struct genbind_node *
add_method(struct genbind_node **genbind_ast,
long methodtype,
struct genbind_node *declarator,
- char *cdata)
+ char *cdata,
+ long lineno,
+ char *filename)
{
struct genbind_node *res_node;
struct genbind_node *method_node;
struct genbind_node *class_node;
struct genbind_node *cdata_node;
+ struct genbind_node *location_node;
char *class_name;
/* extract the class name from the declarator */
@@ -63,11 +134,17 @@ add_method(struct genbind_node **genbind_ast,
cdata);
}
+ location_node = genbind_new_node(GENBIND_NODE_TYPE_FILE,
+ genbind_new_node(GENBIND_NODE_TYPE_LINE,
+ cdata_node,
+ (void *)lineno),
+ strdup(filename));
+
/* generate method node */
method_node = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
NULL,
genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
- cdata_node,
+ location_node,
(void *)methodtype));
class_node = genbind_node_find_type_ident(*genbind_ast,
@@ -80,7 +157,6 @@ add_method(struct genbind_node **genbind_ast,
genbind_new_node(GENBIND_NODE_TYPE_IDENT,
method_node,
class_name));
-
} else {
/* update the existing class */
@@ -92,21 +168,16 @@ add_method(struct genbind_node **genbind_ast,
return res_node;
}
-%}
+}
-%locations
- /* bison prior to 2.4 cannot cope with %define api.pure so we use the
- * deprecated directive
- */
-%pure-parser
-%error-verbose
+%parse-param { char *filename }
%parse-param { struct genbind_node **genbind_ast }
%union
{
- char *text;
- struct genbind_node *node;
- long value;
+ char *text;
+ struct genbind_node *node;
+ long value;
}
%token TOK_BINDING
@@ -135,6 +206,10 @@ add_method(struct genbind_node **genbind_ast,
%token TOK_DBLCOLON
+%token TOK_STRUCT
+%token TOK_UNION
+%token TOK_UNSIGNED
+
%token <text> TOK_IDENTIFIER
%token <text> TOK_STRING_LITERAL
%token <text> TOK_CCODE_LITERAL
@@ -152,55 +227,46 @@ add_method(struct genbind_node **genbind_ast,
%type <node> Class
%type <node> ClassArgs
%type <node> ClassArg
-%type <node> ClassFlag
%type <node> ClassFlags
%type <node> Method
%type <node> MethodDeclarator
%type <value> MethodType
+%type <value> BindingAndMethodType
%type <node> WebIDL
-%type <node> Preface
-%type <node> Prologue
-%type <node> Epilogue
-%type <node> Postface
-%type <node> Private
-%type <node> Internal
-%type <node> Property
%type <node> ParameterList
-%type <node> TypeIdent
+%type <node> CTypeIdent
+%type <node> CType
+%type <node> CTypeSpecifier
%%
-Input
- :
+Input:
Statements
- {
- *genbind_ast = $1;
+ {
+ *genbind_ast = $1;
}
;
-
-Statements
- :
- Statement
- |
- Statements Statement
+Statements:
+ Statement
+ |
+ Statements Statement
{
- $$ = *genbind_ast = genbind_node_prepend($2, $1);
+ $$ = *genbind_ast = genbind_node_prepend($2, $1);
}
- |
- error ';'
- {
- fprintf(stderr, "%d: %s\n", yylloc.first_line, errtxt);
- free(errtxt);
- YYABORT ;
+ |
+ error ';'
+ {
+ fprintf(stderr, "%s\n", errtxt);
+ free(errtxt);
+ YYABORT ;
}
;
-Statement
- :
+Statement:
Binding
|
Class
@@ -208,114 +274,147 @@ Statement
Method
;
-Binding
- :
- TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}'
+Binding:
+ TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}' ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING,
- NULL,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE, $4, $2));
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ $4, $2));
}
;
-BindingArgs
- :
+BindingArgs:
BindingArg
|
BindingArgs BindingArg
{
- $$ = genbind_node_link($2, $1);
+ $$ = genbind_node_link($2, $1);
}
;
-BindingArg
- :
+BindingArg:
WebIDL
|
- Preface
- |
- Prologue
- |
- Epilogue
- |
- Postface
+ BindingAndMethodType CBlock ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
+ genbind_new_node(GENBIND_NODE_TYPE_CDATA,
+ NULL,
+ $2),
+ (void *)$1));
+ }
;
- /* [3] a web IDL file specifier */
-WebIDL
- :
+/* a web IDL file specifier */
+WebIDL:
TOK_WEBIDL TOK_STRING_LITERAL ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDL, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDL, NULL, $2);
}
;
-
- /* type and identifier of a variable */
-TypeIdent
- :
- TOK_STRING_LITERAL TOK_IDENTIFIER
+ /* parse a c type specifier. This probably also needs to cope with
+ * void, char, short, int, long, float, double, signed, enum
+ */
+CTypeSpecifier:
+ TOK_UNSIGNED TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE, NULL, $1), $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("unsigned")),
+ $2);
}
|
- TOK_STRING_LITERAL TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER
+ TOK_STRUCT TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("struct")),
+ $2);
+ }
+ |
+ TOK_UNION TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("union")),
+ $2);
+ }
+ |
+ TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE,
- NULL,
- $1),
- $2),
- $4);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME, NULL, $1);
}
;
-Preface
- :
- TOK_PREFACE CBlock ';'
+CType:
+ CTypeSpecifier
+ |
+ CTypeSpecifier '*'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME, $1, strdup("*"));
}
- ;
-Prologue
- :
- TOK_PROLOGUE CBlock ';'
+ /* type and identifier of a variable */
+CTypeIdent:
+ CType TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PROLOGUE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $2);
+ }
+ |
+ CType TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $2), $4);
}
;
-Epilogue
- :
- TOK_EPILOGUE CBlock ';'
+
+CBlock:
+ TOK_CCODE_LITERAL
+ |
+ CBlock TOK_CCODE_LITERAL
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_EPILOGUE, NULL, $2);
+ $$ = genbind_strapp($1, $2);
}
;
-Postface
- :
- TOK_POSTFACE CBlock ';'
+
+ParameterList:
+ CTypeIdent
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_POSTFACE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
+ }
+ |
+ ParameterList ',' CTypeIdent
+ {
+ $$ = genbind_node_prepend($1,
+ genbind_new_node(
+ GENBIND_NODE_TYPE_PARAMETER,
+ NULL,
+ $3));
}
;
-CBlock
- :
- TOK_CCODE_LITERAL
+Method:
+ MethodType MethodDeclarator CBlock
+ {
+ $$ = add_method(genbind_ast, $1, $2, $3, @1.first_line, @1.filename);
+ }
|
- CBlock TOK_CCODE_LITERAL
+ MethodType MethodDeclarator ';'
{
- $$ = genbind_strapp($1, $2);
+ $$ = add_method(genbind_ast, $1, $2, NULL, @1.first_line, @1.filename);
}
;
-MethodType
- :
+MethodType:
TOK_INIT
{
$$ = GENBIND_METHOD_TYPE_INIT;
@@ -345,27 +444,33 @@ MethodType
{
$$ = GENBIND_METHOD_TYPE_PROTOTYPE;
}
+ |
+ BindingAndMethodType
;
-ParameterList
- :
- TypeIdent
+BindingAndMethodType:
+ TOK_PREFACE
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
+ $$ = GENBIND_METHOD_TYPE_PREFACE;
}
|
- ParameterList ',' TypeIdent
+ TOK_PROLOGUE
{
- $$ = genbind_node_prepend($1,
- genbind_new_node(
- GENBIND_NODE_TYPE_PARAMETER,
- NULL,
- $3));
+ $$ = GENBIND_METHOD_TYPE_PROLOGUE;
+ }
+ |
+ TOK_EPILOGUE
+ {
+ $$ = GENBIND_METHOD_TYPE_EPILOGUE;
+ }
+ |
+ TOK_POSTFACE
+ {
+ $$ = GENBIND_METHOD_TYPE_POSTFACE;
}
;
-MethodDeclarator
- :
+MethodDeclarator:
TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER '(' ParameterList ')'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS,
@@ -406,30 +511,21 @@ MethodDeclarator
}
;
-Method
- :
- MethodType MethodDeclarator CBlock
- {
- $$ = add_method(genbind_ast, $1, $2, $3);
- }
- |
- MethodType MethodDeclarator ';'
- {
- $$ = add_method(genbind_ast, $1, $2, NULL);
- }
- ;
-Class
- :
- TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}'
+Class:
+ TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}' ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS, NULL,
genbind_new_node(GENBIND_NODE_TYPE_IDENT, $4, $2));
}
;
-ClassArgs
- :
+ClassArgs:
+ /* empty */
+ {
+ $$ = NULL;
+ }
+ |
ClassArg
|
ClassArgs ClassArg
@@ -438,78 +534,57 @@ ClassArgs
}
;
-ClassArg
- :
- Private
- |
- Internal
- |
- Property
- |
- ClassFlag
- |
- Preface
- |
- Prologue
- |
- Epilogue
+ClassArg:
+ TOK_PRIVATE CTypeIdent ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
+ }
|
- Postface
- ;
-
-
-Private
- :
- TOK_PRIVATE TypeIdent ';'
+ TOK_INTERNAL CTypeIdent ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
}
- ;
-
-Internal
- :
- TOK_INTERNAL TypeIdent ';'
+ |
+ TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_MODIFIER,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ NULL,
+ $3),
+ (void *)$2));
}
- ;
-
-ClassFlag
- :
+ |
TOK_FLAGS ClassFlags ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
+ }
+ |
+ BindingAndMethodType CBlock ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
+ genbind_new_node(GENBIND_NODE_TYPE_CDATA,
+ NULL,
+ $2),
+ (void *)$1));
}
;
-ClassFlags
- :
+ClassFlags:
TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1);
}
|
ClassFlags ',' TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3);
- }
- ;
-
-Property
- :
- TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
- {
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL,
- genbind_new_node(GENBIND_NODE_TYPE_MODIFIER,
- genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- NULL,
- $3),
- (void *)$2));
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3);
}
;
-Modifiers
- :
+Modifiers:
/* empty */
{
$$ = GENBIND_TYPE_NONE;
@@ -521,8 +596,7 @@ Modifiers
}
;
-Modifier
- :
+Modifier:
TOK_TYPE
{
$$ = GENBIND_TYPE_TYPE;
diff --git a/src/nsgenbind.c b/src/nsgenbind.c
index 135c5c0..09d4c29 100644
--- a/src/nsgenbind.c
+++ b/src/nsgenbind.c
@@ -168,7 +168,7 @@ static enum bindingtype_e genbind_get_type(struct genbind_node *node)
genbind_node_find_type(
genbind_node_getnode(binding_node),
NULL,
- GENBIND_NODE_TYPE_TYPE));
+ GENBIND_NODE_TYPE_NAME));
if (binding_type == NULL) {
fprintf(stderr, "Error: missing binding type\n");
return BINDINGTYPE_UNKNOWN;
diff --git a/src/options.h b/src/options.h
index 5b7d73d..d452c17 100644
--- a/src/options.h
+++ b/src/options.h
@@ -28,9 +28,10 @@ extern struct options *options;
enum opt_warnings {
WARNING_UNIMPLEMENTED = 1,
WARNING_DUPLICATED = 2,
+ WARNING_WEBIDL = 4,
};
-#define WARNING_ALL (WARNING_UNIMPLEMENTED | WARNING_DUPLICATED)
+#define WARNING_ALL (WARNING_UNIMPLEMENTED | WARNING_DUPLICATED | WARNING_WEBIDL)
#define WARN(flags, msg, args...) do { \
if ((options->warnings & flags) != 0) { \
diff --git a/src/webidl-ast.h b/src/webidl-ast.h
index 9ae2ebb..59dfcac 100644
--- a/src/webidl-ast.h
+++ b/src/webidl-ast.h
@@ -49,21 +49,21 @@ enum webidl_node_type {
};
enum webidl_type {
- WEBIDL_TYPE_ANY, /**< The type is unconstrained */
- WEBIDL_TYPE_USER,
- WEBIDL_TYPE_BOOL,
- WEBIDL_TYPE_BYTE,
- WEBIDL_TYPE_OCTET,
- WEBIDL_TYPE_FLOAT,
- WEBIDL_TYPE_DOUBLE,
- WEBIDL_TYPE_SHORT,
- WEBIDL_TYPE_LONG,
- WEBIDL_TYPE_LONGLONG,
- WEBIDL_TYPE_STRING,
- WEBIDL_TYPE_SEQUENCE,
- WEBIDL_TYPE_OBJECT,
- WEBIDL_TYPE_DATE,
- WEBIDL_TYPE_VOID,
+ WEBIDL_TYPE_ANY, /**< 0 - The type is unconstrained */
+ WEBIDL_TYPE_USER, /**< 1 - The type is a dictionary or interface */
+ WEBIDL_TYPE_BOOL, /**< 2 - The type is boolean */
+ WEBIDL_TYPE_BYTE, /**< 3 - The type is a byte */
+ WEBIDL_TYPE_OCTET, /**< 4 - The type is a octet */
+ WEBIDL_TYPE_FLOAT, /**< 5 - The type is a float point number */
+ WEBIDL_TYPE_DOUBLE, /**< 6 - The type is a double */
+ WEBIDL_TYPE_SHORT, /**< 7 - The type is a signed 16bit */
+ WEBIDL_TYPE_LONG, /**< 8 - The type is a signed 32bit */
+ WEBIDL_TYPE_LONGLONG, /**< 9 - The type is a signed 64bit */
+ WEBIDL_TYPE_STRING, /**< 10 - The type is a string */
+ WEBIDL_TYPE_SEQUENCE, /**< 11 - The type is a sequence */
+ WEBIDL_TYPE_OBJECT, /**< 12 - The type is a object */
+ WEBIDL_TYPE_DATE, /**< 13 - The type is a date */
+ WEBIDL_TYPE_VOID, /**< 14 - The type is void */
};
/** modifiers for operations, attributes and arguments */
diff --git a/src/webidl-lexer.l b/src/webidl-lexer.l
index 4788610..a857654 100644
--- a/src/webidl-lexer.l
+++ b/src/webidl-lexer.l
@@ -215,6 +215,10 @@ legacyiterable return TOK_LEGACYITERABLE;
required return TOK_REQUIRED;
+Constructor return TOK_CONSTRUCTOR;
+
+NamedConstructor return TOK_NAMEDCONSTRUCTOR;
+
{identifier} {
/* A leading "_" is used to escape an identifier from
* looking like a reserved word terminal. */
diff --git a/src/webidl-parser.y b/src/webidl-parser.y
index 406962f..b48b449 100644
--- a/src/webidl-parser.y
+++ b/src/webidl-parser.y
@@ -67,6 +67,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char *str)
%token TOK_BYTE
%token TOK_CALLBACK
%token TOK_CONST
+%token TOK_CONSTRUCTOR
%token TOK_CREATOR
%token TOK_DATE
%token TOK_DELETER
@@ -92,6 +93,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char *str)
%token TOK_MODULE
%token TOK_NAN
%token TOK_NATIVE
+%token TOK_NAMEDCONSTRUCTOR
%token TOK_NULL_LITERAL
%token TOK_OBJECT
%token TOK_OCTET
@@ -580,12 +582,12 @@ PartialDictionary:
Default:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'=' DefaultValue
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -619,12 +621,12 @@ ExceptionMembers:
Inheritance:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
':' TOK_IDENTIFIER
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -632,7 +634,7 @@ Inheritance:
Enum:
TOK_ENUM TOK_IDENTIFIER '{' EnumValueList '}' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -662,7 +664,7 @@ EnumValueListString:
CallbackRest:
TOK_IDENTIFIER '=' ReturnType '(' ArgumentList ')' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -670,7 +672,7 @@ CallbackRest:
Typedef:
TOK_TYPEDEF ExtendedAttributeList Type TOK_IDENTIFIER ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -732,12 +734,14 @@ ConstValue:
|
TOK_INT_LITERAL
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_INT, NULL, (void *)$1);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_INT,
+ NULL,
+ (void *)$1);
}
|
TOK_NULL_LITERAL
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_NULL, NULL, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_NULL, NULL, NULL);
}
;
@@ -745,12 +749,16 @@ ConstValue:
BooleanLiteral:
TOK_TRUE
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL, NULL, (void *)true);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+ NULL,
+ (void *)true);
}
|
TOK_FALSE
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL, NULL, (void *)false);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+ NULL,
+ (void *)false);
}
;
@@ -758,34 +766,42 @@ BooleanLiteral:
FloatLiteral:
TOK_FLOAT_LITERAL
{
- float *value;
- value = malloc(sizeof(float));
- *value = strtof($1, NULL);
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = strtof($1, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
'-' TOK_INFINITY
{
- float *value;
- value = malloc(sizeof(float));
- *value = -INFINITY;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = -INFINITY;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
TOK_INFINITY
{
- float *value;
- value = malloc(sizeof(float));
- *value = INFINITY;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = INFINITY;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
TOK_NAN
{
- float *value;
- value = malloc(sizeof(float));
- *value = NAN;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = NAN;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
;
@@ -793,7 +809,7 @@ FloatLiteral:
AttributeOrOperation:
TOK_STRINGIFIER StringifierAttributeOrOperation
{
- $$ = $2;
+ $$ = $2;
}
|
Attribute
@@ -807,13 +823,13 @@ StringifierAttributeOrOperation:
|
OperationRest
{
- /* @todo deal with stringifier */
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION, NULL, $1);
+ /* @todo deal with stringifier */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION, NULL, $1);
}
|
';'
{
- $$=NULL;
+ $$=NULL;
}
;
@@ -915,7 +931,7 @@ AttributeName:
AttributeNameKeyword:
TOK_REQUIRED
{
- $$ = strdup("required");
+ $$ = strdup("required");
}
/* [33]
@@ -924,12 +940,12 @@ AttributeNameKeyword:
Inherit:
/* empty */
{
- $$ = false;
+ $$ = false;
}
|
TOK_INHERIT
{
- $$ = true;
+ $$ = true;
}
;
@@ -940,12 +956,12 @@ Inherit:
ReadOnly:
/* empty */
{
- $$ = false;
+ $$ = false;
}
|
TOK_READONLY
{
- $$ = true;
+ $$ = true;
}
;
@@ -999,34 +1015,39 @@ Special:
TOK_GETTER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_GETTER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_GETTER);
}
|
TOK_SETTER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_SETTER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_SETTER);
}
|
TOK_CREATOR
{
- /* second edition removed this special but teh
- specifications still use it!
- */
+ /* second edition removed this special but the
+ * specifications still use it!
+ */
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_CREATOR);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_CREATOR);
}
|
TOK_DELETER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_DELETER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_DELETER);
}
|
TOK_LEGACYCALLER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
}
;
@@ -1034,10 +1055,10 @@ Special:
OperationRest:
OptionalIdentifier '(' ArgumentList ')' ';'
{
- /* argument list */
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, $3);
+ /* argument list */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, $3);
- $$ = webidl_node_prepend($1, $$); /* identifier */
+ $$ = webidl_node_prepend($1, $$); /* identifier */
}
;
@@ -1045,12 +1066,12 @@ OperationRest:
OptionalIdentifier:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_IDENTIFIER
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1);
}
;
@@ -1061,12 +1082,12 @@ OptionalIdentifier:
ArgumentList:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
Argument Arguments
{
- $$ = webidl_node_append($2, $1);
+ $$ = webidl_node_append($2, $1);
}
;
@@ -1074,12 +1095,12 @@ ArgumentList:
Arguments:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' Argument Arguments
{
- $$ = webidl_node_append($3, $2);
+ $$ = webidl_node_append($3, $2);
}
;
@@ -1088,7 +1109,7 @@ Arguments:
Argument:
ExtendedAttributeList OptionalOrRequiredArgument
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -1124,12 +1145,12 @@ ArgumentName:
Ellipsis:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_ELLIPSIS
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_ELLIPSIS, NULL, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_ELLIPSIS, NULL, NULL);
}
;
@@ -1137,12 +1158,12 @@ Ellipsis:
Iterable:
TOK_ITERABLE '<' Type OptionalType '>' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_LEGACYITERABLE '<' Type '>' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -1150,12 +1171,12 @@ Iterable:
OptionalType:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' Type
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -1175,12 +1196,14 @@ ExceptionField:
ExtendedAttributeList:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'[' ExtendedAttribute ExtendedAttributes ']'
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $3, $2);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ $3,
+ $2);
}
;
@@ -1188,12 +1211,14 @@ ExtendedAttributeList:
ExtendedAttributes:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' ExtendedAttribute ExtendedAttributes
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $3, $2);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ $3,
+ $2);
}
;
@@ -1218,10 +1243,46 @@ ExtendedAttribute:
$$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $4, $2);
}
|
+ TOK_CONSTRUCTOR
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("Constructor"));
+ }
+ |
+ TOK_CONSTRUCTOR '(' ArgumentList ')'
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("Constructor")),
+ webidl_node_new(WEBIDL_NODE_TYPE_LIST,
+ NULL,
+ $3));
+ }
+ |
+ TOK_NAMEDCONSTRUCTOR '=' TOK_IDENTIFIER '(' ArgumentList ')'
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("NamedConstructor")),
+ webidl_node_new(WEBIDL_NODE_TYPE_LIST,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $3),
+ $5));
+ }
+ |
Other ExtendedAttributeRest
{
- $$ = webidl_node_append($2,
- webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1));
+ $$ = webidl_node_append($2,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $1));
}
;
@@ -1229,12 +1290,12 @@ ExtendedAttribute:
ExtendedAttributeRest:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
ExtendedAttribute
{
- $$ = $1;
+ $$ = $1;
}
;
@@ -1242,16 +1303,16 @@ ExtendedAttributeRest:
ExtendedAttributeInner:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'(' ExtendedAttributeInner ')' ExtendedAttributeInner
{
- $$ = webidl_node_prepend(
- webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
- NULL,
- $2),
- $4);
+ $$ = webidl_node_prepend(
+ webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ NULL,
+ $2),
+ $4);
}
|
'[' ExtendedAttributeInner ']' ExtendedAttributeInner
@@ -1276,8 +1337,10 @@ ExtendedAttributeInner:
|
OtherOrComma ExtendedAttributeInner
{
- $$ = webidl_node_append($2,
- webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1));
+ $$ = webidl_node_append($2,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $1));
}
;
@@ -1285,119 +1348,119 @@ ExtendedAttributeInner:
Other:
TOK_INT_LITERAL
{
- /* @todo loosing base info here might break the attribute */
- $$ = calloc(1, 32);
- snprintf($$, 32, "%ld", $1);
+ /* @todo loosing base info here might break the attribute */
+ $$ = calloc(1, 32);
+ snprintf($$, 32, "%ld", $1);
}
|
TOK_FLOAT_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_IDENTIFIER
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_STRING_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_OTHER_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
'-'
{
- $$ = strdup("-");
+ $$ = strdup("-");
}
|
'.'
{
- $$ = strdup(".");
+ $$ = strdup(".");
}
|
TOK_ELLIPSIS
{
- $$ = strdup("...");
+ $$ = strdup("...");
}
|
':'
{
- $$ = strdup(":");
+ $$ = strdup(":");
}
|
';'
{
- $$ = strdup(";");
+ $$ = strdup(";");
}
|
'<'
{
- $$ = strdup("<");
+ $$ = strdup("<");
}
|
'='
{
- $$ = strdup("=");
+ $$ = strdup("=");
}
|
'>'
{
- $$ = strdup(">");
+ $$ = strdup(">");
}
|
'?'
{
- $$ = strdup("?");
+ $$ = strdup("?");
}
|
TOK_DATE
{
- $$ = strdup("Date");
+ $$ = strdup("Date");
}
|
TOK_STRING
{
- $$ = strdup("DOMString");
+ $$ = strdup("DOMString");
}
|
TOK_INFINITY
{
- $$ = strdup("Infinity");
+ $$ = strdup("Infinity");
}
|
TOK_NAN
{
- $$ = strdup("NaN");
+ $$ = strdup("NaN");
}
|
TOK_ANY
{
- $$ = strdup("any");
+ $$ = strdup("any");
}
|
TOK_BOOLEAN
{
- $$ = strdup("boolean");
+ $$ = strdup("boolean");
}
|
TOK_BYTE
{
- $$ = strdup("byte");
+ $$ = strdup("byte");
}
|
TOK_DOUBLE
{
- $$ = strdup("double");
+ $$ = strdup("double");
}
|
TOK_FALSE
{
- $$ = strdup("false");
+ $$ = strdup("false");
}
|
TOK_FLOAT
diff --git a/test/data/bindings/HTMLUnknownElement.bnd b/test/data/bindings/HTMLUnknownElement.bnd
index faabaec..d44018b 100644
--- a/test/data/bindings/HTMLUnknownElement.bnd
+++ b/test/data/bindings/HTMLUnknownElement.bnd
@@ -14,6 +14,6 @@ class HTMLUnknownElement {
postface %{
/* class post */
%};
-}
+};
-init HTMLUnknownElement("struct dom_html_element *" html_unknown_element::html_element);
+init HTMLUnknownElement(struct dom_html_element *html_unknown_element::html_element);
diff --git a/test/data/bindings/browser-duk.bnd b/test/data/bindings/browser-duk.bnd
index 44497a1..3113891 100644
--- a/test/data/bindings/browser-duk.bnd
+++ b/test/data/bindings/browser-duk.bnd
@@ -37,108 +37,112 @@ binding duk_libdom {
postface %{
/* binding postface */
%};
-}
+};
+
+class empty_class {
+};
+
#include "HTMLUnknownElement.bnd"
/* specialisations of html_element */
-init HTMLFontElement("struct dom_html_element *" html_font_element::html_element);
-init HTMLDirectoryElement("struct dom_html_element *" html_directory_element::html_element);
-init HTMLFrameElement("struct dom_html_element *" html_frame_element::html_element);
-init HTMLFrameSetElement("struct dom_html_element *" html_frame_set_element::html_element);
-init HTMLMarqueeElement("struct dom_html_element *" html_marquee_element::html_element);
-init HTMLAppletElement("struct dom_html_element *" html_applet_element::html_element);
-init HTMLCanvasElement("struct dom_html_element *" html_canvas_element::html_element);
-init HTMLTemplateElement("struct dom_html_element *" html_template_element::html_element);
-init HTMLScriptElement("struct dom_html_element *" html_script_element::html_element);
-init HTMLDialogElement("struct dom_html_element *" html_dialog_element::html_element);
-init HTMLMenuItemElement("struct dom_html_element *" html_menu_item_element::html_element);
-init HTMLMenuElement("struct dom_html_element *" html_menu_element::html_element);
-init HTMLDetailsElement("struct dom_html_element *" html_details_element::html_element);
-init HTMLLegendElement("struct dom_html_element *" html_legend_element::html_element);
-init HTMLFieldSetElement("struct dom_html_element *" html_field_set_element::html_element);
-init HTMLMeterElement("struct dom_html_element *" html_meter_element::html_element);
-init HTMLProgressElement("struct dom_html_element *" html_progress_element::html_element);
-init HTMLOutputElement("struct dom_html_element *" html_output_element::html_element);
-init HTMLKeygenElement("struct dom_html_element *" html_keygen_element::html_element);
-init HTMLTextAreaElement("struct dom_html_element *" html_text_area_element::html_element);
-init HTMLOptionElement("struct dom_html_element *" html_option_element::html_element);
-init HTMLOptGroupElement("struct dom_html_element *" html_opt_group_element::html_element);
-init HTMLDataListElement("struct dom_html_element *" html_data_list_element::html_element);
-init HTMLSelectElement("struct dom_html_element *" html_select_element::html_element);
-init HTMLButtonElement("struct dom_html_element *" html_button_element::html_element);
-init HTMLInputElement("struct dom_html_element *" html_input_element::html_element);
-init HTMLLabelElement("struct dom_html_element *" html_label_element::html_element);
-init HTMLFormElement("struct dom_html_element *" html_form_element::html_element);
-init HTMLTableCellElement("struct dom_html_element *" html_table_cell_element::html_element);
-init HTMLTableRowElement("struct dom_html_element *" html_table_row_element::html_element);
-init HTMLTableSectionElement("struct dom_html_element *" html_table_section_element::html_element);
-init HTMLTableColElement("struct dom_html_element *" html_table_col_element::html_element);
-init HTMLTableCaptionElement("struct dom_html_element *" html_table_caption_element::html_element);
-init HTMLTableElement("struct dom_html_element *" html_table_element::html_element);
-init HTMLAreaElement("struct dom_html_element *" html_area_element::html_element);
-init HTMLMapElement("struct dom_html_element *" html_map_element::html_element);
-init HTMLMediaElement("struct dom_html_element *" html_media_element::html_element);
-init HTMLTrackElement("struct dom_html_element *" html_track_element::html_element);
-init HTMLParamElement("struct dom_html_element *" html_param_element::html_element);
-init HTMLObjectElement("struct dom_html_element *" html_object_element::html_element);
-init HTMLEmbedElement("struct dom_html_element *" html_embed_element::html_element);
-init HTMLIFrameElement("struct dom_html_element *" html_i_frame_element::html_element);
-init HTMLImageElement("struct dom_html_element *" html_image_element::html_element);
-init HTMLSourceElement("struct dom_html_element *" html_source_element::html_element);
-init HTMLPictureElement("struct dom_html_element *" html_picture_element::html_element);
-init HTMLModElement("struct dom_html_element *" html_mod_element::html_element);
-init HTMLBRElement("struct dom_html_element *" html_br_element::html_element);
-init HTMLSpanElement("struct dom_html_element *" html_span_element::html_element);
-init HTMLTimeElement("struct dom_html_element *" html_time_element::html_element);
-init HTMLDataElement("struct dom_html_element *" html_data_element::html_element);
-init HTMLAnchorElement("struct dom_html_element *" html_anchor_element::html_element);
-init HTMLDivElement("struct dom_html_element *" html_div_element::html_element);
-init HTMLDListElement("struct dom_html_element *" html_d_list_element::html_element);
-init HTMLLIElement("struct dom_html_element *" html_li_element::html_element);
-init HTMLUListElement("struct dom_html_element *" html_u_list_element::html_element);
-init HTMLOListElement("struct dom_html_element *" html_o_list_element::html_element);
-init HTMLQuoteElement("struct dom_html_element *" html_quote_element::html_element);
-init HTMLPreElement("struct dom_html_element *" html_pre_element::html_element);
-init HTMLHRElement("struct dom_html_element *" html_hr_element::html_element);
-init HTMLParagraphElement("struct dom_html_element *" html_paragraph_element::html_element);
-init HTMLHeadingElement("struct dom_html_element *" html_heading_element::html_element);
-init HTMLBodyElement("struct dom_html_element *" html_body_element::html_element);
-init HTMLStyleElement("struct dom_html_element *" html_style_element::html_element);
-init HTMLMetaElement("struct dom_html_element *" html_meta_element::html_element);
-init HTMLLinkElement("struct dom_html_element *" html_link_element::html_element);
-init HTMLBaseElement("struct dom_html_element *" html_base_element::html_element);
-init HTMLTitleElement("struct dom_html_element *" html_title_element::html_element);
-init HTMLHeadElement("struct dom_html_element *" html_head_element::html_element);
-init HTMLHtmlElement("struct dom_html_element *" html_html_element::html_element);
+init HTMLFontElement(struct dom_html_element *html_font_element::html_element);
+init HTMLDirectoryElement(struct dom_html_element *html_directory_element::html_element);
+init HTMLFrameElement(struct dom_html_element *html_frame_element::html_element);
+init HTMLFrameSetElement(struct dom_html_element *html_frame_set_element::html_element);
+init HTMLMarqueeElement(struct dom_html_element *html_marquee_element::html_element);
+init HTMLAppletElement(struct dom_html_element *html_applet_element::html_element);
+init HTMLCanvasElement(struct dom_html_element *html_canvas_element::html_element);
+init HTMLTemplateElement(struct dom_html_element *html_template_element::html_element);
+init HTMLScriptElement(struct dom_html_element *html_script_element::html_element);
+init HTMLDialogElement(struct dom_html_element *html_dialog_element::html_element);
+init HTMLMenuItemElement(struct dom_html_element *html_menu_item_element::html_element);
+init HTMLMenuElement(struct dom_html_element *html_menu_element::html_element);
+init HTMLDetailsElement(struct dom_html_element *html_details_element::html_element);
+init HTMLLegendElement(struct dom_html_element *html_legend_element::html_element);
+init HTMLFieldSetElement(struct dom_html_element *html_field_set_element::html_element);
+init HTMLMeterElement(struct dom_html_element *html_meter_element::html_element);
+init HTMLProgressElement(struct dom_html_element *html_progress_element::html_element);
+init HTMLOutputElement(struct dom_html_element *html_output_element::html_element);
+init HTMLKeygenElement(struct dom_html_element *html_keygen_element::html_element);
+init HTMLTextAreaElement(struct dom_html_element *html_text_area_element::html_element);
+init HTMLOptionElement(struct dom_html_element *html_option_element::html_element);
+init HTMLOptGroupElement(struct dom_html_element *html_opt_group_element::html_element);
+init HTMLDataListElement(struct dom_html_element *html_data_list_element::html_element);
+init HTMLSelectElement(struct dom_html_element *html_select_element::html_element);
+init HTMLButtonElement(struct dom_html_element *html_button_element::html_element);
+init HTMLInputElement(struct dom_html_element *html_input_element::html_element);
+init HTMLLabelElement(struct dom_html_element *html_label_element::html_element);
+init HTMLFormElement(struct dom_html_element *html_form_element::html_element);
+init HTMLTableCellElement(struct dom_html_element *html_table_cell_element::html_element);
+init HTMLTableRowElement(struct dom_html_element *html_table_row_element::html_element);
+init HTMLTableSectionElement(struct dom_html_element *html_table_section_element::html_element);
+init HTMLTableColElement(struct dom_html_element *html_table_col_element::html_element);
+init HTMLTableCaptionElement(struct dom_html_element *html_table_caption_element::html_element);
+init HTMLTableElement(struct dom_html_element *html_table_element::html_element);
+init HTMLAreaElement(struct dom_html_element *html_area_element::html_element);
+init HTMLMapElement(struct dom_html_element *html_map_element::html_element);
+init HTMLMediaElement(struct dom_html_element *html_media_element::html_element);
+init HTMLTrackElement(struct dom_html_element *html_track_element::html_element);
+init HTMLParamElement(struct dom_html_element *html_param_element::html_element);
+init HTMLObjectElement(struct dom_html_element *html_object_element::html_element);
+init HTMLEmbedElement(struct dom_html_element *html_embed_element::html_element);
+init HTMLIFrameElement(struct dom_html_element *html_i_frame_element::html_element);
+init HTMLImageElement(struct dom_html_element *html_image_element::html_element);
+init HTMLSourceElement(struct dom_html_element *html_source_element::html_element);
+init HTMLPictureElement(struct dom_html_element *html_picture_element::html_element);
+init HTMLModElement(struct dom_html_element *html_mod_element::html_element);
+init HTMLBRElement(struct dom_html_element *html_br_element::html_element);
+init HTMLSpanElement(struct dom_html_element *html_span_element::html_element);
+init HTMLTimeElement(struct dom_html_element *html_time_element::html_element);
+init HTMLDataElement(struct dom_html_element *html_data_element::html_element);
+init HTMLAnchorElement(struct dom_html_element *html_anchor_element::html_element);
+init HTMLDivElement(struct dom_html_element *html_div_element::html_element);
+init HTMLDListElement(struct dom_html_element *html_d_list_element::html_element);
+init HTMLLIElement(struct dom_html_element *html_li_element::html_element);
+init HTMLUListElement(struct dom_html_element *html_u_list_element::html_element);
+init HTMLOListElement(struct dom_html_element *html_o_list_element::html_element);
+init HTMLQuoteElement(struct dom_html_element *html_quote_element::html_element);
+init HTMLPreElement(struct dom_html_element *html_pre_element::html_element);
+init HTMLHRElement(struct dom_html_element *html_hr_element::html_element);
+init HTMLParagraphElement(struct dom_html_element *html_paragraph_element::html_element);
+init HTMLHeadingElement(struct dom_html_element *html_heading_element::html_element);
+init HTMLBodyElement(struct dom_html_element *html_body_element::html_element);
+init HTMLStyleElement(struct dom_html_element *html_style_element::html_element);
+init HTMLMetaElement(struct dom_html_element *html_meta_element::html_element);
+init HTMLLinkElement(struct dom_html_element *html_link_element::html_element);
+init HTMLBaseElement(struct dom_html_element *html_base_element::html_element);
+init HTMLTitleElement(struct dom_html_element *html_title_element::html_element);
+init HTMLHeadElement(struct dom_html_element *html_head_element::html_element);
+init HTMLHtmlElement(struct dom_html_element *html_html_element::html_element);
/* specialisations of HTMLTableCellElement */
-init HTMLTableHeaderCellElement("struct dom_html_element *" html_table_header_cell_element::html_table_cell_element);
-init HTMLTableDataCellElement("struct dom_html_element *" html_table_data_cell_element::html_table_cell_element);
+init HTMLTableHeaderCellElement(struct dom_html_element *html_table_header_cell_element::html_table_cell_element);
+init HTMLTableDataCellElement(struct dom_html_element *html_table_data_cell_element::html_table_cell_element);
/* specialisations of html_media_element */
-init HTMLAudioElement("struct dom_html_element *" html_audio_element::html_media_element);
-init HTMLVideoElement("struct dom_html_element *" html_video_element::html_media_element);
+init HTMLAudioElement(struct dom_html_element *html_audio_element::html_media_element);
+init HTMLVideoElement(struct dom_html_element *html_video_element::html_media_element);
-init HTMLElement("struct dom_html_element *" html_element::element);
+init HTMLElement(struct dom_html_element *html_element::element);
-init Text("struct dom_node_text *" text::character_data);
-init Comment("struct dom_node_comment *" comment::character_data);
-init ProcessingInstruction("struct dom_node_text *" text::character_data);
+init Text(struct dom_node_text *text::character_data);
+init Comment(struct dom_node_comment *comment::character_data);
+init ProcessingInstruction(struct dom_node_text *text::character_data);
-init XMLDocument("struct dom_document *" document);
+init XMLDocument(struct dom_document * document);
-init Element("struct dom_element *" element::node);
-init CharacterData("struct dom_node_character_data *" character_data::node);
-init DocumentFragment("struct dom_document *" document::node);
-init DocumentType("struct dom_document *" document::node);
-init Document("struct dom_document *" document::node);
+init Element(struct dom_element *element::node);
+init CharacterData(struct dom_node_character_data *character_data::node);
+init DocumentFragment(struct dom_document *document::node);
+init DocumentType(struct dom_document *document::node);
+init Document(struct dom_document *document::node);
class Node {
- private "dom_node *" node;
-}
+ private dom_node *node;
+};
-init Node("struct dom_node *" node)
+init Node(struct dom_node *node)
%{
priv->node = node;
dom_node_ref(node);
--
NetSurf Generator for JavaScript bindings
8 years, 1 month
netsurf: branch master updated. release/3.3-350-g51c2dd7
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/51c2dd70e2bb8da61f683...
...commit http://git.netsurf-browser.org/netsurf.git/commit/51c2dd70e2bb8da61f68391...
...tree http://git.netsurf-browser.org/netsurf.git/tree/51c2dd70e2bb8da61f6839161...
The branch, master has been updated
via 51c2dd70e2bb8da61f683916111f083ec0263953 (commit)
from 46945f636221ccf0751f3f0e2e78c6e6d33cab7f (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=51c2dd70e2bb8da61f6...
commit 51c2dd70e2bb8da61f683916111f083ec0263953
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Add assert before we wander off into the weeds.
Visiting slashdot we get a document write with a node that has no
html content user data.
diff --git a/javascript/duktape/Document.bnd b/javascript/duktape/Document.bnd
index 0b478d5..dce110c 100644
--- a/javascript/duktape/Document.bnd
+++ b/javascript/duktape/Document.bnd
@@ -31,6 +31,7 @@ method Document::write()
err = dom_node_get_user_data(priv->parent.node,
corestring_dom___ns_key_html_content_data,
&htmlc);
+ assert(htmlc != NULL);
if (err == DOM_NO_ERR && htmlc->parser != NULL) {
dom_hubbub_parser_insert_chunk(htmlc->parser, (uint8_t *)text, text_len);
}
-----------------------------------------------------------------------
Summary of changes:
javascript/duktape/Document.bnd | 1 +
1 file changed, 1 insertion(+)
diff --git a/javascript/duktape/Document.bnd b/javascript/duktape/Document.bnd
index 0b478d5..dce110c 100644
--- a/javascript/duktape/Document.bnd
+++ b/javascript/duktape/Document.bnd
@@ -31,6 +31,7 @@ method Document::write()
err = dom_node_get_user_data(priv->parent.node,
corestring_dom___ns_key_html_content_data,
&htmlc);
+ assert(htmlc != NULL);
if (err == DOM_NO_ERR && htmlc->parser != NULL) {
dom_hubbub_parser_insert_chunk(htmlc->parser, (uint8_t *)text, text_len);
}
--
NetSurf Browser
8 years, 2 months
netsurf: branch master updated. release/3.3-349-g46945f6
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/46945f636221ccf0751f3...
...commit http://git.netsurf-browser.org/netsurf.git/commit/46945f636221ccf0751f3f0...
...tree http://git.netsurf-browser.org/netsurf.git/tree/46945f636221ccf0751f3f0e2...
The branch, master has been updated
via 46945f636221ccf0751f3f0e2e78c6e6d33cab7f (commit)
via 63dba3a0618a2116ec395937b04f65740fe529f3 (commit)
from 73c6476112181bd5e151be719dde7d5cd48e14c3 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=46945f636221ccf0751...
commit 46945f636221ccf0751f3f0e2e78c6e6d33cab7f
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Improve location implementation to be more complete
diff --git a/javascript/duktape/Location.bnd b/javascript/duktape/Location.bnd
index 5acbde2..8c79cd4 100644
--- a/javascript/duktape/Location.bnd
+++ b/javascript/duktape/Location.bnd
@@ -10,7 +10,10 @@
*/
class Location {
- private "nsurl *" url;
+ private "nsurl *" url;
+ prologue %{
+#include "desktop/browser.h"
+%};
}
init Location("nsurl *" url)
@@ -24,6 +27,80 @@ fini Location()
nsurl_unref(priv->url);
%}
+method Location::reload()
+%{
+ /* retrieve the private data from the root object (window) */
+ duk_push_global_object(ctx);
+ duk_get_prop_string(ctx, -1, PRIVATE_MAGIC);
+ window_private_t *priv_win = duk_get_pointer(ctx, -1);
+ duk_pop(ctx);
+
+ if (priv_win->win != NULL) {
+ browser_window_reload(priv_win->win, false);
+ } else {
+ LOG("failed to get browser context");
+ }
+ return 0;
+%}
+
+method Location::assign()
+%{
+ /* retrieve the private data from the root object (window) */
+ duk_push_global_object(ctx);
+ duk_get_prop_string(ctx, -1, PRIVATE_MAGIC);
+ window_private_t *priv_win = duk_get_pointer(ctx, -1);
+ duk_pop(ctx);
+
+ if (priv_win == NULL || priv_win->win == NULL) {
+ LOG("failed to get browser context");
+ return 0;
+ }
+
+ nsurl *joined;
+ duk_size_t slen;
+ const char *url = duk_safe_to_lstring(ctx, 0, &slen);
+
+ nsurl_join(priv->url, url, &joined);
+ browser_window_navigate(priv_win->win,
+ joined,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(joined);
+ return 0;
+%}
+
+method Location::replace()
+%{
+ /* retrieve the private data from the root object (window) */
+ duk_push_global_object(ctx);
+ duk_get_prop_string(ctx, -1, PRIVATE_MAGIC);
+ window_private_t *priv_win = duk_get_pointer(ctx, -1);
+ duk_pop(ctx);
+
+ if (priv_win == NULL || priv_win->win == NULL) {
+ LOG("failed to get browser context");
+ return 0;
+ }
+
+ nsurl *joined;
+ duk_size_t slen;
+ const char *url = duk_safe_to_lstring(ctx, 0, &slen);
+
+ nsurl_join(priv->url, url, &joined);
+ browser_window_navigate(priv_win->win,
+ joined,
+ NULL,
+ BW_NAVIGATE_NONE,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(joined);
+ return 0;
+%}
+
getter Location::href()
%{
char *url_s = NULL;
@@ -36,11 +113,60 @@ getter Location::href()
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
+setter Location::href()
+%{
+ /* retrieve the private data from the root object (window) */
+ duk_push_global_object(ctx);
+ duk_get_prop_string(ctx, -1, PRIVATE_MAGIC);
+ window_private_t *priv_win = duk_get_pointer(ctx, -1);
+ duk_pop(ctx);
+
+ if (priv_win == NULL || priv_win->win == NULL) {
+ LOG("failed to get browser context");
+ return 0;
+ }
+
+ nsurl *joined;
+ duk_size_t slen;
+ const char *url = duk_safe_to_lstring(ctx, 0, &slen);
+
+ nsurl_join(priv->url, url, &joined);
+ browser_window_navigate(priv_win->win,
+ joined,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(joined);
+ return 0;
+%}
+
+getter Location::origin()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_SCHEME | NSURL_HOST | NSURL_PORT, &url_s, &url_l);
+
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
+ duk_push_lstring(ctx, url_s, url_l);
+
+ if (url_s != NULL) {
+ free(url_s);
+ }
+
+ return 1;
+%}
getter Location::protocol()
%{
@@ -48,13 +174,15 @@ getter Location::protocol()
size_t url_l;
nsurl_get(priv->url, NSURL_SCHEME, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -66,13 +194,15 @@ getter Location::username()
size_t url_l;
nsurl_get(priv->url, NSURL_USERNAME, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -84,13 +214,15 @@ getter Location::password()
size_t url_l;
nsurl_get(priv->url, NSURL_PASSWORD, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -102,13 +234,15 @@ getter Location::host()
size_t url_l;
nsurl_get(priv->url, NSURL_HOST, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -119,32 +253,37 @@ getter Location::hostname()
char *url_s = NULL;
size_t url_l;
- nsurl_get(priv->url, NSURL_COMPLETE, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ nsurl_get(priv->url, NSURL_HOST, &url_s, &url_l);
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
+
getter Location::port()
%{
char *url_s = NULL;
size_t url_l;
nsurl_get(priv->url, NSURL_PORT, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -156,13 +295,15 @@ getter Location::pathname()
size_t url_l;
nsurl_get(priv->url, NSURL_PATH, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -174,13 +315,15 @@ getter Location::search()
size_t url_l;
nsurl_get(priv->url, NSURL_QUERY, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -192,13 +335,15 @@ getter Location::hash()
size_t url_l;
nsurl_get(priv->url, NSURL_FRAGMENT, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
diff --git a/test/js/index.html b/test/js/index.html
index 06e006a..38a59a6 100644
--- a/test/js/index.html
+++ b/test/js/index.html
@@ -12,14 +12,6 @@
<li><a href="core.infinite.html">Infinite loop</a></li>
</ul>
-
-<h2>Window</h2>
-<ul>
-<li><a href="window.lately.html">location</a></li>
-<li><a href="window-enumerate.html">enumerate</a></li>
-</ul>
-
-
<h2>Document write</h2>
<ul>
<li><a href="inline-doc-write-simple.html">Simple document write</a></li>
@@ -31,6 +23,20 @@
<li><a href="inline-innerhtml.html">Inline script innerHtml test</a></li>
</ul>
+<h2>Window</h2>
+<ul>
+<li><a href="window.lately.html">lately</a></li>
+<li><a href="window-enumerate.html">enumerate</a></li>
+</ul>
+
+<h2>Location</h2>
+<ul>
+<li><a href="location-enumerate.html">Enumerate members</a></li>
+<li><a href="location-assign.html">assign</a> should navigate to enumeration with page in history</li>
+<li><a href="location-replace.html">replace</a> should navigate to enumeration without page in history.</li>
+<li><a href="location-href.html">href</a> should navigate to enumeration with page in history</li>
+</ul>
+
<h2>DOM tests</h2>
diff --git a/test/js/location-assign.html b/test/js/location-assign.html
new file mode 100644
index 0000000..5ed808c
--- /dev/null
+++ b/test/js/location-assign.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>location interface assign</title>
+<link rel="stylesheet" type="text/css" href="tst.css">
+</head>
+<body>
+<h1>location interface assign</h1>
+
+<script>
+location.assign("location-enumerate.html");
+</script>
+</body>
+</html>
diff --git a/test/js/location-href.html b/test/js/location-href.html
new file mode 100644
index 0000000..28a9e3c
--- /dev/null
+++ b/test/js/location-href.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>location interface href</title>
+<link rel="stylesheet" type="text/css" href="tst.css">
+</head>
+<body>
+<h1>location interface href</h1>
+
+<script>
+location.href = "location-enumerate.html";
+</script>
+</body>
+</html>
diff --git a/test/js/location-replace.html b/test/js/location-replace.html
new file mode 100644
index 0000000..047cfd4
--- /dev/null
+++ b/test/js/location-replace.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>location interface replace</title>
+<link rel="stylesheet" type="text/css" href="tst.css">
+</head>
+<body>
+<h1>location interface replace</h1>
+
+<script>
+location.replace("location-enumerate.html");
+</script>
+</body>
+</html>
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=63dba3a0618a2116ec3...
commit 63dba3a0618a2116ec395937b04f65740fe529f3
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
expose the location object through document as well as window
diff --git a/javascript/duktape/Document.bnd b/javascript/duktape/Document.bnd
index 6d11ea9..0b478d5 100644
--- a/javascript/duktape/Document.bnd
+++ b/javascript/duktape/Document.bnd
@@ -154,6 +154,19 @@ getter Document::body()
return 0; /* coerced to undefined */
%}
+getter Document::location()
+%{
+ /* retrieve the location object from the root object (window) */
+ duk_push_global_object(ctx);
+ duk_get_prop_string(ctx, -1, "location");
+ if (duk_is_undefined(ctx, -1)) {
+ duk_pop(ctx);
+ return 0;
+ }
+ return 1;
+%}
+
+
method Document::getElementById()
%{
dom_string *elementId_dom;
-----------------------------------------------------------------------
Summary of changes:
javascript/duktape/Document.bnd | 13 +++
javascript/duktape/Location.bnd | 223 ++++++++++++++++++++++++++++++++-------
test/js/index.html | 22 ++--
test/js/location-assign.html | 13 +++
test/js/location-href.html | 13 +++
test/js/location-replace.html | 13 +++
6 files changed, 250 insertions(+), 47 deletions(-)
create mode 100644 test/js/location-assign.html
create mode 100644 test/js/location-href.html
create mode 100644 test/js/location-replace.html
diff --git a/javascript/duktape/Document.bnd b/javascript/duktape/Document.bnd
index 6d11ea9..0b478d5 100644
--- a/javascript/duktape/Document.bnd
+++ b/javascript/duktape/Document.bnd
@@ -154,6 +154,19 @@ getter Document::body()
return 0; /* coerced to undefined */
%}
+getter Document::location()
+%{
+ /* retrieve the location object from the root object (window) */
+ duk_push_global_object(ctx);
+ duk_get_prop_string(ctx, -1, "location");
+ if (duk_is_undefined(ctx, -1)) {
+ duk_pop(ctx);
+ return 0;
+ }
+ return 1;
+%}
+
+
method Document::getElementById()
%{
dom_string *elementId_dom;
diff --git a/javascript/duktape/Location.bnd b/javascript/duktape/Location.bnd
index 5acbde2..8c79cd4 100644
--- a/javascript/duktape/Location.bnd
+++ b/javascript/duktape/Location.bnd
@@ -10,7 +10,10 @@
*/
class Location {
- private "nsurl *" url;
+ private "nsurl *" url;
+ prologue %{
+#include "desktop/browser.h"
+%};
}
init Location("nsurl *" url)
@@ -24,6 +27,80 @@ fini Location()
nsurl_unref(priv->url);
%}
+method Location::reload()
+%{
+ /* retrieve the private data from the root object (window) */
+ duk_push_global_object(ctx);
+ duk_get_prop_string(ctx, -1, PRIVATE_MAGIC);
+ window_private_t *priv_win = duk_get_pointer(ctx, -1);
+ duk_pop(ctx);
+
+ if (priv_win->win != NULL) {
+ browser_window_reload(priv_win->win, false);
+ } else {
+ LOG("failed to get browser context");
+ }
+ return 0;
+%}
+
+method Location::assign()
+%{
+ /* retrieve the private data from the root object (window) */
+ duk_push_global_object(ctx);
+ duk_get_prop_string(ctx, -1, PRIVATE_MAGIC);
+ window_private_t *priv_win = duk_get_pointer(ctx, -1);
+ duk_pop(ctx);
+
+ if (priv_win == NULL || priv_win->win == NULL) {
+ LOG("failed to get browser context");
+ return 0;
+ }
+
+ nsurl *joined;
+ duk_size_t slen;
+ const char *url = duk_safe_to_lstring(ctx, 0, &slen);
+
+ nsurl_join(priv->url, url, &joined);
+ browser_window_navigate(priv_win->win,
+ joined,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(joined);
+ return 0;
+%}
+
+method Location::replace()
+%{
+ /* retrieve the private data from the root object (window) */
+ duk_push_global_object(ctx);
+ duk_get_prop_string(ctx, -1, PRIVATE_MAGIC);
+ window_private_t *priv_win = duk_get_pointer(ctx, -1);
+ duk_pop(ctx);
+
+ if (priv_win == NULL || priv_win->win == NULL) {
+ LOG("failed to get browser context");
+ return 0;
+ }
+
+ nsurl *joined;
+ duk_size_t slen;
+ const char *url = duk_safe_to_lstring(ctx, 0, &slen);
+
+ nsurl_join(priv->url, url, &joined);
+ browser_window_navigate(priv_win->win,
+ joined,
+ NULL,
+ BW_NAVIGATE_NONE,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(joined);
+ return 0;
+%}
+
getter Location::href()
%{
char *url_s = NULL;
@@ -36,11 +113,60 @@ getter Location::href()
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
+setter Location::href()
+%{
+ /* retrieve the private data from the root object (window) */
+ duk_push_global_object(ctx);
+ duk_get_prop_string(ctx, -1, PRIVATE_MAGIC);
+ window_private_t *priv_win = duk_get_pointer(ctx, -1);
+ duk_pop(ctx);
+
+ if (priv_win == NULL || priv_win->win == NULL) {
+ LOG("failed to get browser context");
+ return 0;
+ }
+
+ nsurl *joined;
+ duk_size_t slen;
+ const char *url = duk_safe_to_lstring(ctx, 0, &slen);
+
+ nsurl_join(priv->url, url, &joined);
+ browser_window_navigate(priv_win->win,
+ joined,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(joined);
+ return 0;
+%}
+
+getter Location::origin()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_SCHEME | NSURL_HOST | NSURL_PORT, &url_s, &url_l);
+
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
+ duk_push_lstring(ctx, url_s, url_l);
+
+ if (url_s != NULL) {
+ free(url_s);
+ }
+
+ return 1;
+%}
getter Location::protocol()
%{
@@ -48,13 +174,15 @@ getter Location::protocol()
size_t url_l;
nsurl_get(priv->url, NSURL_SCHEME, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -66,13 +194,15 @@ getter Location::username()
size_t url_l;
nsurl_get(priv->url, NSURL_USERNAME, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -84,13 +214,15 @@ getter Location::password()
size_t url_l;
nsurl_get(priv->url, NSURL_PASSWORD, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -102,13 +234,15 @@ getter Location::host()
size_t url_l;
nsurl_get(priv->url, NSURL_HOST, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -119,32 +253,37 @@ getter Location::hostname()
char *url_s = NULL;
size_t url_l;
- nsurl_get(priv->url, NSURL_COMPLETE, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ nsurl_get(priv->url, NSURL_HOST, &url_s, &url_l);
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
+
getter Location::port()
%{
char *url_s = NULL;
size_t url_l;
nsurl_get(priv->url, NSURL_PORT, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -156,13 +295,15 @@ getter Location::pathname()
size_t url_l;
nsurl_get(priv->url, NSURL_PATH, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -174,13 +315,15 @@ getter Location::search()
size_t url_l;
nsurl_get(priv->url, NSURL_QUERY, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
@@ -192,13 +335,15 @@ getter Location::hash()
size_t url_l;
nsurl_get(priv->url, NSURL_FRAGMENT, &url_s, &url_l);
- if (url_s == NULL) {
- return 0;
- }
+ /* if url_s is NULL duk_push_lstring pushes an empty string
+ * which is correct for this API
+ */
duk_push_lstring(ctx, url_s, url_l);
- free(url_s);
+ if (url_s != NULL) {
+ free(url_s);
+ }
return 1;
%}
diff --git a/test/js/index.html b/test/js/index.html
index 06e006a..38a59a6 100644
--- a/test/js/index.html
+++ b/test/js/index.html
@@ -12,14 +12,6 @@
<li><a href="core.infinite.html">Infinite loop</a></li>
</ul>
-
-<h2>Window</h2>
-<ul>
-<li><a href="window.lately.html">location</a></li>
-<li><a href="window-enumerate.html">enumerate</a></li>
-</ul>
-
-
<h2>Document write</h2>
<ul>
<li><a href="inline-doc-write-simple.html">Simple document write</a></li>
@@ -31,6 +23,20 @@
<li><a href="inline-innerhtml.html">Inline script innerHtml test</a></li>
</ul>
+<h2>Window</h2>
+<ul>
+<li><a href="window.lately.html">lately</a></li>
+<li><a href="window-enumerate.html">enumerate</a></li>
+</ul>
+
+<h2>Location</h2>
+<ul>
+<li><a href="location-enumerate.html">Enumerate members</a></li>
+<li><a href="location-assign.html">assign</a> should navigate to enumeration with page in history</li>
+<li><a href="location-replace.html">replace</a> should navigate to enumeration without page in history.</li>
+<li><a href="location-href.html">href</a> should navigate to enumeration with page in history</li>
+</ul>
+
<h2>DOM tests</h2>
diff --git a/test/js/location-assign.html b/test/js/location-assign.html
new file mode 100644
index 0000000..5ed808c
--- /dev/null
+++ b/test/js/location-assign.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>location interface assign</title>
+<link rel="stylesheet" type="text/css" href="tst.css">
+</head>
+<body>
+<h1>location interface assign</h1>
+
+<script>
+location.assign("location-enumerate.html");
+</script>
+</body>
+</html>
diff --git a/test/js/location-href.html b/test/js/location-href.html
new file mode 100644
index 0000000..28a9e3c
--- /dev/null
+++ b/test/js/location-href.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>location interface href</title>
+<link rel="stylesheet" type="text/css" href="tst.css">
+</head>
+<body>
+<h1>location interface href</h1>
+
+<script>
+location.href = "location-enumerate.html";
+</script>
+</body>
+</html>
diff --git a/test/js/location-replace.html b/test/js/location-replace.html
new file mode 100644
index 0000000..047cfd4
--- /dev/null
+++ b/test/js/location-replace.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>location interface replace</title>
+<link rel="stylesheet" type="text/css" href="tst.css">
+</head>
+<body>
+<h1>location interface replace</h1>
+
+<script>
+location.replace("location-enumerate.html");
+</script>
+</body>
+</html>
--
NetSurf Browser
8 years, 2 months
netsurf: branch chris/composite-text-exp updated. release/3.3-349-ga109b41
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/a109b414701dc276b8c4d...
...commit http://git.netsurf-browser.org/netsurf.git/commit/a109b414701dc276b8c4d8c...
...tree http://git.netsurf-browser.org/netsurf.git/tree/a109b414701dc276b8c4d8cd9...
The branch, chris/composite-text-exp has been updated
via a109b414701dc276b8c4d8cd9f948f4a169652e7 (commit)
from 77ac348b052aa41954254899429c9ab3ef61d5e9 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=a109b414701dc276b8c...
commit a109b414701dc276b8c4d8cd9f948f4a169652e7
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Mostly working glyph cache
diff --git a/amiga/font.c b/amiga/font.c
index cba1ee5..e777cd5 100644
--- a/amiga/font.c
+++ b/amiga/font.c
@@ -598,7 +598,7 @@ static struct ami_font_node *ami_open_outline_font(const plot_font_style_t *fsty
#ifdef __amigaos4__
static struct BitMap *ami_font_glyph_cache_retrieve(struct ami_font_node *font_node,
- uint32 char1, struct GlyphMap *glyph)
+ uint32 char1, struct GlyphMap *glyph, struct BitMap *friend)
{
UBYTE *glyphbm = glyph->glm_BitMap;
struct RastPort rp;
@@ -612,9 +612,9 @@ static struct BitMap *ami_font_glyph_cache_retrieve(struct ami_font_node *font_n
afgn = (struct ami_font_glyph_node *)InsertSkipNode(font_node->glyph_cache,
(APTR)char1, sizeof(struct ami_font_glyph_node));
- afgn->bm = AllocBitMapTags(glyph->glm_BMModulo, glyph->glm_BMRows, 8,
- BMATags_PixelFormat, PIXF_ALPHA8,
- //BMATags_Friend, scrn->RastPort.BitMap,
+ afgn->bm = AllocBitMapTags(glyph->glm_BMModulo, glyph->glm_BMRows, 32,
+ //BMATags_PixelFormat, PIXF_ALPHA8,
+ BMATags_Friend, friend,
//BMATags_Clear, TRUE,
TAG_DONE);
@@ -687,23 +687,24 @@ static inline int32 ami_font_plot_glyph(struct ami_font_node *font_node, struct
if(rp) {
#ifdef __amigaos4__
if(NSA_FONT_COMPOSITE && (template_type == BLITT_ALPHATEMPLATE)) {
- struct BitMap *cached_bm = ami_font_glyph_cache_retrieve(font_node, long_char_1, glyph);
+ struct BitMap *cached_bm = ami_font_glyph_cache_retrieve(font_node, long_char_1, glyph, rp->BitMap);
CompositeTags(COMPOSITE_Src_Over_Dest, COMPSRC_SOLIDCOLOR, rp->BitMap,
COMPTAG_Color0, 0xff000000, /* assume black for now */
COMPTAG_SrcAlphaMask, cached_bm,
- COMPTAG_SrcX, glyph->glm_X0 + glyph->glm_BlackLeft,
- COMPTAG_SrcY, glyph->glm_Y0 + glyph->glm_BlackTop,
+ COMPTAG_SrcX, glyph->glm_BlackLeft, //glyph->glm_X0 + ,
+ COMPTAG_SrcY, glyph->glm_BlackTop, //glyph->glm_Y0 +
COMPTAG_SrcWidth, glyph->glm_BlackWidth,
COMPTAG_SrcHeight, glyph->glm_BlackHeight,
COMPTAG_OffsetX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
- COMPTAG_OffsetY, x - glyph->glm_Y0 + glyph->glm_BlackTop,
+ COMPTAG_OffsetY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
COMPTAG_DestX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
COMPTAG_DestY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
COMPTAG_DestWidth, glyph->glm_BlackWidth,
COMPTAG_DestHeight, glyph->glm_BlackHeight,
COMPTAG_Flags, COMPFLAG_IgnoreDestAlpha,
TAG_DONE);
+
} else {
BltBitMapTags(BLITA_SrcX, glyph->glm_BlackLeft,
BLITA_SrcY, glyph->glm_BlackTop,
@@ -1074,7 +1075,7 @@ void ami_init_fonts(void)
}
#ifdef __amigaos4__
-static void ami_font_del_skiplist(struct SkipList *skiplist)
+static void ami_font_del_skiplist(struct SkipList *skiplist, bool glyph_cache)
{
struct SkipNode *node;
struct SkipNode *nnode;
@@ -1084,7 +1085,12 @@ static void ami_font_del_skiplist(struct SkipList *skiplist)
do {
nnode = GetNextSkipNode(skiplist, node);
- ami_font_close((struct ami_font_node *)node);
+ if(glyph_cache == false) {
+ ami_font_close((struct ami_font_node *)node);
+ } else {
+ struct ami_font_glyph_node *afgn = (struct ami_font_glyph_node *)node;
+ FreeBitMap(afgn->bm);
+ }
} while((node = nnode));
@@ -1097,7 +1103,7 @@ void ami_close_fonts(void)
LOG("Cleaning up font cache");
ami_schedule(-1, (void *)ami_font_cleanup, ami_font_list);
#ifdef __amigaos4__
- ami_font_del_skiplist(ami_font_list);
+ ami_font_del_skiplist(ami_font_list, false);
#else
FreeObjList(ami_font_list);
#endif
@@ -1110,6 +1116,7 @@ void ami_font_close(struct ami_font_node *node)
/* Called from FreeObjList if node type is AMINS_FONT */
CloseOutlineFont(node->font, &ami_diskfontlib_list);
+ ami_font_del_skiplist(node->glyph_cache, true);
}
void ami_font_setdevicedpi(int id)
-----------------------------------------------------------------------
Summary of changes:
amiga/font.c | 29 ++++++++++++++++++-----------
1 file changed, 18 insertions(+), 11 deletions(-)
diff --git a/amiga/font.c b/amiga/font.c
index cba1ee5..e777cd5 100644
--- a/amiga/font.c
+++ b/amiga/font.c
@@ -598,7 +598,7 @@ static struct ami_font_node *ami_open_outline_font(const plot_font_style_t *fsty
#ifdef __amigaos4__
static struct BitMap *ami_font_glyph_cache_retrieve(struct ami_font_node *font_node,
- uint32 char1, struct GlyphMap *glyph)
+ uint32 char1, struct GlyphMap *glyph, struct BitMap *friend)
{
UBYTE *glyphbm = glyph->glm_BitMap;
struct RastPort rp;
@@ -612,9 +612,9 @@ static struct BitMap *ami_font_glyph_cache_retrieve(struct ami_font_node *font_n
afgn = (struct ami_font_glyph_node *)InsertSkipNode(font_node->glyph_cache,
(APTR)char1, sizeof(struct ami_font_glyph_node));
- afgn->bm = AllocBitMapTags(glyph->glm_BMModulo, glyph->glm_BMRows, 8,
- BMATags_PixelFormat, PIXF_ALPHA8,
- //BMATags_Friend, scrn->RastPort.BitMap,
+ afgn->bm = AllocBitMapTags(glyph->glm_BMModulo, glyph->glm_BMRows, 32,
+ //BMATags_PixelFormat, PIXF_ALPHA8,
+ BMATags_Friend, friend,
//BMATags_Clear, TRUE,
TAG_DONE);
@@ -687,23 +687,24 @@ static inline int32 ami_font_plot_glyph(struct ami_font_node *font_node, struct
if(rp) {
#ifdef __amigaos4__
if(NSA_FONT_COMPOSITE && (template_type == BLITT_ALPHATEMPLATE)) {
- struct BitMap *cached_bm = ami_font_glyph_cache_retrieve(font_node, long_char_1, glyph);
+ struct BitMap *cached_bm = ami_font_glyph_cache_retrieve(font_node, long_char_1, glyph, rp->BitMap);
CompositeTags(COMPOSITE_Src_Over_Dest, COMPSRC_SOLIDCOLOR, rp->BitMap,
COMPTAG_Color0, 0xff000000, /* assume black for now */
COMPTAG_SrcAlphaMask, cached_bm,
- COMPTAG_SrcX, glyph->glm_X0 + glyph->glm_BlackLeft,
- COMPTAG_SrcY, glyph->glm_Y0 + glyph->glm_BlackTop,
+ COMPTAG_SrcX, glyph->glm_BlackLeft, //glyph->glm_X0 + ,
+ COMPTAG_SrcY, glyph->glm_BlackTop, //glyph->glm_Y0 +
COMPTAG_SrcWidth, glyph->glm_BlackWidth,
COMPTAG_SrcHeight, glyph->glm_BlackHeight,
COMPTAG_OffsetX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
- COMPTAG_OffsetY, x - glyph->glm_Y0 + glyph->glm_BlackTop,
+ COMPTAG_OffsetY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
COMPTAG_DestX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
COMPTAG_DestY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
COMPTAG_DestWidth, glyph->glm_BlackWidth,
COMPTAG_DestHeight, glyph->glm_BlackHeight,
COMPTAG_Flags, COMPFLAG_IgnoreDestAlpha,
TAG_DONE);
+
} else {
BltBitMapTags(BLITA_SrcX, glyph->glm_BlackLeft,
BLITA_SrcY, glyph->glm_BlackTop,
@@ -1074,7 +1075,7 @@ void ami_init_fonts(void)
}
#ifdef __amigaos4__
-static void ami_font_del_skiplist(struct SkipList *skiplist)
+static void ami_font_del_skiplist(struct SkipList *skiplist, bool glyph_cache)
{
struct SkipNode *node;
struct SkipNode *nnode;
@@ -1084,7 +1085,12 @@ static void ami_font_del_skiplist(struct SkipList *skiplist)
do {
nnode = GetNextSkipNode(skiplist, node);
- ami_font_close((struct ami_font_node *)node);
+ if(glyph_cache == false) {
+ ami_font_close((struct ami_font_node *)node);
+ } else {
+ struct ami_font_glyph_node *afgn = (struct ami_font_glyph_node *)node;
+ FreeBitMap(afgn->bm);
+ }
} while((node = nnode));
@@ -1097,7 +1103,7 @@ void ami_close_fonts(void)
LOG("Cleaning up font cache");
ami_schedule(-1, (void *)ami_font_cleanup, ami_font_list);
#ifdef __amigaos4__
- ami_font_del_skiplist(ami_font_list);
+ ami_font_del_skiplist(ami_font_list, false);
#else
FreeObjList(ami_font_list);
#endif
@@ -1110,6 +1116,7 @@ void ami_font_close(struct ami_font_node *node)
/* Called from FreeObjList if node type is AMINS_FONT */
CloseOutlineFont(node->font, &ami_diskfontlib_list);
+ ami_font_del_skiplist(node->glyph_cache, true);
}
void ami_font_setdevicedpi(int id)
--
NetSurf Browser
8 years, 2 months
netsurf: branch master updated. release/3.3-347-g73c6476
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/73c6476112181bd5e151b...
...commit http://git.netsurf-browser.org/netsurf.git/commit/73c6476112181bd5e151be7...
...tree http://git.netsurf-browser.org/netsurf.git/tree/73c6476112181bd5e151be719...
The branch, master has been updated
via 73c6476112181bd5e151be719dde7d5cd48e14c3 (commit)
from 410f6fdb9ef5e12506dd50ae6dc74ebc4a06dae4 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=73c6476112181bd5e15...
commit 73c6476112181bd5e151be719dde7d5cd48e14c3
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Fix instanceof to be correct and improve documentation of stack contents
diff --git a/javascript/dukky.c b/javascript/dukky.c
index 0358a57..3b7ca47 100644
--- a/javascript/dukky.c
+++ b/javascript/dukky.c
@@ -42,29 +42,30 @@ duk_bool_t
dukky_instanceof_at(duk_context *ctx, duk_idx_t _idx, const char *klass)
{
duk_idx_t idx = duk_normalize_index(ctx, _idx);
- /* ... ??? */
+ /* ... ??? ... */
if (!duk_check_type(ctx, idx, DUK_TYPE_OBJECT)) {
return false;
}
- /* ... obj */
+ /* ... obj ... */
duk_get_global_string(ctx, "\xFF\xFFNETSURF_DUKTAPE_PROTOTYPES");
- /* ... obj protos */
- duk_get_prop_string(ctx, idx, klass);
- /* ... obj protos goalproto */
+ /* ... obj ... protos */
+ duk_get_prop_string(ctx, -1, klass);
+ /* ... obj ... protos goalproto */
duk_get_prototype(ctx, idx);
- /* ... obj protos goalproto proto? */
+ /* ... obj ... protos goalproto proto? */
while (!duk_is_undefined(ctx, -1)) {
if (duk_strict_equals(ctx, -1, -2)) {
duk_pop_3(ctx);
+ /* ... obj ... */
return true;
}
duk_get_prototype(ctx, -1);
- /* ... obj protos goalproto proto proto? */
+ /* ... obj ... protos goalproto proto proto? */
duk_replace(ctx, -2);
- /* ... obj protos goalproto proto? */
+ /* ... obj ... protos goalproto proto? */
}
duk_pop_3(ctx);
- /* ... obj */
+ /* ... obj ... */
return false;
}
-----------------------------------------------------------------------
Summary of changes:
javascript/dukky.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/javascript/dukky.c b/javascript/dukky.c
index 0358a57..3b7ca47 100644
--- a/javascript/dukky.c
+++ b/javascript/dukky.c
@@ -42,29 +42,30 @@ duk_bool_t
dukky_instanceof_at(duk_context *ctx, duk_idx_t _idx, const char *klass)
{
duk_idx_t idx = duk_normalize_index(ctx, _idx);
- /* ... ??? */
+ /* ... ??? ... */
if (!duk_check_type(ctx, idx, DUK_TYPE_OBJECT)) {
return false;
}
- /* ... obj */
+ /* ... obj ... */
duk_get_global_string(ctx, "\xFF\xFFNETSURF_DUKTAPE_PROTOTYPES");
- /* ... obj protos */
- duk_get_prop_string(ctx, idx, klass);
- /* ... obj protos goalproto */
+ /* ... obj ... protos */
+ duk_get_prop_string(ctx, -1, klass);
+ /* ... obj ... protos goalproto */
duk_get_prototype(ctx, idx);
- /* ... obj protos goalproto proto? */
+ /* ... obj ... protos goalproto proto? */
while (!duk_is_undefined(ctx, -1)) {
if (duk_strict_equals(ctx, -1, -2)) {
duk_pop_3(ctx);
+ /* ... obj ... */
return true;
}
duk_get_prototype(ctx, -1);
- /* ... obj protos goalproto proto proto? */
+ /* ... obj ... protos goalproto proto proto? */
duk_replace(ctx, -2);
- /* ... obj protos goalproto proto? */
+ /* ... obj ... protos goalproto proto? */
}
duk_pop_3(ctx);
- /* ... obj */
+ /* ... obj ... */
return false;
}
--
NetSurf Browser
8 years, 2 months
netsurf: branch chris/composite-text-exp updated. release/3.3-348-g77ac348
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/77ac348b052aa41954254...
...commit http://git.netsurf-browser.org/netsurf.git/commit/77ac348b052aa4195425489...
...tree http://git.netsurf-browser.org/netsurf.git/tree/77ac348b052aa419542548994...
The branch, chris/composite-text-exp has been updated
discards a38c002968254f5948e371dcea78f0bad966f9f4 (commit)
via 77ac348b052aa41954254899429c9ab3ef61d5e9 (commit)
via 698f8e77b9adf58f08da29479ad963b25eb95a50 (commit)
via 410f6fdb9ef5e12506dd50ae6dc74ebc4a06dae4 (commit)
via 1a43dd21b38805424d717c68a95635d4386bd6d8 (commit)
via 1f07c457401a6d944c26319571beb32f3b9009f5 (commit)
via d137bda4547ec6ecc07dec4c32097428f022ed7c (commit)
via e5c34567dcb6a8693f67163bb46f32fa2acc4811 (commit)
via d1ccd3e53d45071b9c715aaacf9d60e261701957 (commit)
via de75959362f83adee9f7b879fe5e76701575af7c (commit)
via 1e83301251beed8fd0450a2a0d71d8a9451ccc46 (commit)
via 1a8cf5b7a7e9982c859364638e6ae4b6ed1cfd93 (commit)
via 5b880e586c9358db0ae86bb95edb2559f16d5da4 (commit)
via eb366fa0d8cebc235e77f0279b9bc955af3ee1bc (commit)
via 6a002558551b5dd57c062268079aef7a63f444e7 (commit)
via 63227a214bb8e0f576ecb684313e5f3a3bdcf96f (commit)
via 00aa1e2d3501ee0a004415a56a845db51c660ef4 (commit)
via 46f3670fae57fb1b05a1d8304f500b0ac3350b16 (commit)
via 7ea2488d1c2ca066f3c48de0ef874a5dfeb368b4 (commit)
via 12bef8a0d94984dd99250f0c04677833d4302203 (commit)
via da5638debc89f510bfd2f018bb81563f097b9de3 (commit)
via a15e5a7869e8c14b0c4351eef168b88285cc05b4 (commit)
via 41f219192c6a9ee34a14d0cb149946eff9eeec50 (commit)
via cdaae7b30e22373b99117438a15e062e8749688d (commit)
via 944248ce3205881df9268d2c3f9f0cb52fc2f075 (commit)
via 52d182e71e3098148b98e7ae24b7740305960634 (commit)
via 2e4bfc5dc3ae3d6c13fbc6f956b611354ed37257 (commit)
This update added new revisions after undoing existing revisions. That is
to say, the old revision is not a strict subset of the new revision. This
situation occurs when you --force push a change and generate a repository
containing something like this:
* -- * -- B -- O -- O -- O (a38c002968254f5948e371dcea78f0bad966f9f4)
\
N -- N -- N (77ac348b052aa41954254899429c9ab3ef61d5e9)
When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=77ac348b052aa419542...
commit 77ac348b052aa41954254899429c9ab3ef61d5e9
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
non-functional experimental glyph cache
diff --git a/amiga/font.c b/amiga/font.c
index 43d98ca..cba1ee5 100644
--- a/amiga/font.c
+++ b/amiga/font.c
@@ -69,10 +69,13 @@
#define NSA_FONT_EMWIDTH(s) (s / FONT_SIZE_SCALE) * (ami_xdpi / 72.0)
-struct ami_font_node
-{
+#define NSA_FONT_COMPOSITE (GfxBase->LibNode.lib_Version >= 54) && \
+ (nsoption_bool(exp_comp_fonts) == true)
+
+struct ami_font_node {
#ifdef __amigaos4__
struct SkipNode skip_node;
+ struct SkipList *glyph_cache;
#endif
struct OutlineFont *font;
char *bold;
@@ -81,6 +84,14 @@ struct ami_font_node
struct TimeVal lastused;
};
+struct ami_font_glyph_node
+{
+#ifdef __amigaos4__
+ struct SkipNode skip_node;
+#endif
+ struct BitMap *bm;
+};
+
const uint16 sc_table[] = {
0x0061, 0x1D00, /* a */
0x0062, 0x0299, /* b */
@@ -149,7 +160,9 @@ const uint16 sc_table[] = {
0, 0};
#ifdef __amigaos4__
-struct SkipList *ami_font_list = NULL;
+static struct SkipList *ami_font_list = NULL;
+static struct Hook ami_font_cache_hook;
+static struct Hook ami_font_glyph_cache_hook;
#else
struct MinList *ami_font_list = NULL;
#endif
@@ -157,13 +170,12 @@ struct List ami_diskfontlib_list;
lwc_string *glypharray[0xffff + 1];
ULONG ami_devicedpi;
ULONG ami_xdpi;
-static struct Hook ami_font_cache_hook;
-static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPort *rp,
+static inline int32 ami_font_plot_glyph(struct ami_font_node *ofont, struct RastPort *rp,
uint16 *char1, uint16 *char2, uint32 x, uint32 y, uint32 emwidth, bool aa);
static inline int32 ami_font_width_glyph(struct OutlineFont *ofont,
const uint16 *char1, const uint16 *char2, uint32 emwidth);
-static struct OutlineFont *ami_open_outline_font(const plot_font_style_t *fstyle,
+static struct ami_font_node *ami_open_outline_font(const plot_font_style_t *fstyle,
const uint16 *codepoint);
static inline ULONG ami_font_unicode_width(const char *string, ULONG length,
const plot_font_style_t *fstyle, ULONG x, ULONG y, bool aa);
@@ -215,7 +227,7 @@ static inline bool amiga_nsfont_position_in_string(const plot_font_style_t *fsty
{
uint16 *utf16 = NULL, *outf16 = NULL;
uint16 *utf16next = NULL;
- struct OutlineFont *ofont, *ufont = NULL;
+ struct ami_font_node *ofont, *ufont = NULL;
int tx = 0;
uint32 utf8_pos = 0;
int utf16charlen;
@@ -233,14 +245,14 @@ static inline bool amiga_nsfont_position_in_string(const plot_font_style_t *fsty
utf16charlen = amiga_nsfont_utf16_char_length(utf16);
utf16next = &utf16[utf16charlen];
- tempx = ami_font_width_glyph(ofont, utf16, utf16next, emwidth);
+ tempx = ami_font_width_glyph(ofont->font, utf16, utf16next, emwidth);
if (tempx == 0) {
if (ufont == NULL)
ufont = ami_open_outline_font(fstyle, utf16);
if (ufont)
- tempx = ami_font_width_glyph(ufont, utf16,
+ tempx = ami_font_width_glyph(ufont->font, utf16,
utf16next, emwidth);
}
@@ -299,7 +311,7 @@ static inline bool amiga_nsfont_split(const plot_font_style_t *fstyle,
uint16 *utf16_str = NULL;
const uint16 *utf16 = NULL;
const uint16 *utf16next = NULL;
- struct OutlineFont *ofont, *ufont = NULL;
+ struct ami_font_node *ofont, *ufont = NULL;
int tx = 0;
uint32 utf8_pos = 0;
int32 tempx = 0;
@@ -325,14 +337,14 @@ static inline bool amiga_nsfont_split(const plot_font_style_t *fstyle,
else
utf16next = utf16 + 2;
- tempx = ami_font_width_glyph(ofont, utf16, utf16next, emwidth);
+ tempx = ami_font_width_glyph(ofont->font, utf16, utf16next, emwidth);
if (tempx == 0) {
if (ufont == NULL)
ufont = ami_open_outline_font(fstyle, utf16);
if (ufont)
- tempx = ami_font_width_glyph(ufont, utf16,
+ tempx = ami_font_width_glyph(ufont->font, utf16,
utf16next, emwidth);
}
@@ -433,6 +445,10 @@ static struct ami_font_node *ami_font_open(const char *font, bool critical)
node->objstruct = nodedata;
node->dtz_Node.ln_Name = strdup(font);
}
+#else
+ if(NSA_FONT_COMPOSITE) {
+ nodedata->glyph_cache = CreateSkipList(&ami_font_glyph_cache_hook, 10);
+ }
#endif
return nodedata;
@@ -445,7 +461,7 @@ static struct ami_font_node *ami_font_open(const char *font, bool critical)
* \param codepoint open a default font instead of the one specified by fstyle
* \return outline font or NULL on error
*/
-static struct OutlineFont *ami_open_outline_font(const plot_font_style_t *fstyle,
+static struct ami_font_node *ami_open_outline_font(const plot_font_style_t *fstyle,
const uint16 *codepoint)
{
struct ami_font_node *node;
@@ -560,6 +576,7 @@ static struct OutlineFont *ami_open_outline_font(const plot_font_style_t *fstyle
ofont = node->font;
} else {
ofont = designed_node->font;
+ node = designed_node;
}
#ifndef __amigaos4__
@@ -574,12 +591,45 @@ static struct OutlineFont *ami_open_outline_font(const plot_font_style_t *fstyle
OT_ShearSin, shearsin,
OT_ShearCos, shearcos,
TAG_END) == OTERR_Success)
- return ofont;
+ return node;
return NULL;
}
-static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPort *rp,
+#ifdef __amigaos4__
+static struct BitMap *ami_font_glyph_cache_retrieve(struct ami_font_node *font_node,
+ uint32 char1, struct GlyphMap *glyph)
+{
+ UBYTE *glyphbm = glyph->glm_BitMap;
+ struct RastPort rp;
+ struct ami_font_glyph_node *afgn;
+
+ // check cache
+ if((afgn = (struct ami_font_glyph_node *)FindSkipNode(font_node->glyph_cache, (APTR)char1))) {
+ return afgn->bm;
+ }
+
+ afgn = (struct ami_font_glyph_node *)InsertSkipNode(font_node->glyph_cache,
+ (APTR)char1, sizeof(struct ami_font_glyph_node));
+
+ afgn->bm = AllocBitMapTags(glyph->glm_BMModulo, glyph->glm_BMRows, 8,
+ BMATags_PixelFormat, PIXF_ALPHA8,
+ //BMATags_Friend, scrn->RastPort.BitMap,
+ //BMATags_Clear, TRUE,
+ TAG_DONE);
+
+ InitRastPort(&rp);
+ rp.BitMap = afgn->bm;
+
+ WritePixelArray(glyphbm, 0, 0,
+ glyph->glm_BMModulo, PIXF_ALPHA8, &rp,
+ 0, 0, glyph->glm_BMModulo, glyph->glm_BMRows);
+
+ return afgn->bm;
+}
+#endif
+
+static inline int32 ami_font_plot_glyph(struct ami_font_node *font_node, struct RastPort *rp,
uint16 *char1, uint16 *char2, uint32 x, uint32 y, uint32 emwidth, bool aa)
{
struct GlyphMap *glyph;
@@ -589,6 +639,7 @@ static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPo
ULONG glyphmaptag;
ULONG template_type;
uint32 long_char_1 = 0, long_char_2 = 0;
+ struct OutlineFont *ofont = font_node->font;
#ifndef __amigaos4__
struct BulletBase *BulletBase = ofont->BulletBase;
#endif
@@ -635,25 +686,18 @@ static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPo
if(rp) {
#ifdef __amigaos4__
- if((GfxBase->LibNode.lib_Version >= 54) &&
- (template_type == BLITT_ALPHATEMPLATE) &&
- (nsoption_bool(exp_comp_fonts) == true)) {
-
- WritePixelArray(glyphbm, glyph->glm_BlackLeft, glyph->glm_BlackTop,
- glyph->glm_BMModulo, PIXF_ALPHA8, rp,
- x - glyph->glm_X0 + glyph->glm_BlackLeft,
- y - glyph->glm_Y0 + glyph->glm_BlackTop,
- glyph->glm_BlackWidth, glyph->glm_BlackHeight);
+ if(NSA_FONT_COMPOSITE && (template_type == BLITT_ALPHATEMPLATE)) {
+ struct BitMap *cached_bm = ami_font_glyph_cache_retrieve(font_node, long_char_1, glyph);
CompositeTags(COMPOSITE_Src_Over_Dest, COMPSRC_SOLIDCOLOR, rp->BitMap,
COMPTAG_Color0, 0xff000000, /* assume black for now */
- COMPTAG_SrcAlphaMask, rp->BitMap,
- COMPTAG_SrcX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
- COMPTAG_SrcY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
+ COMPTAG_SrcAlphaMask, cached_bm,
+ COMPTAG_SrcX, glyph->glm_X0 + glyph->glm_BlackLeft,
+ COMPTAG_SrcY, glyph->glm_Y0 + glyph->glm_BlackTop,
COMPTAG_SrcWidth, glyph->glm_BlackWidth,
COMPTAG_SrcHeight, glyph->glm_BlackHeight,
COMPTAG_OffsetX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
- COMPTAG_OffsetY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
+ COMPTAG_OffsetY, x - glyph->glm_Y0 + glyph->glm_BlackTop,
COMPTAG_DestX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
COMPTAG_DestY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
COMPTAG_DestWidth, glyph->glm_BlackWidth,
@@ -807,7 +851,7 @@ ULONG ami_font_unicode_text(struct RastPort *rp, const char *string, ULONG lengt
uint16 *utf16charsc = 0, *utf16nextsc = 0;
uint16 *utf16next = 0;
int utf16charlen;
- struct OutlineFont *ofont, *ufont = NULL;
+ struct ami_font_node *ofont, *ufont = NULL;
uint32 x=0;
int32 tempx = 0;
ULONG emwidth = (ULONG)NSA_FONT_EMWIDTH(fstyle->size);
@@ -873,7 +917,7 @@ static inline ULONG ami_font_unicode_width(const char *string, ULONG length,
uint16 *utf16charsc = 0, *utf16nextsc = 0;
uint16 *utf16next = 0;
int utf16charlen;
- struct OutlineFont *ofont, *ufont = NULL;
+ struct ami_font_node *ofont, *ufont = NULL;
uint32 x=0;
int32 tempx = 0;
ULONG emwidth = (ULONG)NSA_FONT_EMWIDTH(fstyle->size);
@@ -895,12 +939,12 @@ static inline ULONG ami_font_unicode_width(const char *string, ULONG length,
utf16charsc = (uint16 *)ami_font_translate_smallcaps(utf16);
utf16nextsc = (uint16 *)ami_font_translate_smallcaps(utf16next);
- tempx = ami_font_width_glyph(ofont, utf16charsc, utf16nextsc, emwidth);
+ tempx = ami_font_width_glyph(ofont->font, utf16charsc, utf16nextsc, emwidth);
}
else tempx = 0;
if(tempx == 0) {
- tempx = ami_font_width_glyph(ofont, utf16, utf16next, emwidth);
+ tempx = ami_font_width_glyph(ofont->font, utf16, utf16next, emwidth);
}
if(tempx == 0)
@@ -912,7 +956,7 @@ static inline ULONG ami_font_unicode_width(const char *string, ULONG length,
if(ufont)
{
- tempx = ami_font_width_glyph(ufont, utf16, utf16next, emwidth);
+ tempx = ami_font_width_glyph(ufont->font, utf16, utf16next, emwidth);
}
}
@@ -945,6 +989,11 @@ static LONG ami_font_cache_sort(struct Hook *hook, APTR key1, APTR key2)
{
return stricmp(key1, key2);
}
+
+static LONG ami_font_glyph_cache_sort(struct Hook *hook, APTR key1, APTR key2)
+{
+ return (int)key2 - (int)key1;
+}
#endif
#ifdef __amigaos4__
@@ -1009,6 +1058,8 @@ void ami_init_fonts(void)
/* Initialise font caching etc lists */
#ifdef __amigaos4__
+ ami_font_glyph_cache_hook.h_Entry = (HOOKFUNC)ami_font_glyph_cache_sort;
+ ami_font_glyph_cache_hook.h_Data = 0;
ami_font_cache_hook.h_Entry = (HOOKFUNC)ami_font_cache_sort;
ami_font_cache_hook.h_Data = 0;
ami_font_list = CreateSkipList(&ami_font_cache_hook, 8);
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=698f8e77b9adf58f08d...
commit 698f8e77b9adf58f08da29479ad963b25eb95a50
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Experimental composited text
diff --git a/amiga/font.c b/amiga/font.c
index 7569bb6..43d98ca 100644
--- a/amiga/font.c
+++ b/amiga/font.c
@@ -635,18 +635,45 @@ static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPo
if(rp) {
#ifdef __amigaos4__
- BltBitMapTags(BLITA_SrcX, glyph->glm_BlackLeft,
- BLITA_SrcY, glyph->glm_BlackTop,
- BLITA_DestX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
- BLITA_DestY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
- BLITA_Width, glyph->glm_BlackWidth,
- BLITA_Height, glyph->glm_BlackHeight,
- BLITA_Source, glyphbm,
- BLITA_SrcType, template_type,
- BLITA_Dest, rp,
- BLITA_DestType, BLITT_RASTPORT,
- BLITA_SrcBytesPerRow, glyph->glm_BMModulo,
+ if((GfxBase->LibNode.lib_Version >= 54) &&
+ (template_type == BLITT_ALPHATEMPLATE) &&
+ (nsoption_bool(exp_comp_fonts) == true)) {
+
+ WritePixelArray(glyphbm, glyph->glm_BlackLeft, glyph->glm_BlackTop,
+ glyph->glm_BMModulo, PIXF_ALPHA8, rp,
+ x - glyph->glm_X0 + glyph->glm_BlackLeft,
+ y - glyph->glm_Y0 + glyph->glm_BlackTop,
+ glyph->glm_BlackWidth, glyph->glm_BlackHeight);
+
+ CompositeTags(COMPOSITE_Src_Over_Dest, COMPSRC_SOLIDCOLOR, rp->BitMap,
+ COMPTAG_Color0, 0xff000000, /* assume black for now */
+ COMPTAG_SrcAlphaMask, rp->BitMap,
+ COMPTAG_SrcX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
+ COMPTAG_SrcY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
+ COMPTAG_SrcWidth, glyph->glm_BlackWidth,
+ COMPTAG_SrcHeight, glyph->glm_BlackHeight,
+ COMPTAG_OffsetX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
+ COMPTAG_OffsetY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
+ COMPTAG_DestX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
+ COMPTAG_DestY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
+ COMPTAG_DestWidth, glyph->glm_BlackWidth,
+ COMPTAG_DestHeight, glyph->glm_BlackHeight,
+ COMPTAG_Flags, COMPFLAG_IgnoreDestAlpha,
+ TAG_DONE);
+ } else {
+ BltBitMapTags(BLITA_SrcX, glyph->glm_BlackLeft,
+ BLITA_SrcY, glyph->glm_BlackTop,
+ BLITA_DestX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
+ BLITA_DestY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
+ BLITA_Width, glyph->glm_BlackWidth,
+ BLITA_Height, glyph->glm_BlackHeight,
+ BLITA_Source, glyphbm,
+ BLITA_SrcType, template_type,
+ BLITA_Dest, rp,
+ BLITA_DestType, BLITT_RASTPORT,
+ BLITA_SrcBytesPerRow, glyph->glm_BMModulo,
TAG_DONE);
+ }
#else
/* On OS3 the glyph needs to be in chip RAM */
void *chip_glyph = AllocVec(glyph->glm_BMModulo * glyph->glm_BMRows, MEMF_CHIP);
diff --git a/amiga/options.h b/amiga/options.h
index 317e5df..ec8a41b 100644
--- a/amiga/options.h
+++ b/amiga/options.h
@@ -63,7 +63,8 @@ NSOPTION_STRING(font_surrogate, NULL)
NSOPTION_STRING(font_unicode_file, NULL)
NSOPTION_BOOL(font_unicode_only, false)
NSOPTION_BOOL(font_antialiasing, true)
-NSOPTION_BOOL(use_diskfont, false)
+NSOPTION_BOOL(use_diskfont, false) /* experimental */
+NSOPTION_BOOL(exp_comp_fonts, false) /* experimental */
NSOPTION_BOOL(drag_save_icons, true)
NSOPTION_INTEGER(hotlist_window_xpos, 0)
NSOPTION_INTEGER(hotlist_window_ypos, 0)
-----------------------------------------------------------------------
Summary of changes:
amiga/Makefile.target | 5 +-
amiga/bitmap.h | 1 +
amiga/clipboard.c | 2 +-
amiga/clipboard.h | 2 +-
amiga/context_menu.c | 1340 --------------------------------
amiga/ctxmenu.c | 557 +++++++++++++
amiga/ctxmenu.h | 92 +++
amiga/font.c | 117 ++-
amiga/gui.c | 206 ++---
amiga/gui.h | 21 +-
amiga/gui_options.c | 31 +-
amiga/libs.c | 12 +-
amiga/menu.c | 51 +-
amiga/menu.h | 7 +-
amiga/options.h | 1 -
amiga/os3support.h | 2 +
amiga/selectmenu.c | 200 +++++
amiga/{context_menu.h => selectmenu.h} | 20 +-
javascript/duktape/Location.bnd | 206 +++++
javascript/duktape/Window.bnd | 19 +
javascript/duktape/netsurf.bnd | 2 +
render/box_construct.c | 1 +
render/form.h | 1 +
resources/FatMessages | 11 +
24 files changed, 1296 insertions(+), 1611 deletions(-)
delete mode 100644 amiga/context_menu.c
create mode 100644 amiga/ctxmenu.c
create mode 100644 amiga/ctxmenu.h
mode change 100755 => 100644 amiga/gui.h
create mode 100644 amiga/selectmenu.c
rename amiga/{context_menu.h => selectmenu.h} (74%)
create mode 100644 javascript/duktape/Location.bnd
diff --git a/amiga/Makefile.target b/amiga/Makefile.target
index e704eb5..29b3905 100644
--- a/amiga/Makefile.target
+++ b/amiga/Makefile.target
@@ -70,12 +70,13 @@ MESSAGES_FILTER=ami
S_AMIGA := gui.c tree.c history.c hotlist.c schedule.c file.c \
misc.c bitmap.c font.c filetype.c utf8.c login.c \
plotters.c object.c menu.c save_pdf.c arexx.c version.c \
- cookies.c context_menu.c clipboard.c help.c font_scan.c \
+ cookies.c ctxmenu.c clipboard.c help.c font_scan.c \
launch.c search.c history_local.c download.c iff_dr2d.c \
sslcert.c gui_options.c print.c theme.c drag.c icon.c libs.c \
datatypes.c dt_picture.c dt_anim.c dt_sound.c plugin_hack.c \
stringview/stringview.c stringview/urlhistory.c rtg.c \
- agclass/amigaguide_class.c os3support.c font_bitmap.c
+ agclass/amigaguide_class.c os3support.c font_bitmap.c \
+ selectmenu.c
S_AMIGA := $(addprefix amiga/,$(S_AMIGA))
# This is the final source build list
diff --git a/amiga/bitmap.h b/amiga/bitmap.h
index f270871..ff1b01c 100755
--- a/amiga/bitmap.h
+++ b/amiga/bitmap.h
@@ -19,6 +19,7 @@
#ifndef AMIGA_BITMAP_H
#define AMIGA_BITMAP_H
+#include <stdbool.h>
#include <exec/types.h>
#include <proto/graphics.h>
#include <intuition/classusr.h>
diff --git a/amiga/clipboard.c b/amiga/clipboard.c
index 7495398..10f0faf 100644
--- a/amiga/clipboard.c
+++ b/amiga/clipboard.c
@@ -327,7 +327,7 @@ void ami_drag_selection(struct gui_window *g)
}
}
-bool ami_easy_clipboard(char *text)
+bool ami_easy_clipboard(const char *text)
{
gui_set_clipboard(text, strlen(text), NULL, 0);
return true;
diff --git a/amiga/clipboard.h b/amiga/clipboard.h
index db6fc35..bc5b779 100755
--- a/amiga/clipboard.h
+++ b/amiga/clipboard.h
@@ -34,7 +34,7 @@ void gui_start_selection(struct gui_window *g);
void ami_clipboard_init(void);
void ami_clipboard_free(void);
void ami_drag_selection(struct gui_window *g);
-bool ami_easy_clipboard(char *text);
+bool ami_easy_clipboard(const char *text);
bool ami_easy_clipboard_bitmap(struct bitmap *bitmap);
#ifdef WITH_NS_SVG
bool ami_easy_clipboard_svg(struct hlcache_handle *c);
diff --git a/amiga/context_menu.c b/amiga/context_menu.c
deleted file mode 100644
index 9a10a25..0000000
--- a/amiga/context_menu.c
+++ /dev/null
@@ -1,1340 +0,0 @@
-/*
- * Copyright 2008 - 2011 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifdef __amigaos4__
-
-#include <proto/popupmenu.h>
-#include <proto/intuition.h>
-#include <proto/asl.h>
-#include <proto/dos.h>
-#include <proto/exec.h>
-#include <reaction/reaction_macros.h>
-#include <string.h>
-
-#include "utils/nsoption.h"
-#include "utils/utf8.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
-#include "render/form.h"
-#include "desktop/browser_history.h"
-#include "desktop/browser.h"
-#include "desktop/hotlist.h"
-#include "desktop/searchweb.h"
-#include "desktop/textinput.h"
-#include "desktop/gui_window.h"
-
-#include "amiga/clipboard.h"
-#include "amiga/bitmap.h"
-#include "amiga/file.h"
-#include "amiga/filetype.h"
-#include "amiga/gui.h"
-#include "amiga/history_local.h"
-#include "amiga/iff_dr2d.h"
-#include "amiga/plugin_hack.h"
-#include "amiga/theme.h"
-#include "amiga/tree.h"
-#include "amiga/utf8.h"
-#include "amiga/context_menu.h"
-
-
-HOOKF(uint32, ami_context_menu_hook, Object *, item, APTR);
-HOOKF(uint32, ami_popup_hook, Object *, item, APTR);
-
-static bool ami_context_menu_history(const struct browser_window *bw, int x0, int y0,
- int x1, int y1, const struct history_entry *entry, void *user_data);
-
-enum {
- CMID_SELECTFILE,
- CMID_COPYURL,
- CMID_URLOPEN,
- CMID_URLOPENWIN,
- CMID_URLOPENTAB,
- CMID_URLHOTLIST,
- CMID_SAVEURL,
- CMID_SHOWOBJ,
- CMID_COPYOBJ,
- CMID_CLIPOBJ,
- CMID_SAVEOBJ,
- CMID_SAVEIFFOBJ,
- CMID_RELOADOBJ,
- CMID_SELALL,
- CMID_SELCLEAR,
- CMID_SELCUT,
- CMID_SELCOPY,
- CMID_SELPASTE,
- CMID_SELSEARCH,
- CMID_SELSAVE,
- CMID_FRAMEWIN,
- CMID_FRAMETAB,
- CMID_FRAMESHOW,
- CMID_FRAMERELOAD,
- CMID_FRAMECOPYURL,
- CMID_FRAMESAVE,
- CMID_FRAMESAVECOMPLETE,
- CMID_PLUGINCMD,
- CMID_NAVHOME,
- CMID_NAVBACK,
- CMID_NAVFORWARD,
- CMID_NAVRELOAD,
- CMID_NAVSTOP,
- CMID_PAGEOPEN,
- CMID_PAGESAVE,
- CMID_PAGESAVECOMPLETE,
- CMID_PAGEHOTLIST,
- CMID_PAGECLOSE,
-
- CMID_TREE_EXPAND,
- CMID_TREE_COLLAPSE,
- CMID_TREE_LAUNCH,
- CMID_TREE_NEWFOLDER,
- CMID_TREE_NEWITEM,
- CMID_TREE_SETDEFAULT,
- CMID_TREE_CLEARDEFAULT,
- CMID_TREE_DELETE,
- CMID_TREE_EDITTITLE,
- CMID_TREE_EDITLINK,
- CMID_TREE_EDITFOLDER,
- CMID_TREE_ADDHOTLIST,
-
- CMSUB_OBJECT,
- CMSUB_URL,
- CMSUB_SEL,
- CMSUB_PAGE,
- CMSUB_FRAME,
- CMSUB_NAVIGATE,
- CMID_HISTORY,
- CMID_LAST
-};
-
-struct ami_file_input_menu_data {
- int x;
- int y;
- struct browser_window *bw;
-};
-
-struct Library *PopupMenuBase = NULL;
-struct PopupMenuIFace *IPopupMenu = NULL;
-static char *ctxmenulab[CMID_LAST];
-static Object *ctxmenuobj = NULL;
-static struct Hook ctxmenuhook;
-
-void ami_context_menu_init(void)
-{
- if((PopupMenuBase = OpenLibrary("popupmenu.class",0))) {
- IPopupMenu = (struct PopupMenuIFace *)GetInterface(PopupMenuBase,"main",1,NULL);
- }
-
- ctxmenulab[CMID_SELECTFILE] = ami_utf8_easy((char *)messages_get("SelectFile"));
-
- ctxmenulab[CMID_SHOWOBJ] = ami_utf8_easy((char *)messages_get("ObjShow"));
- ctxmenulab[CMID_RELOADOBJ] = ami_utf8_easy((char *)messages_get("ObjReload"));
- ctxmenulab[CMID_COPYOBJ] = ami_utf8_easy((char *)messages_get("CopyURL"));
- ctxmenulab[CMID_CLIPOBJ] = ami_utf8_easy((char *)messages_get("CopyClip"));
- ctxmenulab[CMID_SAVEOBJ] = ami_utf8_easy((char *)messages_get("SaveAs"));
- ctxmenulab[CMID_SAVEIFFOBJ] = ami_utf8_easy((char *)messages_get("SaveIFF"));
-
- ctxmenulab[CMID_PAGEOPEN] = ami_utf8_easy((char *)messages_get("OpenFile"));
- ctxmenulab[CMID_PAGESAVE] = ami_utf8_easy((char *)messages_get("SaveAs"));
- ctxmenulab[CMID_PAGESAVECOMPLETE] = ami_utf8_easy((char *)messages_get("SaveComplete"));
- ctxmenulab[CMID_PAGEHOTLIST] = ami_utf8_easy((char *)messages_get("HotlistAdd"));
- ctxmenulab[CMID_PAGECLOSE] = ami_utf8_easy((char *)messages_get("Close"));
-
- ctxmenulab[CMID_FRAMEWIN] = ami_utf8_easy((char *)messages_get("FrameNewWin"));
- ctxmenulab[CMID_FRAMETAB] = ami_utf8_easy((char *)messages_get("FrameNewTab"));
- ctxmenulab[CMID_FRAMESHOW] = ami_utf8_easy((char *)messages_get("FrameOnly"));
- ctxmenulab[CMID_FRAMESAVE] = ami_utf8_easy((char *)messages_get("SaveAs"));
- ctxmenulab[CMID_FRAMESAVECOMPLETE] = ami_utf8_easy((char *)messages_get("SaveComplete"));
- ctxmenulab[CMID_FRAMECOPYURL] = ami_utf8_easy((char *)messages_get("CopyURL"));
- ctxmenulab[CMID_FRAMERELOAD] = ami_utf8_easy((char *)messages_get("ObjReload"));
-
- ctxmenulab[CMID_SAVEURL] = ami_utf8_easy((char *)messages_get("LinkDload"));
- ctxmenulab[CMID_URLOPEN] = ami_utf8_easy((char *)messages_get("Open"));
- ctxmenulab[CMID_URLOPENWIN] = ami_utf8_easy((char *)messages_get("LinkNewWin"));
- ctxmenulab[CMID_URLOPENTAB] = ami_utf8_easy((char *)messages_get("LinkNewTab"));
- ctxmenulab[CMID_URLHOTLIST] = ami_utf8_easy((char *)messages_get("HotlistAdd"));
- ctxmenulab[CMID_COPYURL] = ami_utf8_easy((char *)messages_get("CopyURL"));
-
- ctxmenulab[CMID_NAVHOME] = ami_utf8_easy((char *)messages_get("Home"));
- ctxmenulab[CMID_NAVBACK] = ami_utf8_easy((char *)messages_get("Back"));
- ctxmenulab[CMID_NAVFORWARD] = ami_utf8_easy((char *)messages_get("Forward"));
- ctxmenulab[CMID_NAVRELOAD] = ami_utf8_easy((char *)messages_get("ObjReload"));
- ctxmenulab[CMID_NAVSTOP] = ami_utf8_easy((char *)messages_get("Stop"));
-
- ctxmenulab[CMID_SELCUT] = ami_utf8_easy((char *)messages_get("CutNS"));
- ctxmenulab[CMID_SELCOPY] = ami_utf8_easy((char *)messages_get("CopyNS"));
- ctxmenulab[CMID_SELPASTE] = ami_utf8_easy((char *)messages_get("PasteNS"));
- ctxmenulab[CMID_SELALL] = ami_utf8_easy((char *)messages_get("SelectAllNS"));
- ctxmenulab[CMID_SELCLEAR] = ami_utf8_easy((char *)messages_get("ClearNS"));
- ctxmenulab[CMID_SELSEARCH] = ami_utf8_easy((char *)messages_get("SearchWeb"));
- ctxmenulab[CMID_SELSAVE] = ami_utf8_easy((char *)messages_get("SaveAs"));
-
- ctxmenulab[CMID_PLUGINCMD] = ami_utf8_easy((char *)messages_get("ExternalApp"));
-
- ctxmenulab[CMSUB_PAGE] = ami_utf8_easy((char *)messages_get("Page"));
- ctxmenulab[CMSUB_FRAME] = ami_utf8_easy((char *)messages_get("Frame"));
- ctxmenulab[CMSUB_OBJECT] = ami_utf8_easy((char *)messages_get("Object"));
- ctxmenulab[CMSUB_NAVIGATE] = ami_utf8_easy((char *)messages_get("Navigate"));
- ctxmenulab[CMSUB_URL] = ami_utf8_easy((char *)messages_get("Link"));
- ctxmenulab[CMSUB_SEL] = ami_utf8_easy((char *)messages_get("Selection"));
-
- /* Back button */
- ctxmenulab[CMID_HISTORY] = ami_utf8_easy((char *)messages_get("HistLocalNS"));
-
- /* treeviews */
- ctxmenulab[CMID_TREE_EXPAND] = ami_utf8_easy((char *)messages_get("Expand"));
- ctxmenulab[CMID_TREE_COLLAPSE] = ami_utf8_easy((char *)messages_get("Collapse"));
- ctxmenulab[CMID_TREE_LAUNCH] = ami_utf8_easy((char *)messages_get("TreeLaunch"));
- ctxmenulab[CMID_TREE_NEWFOLDER] = ami_utf8_easy((char *)messages_get("TreeNewFolder"));
- ctxmenulab[CMID_TREE_NEWITEM] = ami_utf8_easy((char *)messages_get("TreeNewLink"));
- ctxmenulab[CMID_TREE_SETDEFAULT] = ami_utf8_easy((char *)messages_get("TreeDefault"));
- ctxmenulab[CMID_TREE_CLEARDEFAULT] = ami_utf8_easy((char *)messages_get("TreeClear"));
- ctxmenulab[CMID_TREE_DELETE] = ami_utf8_easy((char *)messages_get("TreeDelete"));
- ctxmenulab[CMID_TREE_EDITTITLE] = ami_utf8_easy((char *)messages_get("EditTitle"));
- ctxmenulab[CMID_TREE_EDITLINK] = ami_utf8_easy((char *)messages_get("EditLink"));
- ctxmenulab[CMID_TREE_EDITFOLDER] = ami_utf8_easy((char *)messages_get("EditFolder"));
- ctxmenulab[CMID_TREE_ADDHOTLIST] = ami_utf8_easy((char *)messages_get("HotlistAdd"));
-
-}
-
-static void ami_context_menu_add_submenu(Object *ctxmenuobj, ULONG cmsub, void *userdata)
-{
- /*
- * CMSUB_PAGE - userdata = hlcache_object *
- * CMSUB_FRAME - userdata = hlcache_object *
- * CMSUB_URL - userdata = char *
- * CMSUB_OBJECT - userdata = hlcache_object *
- * CMSUB_SEL - userdata = gui_window * (only for menu construction)
- * CMSUB_NAVIGATE - userdata = browser_window *
- * CMID_SELECTFILE - userdata = ami_file_input_menu_data *
- */
-
- struct gui_window *gw = NULL;
-
- switch(cmsub)
- {
- case CMSUB_PAGE:
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMSUB_PAGE],
- PMSIMPLESUB,
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_PAGEOPEN],
- PMIA_ID, CMID_PAGEOPEN,
- PMIA_UserData, userdata,
- PMIA_CommKey, "O",
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_PAGESAVE],
- PMIA_ID, CMID_PAGESAVE,
- PMIA_UserData, userdata,
- PMIA_CommKey, "S",
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_PAGESAVECOMPLETE],
- PMIA_ID, CMID_PAGESAVECOMPLETE,
- PMIA_UserData, userdata,
- PMIA_Disabled, (content_get_type(userdata) != CONTENT_HTML),
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_PAGECLOSE],
- PMIA_ID, CMID_PAGECLOSE,
- PMIA_UserData, userdata,
- PMIA_CommKey, "K",
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_PAGEHOTLIST],
- PMIA_ID, CMID_PAGEHOTLIST,
- PMIA_UserData, nsurl_access(hlcache_handle_get_url(userdata)),
- PMIA_CommKey, "B",
- TAG_DONE),
- PMEND,
- TAG_DONE),
- ~0);
- break;
-
- case CMSUB_FRAME:
- IDoMethod(ctxmenuobj,PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMSUB_FRAME],
- PMSIMPLESUB,
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_FRAMEWIN],
- PMIA_ID, CMID_FRAMEWIN,
- PMIA_UserData, nsurl_access(hlcache_handle_get_url(userdata)),
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_FRAMETAB],
- PMIA_ID, CMID_FRAMETAB,
- PMIA_UserData, nsurl_access(hlcache_handle_get_url(userdata)),
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_FRAMESHOW],
- PMIA_ID, CMID_FRAMESHOW,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_FRAMERELOAD],
- PMIA_ID, CMID_FRAMERELOAD,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_FRAMECOPYURL],
- PMIA_ID, CMID_FRAMECOPYURL,
- PMIA_UserData, nsurl_access(hlcache_handle_get_url(userdata)),
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_FRAMESAVE],
- PMIA_ID, CMID_FRAMESAVE,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_FRAMESAVECOMPLETE],
- PMIA_ID, CMID_FRAMESAVECOMPLETE,
- PMIA_UserData, userdata,
- PMIA_Disabled, (content_get_type(userdata) != CONTENT_HTML),
- TAG_DONE),
- PMEND,
- TAG_DONE),
- ~0);
- break;
-
- case CMSUB_NAVIGATE:
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMSUB_NAVIGATE],
- PMSIMPLESUB,
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_NAVHOME],
- PMIA_ID, CMID_NAVHOME,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_NAVBACK],
- PMIA_ID, CMID_NAVBACK,
- PMIA_UserData, userdata,
- PMIA_Disabled, !browser_window_back_available(userdata),
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_NAVFORWARD],
- PMIA_ID, CMID_NAVFORWARD,
- PMIA_UserData, userdata,
- PMIA_Disabled, !browser_window_forward_available(userdata),
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_NAVRELOAD],
- PMIA_ID, CMID_NAVRELOAD,
- PMIA_UserData, userdata,
- PMIA_CommKey, "R",
- PMIA_Disabled, !browser_window_reload_available(userdata),
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_NAVSTOP],
- PMIA_ID, CMID_NAVSTOP,
- PMIA_UserData, userdata,
- PMIA_Disabled, !browser_window_stop_available(userdata),
- TAG_DONE),
- PMEND,
- TAG_DONE),
- ~0);
- break;
-
- case CMSUB_URL:
- IDoMethod(ctxmenuobj,PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMSUB_URL],
- PMSIMPLESUB,
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_URLOPEN],
- PMIA_ID, CMID_URLOPEN,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_URLOPENWIN],
- PMIA_ID, CMID_URLOPENWIN,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_URLOPENTAB],
- PMIA_ID, CMID_URLOPENTAB,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_COPYURL],
- PMIA_ID, CMID_COPYURL,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_URLHOTLIST],
- PMIA_ID, CMID_URLHOTLIST,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SAVEURL],
- PMIA_ID, CMID_SAVEURL,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMEND,
- TAG_DONE),
- ~0);
- break;
-
- case CMSUB_OBJECT:
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMSUB_OBJECT],
- PMSIMPLESUB,
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SHOWOBJ],
- PMIA_ID, CMID_SHOWOBJ,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_RELOADOBJ],
- PMIA_ID, CMID_RELOADOBJ,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_COPYOBJ],
- PMIA_ID, CMID_COPYOBJ,
- PMIA_UserData, nsurl_access(hlcache_handle_get_url(userdata)),
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_CLIPOBJ],
- PMIA_ID, CMID_CLIPOBJ,
- PMIA_UserData, userdata,
- PMIA_Disabled, (content_get_type(userdata) != CONTENT_IMAGE),
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SAVEOBJ],
- PMIA_ID, CMID_SAVEOBJ,
- PMIA_UserData, userdata,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SAVEIFFOBJ],
- PMIA_ID, CMID_SAVEIFFOBJ,
- PMIA_UserData, userdata,
- PMIA_Disabled, (content_get_type(userdata) != CONTENT_IMAGE),
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem, NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_PLUGINCMD],
- PMIA_ID, CMID_PLUGINCMD,
- PMIA_UserData, userdata,
- PMIA_Disabled, !ami_mime_content_to_cmd(userdata),
- TAG_DONE),
- PMEND,
- TAG_DONE),
- ~0);
- break;
-
- case CMSUB_SEL:
- gw = userdata;
- BOOL disabled_noselection = !(browser_window_get_editor_flags(gw->bw) & BW_EDITOR_CAN_COPY);
-
- IDoMethod(ctxmenuobj,PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMSUB_SEL],
- PMIA_SubMenu, NewObject(POPUPMENU_GetClass(), NULL,
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELCUT],
- PMIA_ID,CMID_SELCUT,
- PMIA_Disabled, !(browser_window_get_editor_flags(gw->bw) & BW_EDITOR_CAN_CUT),
- PMIA_CommKey, "X",
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELCOPY],
- PMIA_ID,CMID_SELCOPY,
- PMIA_Disabled, disabled_noselection,
- PMIA_CommKey, "C",
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELPASTE],
- PMIA_ID,CMID_SELPASTE,
- PMIA_Disabled, (gw->c_h == 0),
- PMIA_CommKey, "V",
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELALL],
- PMIA_ID,CMID_SELALL,
- PMIA_CommKey, "A",
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELCLEAR],
- PMIA_ID,CMID_SELCLEAR,
- PMIA_Disabled, disabled_noselection,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELSEARCH],
- PMIA_ID,CMID_SELSEARCH,
- PMIA_Disabled, disabled_noselection,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELSAVE],
- PMIA_ID,CMID_SELSAVE,
- PMIA_Disabled, disabled_noselection,
- TAG_DONE),
- TAG_DONE),
- TAG_DONE),
- ~0);
- break;
-
- case CMID_SELECTFILE:
- IDoMethod(ctxmenuobj,PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELECTFILE],
- PMIA_ID, CMID_SELECTFILE,
- PMIA_UserData, userdata,
- TAG_DONE),
- ~0);
- break;
- }
-}
-
-void ami_context_menu_free(void)
-{
- int i;
-
- if(ctxmenuobj) DisposeObject(ctxmenuobj);
-
- for(i=0;i<CMID_LAST;i++)
- {
- ami_utf8_free(ctxmenulab[i]);
- }
-
- if(IPopupMenu) DropInterface((struct Interface *)IPopupMenu);
- if(PopupMenuBase) CloseLibrary(PopupMenuBase);
-}
-
-BOOL ami_context_menu_mouse_trap(struct gui_window_2 *gwin, BOOL trap)
-{
- if(nsoption_bool(context_menu) == false) return FALSE;
-
- if((nsoption_bool(kiosk_mode) == false) && (trap == FALSE))
- {
- if(browser_window_back_available(gwin->gw->bw) &&
- ami_gadget_hit(gwin->objects[GID_BACK],
- gwin->win->MouseX, gwin->win->MouseY))
- trap = TRUE;
-
- if(browser_window_forward_available(gwin->gw->bw) &&
- ami_gadget_hit(gwin->objects[GID_FORWARD],
- gwin->win->MouseX, gwin->win->MouseY))
- trap = TRUE;
- }
-
- if(gwin->rmbtrapped == trap) return trap;
-
- SetWindowAttr(gwin->win, WA_RMBTrap, (APTR)(ULONG)trap, sizeof(BOOL));
- gwin->rmbtrapped = trap;
-
- return trap;
-}
-
-void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y)
-{
- struct hlcache_handle *cc = browser_window_get_content(gwin->gw->bw);
- bool no_more_menus = false;
- bool menuhascontent = false;
- struct browser_window_features ccdata;
-
- if(!cc) return;
- if(ctxmenuobj) DisposeObject(ctxmenuobj);
-
- ctxmenuhook.h_Entry = ami_context_menu_hook;
- ctxmenuhook.h_SubEntry = NULL;
- ctxmenuhook.h_Data = gwin;
-
- ctxmenuobj = NewObject( POPUPMENU_GetClass(), NULL,
- PMA_MenuHandler, &ctxmenuhook,
- TAG_DONE);
-
- if(gwin->gw->bw && ami_gadget_hit(gwin->objects[GID_BACK],
- gwin->win->MouseX, gwin->win->MouseY))
- {
- gwin->temp = 0;
- browser_window_history_enumerate_back(gwin->gw->bw, ami_context_menu_history, gwin);
-
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- ~0);
-
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_HISTORY],
- PMIA_ID, CMID_HISTORY,
- PMIA_UserData, NULL,
- TAG_DONE),
- ~0);
-
- menuhascontent = true;
- }
- else if(gwin->gw->bw && ami_gadget_hit(gwin->objects[GID_FORWARD],
- gwin->win->MouseX, gwin->win->MouseY))
- {
- gwin->temp = 0;
- browser_window_history_enumerate_forward(gwin->gw->bw, ami_context_menu_history, gwin);
-
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- ~0);
-
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_HISTORY],
- PMIA_ID, CMID_HISTORY,
- PMIA_UserData, NULL,
- TAG_DONE),
- ~0);
-
- menuhascontent = true;
- }
- else
- {
- if(no_more_menus == false)
- {
- browser_window_get_features(gwin->gw->bw, x, y, &ccdata);
-
- ami_context_menu_add_submenu(ctxmenuobj, CMSUB_PAGE, cc);
- menuhascontent = true;
-
- if(ccdata.main && (ccdata.main != cc))
- {
- ami_context_menu_add_submenu(ctxmenuobj, CMSUB_FRAME, ccdata.main);
- menuhascontent = true;
- }
-
- if(ccdata.link)
- {
- ami_context_menu_add_submenu(ctxmenuobj, CMSUB_URL, (char *)nsurl_access(ccdata.link));
- menuhascontent = true;
- }
-
- if(ccdata.object)
- {
- ami_context_menu_add_submenu(ctxmenuobj, CMSUB_OBJECT, ccdata.object);
- menuhascontent = true;
- }
-
- if(ccdata.form_features == CTX_FORM_FILE)
- {
- struct ami_file_input_menu_data file_input = {
- .x = x,
- .y = y,
- .bw = gwin->gw->bw
- };
- ami_context_menu_add_submenu(ctxmenuobj, CMID_SELECTFILE, &file_input);
- menuhascontent = true;
- }
-
- ami_context_menu_add_submenu(ctxmenuobj, CMSUB_NAVIGATE, gwin->gw->bw);
- menuhascontent = true;
-
- if(browser_window_can_select(gwin->gw->bw))
- {
- ami_context_menu_add_submenu(ctxmenuobj, CMSUB_SEL, gwin->gw);
- menuhascontent = true;
- }
- }
- }
-
- if(!menuhascontent) return;
-
- gui_window_set_pointer(gwin->gw, GUI_POINTER_DEFAULT);
-
- IDoMethod(ctxmenuobj, PM_OPEN, gwin->win);
-}
-
-HOOKF(uint32, ami_context_menu_hook, Object *, item, APTR)
-{
- int32 itemid = 0;
- struct gui_window_2 *gwin = hook->h_Data;
- APTR userdata = NULL;
- struct browser_window *bw;
- struct hlcache_handle *object;
- struct bitmap *bm;
- nsurl *url;
- nserror error;
-
- if(GetAttrs(item, PMIA_ID, &itemid,
- PMIA_UserData, &userdata,
- TAG_DONE)) {
- switch(itemid)
- {
- case CMID_SELECTFILE:
- if(AslRequestTags(filereq,
- ASLFR_Window, gwin->win,
- ASLFR_SleepWindow, TRUE,
- ASLFR_TitleText,messages_get("NetSurf"),
- ASLFR_Screen,scrn,
- ASLFR_DoSaveMode,FALSE,
- TAG_DONE))
- {
- struct ami_file_input_menu_data
- *file_input = userdata;
- char fname[1024];
-
- strlcpy(fname,filereq->fr_Drawer,1024);
- AddPart(fname,filereq->fr_File,1024);
-
- browser_window_drop_file_at_point(
- file_input->bw,
- file_input->x,
- file_input->y,
- fname);
- }
- break;
-
- case CMID_PAGEOPEN:
- ami_file_open(gwin);
- break;
-
- case CMID_PAGECLOSE:
- browser_window_destroy(gwin->gw->bw);
- break;
-
- case CMID_URLHOTLIST:
- case CMID_PAGEHOTLIST:
- {
- if (nsurl_create(userdata, &url) != NSERROR_OK)
- break;
-
- hotlist_add_url(url);
- nsurl_unref(url);
- ami_gui_update_hotlist_button(gwin);
- }
- break;
-
- case CMID_FRAMECOPYURL:
- case CMID_COPYURL:
- case CMID_COPYOBJ:
- ami_easy_clipboard((char *)userdata);
- break;
-
- case CMID_FRAMEWIN:
- case CMID_URLOPENWIN:
- error = nsurl_create(userdata, &url);
- if (error == NSERROR_OK) {
- error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY,
- url,
- browser_window_get_url(gwin->gw->bw),
- gwin->gw->bw,
- &bw);
- nsurl_unref(url);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
-
-
- break;
-
- case CMID_FRAMETAB:
- case CMID_URLOPENTAB:
- error = nsurl_create(userdata, &url);
- if (error == NSERROR_OK) {
- error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY | BW_CREATE_TAB,
- url,
- browser_window_get_url(gwin->gw->bw),
- gwin->gw->bw,
- &bw);
- nsurl_unref(url);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
-
- break;
-
- case CMID_FRAMESAVE:
- case CMID_SAVEURL:
- {
- nsurl *url;
- if (nsurl_create(userdata, &url) != NSERROR_OK) {
- warn_user("NoMemory", 0);
- } else {
- browser_window_navigate(gwin->gw->bw,
- url,
- browser_window_get_url(gwin->gw->bw),
- BW_NAVIGATE_DOWNLOAD,
- NULL,
- NULL,
- NULL);
- nsurl_unref(url);
- }
- }
- break;
-
- case CMID_FRAMESHOW:
- case CMID_SHOWOBJ:
- browser_window_navigate(gwin->gw->bw,
- hlcache_handle_get_url(userdata),
- browser_window_get_url(gwin->gw->bw),
- BW_NAVIGATE_HISTORY,
- NULL,
- NULL,
- NULL);
-
- break;
-
- case CMID_URLOPEN:
- {
- nsurl *url;
- if (nsurl_create(userdata, &url) != NSERROR_OK) {
- warn_user("NoMemory", 0);
- } else {
- browser_window_navigate(gwin->gw->bw,
- url,
- browser_window_get_url(gwin->gw->bw),
- BW_NAVIGATE_HISTORY,
- NULL,
- NULL,
- NULL);
- nsurl_unref(url);
- }
- }
- break;
-
- case CMID_FRAMERELOAD:
- case CMID_RELOADOBJ:
- object = (struct hlcache_handle *)userdata;
- content_invalidate_reuse_data(object);
- browser_window_reload(gwin->gw->bw, false);
- break;
-
- case CMID_CLIPOBJ:
- object = (struct hlcache_handle *)userdata;
- if((bm = content_get_bitmap(object)))
- {
- bm->url = (char *)nsurl_access(hlcache_handle_get_url(object));
- bm->title = (char *)content_get_title(object);
- ami_easy_clipboard_bitmap(bm);
- }
-#ifdef WITH_NS_SVG
- else if(ami_mime_compare(object, "svg") == true)
- {
- ami_easy_clipboard_svg(object);
- }
-#endif
- break;
-
- case CMID_SAVEOBJ:
- case CMID_PAGESAVE:
- ami_file_save_req(AMINS_SAVE_SOURCE, gwin,
- (struct hlcache_handle *)userdata);
- break;
-
- case CMID_PAGESAVECOMPLETE:
- case CMID_FRAMESAVECOMPLETE:
- ami_file_save_req(AMINS_SAVE_COMPLETE, gwin,
- (struct hlcache_handle *)userdata);
- break;
-
- case CMID_SAVEIFFOBJ:
- ami_file_save_req(AMINS_SAVE_IFF, gwin,
- (struct hlcache_handle *)userdata);
- break;
-
- case CMID_PLUGINCMD:
- amiga_plugin_hack_execute((struct hlcache_handle *)userdata);
- break;
-
- case CMID_HISTORY:
- if(userdata == NULL)
- {
- ami_history_open(gwin->gw);
- }
- else
- {
- browser_window_history_go(gwin->gw->bw,
- (struct history_entry *)userdata, false);
- }
- break;
-
- case CMID_NAVHOME:
- {
- nsurl *url;
-
- if (nsurl_create(nsoption_charp(homepage_url), &url) != NSERROR_OK) {
- warn_user("NoMemory", 0);
- } else {
- browser_window_navigate(gwin->gw->bw,
- url,
- NULL,
- BW_NAVIGATE_HISTORY,
- NULL,
- NULL,
- NULL);
- nsurl_unref(url);
- }
-
- }
- break;
-
- case CMID_NAVBACK:
- ami_gui_history(gwin, true);
- break;
-
- case CMID_NAVFORWARD:
- ami_gui_history(gwin, false);
- break;
-
- case CMID_NAVSTOP:
- if(browser_window_stop_available(gwin->gw->bw))
- browser_window_stop(gwin->gw->bw);
- break;
-
- case CMID_NAVRELOAD:
- if(browser_window_reload_available(gwin->gw->bw))
- browser_window_reload(gwin->gw->bw, true);
- break;
-
- case CMID_SELCUT:
- browser_window_key_press(gwin->gw->bw, NS_KEY_CUT_SELECTION);
- break;
-
- case CMID_SELCOPY:
- browser_window_key_press(gwin->gw->bw, NS_KEY_COPY_SELECTION);
- browser_window_key_press(gwin->gw->bw, NS_KEY_CLEAR_SELECTION);
- break;
-
- case CMID_SELPASTE:
- browser_window_key_press(gwin->gw->bw, NS_KEY_PASTE);
- break;
-
- case CMID_SELALL:
- browser_window_key_press(gwin->gw->bw, NS_KEY_SELECT_ALL);
- gui_start_selection(gwin->gw);
- break;
-
- case CMID_SELCLEAR:
- browser_window_key_press(gwin->gw->bw, NS_KEY_CLEAR_SELECTION);
- break;
-
- case CMID_SELSAVE:
- ami_file_save_req(AMINS_SAVE_SELECTION, gwin, NULL);
- break;
-
- case CMID_SELSEARCH:
- {
- char *sel;
-
- if((sel = browser_window_get_selection(gwin->gw->bw)))
- {
- nserror ret;
- nsurl *url;
-
- ret = search_web_omni(sel, SEARCH_WEB_OMNI_SEARCHONLY, &url);
- free(sel);
- if (ret == NSERROR_OK) {
- ret = browser_window_navigate(gwin->gw->bw,
- url,
- NULL,
- BW_NAVIGATE_HISTORY,
- NULL,
- NULL,
- NULL);
- nsurl_unref(url);
- }
- if (ret != NSERROR_OK) {
- warn_user(messages_get_errorcode(ret), 0);
- }
- }
- }
- break;
- }
- }
-
- return itemid;
-}
-
-#if 0
-/* \todo This is the context menu for the treeviews which needs fixing */
-static uint32 ami_context_menu_hook_tree(struct Hook *hook, Object *item, APTR reserved)
-{
- int32 itemid = 0;
- struct tree *tree = hook->h_Data;
- APTR userdata = NULL;
-
- if(GetAttrs(item,PMIA_ID, &itemid,
- PMIA_UserData, &userdata,
- TAG_DONE))
- {
- switch(itemid)
- {
- case CMID_TREE_LAUNCH:
- tree_keypress(tree, NS_KEY_CR);
- break;
-
- case CMID_TREE_EDITFOLDER:
- hotlist_edit_selection();
- break;
-
- case CMID_TREE_EDITTITLE:
- warn_user("TODO.", 0);
- break;
-
- case CMID_TREE_EDITLINK:
- warn_user("TODO.", 0);
- break;
-
- case CMID_TREE_NEWFOLDER:
- hotlist_add_folder(NULL, false, 0);
- break;
-
- case CMID_TREE_NEWITEM:
- hotlist_add_entry(NULL, NULL, false, 0);
- break;
-
- case CMID_TREE_SETDEFAULT:
- warn_user("TODO.", 0);
- break;
-
- case CMID_TREE_CLEARDEFAULT:
- warn_user("TODO.", 0);
- break;
-
- case CMID_TREE_ADDHOTLIST:
- warn_user("TODO.", 0);
- break;
-
- case CMID_TREE_DELETE:
- tree_keypress(tree, NS_KEY_DELETE_RIGHT);
- break;
- }
- }
- return itemid;
-}
-
-void ami_context_menu_show_tree(struct tree *tree, struct Window *win, int type)
-{
- struct node *root = tree_get_root(tree);
- struct node *sel_node = tree_get_selected_node(root);
- bool has_selection = tree_node_has_selection(root);
- bool menu_content = false;
-
- if(ctxmenuobj) DisposeObject(ctxmenuobj);
-
- ctxmenuhook.h_Entry = ami_context_menu_hook_tree;
- ctxmenuhook.h_SubEntry = NULL;
- ctxmenuhook.h_Data = tree;
-
- ctxmenuobj = NewObject( POPUPMENU_GetClass(), NULL,
- PMA_MenuHandler, &ctxmenuhook,
- TAG_DONE);
-
- if(has_selection && (type != AMI_TREE_COOKIES) &&
- ((sel_node == NULL) ||
- (tree_node_is_folder(sel_node) == false))) {
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_LAUNCH],
- PMIA_ID, CMID_TREE_LAUNCH,
- PMIA_UserData, NULL,
- TAG_DONE),
- ~0);
-
- menu_content = true;
- }
-
- if(type == AMI_TREE_HOTLIST) {
- if(menu_content == true) {
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- ~0);
-
- menu_content = false;
- }
-
- if(has_selection && (sel_node != NULL)) {
- if(tree_node_is_folder(sel_node) == true) {
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_EDITFOLDER],
- PMIA_ID, CMID_TREE_EDITFOLDER,
- PMIA_UserData, NULL,
- TAG_DONE),
- ~0);
- }
- else
- {
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_EDITTITLE],
- PMIA_ID, CMID_TREE_EDITTITLE,
- PMIA_UserData, sel_node,
- TAG_DONE),
- ~0);
-
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_EDITLINK],
- PMIA_ID, CMID_TREE_EDITLINK,
- PMIA_UserData, sel_node,
- TAG_DONE),
- ~0);
- }
- menu_content = true;
- }
-
- if(menu_content == true) {
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- ~0);
-
- menu_content = false;
- }
-
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_NEWFOLDER],
- PMIA_ID, CMID_TREE_NEWFOLDER,
- PMIA_UserData, NULL,
- TAG_DONE),
- ~0);
-
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_NEWITEM],
- PMIA_ID, CMID_TREE_NEWITEM,
- PMIA_UserData, NULL,
- TAG_DONE),
- ~0);
-
- if(has_selection && (sel_node != NULL) &&
- (tree_node_is_folder(sel_node) == true)) {
-
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- ~0);
-
- if(tree_node_is_default(sel_node) == true)
- {
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_CLEARDEFAULT],
- PMIA_ID, CMID_TREE_CLEARDEFAULT,
- PMIA_UserData, NULL,
- TAG_DONE),
- ~0);
- }
- else
- {
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_SETDEFAULT],
- PMIA_ID, CMID_TREE_SETDEFAULT,
- PMIA_UserData, NULL,
- TAG_DONE),
- ~0);
- }
- }
-
- menu_content = true;
- }
-
- if((type == AMI_TREE_HISTORY) && has_selection &&
- (sel_node != NULL) && (tree_node_is_folder(sel_node) == false)) {
- if(menu_content == true) {
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- ~0);
- }
-
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_ADDHOTLIST],
- PMIA_ID, CMID_TREE_ADDHOTLIST,
- PMIA_UserData, sel_node,
- TAG_DONE),
- ~0);
-
- menu_content = true;
- }
-
- if(has_selection) {
- if(menu_content == true) {
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- ~0);
- }
-
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_DELETE],
- PMIA_ID, CMID_TREE_DELETE,
- PMIA_UserData, root,
- TAG_DONE),
- ~0);
-
- menu_content = true;
- }
-
- if(menu_content == true)
- IDoMethod(ctxmenuobj, PM_OPEN, win);
-}
-#endif
-
-static bool ami_context_menu_history(const struct browser_window *bw,
- int x0, int y0, int x1, int y1,
- const struct history_entry *entry, void *user_data)
-{
- struct gui_window_2 *gwin = (struct gui_window_2 *)user_data;
-
- gwin->temp++;
- if(gwin->temp > 10) return false;
-
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)browser_window_history_entry_get_title(entry),
- PMIA_ID, CMID_HISTORY,
- PMIA_UserData, entry,
- TAG_DONE),
- ~0);
-
- return true;
-}
-
-HOOKF(uint32, ami_popup_hook, Object *, item, APTR)
-{
- uint32 itemid = 0;
- struct gui_window *gwin = hook->h_Data;
-
- if(GetAttr(PMIA_ID, item, &itemid))
- {
- form_select_process_selection(gwin->shared->control,itemid);
- }
-
- return itemid;
-}
-
-void gui_create_form_select_menu(struct gui_window *g,
- struct form_control *control)
-{
- /* TODO: PMIA_Title memory leaks as we don't free the strings.
- * We use the core menu anyway, but in future when popupmenu.class
- * improves we will probably start using this again.
- */
-
- struct gui_window *gwin = g;
- struct form_option *opt = form_select_get_option(control, 0);
- ULONG i = 0;
-
- if(ctxmenuobj) DisposeObject(ctxmenuobj);
-
- ctxmenuhook.h_Entry = ami_popup_hook;
- ctxmenuhook.h_SubEntry = NULL;
- ctxmenuhook.h_Data = gwin;
-
- gwin->shared->control = control;
-
- ctxmenuobj = PMMENU(ami_utf8_easy(form_control_get_name(control))),
- PMA_MenuHandler, &ctxmenuhook, End;
-
- while(opt)
- {
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject( POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ami_utf8_easy(opt->text),
- PMIA_ID, i,
- PMIA_CheckIt, TRUE,
- PMIA_Checked, opt->selected,
- TAG_DONE),
- ~0);
-
- opt = opt->next;
- i++;
- }
-
- gui_window_set_pointer(gwin, GUI_POINTER_DEFAULT); // Clear the menu-style pointer
-
- IDoMethod(ctxmenuobj, PM_OPEN, gwin->shared->win);
-}
-
-#else
-
-#include <proto/dos.h>
-#include "amiga/context_menu.h"
-
-void ami_context_menu_init(void)
-{
-}
-
-void ami_context_menu_free(void)
-{
-}
-
-BOOL ami_context_menu_mouse_trap(struct gui_window_2 *gwin, BOOL trap)
-{
- return FALSE;
-}
-
-void ami_context_menu_show(struct gui_window_2 *gwin, int x, int y)
-{
-}
-
-void gui_create_form_select_menu(struct gui_window *g, struct form_control *control)
-{
-}
-#endif
-
diff --git a/amiga/ctxmenu.c b/amiga/ctxmenu.c
new file mode 100644
index 0000000..42d0da3
--- /dev/null
+++ b/amiga/ctxmenu.c
@@ -0,0 +1,557 @@
+/*
+ * Copyright 2015 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Intuition-based context menu operations
+ */
+
+#ifdef __amigaos4__
+#include <string.h>
+
+#include <proto/exec.h>
+#include <proto/intuition.h>
+
+#include <proto/bitmap.h>
+#include <images/bitmap.h>
+#include <proto/window.h>
+#include <classes/window.h>
+
+#include <intuition/menuclass.h>
+#include <reaction/reaction_macros.h>
+
+#include "amiga/bitmap.h"
+#include "amiga/clipboard.h"
+#include "amiga/ctxmenu.h"
+#include "amiga/filetype.h"
+#include "amiga/gui.h"
+#include "amiga/libs.h"
+#include "amiga/plugin_hack.h"
+#include "amiga/theme.h"
+#include "amiga/utf8.h"
+
+#include "desktop/browser.h"
+#include "desktop/browser_history.h"
+#include "desktop/mouse.h"
+#include "desktop/textinput.h"
+
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/nsoption.h"
+
+enum {
+ AMI_CTX_ID_NONE = 0,
+
+ /* Text selection */
+ AMI_CTX_ID_SELCOPY,
+
+ /* Links */
+ AMI_CTX_ID_URLOPENTAB,
+ AMI_CTX_ID_URLOPENWIN,
+ AMI_CTX_ID_URLDOWNLOAD,
+ AMI_CTX_ID_URLCOPY,
+
+ /* Objects */
+ AMI_CTX_ID_OBJSHOW,
+ AMI_CTX_ID_OBJCOPY,
+ AMI_CTX_ID_OBJCMD,
+
+ /* Frames */
+ AMI_CTX_ID_FRAMESHOW,
+
+ /* History */
+ AMI_CTX_ID_HISTORY,
+ AMI_CTX_ID_HISTORY0,
+ AMI_CTX_ID_HISTORY9F = AMI_CTX_ID_HISTORY0 + 19,
+
+ /* Tabs */
+ AMI_CTX_ID_TABNEW,
+
+ AMI_CTX_ID_MAX
+};
+
+static Object *ctxmenu_obj = NULL;
+
+static struct Hook ctxmenu_item_hook[AMI_CTX_ID_MAX];
+static char *ctxmenu_item_label[AMI_CTX_ID_MAX];
+static char *ctxmenu_item_shortcut[AMI_CTX_ID_MAX];
+static Object *ctxmenu_item_image[AMI_CTX_ID_MAX];
+
+/****************************
+ * Menu item hook functions *
+ ****************************/
+
+/** Menu functions - called automatically by RA_HandleInput **/
+HOOKF(void, ami_ctxmenu_item_selcopy, APTR, window, struct IntuiMessage *)
+{
+ struct gui_window_2 *gwin = (struct gui_window_2 *)hook->h_Data;
+
+ browser_window_key_press(gwin->gw->bw, NS_KEY_COPY_SELECTION);
+ browser_window_key_press(gwin->gw->bw, NS_KEY_CLEAR_SELECTION);
+}
+
+HOOKF(void, ami_ctxmenu_item_urlopentab, APTR, window, struct IntuiMessage *)
+{
+ struct browser_window *bw;
+ nsurl *url = (nsurl *)hook->h_Data;
+ struct gui_window_2 *gwin;
+
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
+ nserror error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY | BW_CREATE_TAB,
+ url,
+ browser_window_get_url(gwin->gw->bw),
+ gwin->gw->bw,
+ &bw);
+
+ if (error != NSERROR_OK)
+ warn_user(messages_get_errorcode(error), 0);
+}
+
+HOOKF(void, ami_ctxmenu_item_urlopenwin, APTR, window, struct IntuiMessage *)
+{
+ struct browser_window *bw;
+ nsurl *url = (nsurl *)hook->h_Data;
+ struct gui_window_2 *gwin;
+
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
+ nserror error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY,
+ url,
+ browser_window_get_url(gwin->gw->bw),
+ gwin->gw->bw,
+ &bw);
+
+ if (error != NSERROR_OK)
+ warn_user(messages_get_errorcode(error), 0);
+}
+
+HOOKF(void, ami_ctxmenu_item_urldownload, APTR, window, struct IntuiMessage *)
+{
+ nsurl *url = (nsurl *)hook->h_Data;
+ struct gui_window_2 *gwin;
+
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
+
+ browser_window_navigate(gwin->gw->bw,
+ url,
+ browser_window_get_url(gwin->gw->bw),
+ BW_NAVIGATE_DOWNLOAD,
+ NULL,
+ NULL,
+ NULL);
+}
+
+HOOKF(void, ami_ctxmenu_item_urlcopy, APTR, window, struct IntuiMessage *)
+{
+ nsurl *url = (nsurl *)hook->h_Data;
+ ami_easy_clipboard(nsurl_access(url));
+}
+
+HOOKF(void, ami_ctxmenu_item_objshow, APTR, window, struct IntuiMessage *)
+{
+ struct gui_window_2 *gwin;
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
+
+ browser_window_navigate(gwin->gw->bw,
+ hlcache_handle_get_url(hook->h_Data),
+ browser_window_get_url(gwin->gw->bw),
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+}
+
+HOOKF(void, ami_ctxmenu_item_objcopy, APTR, window, struct IntuiMessage *)
+{
+ struct bitmap *bm;
+ struct gui_window_2 *gwin;
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
+
+ struct hlcache_handle *object = (struct hlcache_handle *)hook->h_Data;
+ if((bm = content_get_bitmap(object)))
+ {
+ bm->url = (char *)nsurl_access(hlcache_handle_get_url(object));
+ bm->title = (char *)content_get_title(object);
+ ami_easy_clipboard_bitmap(bm);
+ }
+#ifdef WITH_NS_SVG
+ else if(ami_mime_compare(object, "svg") == true)
+ {
+ ami_easy_clipboard_svg(object);
+ }
+#endif
+}
+
+HOOKF(void, ami_ctxmenu_item_objcmd, APTR, window, struct IntuiMessage *)
+{
+ amiga_plugin_hack_execute((struct hlcache_handle *)hook->h_Data);
+}
+
+HOOKF(void, ami_ctxmenu_item_frameshow, APTR, window, struct IntuiMessage *)
+{
+ struct gui_window_2 *gwin;
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
+
+ browser_window_navigate(gwin->gw->bw,
+ hlcache_handle_get_url(hook->h_Data),
+ browser_window_get_url(gwin->gw->bw),
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+}
+
+/** Hooks for clicktab context menu entries **/
+HOOKF(void, ami_ctxmenu_item_tabnew, APTR, window, struct IntuiMessage *)
+{
+ struct gui_window_2 *gwin;
+
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
+ ami_gui_new_blank_tab(gwin);
+}
+
+/** Hook for history context menu entries **/
+HOOKF(void, ami_ctxmenu_item_history, APTR, window, struct IntuiMessage *)
+{
+ struct gui_window_2 *gwin;
+
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
+
+ browser_window_history_go(gwin->gw->bw, (struct history_entry *)hook->h_Data, false);
+}
+
+
+/*************************
+ * Browser context menus *
+ *************************/
+
+/** Add an initialised item to a context menu **/
+static void ami_ctxmenu_add_item(Object *root_menu, int id, APTR data)
+{
+ ctxmenu_item_hook[id].h_Data = data;
+
+ IDoMethod(root_menu, OM_ADDMEMBER, MStrip,
+ MA_Type, T_ITEM,
+ MA_ID, id,
+ MA_Label, ctxmenu_item_label[id],
+ MA_Key, ctxmenu_item_shortcut[id],
+ MA_Image, ctxmenu_item_image[id],
+ MA_UserData, &ctxmenu_item_hook[id],
+ MEnd);
+}
+
+/** Hook function called by Intuition, creates context menu structure **/
+static uint32 ami_ctxmenu_hook_func(struct Hook *hook, struct Window *window, struct ContextMenuMsg *msg)
+{
+ Object *root_menu;
+ bool ctxmenu_has_content = false;
+ struct gui_window_2 *gwin = hook->h_Data;
+ struct hlcache_handle *cc = browser_window_get_content(gwin->gw->bw);
+ struct browser_window_features ccdata;
+ int mx = window->MouseX;
+ int my = window->MouseY;
+ int x, y;
+
+ if(msg->State != CM_QUERY) return 0;
+ if(nsoption_bool(kiosk_mode) == true) return 0;
+// check window is active
+
+ if(ctxmenu_obj != NULL) DisposeObject(ctxmenu_obj);
+
+ ctxmenu_obj = MStrip,
+ MA_Type, T_ROOT,
+ MA_AddChild, root_menu = MStrip,
+ MA_Type, T_MENU,
+ MA_Label, NULL, //"NetSurf",
+ MA_EmbeddedKey, FALSE,
+ MA_FreeImage, FALSE,
+ MEnd,
+ MEnd;
+
+ if(ami_mouse_to_ns_coords(gwin, &x, &y, mx, my) == false) {
+ /* Outside browser render area */
+ return 0;
+ }
+
+ browser_window_get_features(gwin->gw->bw, x, y, &ccdata);
+
+ if((browser_window_can_select(gwin->gw->bw)) &&
+ ((browser_window_get_editor_flags(gwin->gw->bw) & BW_EDITOR_CAN_COPY))) {
+
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_SELCOPY, gwin);
+
+ ctxmenu_has_content = true;
+ }
+
+ if(ccdata.link) {
+ if(ctxmenu_has_content == true)
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_NONE, NULL);
+
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_URLOPENTAB, ccdata.link);
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_URLOPENWIN, ccdata.link);
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_URLDOWNLOAD, ccdata.link);
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_URLCOPY, ccdata.link);
+ ctxmenu_has_content = true;
+ }
+
+ if(ccdata.object) {
+ if(ctxmenu_has_content == true)
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_NONE, NULL);
+
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_OBJSHOW, ccdata.object);
+
+ if(content_get_type(ccdata.object) == CONTENT_IMAGE)
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_OBJCOPY, ccdata.object);
+
+ if(ami_mime_content_to_cmd(ccdata.object))
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_OBJCMD, ccdata.object);
+
+ ctxmenu_has_content = true;
+ }
+
+ if(ccdata.main && (ccdata.main != cc)) {
+ if(ctxmenu_has_content == true)
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_NONE, NULL);
+
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_FRAMESHOW, ccdata.main);
+
+ ctxmenu_has_content = true;
+ }
+
+ if(ctxmenu_has_content == true) {
+ msg->Menu = ctxmenu_obj;
+ ami_set_pointer(gwin, GUI_POINTER_DEFAULT, false);
+ }
+
+ return 0;
+}
+
+/** Initial menu item creation **/
+static void ami_ctxmenu_alloc_item(int id, const char *label, const char *key, const char *image, void *func)
+{
+ if(label == ML_SEPARATOR) {
+ ctxmenu_item_label[id] = ML_SEPARATOR;
+ } else {
+ ctxmenu_item_label[id] = ami_utf8_easy(messages_get(label));
+ }
+
+ if(key != NULL) {
+ ctxmenu_item_shortcut[id] = strdup(key);
+ } else {
+ ctxmenu_item_shortcut[id] = NULL;
+ }
+
+ if(image != NULL) {
+ ctxmenu_item_image[id] = BitMapObj,
+ BITMAP_Screen, scrn,
+ BITMAP_SourceFile, image,
+ BITMAP_Masking, TRUE,
+ BitMapEnd;
+
+ SetAttrs(ctxmenu_item_image[id],
+ BITMAP_Width, 16,
+ BITMAP_Height, 16,
+ TAG_DONE);
+ }
+
+ ctxmenu_item_hook[id].h_Entry = func;
+ ctxmenu_item_hook[id].h_Data = 0;
+}
+
+/** Exported interface documented in ctxmenu.h **/
+struct Hook *ami_ctxmenu_get_hook(APTR data)
+{
+ return AllocSysObjectTags(ASOT_HOOK,
+ ASOHOOK_Entry, (HOOKFUNC)ami_ctxmenu_hook_func,
+ ASOHOOK_Data, data,
+ TAG_DONE);
+}
+
+/** Exported interface documented in ctxmenu.h **/
+void ami_ctxmenu_release_hook(struct Hook *hook)
+{
+ FreeSysObject(ASOT_HOOK, hook);
+}
+
+/** Exported interface documented in ctxmenu.h **/
+void ami_ctxmenu_free(void)
+{
+ for(int i = 1; i < AMI_CTX_ID_MAX; i++) {
+ if((ctxmenu_item_label[i] != NULL) && (ctxmenu_item_label[i] != ML_SEPARATOR)) {
+ ami_utf8_free(ctxmenu_item_label[i]);
+ }
+ ctxmenu_item_label[i] = NULL;
+
+ if(ctxmenu_item_shortcut[i] != NULL) {
+ free(ctxmenu_item_shortcut[i]);
+ ctxmenu_item_shortcut[i] = NULL;
+ }
+
+ if(ctxmenu_item_image[i] != NULL) {
+ DisposeObject(ctxmenu_item_image[i]);
+ ctxmenu_item_image[i] = NULL;
+ }
+ }
+
+ if(ctxmenu_obj != NULL) DisposeObject(ctxmenu_obj);
+ ctxmenu_obj = NULL;
+}
+
+/** Exported interface documented in ctxmenu.h **/
+void ami_ctxmenu_init(void)
+{
+ ami_ctxmenu_alloc_item(AMI_CTX_ID_NONE, ML_SEPARATOR, NULL, NULL, NULL);
+
+ ami_ctxmenu_alloc_item(AMI_CTX_ID_SELCOPY, "CopyNS", "C", "TBImages:list_copy",
+ ami_ctxmenu_item_selcopy);
+
+ ami_ctxmenu_alloc_item(AMI_CTX_ID_URLOPENTAB, "LinkNewTab", NULL, "TBImages:list_tab",
+ ami_ctxmenu_item_urlopentab);
+ ami_ctxmenu_alloc_item(AMI_CTX_ID_URLOPENWIN, "LinkNewWin", NULL, "TBImages:list_app",
+ ami_ctxmenu_item_urlopenwin);
+ ami_ctxmenu_alloc_item(AMI_CTX_ID_URLDOWNLOAD, "LinkDload", NULL, "TBImages:list_save",
+ ami_ctxmenu_item_urldownload);
+ ami_ctxmenu_alloc_item(AMI_CTX_ID_URLCOPY, "CopyURL", NULL, "TBImages:list_copy",
+ ami_ctxmenu_item_urlcopy);
+
+ ami_ctxmenu_alloc_item(AMI_CTX_ID_OBJSHOW, "ObjShow", NULL, "TBImages:list_preview",
+ ami_ctxmenu_item_objshow);
+ ami_ctxmenu_alloc_item(AMI_CTX_ID_OBJCOPY, "CopyClip", NULL, "TBImages:list_copy",
+ ami_ctxmenu_item_objcopy);
+ ami_ctxmenu_alloc_item(AMI_CTX_ID_OBJCMD, "ExternalApp", NULL, "TBImages:list_tool",
+ ami_ctxmenu_item_objcmd);
+
+ ami_ctxmenu_alloc_item(AMI_CTX_ID_FRAMESHOW, "FrameOnly", NULL, "TBImages:list_preview",
+ ami_ctxmenu_item_frameshow);
+
+ ami_ctxmenu_alloc_item(AMI_CTX_ID_TABNEW, "NewTab", "T", "TBImages:list_add",
+ ami_ctxmenu_item_tabnew);
+}
+
+/********************************
+ * History button context menus *
+ ********************************/
+
+/** Create menu entries from browser history **/
+static bool ami_ctxmenu_history(int direction, struct gui_window_2 *gwin, const struct history_entry *entry)
+{
+ Object *history_root;
+ int id = AMI_CTX_ID_HISTORY0 + gwin->temp;
+ if(direction == AMI_CTXMENU_HISTORY_FORWARD) id += 10;
+
+ if(gwin->temp >= 10) return false;
+
+ ctxmenu_item_hook[id].h_Entry = (HOOKFUNC)ami_ctxmenu_item_history;
+ ctxmenu_item_hook[id].h_Data = (APTR)entry;
+
+ history_root = (Object *)IDoMethod(gwin->history_ctxmenu[direction], MM_FINDID, 0, AMI_CTX_ID_HISTORY);
+
+ IDoMethod(history_root, OM_ADDMEMBER, MStrip,
+ MA_Type, T_ITEM,
+ MA_Label, browser_window_history_entry_get_title(entry),
+ MA_ID, id,
+ MA_Image, NULL,
+ MA_UserData, &ctxmenu_item_hook[id],
+ MEnd);
+
+ gwin->temp++;
+
+ return true;
+}
+
+/** Callback for browser_window_history_enumerate **/
+static bool ami_ctxmenu_history_back(const struct browser_window *bw,
+ int x0, int y0, int x1, int y1,
+ const struct history_entry *entry, void *user_data)
+{
+ return ami_ctxmenu_history(AMI_CTXMENU_HISTORY_BACK, (struct gui_window_2 *)user_data, entry);
+}
+
+/** Callback for browser_window_history_enumerate **/
+static bool ami_ctxmenu_history_forward(const struct browser_window *bw,
+ int x0, int y0, int x1, int y1,
+ const struct history_entry *entry, void *user_data)
+{
+ return ami_ctxmenu_history(AMI_CTXMENU_HISTORY_FORWARD, (struct gui_window_2 *)user_data, entry);
+}
+
+/** Exported interface documented in ctxmenu.h **/
+struct Menu *ami_ctxmenu_history_create(int direction, struct gui_window_2 *gwin)
+{
+ Object *obj;
+
+ if(gwin->history_ctxmenu[direction] == NULL) {
+ if(ctxmenu_item_label[AMI_CTX_ID_HISTORY] == NULL)
+ ctxmenu_item_label[AMI_CTX_ID_HISTORY] = ami_utf8_easy(messages_get("History"));
+
+ gwin->history_ctxmenu[direction] = MStrip,
+ MA_Type, T_ROOT,
+ MA_AddChild, MStrip,
+ MA_Type, T_MENU,
+ MA_ID, AMI_CTX_ID_HISTORY,
+ MA_Label, ctxmenu_item_label[AMI_CTX_ID_HISTORY],
+ MA_EmbeddedKey, FALSE,
+ //MA_FreeImage, FALSE,
+ MEnd,
+ MEnd;
+ } else {
+ for (int i = 0; i < 20; i++) {
+ obj = (Object *)IDoMethod(gwin->history_ctxmenu[direction],
+ MM_FINDID, 0, AMI_CTX_ID_HISTORY0 + i);
+ if(obj != NULL) IDoMethod(gwin->history_ctxmenu[direction], OM_REMMEMBER, obj);
+ }
+
+ gwin->temp = 0;
+
+ if(direction == AMI_CTXMENU_HISTORY_BACK) {
+ browser_window_history_enumerate_back(gwin->gw->bw, ami_ctxmenu_history_back, gwin);
+ } else {
+ browser_window_history_enumerate_forward(gwin->gw->bw, ami_ctxmenu_history_forward, gwin);
+ }
+ }
+
+ return (struct Menu *)gwin->history_ctxmenu[direction];
+}
+
+
+/**************************
+ * ClickTab context menus *
+ **************************/
+
+/** Exported interface documented in ctxmenu.h **/
+struct Menu *ami_ctxmenu_clicktab_create(struct gui_window_2 *gwin)
+{
+ Object *root_menu;
+
+ if(gwin->clicktab_ctxmenu != NULL) return (struct Menu *)gwin->clicktab_ctxmenu;
+
+ gwin->clicktab_ctxmenu = MStrip,
+ MA_Type, T_ROOT,
+ MA_AddChild, root_menu = MStrip,
+ MA_Type, T_MENU,
+ MA_Label, NULL,
+ MA_EmbeddedKey, FALSE,
+ MEnd,
+ MEnd;
+
+ ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_TABNEW, gwin);
+
+ return (struct Menu *)gwin->clicktab_ctxmenu;
+}
+
+
+#endif
+
diff --git a/amiga/ctxmenu.h b/amiga/ctxmenu.h
new file mode 100644
index 0000000..08a5fe5
--- /dev/null
+++ b/amiga/ctxmenu.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2015 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Interface to Intuition-based context menu operations
+ */
+
+#ifndef AMIGA_CTXMENU_H
+#define AMIGA_CTXMENU_H 1
+struct Hook;
+struct Menu;
+struct gui_window_2;
+
+enum {
+ AMI_CTXMENU_HISTORY_BACK = 0,
+ AMI_CTXMENU_HISTORY_FORWARD = 1
+};
+
+#ifdef __amigaos4__
+/**
+ * Initialise context menus code (allocate label text, etc)
+ * Must be called *after* NetSurf's screen pointer is obtained.
+ */
+void ami_ctxmenu_init(void);
+
+/**
+ * Cleanup context menus code
+ */
+void ami_ctxmenu_free(void);
+
+/**
+ * Get a Hook for WA_ContextMenuHook
+ *
+ * \param data ptr for the hook to use (struct gui_window_2 *)
+ * \returns pointer to a struct Hook
+ */
+struct Hook *ami_ctxmenu_get_hook(APTR data);
+
+/**
+ * Release a Hook for WA_ContextMenuHook
+ *
+ * \param hook ptr to hook
+ */
+void ami_ctxmenu_release_hook(struct Hook *hook);
+
+/**
+ * Create history context menu
+ * The first time this is run it will create an empty menu,
+ * Subsequent runs will (re-)populate with the history.
+ * This is to allow the pointer to be obtained before the browser_window is opened.
+ *
+ * \param direction AMI_CTXMENU_HISTORY_(BACK|FORWARD)
+ * \param gwin struct gui_window_2 *
+ * \returns pointer to menu (for convenience, is also stored in gwin structure)
+ * The returned pointer MUST be disposed of with DisposeObject before program exit.
+ */
+struct Menu *ami_ctxmenu_history_create(int direction, struct gui_window_2 *gwin);
+
+/**
+ * Create ClickTab context menu
+ *
+ * \param gwin struct gui_window_2 *
+ * \returns pointer to menu (for convenience, is also stored in gwin structure)
+ * The returned pointer MUST be disposed of with DisposeObject before program exit.
+ */
+struct Menu *ami_ctxmenu_clicktab_create(struct gui_window_2 *gwin);
+
+#else //__amigaos4__
+inline void ami_ctxmenu_init(void) {}
+inline void ami_ctxmenu_free(void) {}
+inline struct Hook *ami_ctxmenu_get_hook(APTR data) {return NULL;}
+inline void ami_ctxmenu_release_hook(struct Hook *hook) {}
+inline struct Menu *ami_ctxmenu_history_create(int direction, struct gui_window_2 *gwin) {return NULL;}
+inline struct Menu *ami_ctxmenu_clicktab_create(struct gui_window_2 *gwin) {return NULL;}
+#endif //__amigaos4__
+#endif //AMIGA_CTXMENU_H
+
diff --git a/amiga/font.c b/amiga/font.c
index 43d98ca..cba1ee5 100644
--- a/amiga/font.c
+++ b/amiga/font.c
@@ -69,10 +69,13 @@
#define NSA_FONT_EMWIDTH(s) (s / FONT_SIZE_SCALE) * (ami_xdpi / 72.0)
-struct ami_font_node
-{
+#define NSA_FONT_COMPOSITE (GfxBase->LibNode.lib_Version >= 54) && \
+ (nsoption_bool(exp_comp_fonts) == true)
+
+struct ami_font_node {
#ifdef __amigaos4__
struct SkipNode skip_node;
+ struct SkipList *glyph_cache;
#endif
struct OutlineFont *font;
char *bold;
@@ -81,6 +84,14 @@ struct ami_font_node
struct TimeVal lastused;
};
+struct ami_font_glyph_node
+{
+#ifdef __amigaos4__
+ struct SkipNode skip_node;
+#endif
+ struct BitMap *bm;
+};
+
const uint16 sc_table[] = {
0x0061, 0x1D00, /* a */
0x0062, 0x0299, /* b */
@@ -149,7 +160,9 @@ const uint16 sc_table[] = {
0, 0};
#ifdef __amigaos4__
-struct SkipList *ami_font_list = NULL;
+static struct SkipList *ami_font_list = NULL;
+static struct Hook ami_font_cache_hook;
+static struct Hook ami_font_glyph_cache_hook;
#else
struct MinList *ami_font_list = NULL;
#endif
@@ -157,13 +170,12 @@ struct List ami_diskfontlib_list;
lwc_string *glypharray[0xffff + 1];
ULONG ami_devicedpi;
ULONG ami_xdpi;
-static struct Hook ami_font_cache_hook;
-static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPort *rp,
+static inline int32 ami_font_plot_glyph(struct ami_font_node *ofont, struct RastPort *rp,
uint16 *char1, uint16 *char2, uint32 x, uint32 y, uint32 emwidth, bool aa);
static inline int32 ami_font_width_glyph(struct OutlineFont *ofont,
const uint16 *char1, const uint16 *char2, uint32 emwidth);
-static struct OutlineFont *ami_open_outline_font(const plot_font_style_t *fstyle,
+static struct ami_font_node *ami_open_outline_font(const plot_font_style_t *fstyle,
const uint16 *codepoint);
static inline ULONG ami_font_unicode_width(const char *string, ULONG length,
const plot_font_style_t *fstyle, ULONG x, ULONG y, bool aa);
@@ -215,7 +227,7 @@ static inline bool amiga_nsfont_position_in_string(const plot_font_style_t *fsty
{
uint16 *utf16 = NULL, *outf16 = NULL;
uint16 *utf16next = NULL;
- struct OutlineFont *ofont, *ufont = NULL;
+ struct ami_font_node *ofont, *ufont = NULL;
int tx = 0;
uint32 utf8_pos = 0;
int utf16charlen;
@@ -233,14 +245,14 @@ static inline bool amiga_nsfont_position_in_string(const plot_font_style_t *fsty
utf16charlen = amiga_nsfont_utf16_char_length(utf16);
utf16next = &utf16[utf16charlen];
- tempx = ami_font_width_glyph(ofont, utf16, utf16next, emwidth);
+ tempx = ami_font_width_glyph(ofont->font, utf16, utf16next, emwidth);
if (tempx == 0) {
if (ufont == NULL)
ufont = ami_open_outline_font(fstyle, utf16);
if (ufont)
- tempx = ami_font_width_glyph(ufont, utf16,
+ tempx = ami_font_width_glyph(ufont->font, utf16,
utf16next, emwidth);
}
@@ -299,7 +311,7 @@ static inline bool amiga_nsfont_split(const plot_font_style_t *fstyle,
uint16 *utf16_str = NULL;
const uint16 *utf16 = NULL;
const uint16 *utf16next = NULL;
- struct OutlineFont *ofont, *ufont = NULL;
+ struct ami_font_node *ofont, *ufont = NULL;
int tx = 0;
uint32 utf8_pos = 0;
int32 tempx = 0;
@@ -325,14 +337,14 @@ static inline bool amiga_nsfont_split(const plot_font_style_t *fstyle,
else
utf16next = utf16 + 2;
- tempx = ami_font_width_glyph(ofont, utf16, utf16next, emwidth);
+ tempx = ami_font_width_glyph(ofont->font, utf16, utf16next, emwidth);
if (tempx == 0) {
if (ufont == NULL)
ufont = ami_open_outline_font(fstyle, utf16);
if (ufont)
- tempx = ami_font_width_glyph(ufont, utf16,
+ tempx = ami_font_width_glyph(ufont->font, utf16,
utf16next, emwidth);
}
@@ -433,6 +445,10 @@ static struct ami_font_node *ami_font_open(const char *font, bool critical)
node->objstruct = nodedata;
node->dtz_Node.ln_Name = strdup(font);
}
+#else
+ if(NSA_FONT_COMPOSITE) {
+ nodedata->glyph_cache = CreateSkipList(&ami_font_glyph_cache_hook, 10);
+ }
#endif
return nodedata;
@@ -445,7 +461,7 @@ static struct ami_font_node *ami_font_open(const char *font, bool critical)
* \param codepoint open a default font instead of the one specified by fstyle
* \return outline font or NULL on error
*/
-static struct OutlineFont *ami_open_outline_font(const plot_font_style_t *fstyle,
+static struct ami_font_node *ami_open_outline_font(const plot_font_style_t *fstyle,
const uint16 *codepoint)
{
struct ami_font_node *node;
@@ -560,6 +576,7 @@ static struct OutlineFont *ami_open_outline_font(const plot_font_style_t *fstyle
ofont = node->font;
} else {
ofont = designed_node->font;
+ node = designed_node;
}
#ifndef __amigaos4__
@@ -574,12 +591,45 @@ static struct OutlineFont *ami_open_outline_font(const plot_font_style_t *fstyle
OT_ShearSin, shearsin,
OT_ShearCos, shearcos,
TAG_END) == OTERR_Success)
- return ofont;
+ return node;
return NULL;
}
-static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPort *rp,
+#ifdef __amigaos4__
+static struct BitMap *ami_font_glyph_cache_retrieve(struct ami_font_node *font_node,
+ uint32 char1, struct GlyphMap *glyph)
+{
+ UBYTE *glyphbm = glyph->glm_BitMap;
+ struct RastPort rp;
+ struct ami_font_glyph_node *afgn;
+
+ // check cache
+ if((afgn = (struct ami_font_glyph_node *)FindSkipNode(font_node->glyph_cache, (APTR)char1))) {
+ return afgn->bm;
+ }
+
+ afgn = (struct ami_font_glyph_node *)InsertSkipNode(font_node->glyph_cache,
+ (APTR)char1, sizeof(struct ami_font_glyph_node));
+
+ afgn->bm = AllocBitMapTags(glyph->glm_BMModulo, glyph->glm_BMRows, 8,
+ BMATags_PixelFormat, PIXF_ALPHA8,
+ //BMATags_Friend, scrn->RastPort.BitMap,
+ //BMATags_Clear, TRUE,
+ TAG_DONE);
+
+ InitRastPort(&rp);
+ rp.BitMap = afgn->bm;
+
+ WritePixelArray(glyphbm, 0, 0,
+ glyph->glm_BMModulo, PIXF_ALPHA8, &rp,
+ 0, 0, glyph->glm_BMModulo, glyph->glm_BMRows);
+
+ return afgn->bm;
+}
+#endif
+
+static inline int32 ami_font_plot_glyph(struct ami_font_node *font_node, struct RastPort *rp,
uint16 *char1, uint16 *char2, uint32 x, uint32 y, uint32 emwidth, bool aa)
{
struct GlyphMap *glyph;
@@ -589,6 +639,7 @@ static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPo
ULONG glyphmaptag;
ULONG template_type;
uint32 long_char_1 = 0, long_char_2 = 0;
+ struct OutlineFont *ofont = font_node->font;
#ifndef __amigaos4__
struct BulletBase *BulletBase = ofont->BulletBase;
#endif
@@ -635,25 +686,18 @@ static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPo
if(rp) {
#ifdef __amigaos4__
- if((GfxBase->LibNode.lib_Version >= 54) &&
- (template_type == BLITT_ALPHATEMPLATE) &&
- (nsoption_bool(exp_comp_fonts) == true)) {
-
- WritePixelArray(glyphbm, glyph->glm_BlackLeft, glyph->glm_BlackTop,
- glyph->glm_BMModulo, PIXF_ALPHA8, rp,
- x - glyph->glm_X0 + glyph->glm_BlackLeft,
- y - glyph->glm_Y0 + glyph->glm_BlackTop,
- glyph->glm_BlackWidth, glyph->glm_BlackHeight);
+ if(NSA_FONT_COMPOSITE && (template_type == BLITT_ALPHATEMPLATE)) {
+ struct BitMap *cached_bm = ami_font_glyph_cache_retrieve(font_node, long_char_1, glyph);
CompositeTags(COMPOSITE_Src_Over_Dest, COMPSRC_SOLIDCOLOR, rp->BitMap,
COMPTAG_Color0, 0xff000000, /* assume black for now */
- COMPTAG_SrcAlphaMask, rp->BitMap,
- COMPTAG_SrcX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
- COMPTAG_SrcY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
+ COMPTAG_SrcAlphaMask, cached_bm,
+ COMPTAG_SrcX, glyph->glm_X0 + glyph->glm_BlackLeft,
+ COMPTAG_SrcY, glyph->glm_Y0 + glyph->glm_BlackTop,
COMPTAG_SrcWidth, glyph->glm_BlackWidth,
COMPTAG_SrcHeight, glyph->glm_BlackHeight,
COMPTAG_OffsetX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
- COMPTAG_OffsetY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
+ COMPTAG_OffsetY, x - glyph->glm_Y0 + glyph->glm_BlackTop,
COMPTAG_DestX, x - glyph->glm_X0 + glyph->glm_BlackLeft,
COMPTAG_DestY, y - glyph->glm_Y0 + glyph->glm_BlackTop,
COMPTAG_DestWidth, glyph->glm_BlackWidth,
@@ -807,7 +851,7 @@ ULONG ami_font_unicode_text(struct RastPort *rp, const char *string, ULONG lengt
uint16 *utf16charsc = 0, *utf16nextsc = 0;
uint16 *utf16next = 0;
int utf16charlen;
- struct OutlineFont *ofont, *ufont = NULL;
+ struct ami_font_node *ofont, *ufont = NULL;
uint32 x=0;
int32 tempx = 0;
ULONG emwidth = (ULONG)NSA_FONT_EMWIDTH(fstyle->size);
@@ -873,7 +917,7 @@ static inline ULONG ami_font_unicode_width(const char *string, ULONG length,
uint16 *utf16charsc = 0, *utf16nextsc = 0;
uint16 *utf16next = 0;
int utf16charlen;
- struct OutlineFont *ofont, *ufont = NULL;
+ struct ami_font_node *ofont, *ufont = NULL;
uint32 x=0;
int32 tempx = 0;
ULONG emwidth = (ULONG)NSA_FONT_EMWIDTH(fstyle->size);
@@ -895,12 +939,12 @@ static inline ULONG ami_font_unicode_width(const char *string, ULONG length,
utf16charsc = (uint16 *)ami_font_translate_smallcaps(utf16);
utf16nextsc = (uint16 *)ami_font_translate_smallcaps(utf16next);
- tempx = ami_font_width_glyph(ofont, utf16charsc, utf16nextsc, emwidth);
+ tempx = ami_font_width_glyph(ofont->font, utf16charsc, utf16nextsc, emwidth);
}
else tempx = 0;
if(tempx == 0) {
- tempx = ami_font_width_glyph(ofont, utf16, utf16next, emwidth);
+ tempx = ami_font_width_glyph(ofont->font, utf16, utf16next, emwidth);
}
if(tempx == 0)
@@ -912,7 +956,7 @@ static inline ULONG ami_font_unicode_width(const char *string, ULONG length,
if(ufont)
{
- tempx = ami_font_width_glyph(ufont, utf16, utf16next, emwidth);
+ tempx = ami_font_width_glyph(ufont->font, utf16, utf16next, emwidth);
}
}
@@ -945,6 +989,11 @@ static LONG ami_font_cache_sort(struct Hook *hook, APTR key1, APTR key2)
{
return stricmp(key1, key2);
}
+
+static LONG ami_font_glyph_cache_sort(struct Hook *hook, APTR key1, APTR key2)
+{
+ return (int)key2 - (int)key1;
+}
#endif
#ifdef __amigaos4__
@@ -1009,6 +1058,8 @@ void ami_init_fonts(void)
/* Initialise font caching etc lists */
#ifdef __amigaos4__
+ ami_font_glyph_cache_hook.h_Entry = (HOOKFUNC)ami_font_glyph_cache_sort;
+ ami_font_glyph_cache_hook.h_Data = 0;
ami_font_cache_hook.h_Entry = (HOOKFUNC)ami_font_cache_sort;
ami_font_cache_hook.h_Data = 0;
ami_font_list = CreateSkipList(&ami_font_cache_hook, 8);
diff --git a/amiga/gui.c b/amiga/gui.c
index aa84b52..b4f3b13 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2008-2014 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ * Copyright 2008-2015 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -34,9 +34,6 @@
#include <proto/intuition.h>
#include <proto/keymap.h>
#include <proto/locale.h>
-#ifdef __amigaos4__
-#include <proto/popupmenu.h>
-#endif
#include <proto/utility.h>
#include <proto/wb.h>
@@ -119,8 +116,8 @@
#include "amiga/arexx.h"
#include "amiga/bitmap.h"
#include "amiga/clipboard.h"
-#include "amiga/context_menu.h"
#include "amiga/cookies.h"
+#include "amiga/ctxmenu.h"
#include "amiga/datatypes.h"
#include "amiga/download.h"
#include "amiga/drag.h"
@@ -144,6 +141,7 @@
#include "amiga/print.h"
#include "amiga/schedule.h"
#include "amiga/search.h"
+#include "amiga/selectmenu.h"
#include "amiga/theme.h"
#include "amiga/tree.h"
#include "amiga/utf8.h"
@@ -541,9 +539,8 @@ static nserror ami_set_options(struct nsoption_s *defaults)
STRPTR tempacceptlangs;
char temp[1024];
- /* The following line disables the popupmenu.class select menu
- ** This will become a user option when/if popupmenu.class is
- ** updated to show more items than can fit in one column vertically
+ /* The following line disables the popupmenu.class select menu.
+ ** It's not recommended to use it!
*/
nsoption_set_bool(core_select_menu, true);
@@ -626,9 +623,6 @@ static nserror ami_set_options(struct nsoption_s *defaults)
}
}
- if(popupmenu_lib_ok == FALSE)
- nsoption_set_bool(context_menu, false);
-
#ifndef __amigaos4__
nsoption_set_bool(download_notify, false);
nsoption_set_bool(font_antialiasing, false);
@@ -1102,6 +1096,10 @@ static void ami_update_buttons(struct gui_window_2 *gwin)
SetGadgetAttrs((struct Gadget *)gwin->objects[GID_CLOSETAB],
gwin->win, NULL, GA_Disabled, tabclose, TAG_DONE);
}
+
+ /* Update the back/forward buttons history context menu */
+ ami_ctxmenu_history_create(AMI_CTXMENU_HISTORY_BACK, gwin);
+ ami_ctxmenu_history_create(AMI_CTXMENU_HISTORY_FORWARD, gwin);
}
void ami_gui_history(struct gui_window_2 *gwin, bool back)
@@ -1317,7 +1315,7 @@ static bool ami_spacebox_to_ns_coords(struct gui_window_2 *gwin, int *x, int *y,
return true;
}
-static bool ami_mouse_to_ns_coords(struct gui_window_2 *gwin, int *x, int *y,
+bool ami_mouse_to_ns_coords(struct gui_window_2 *gwin, int *x, int *y,
int mouse_x, int mouse_y)
{
int ns_x, ns_y;
@@ -1918,7 +1916,6 @@ static void ami_handle_msg(void)
if((x>=xs) && (y>=ys) && (x<width+xs) && (y<height+ys))
{
ami_update_quals(gwin);
- ami_context_menu_mouse_trap(gwin, TRUE);
if(gwin->mouse_state & BROWSER_MOUSE_PRESS_1)
{
@@ -1934,11 +1931,7 @@ static void ami_handle_msg(void)
{
browser_window_mouse_track(gwin->gw->bw,gwin->mouse_state | gwin->key_state,x,y);
}
- }
- else
- {
- ami_context_menu_mouse_trap(gwin, FALSE);
-
+ } else {
if(!gwin->mouse_state) ami_set_pointer(gwin, GUI_POINTER_DEFAULT, true);
}
break;
@@ -1988,10 +1981,6 @@ static void ami_handle_msg(void)
switch(code)
{
- case MENUDOWN:
- ami_context_menu_show(gwin,x,y);
- break;
-
case SELECTUP:
if(gwin->mouse_state & BROWSER_MOUSE_PRESS_1)
{
@@ -2265,104 +2254,10 @@ static void ami_handle_msg(void)
if((ie->ie_Qualifier & IEQUALIFIER_RCOMMAND) &&
((31 < nskey) && (nskey < 127))) {
- /* We are duplicating the menu shortcuts here, as if RMBTRAP is
- * active (ie. when context menus are enabled and the mouse is over
- * the browser rendering area), Intuition also does not catch the
- * menu shortcut key presses. Context menus possibly need to be
- * changed to use MENUVERIFY not RMBTRAP.
- * NB: Some keypresses are converted to generic keypresses above
- * rather than being "menu-emulated" here.
- */
+ /* NB: Some keypresses are converted to generic keypresses above
+ * rather than being "menu-emulated" here. */
switch(nskey)
{
- case 'n':
- if ((nsoption_bool(kiosk_mode) == false)) {
- nsurl *urlns;
- nserror error;
-
- error = nsurl_create(nsoption_charp(homepage_url), &urlns);
- if (error == NSERROR_OK) {
- error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY,
- urlns,
- NULL,
- gwin->gw->bw,
- NULL);
- nsurl_unref(urlns);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
-
- }
- break;
-
- case 't':
- if((nsoption_bool(kiosk_mode) == false)) {
- nsurl *urlns;
- nserror error;
-
- error = nsurl_create(nsoption_charp(homepage_url), &urlns);
- if (error == NSERROR_OK) {
- error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY |
- BW_CREATE_TAB,
- urlns,
- NULL,
- gwin->gw->bw,
- NULL);
- nsurl_unref(urlns);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
-
- }
- break;
-
- case 'k':
- if((nsoption_bool(kiosk_mode) == false))
- browser_window_destroy(gwin->gw->bw);
- break;
-
- case 'o':
- ami_file_open(gwin);
- break;
-
- case 's':
- ami_file_save_req(AMINS_SAVE_SOURCE, gwin,
- browser_window_get_content(gwin->gw->bw));
- break;
-
- case 'p':
- ami_print_ui(browser_window_get_content(gwin->gw->bw));
- break;
-
- case 'q':
- if((nsoption_bool(kiosk_mode) == false))
- ami_quit_netsurf();
- break;
-
- case 'f':
- ami_search_open(gwin->gw);
- break;
-
- case 'h':
- if((nsoption_bool(kiosk_mode) == false))
- ami_tree_open(hotlist_window, AMI_TREE_HOTLIST);
- break;
-
- case '-':
- if(gwin->gw->scale > 0.1)
- ami_gui_set_scale(gwin->gw, gwin->gw->scale - 0.1);
- break;
-
- case '=':
- ami_gui_set_scale(gwin->gw, 1.0);
- break;
-
- case '+':
- ami_gui_set_scale(gwin->gw, gwin->gw->scale + 0.1);
- break;
-
/* The following aren't available from the menu at the moment */
case 'r': // reload
@@ -3037,7 +2932,7 @@ static void gui_quit(void)
if(nsscreentitle) FreeVec(nsscreentitle);
LOG("Freeing menu items");
- ami_context_menu_free();
+ ami_ctxmenu_free();
ami_menu_free_glyphs();
LOG("Freeing mouse pointers");
@@ -3314,6 +3209,7 @@ static void ami_toggletabbar(struct gui_window_2 *gwin, bool show)
GA_ID, GID_TABS,
GA_RelVerify, TRUE,
GA_Underscore, 13, // disable kb shortcuts
+ GA_ContextMenu, ami_ctxmenu_clicktab_create(gwin),
CLICKTAB_Labels, &gwin->tab_list,
CLICKTAB_LabelTruncate, TRUE,
CLICKTAB_CloseImage, gwin->objects[GID_CLOSETAB_BM],
@@ -3849,7 +3745,7 @@ gui_window_create(struct browser_window *bw,
}
ami_NewMinList(&g->shared->shared_pens);
-
+
g->shared->scrollerhook.h_Entry = (void *)ami_scroller_hook;
g->shared->scrollerhook.h_Data = g->shared;
@@ -3861,6 +3757,11 @@ gui_window_create(struct browser_window *bw,
newprefs_hook.h_Entry = (void *)ami_gui_newprefs_hook;
newprefs_hook.h_Data = 0;
+
+ g->shared->ctxmenu_hook = ami_ctxmenu_get_hook(g->shared);
+ g->shared->history_ctxmenu[AMI_CTXMENU_HISTORY_BACK] = NULL;
+ g->shared->history_ctxmenu[AMI_CTXMENU_HISTORY_FORWARD] = NULL;
+ g->shared->clicktab_ctxmenu = NULL;
if(nsoption_bool(window_simple_refresh) == true) {
refresh_mode = WA_SimpleRefresh;
@@ -3880,10 +3781,9 @@ gui_window_create(struct browser_window *bw,
(locked_screen == TRUE) &&
(strcmp(nsoption_charp(pubscreen_name), "Workbench") == 0))
iconifygadget = TRUE;
- ami_create_menu(g->shared);
-#ifndef __amigaos4__
- struct Menu *menu = ami_menu_create_os3(g->shared, g->shared->menu);
-#endif
+
+ struct Menu *menu = ami_menu_create(g->shared);
+
NewList(&g->shared->tab_list);
g->tab_node = AllocClickTabNode(TNA_Text,messages_get("NetSurf"),
TNA_Number, 0,
@@ -4024,6 +3924,7 @@ gui_window_create(struct browser_window *bw,
WA_ReportMouse,TRUE,
refresh_mode, TRUE,
WA_SizeBBottom, TRUE,
+ WA_ContextMenuHook, g->shared->ctxmenu_hook,
WA_IDCMP, IDCMP_MENUPICK | IDCMP_MOUSEMOVE |
IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
IDCMP_RAWKEY | idcmp_sizeverify |
@@ -4031,11 +3932,7 @@ gui_window_create(struct browser_window *bw,
IDCMP_REFRESHWINDOW |
IDCMP_ACTIVEWINDOW | IDCMP_EXTENDEDMOUSE,
WINDOW_IconifyGadget, iconifygadget,
-#ifdef __amigaos4__
- WINDOW_NewMenu, g->shared->menu,
-#else
WINDOW_MenuStrip, menu,
-#endif
WINDOW_MenuUserData, WGUD_HOOK,
WINDOW_NewPrefsHook, &newprefs_hook,
WINDOW_IDCMPHook, &g->shared->scrollerhook,
@@ -4051,9 +3948,10 @@ gui_window_create(struct browser_window *bw,
LAYOUT_AddChild, g->shared->objects[GID_TOOLBARLAYOUT] = LayoutHObj,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_AddChild, g->shared->objects[GID_BACK] = ButtonObj,
- GA_ID,GID_BACK,
- GA_RelVerify,TRUE,
- GA_Disabled,TRUE,
+ GA_ID, GID_BACK,
+ GA_RelVerify, TRUE,
+ GA_Disabled, TRUE,
+ GA_ContextMenu, ami_ctxmenu_history_create(AMI_CTXMENU_HISTORY_BACK, g->shared),
GA_HintInfo, g->shared->helphints[GID_BACK],
BUTTON_RenderImage,BitMapObj,
BITMAP_SourceFile,nav_west,
@@ -4066,9 +3964,10 @@ gui_window_create(struct browser_window *bw,
CHILD_WeightedWidth,0,
CHILD_WeightedHeight,0,
LAYOUT_AddChild, g->shared->objects[GID_FORWARD] = ButtonObj,
- GA_ID,GID_FORWARD,
- GA_RelVerify,TRUE,
- GA_Disabled,TRUE,
+ GA_ID, GID_FORWARD,
+ GA_RelVerify, TRUE,
+ GA_Disabled, TRUE,
+ GA_ContextMenu, ami_ctxmenu_history_create(AMI_CTXMENU_HISTORY_FORWARD, g->shared),
GA_HintInfo, g->shared->helphints[GID_FORWARD],
BUTTON_RenderImage,BitMapObj,
BITMAP_SourceFile,nav_east,
@@ -4301,11 +4200,15 @@ gui_window_create(struct browser_window *bw,
"frbuttonclass", /**\todo find appropriate class which works on OS3 */
GA_ID, GID_STATUS,
GA_Left, scrn->WBorLeft + 2,
+#ifdef __amigaos4__
GA_RelBottom, -((2 + height + scrn->WBorBottom - scrn->RastPort.TxHeight)/2),
+ GA_BottomBorder, TRUE,
+#else
+ GA_Top, g->shared->win->Height,
+#endif
GA_Width, width,
GA_Height, 1 + height - scrn->WBorBottom,
GA_DrawInfo, dri,
- GA_BottomBorder, TRUE,
GA_ReadOnly, TRUE,
GA_Disabled, TRUE,
GA_Image, (struct Image *)NewObject(
@@ -4423,8 +4326,7 @@ static void gui_window_destroy(struct gui_window *g)
cur_gw = NULL;
- if(g->shared->tabs > 1)
- {
+ if(g->shared->tabs > 1) {
SetGadgetAttrs((struct Gadget *)g->shared->objects[GID_TABS],g->shared->win,NULL,
CLICKTAB_Labels,~0,
TAG_DONE);
@@ -4467,7 +4369,6 @@ static void gui_window_destroy(struct gui_window *g)
DisposeObject(g->shared->objects[OID_MAIN]);
ami_gui_appicon_remove(g->shared);
if(g->shared->appwin) RemoveAppWindow(g->shared->appwin);
-
ami_gui_hotlist_toolbar_free(g->shared, &g->shared->hotlist_toolbar_list);
/* These aren't freed by the above.
@@ -4481,10 +4382,14 @@ static void gui_window_destroy(struct gui_window *g)
ami_gui_opts_websearch_free(g->shared->web_search_list);
if(g->shared->search_bm) DisposeObject(g->shared->search_bm);
+ /* This appears to be disposed along with the ClickTab object
+ if(g->shared->clicktab_ctxmenu) DisposeObject((Object *)g->shared->clicktab_ctxmenu); */
+ DisposeObject((Object *)g->shared->history_ctxmenu[AMI_CTXMENU_HISTORY_BACK]);
+ DisposeObject((Object *)g->shared->history_ctxmenu[AMI_CTXMENU_HISTORY_FORWARD]);
+ ami_ctxmenu_release_hook(g->shared->ctxmenu_hook);
ami_free_menulabs(g->shared);
-#ifndef __amigaos4__
- ami_menu_free_os3(g->shared);
-#endif
+ ami_menu_free(g->shared);
+
free(g->shared->wintitle);
ami_utf8_free(g->shared->status);
FreeVec(g->shared->svbuffer);
@@ -4493,8 +4398,7 @@ static void gui_window_destroy(struct gui_window *g)
free(g->shared->helphints[gid]);
DelObject(g->shared->node);
- if(g->tab_node)
- {
+ if(g->tab_node) {
Remove(g->tab_node);
FreeClickTabNode(g->tab_node);
}
@@ -5446,19 +5350,6 @@ int main(int argc, char** argv)
/* Open splash window */
Object *splash_window = ami_gui_splash_open();
- /* Open popupmenu.library just to check the version.
- * Versions older than 53.11 are dangerous, so we
- * forcibly disable context menus if these are in use.
- */
- popupmenu_lib_ok = FALSE;
-#ifdef __amigaos4__
- if((PopupMenuBase = OpenLibrary("popupmenu.library", 53))) {
- LOG("popupmenu.library v%d.%d", PopupMenuBase->lib_Version, PopupMenuBase->lib_Revision);
- if(LIB_IS_AT_LEAST((struct Library *)PopupMenuBase, 53, 11))
- popupmenu_lib_ok = TRUE;
- CloseLibrary(PopupMenuBase);
- }
-#endif
if (ami_open_resources() == false) { /* alloc message ports */
ami_misc_fatal_error("Unable to allocate resources");
return RETURN_FAIL;
@@ -5523,7 +5414,6 @@ int main(int argc, char** argv)
ami_openurl_open();
ami_amiupdate(); /* set env-vars for AmiUpdate */
ami_init_fonts();
- ami_context_menu_init();
save_complete_init();
ami_theme_init();
ami_init_mouse_pointers();
@@ -5539,6 +5429,8 @@ int main(int argc, char** argv)
gui_init2(argc, argv);
+ ami_ctxmenu_init(); /* Requires screen pointer */
+
ami_gui_splash_close(splash_window);
strlcpy(script, nsoption_charp(arexx_dir), 1024);
diff --git a/amiga/gui.h b/amiga/gui.h
old mode 100755
new mode 100644
index adad63d..6a01082
--- a/amiga/gui.h
+++ b/amiga/gui.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2008-2014 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ * Copyright 2008-2015 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -18,15 +18,16 @@
#ifndef AMIGA_GUI_H
#define AMIGA_GUI_H
-
+#include <stdbool.h>
#include <graphics/rastport.h>
-#include "amiga/object.h"
#include <intuition/classusr.h>
#include <dos/dos.h>
#include <devices/inputevent.h>
+#include "amiga/menu.h"
+#include "amiga/object.h"
#include "amiga/os3support.h"
#include "amiga/plotters.h"
-#include "amiga/menu.h"
+#include "desktop/gui_window.h"
#ifdef __amigaos4__
#define HOOKF(ret,func,type,ptr,msgtype) static ret func(struct Hook *hook, type ptr, msgtype msg)
@@ -131,15 +132,16 @@ struct gui_window_2 {
struct DiskObject *dobj; /* iconify appicon */
struct Hook favicon_hook;
struct Hook throbber_hook;
+ struct Hook *ctxmenu_hook;
+ Object *history_ctxmenu[2];
+ Object *clicktab_ctxmenu;
gui_drag_type drag_op;
struct IBox *ptr_lock;
struct AppWindow *appwin;
struct MinList shared_pens;
gui_pointer_shape mouse_pointer;
-#ifndef __amigaos4__
- struct NewMenu *menu_os3;
- struct VisualInfo *vi;
-#endif
+ struct Menu *imenu; /* Intuition menu */
+ struct VisualInfo *vi; /* For GadTools menu */
};
struct gui_window
@@ -173,6 +175,8 @@ void ami_schedule_redraw(struct gui_window_2 *gwin, bool full_redraw);
STRPTR ami_locale_langs(void);
int ami_key_to_nskey(ULONG keycode, struct InputEvent *ie);
bool ami_text_box_at_point(struct gui_window_2 *gwin, ULONG *x, ULONG *y);
+bool ami_mouse_to_ns_coords(struct gui_window_2 *gwin, int *x, int *y,
+ int mouse_x, int mouse_y);
BOOL ami_gadget_hit(Object *obj, int x, int y);
void ami_gui_history(struct gui_window_2 *gwin, bool back);
void ami_gui_hotlist_update_all(void);
@@ -220,6 +224,5 @@ struct MsgPort *sport;
struct gui_window *cur_gw;
struct gui_globals browserglob;
BOOL ami_autoscroll;
-BOOL popupmenu_lib_ok;
#endif
diff --git a/amiga/gui_options.c b/amiga/gui_options.c
index 42ee09a..cfa78e8 100755
--- a/amiga/gui_options.c
+++ b/amiga/gui_options.c
@@ -71,6 +71,7 @@
#include "amiga/libs.h"
#include "amiga/misc.h"
#include "amiga/object.h"
+#include "amiga/selectmenu.h"
#include "amiga/theme.h"
#include "amiga/utf8.h"
@@ -132,7 +133,7 @@ enum
GID_OPTS_TAB_CLOSE,
GID_OPTS_SEARCH_PROV,
GID_OPTS_CLIPBOARD,
- GID_OPTS_CONTEXTMENU,
+ GID_OPTS_SELECTMENU,
GID_OPTS_STARTUP_NO_WIN,
GID_OPTS_CLOSE_NO_QUIT,
GID_OPTS_DOCKY,
@@ -328,7 +329,7 @@ static void ami_gui_opts_setup(struct ami_gui_opts_window *gow)
gadlab[GID_OPTS_TAB_CLOSE] = (char *)ami_utf8_easy((char *)messages_get("TabClose"));
gadlab[GID_OPTS_SEARCH_PROV] = (char *)ami_utf8_easy((char *)messages_get("SearchProvider"));
gadlab[GID_OPTS_CLIPBOARD] = (char *)ami_utf8_easy((char *)messages_get("ClipboardUTF8"));
- gadlab[GID_OPTS_CONTEXTMENU] = (char *)ami_utf8_easy((char *)messages_get("ContextMenu"));
+ gadlab[GID_OPTS_SELECTMENU] = (char *)ami_utf8_easy((char *)messages_get("PopupMenu"));
gadlab[GID_OPTS_STARTUP_NO_WIN] = (char *)ami_utf8_easy((char *)messages_get("OptionNoWindow"));
gadlab[GID_OPTS_CLOSE_NO_QUIT] = (char *)ami_utf8_easy((char *)messages_get("OptionNoQuit"));
gadlab[GID_OPTS_DOCKY] = (char *)ami_utf8_easy((char *)messages_get("OptionDocky"));
@@ -1360,22 +1361,22 @@ void ami_gui_opts_open(void)
LAYOUT_BevelStyle, BVS_GROUP,
LAYOUT_Label, gadlab[GRP_OPTS_MISC],
LAYOUT_SpaceOuter, TRUE,
-#ifdef __amigaos4__
- LAYOUT_AddChild, gow->objects[GID_OPTS_CONTEXTMENU] = CheckBoxObj,
- GA_ID, GID_OPTS_CONTEXTMENU,
- GA_RelVerify, TRUE,
- GA_Text, gadlab[GID_OPTS_CONTEXTMENU],
- GA_Selected, nsoption_bool(context_menu),
- GA_Disabled, !popupmenu_lib_ok,
- CheckBoxEnd,
-#endif
LAYOUT_AddChild, gow->objects[GID_OPTS_FASTSCROLL] = CheckBoxObj,
GA_ID, GID_OPTS_FASTSCROLL,
GA_RelVerify, TRUE,
GA_Text, gadlab[GID_OPTS_FASTSCROLL],
GA_Selected, nsoption_bool(faster_scroll),
CheckBoxEnd,
- LayoutEnd, // context menus
+#ifdef __amigaos4__
+ LAYOUT_AddChild, gow->objects[GID_OPTS_SELECTMENU] = CheckBoxObj,
+ GA_ID, GID_OPTS_SELECTMENU,
+ GA_RelVerify, TRUE,
+ GA_Text, gadlab[GID_OPTS_SELECTMENU],
+ GA_Selected, !nsoption_bool(core_select_menu),
+ GA_Disabled, !ami_selectmenu_is_safe(),
+ CheckBoxEnd,
+#endif
+ LayoutEnd, // misc
CHILD_WeightedHeight, 0,
LayoutEnd, // page vgroup
@@ -1855,11 +1856,11 @@ static void ami_gui_opts_use(bool save)
nsoption_set_bool(clipboard_write_utf8, false);
}
- GetAttr(GA_Selected,gow->objects[GID_OPTS_CONTEXTMENU],(ULONG *)&data);
+ GetAttr(GA_Selected,gow->objects[GID_OPTS_SELECTMENU],(ULONG *)&data);
if (data) {
- nsoption_set_bool(context_menu, true);
+ nsoption_set_bool(core_select_menu, false);
} else {
- nsoption_set_bool(context_menu, false);
+ nsoption_set_bool(core_select_menu, true);
}
GetAttr(GA_Selected,gow->objects[GID_OPTS_STARTUP_NO_WIN],(ULONG *)&data);
diff --git a/amiga/libs.c b/amiga/libs.c
index cac028d..76ac876 100644
--- a/amiga/libs.c
+++ b/amiga/libs.c
@@ -77,8 +77,8 @@
if(PREFIX##Base) CloseLibrary((struct Library *)PREFIX##Base);
#define AMINS_LIB_STRUCT(PREFIX) \
- struct PREFIX##Base *PREFIX##Base; \
- struct PREFIX##IFace *I##PREFIX;
+ struct PREFIX##Base *PREFIX##Base = NULL; \
+ struct PREFIX##IFace *I##PREFIX = NULL;
#define AMINS_CLASS_OPEN(CLASS, CLASSVER, PREFIX, CLASSGET, NEEDINTERFACE) \
LOG("Opening %s v%d", CLASS, CLASSVER); \
@@ -125,7 +125,7 @@
if(PREFIX##Base) CloseLibrary((struct Library *)PREFIX##Base);
#define AMINS_LIB_STRUCT(PREFIX) \
- struct PREFIX##Base *PREFIX##Base;
+ struct PREFIX##Base *PREFIX##Base = NULL;
#define AMINS_CLASS_OPEN(CLASS, CLASSVER, PREFIX, CLASSGET, NEEDINTERFACE) \
LOG("Opening %s v%d", CLASS, CLASSVER); \
@@ -215,10 +215,10 @@ bool ami_libs_open(void)
AMINS_LIB_OPEN("locale.library", 38, Locale, "main", 1, true)
AMINS_LIB_OPEN("workbench.library", 37, Workbench, "main", 1, true)
- /*\todo This is down here as we need to check the graphics.library version
- * before opening. If it is sufficiently new enough we can avoid using P96
+ /* This is down here as we need to check the graphics.library version
+ * before opening. If it is sufficiently new enough we can avoid using P96.
*/
- if(GfxBase->LibNode.lib_Version >= 54)
+ if(GfxBase->LibNode.lib_Version < 54)
AMINS_LIB_OPEN("Picasso96API.library", 0, P96, "main", 1, false)
/* NB: timer.device is opened in schedule.c (ultimately by the scheduler process).
diff --git a/amiga/menu.c b/amiga/menu.c
index 571f411..9d555ab 100644
--- a/amiga/menu.c
+++ b/amiga/menu.c
@@ -561,7 +561,7 @@ static void ami_menu_alloc_item(struct gui_window_2 *gwin, int num, UBYTE type,
gwin->menulab[num] = ami_utf8_easy(messages_get(label));
}
}
-
+
gwin->menuicon[num] = NULL;
if(key) gwin->menukey[num] = key;
if(func) gwin->menu_hook[num].h_Entry = (HOOKFUNC)func;
@@ -704,29 +704,19 @@ static void ami_init_menulabs(struct gui_window_2 *gwin)
/* Menu refresh for hotlist */
void ami_menu_refresh(struct gui_window_2 *gwin)
{
+ struct Menu *menu;
+
SetAttrs(gwin->objects[OID_MAIN],
-#ifdef __amigaos4__
- WINDOW_NewMenu, NULL,
-#else
WINDOW_MenuStrip, NULL,
-#endif
TAG_DONE);
-#ifndef __amigaos4__
- ami_menu_free_os3(gwin->menu_os3);
-#endif
+ ami_menu_free(gwin);
ami_free_menulabs(gwin);
- ami_create_menu(gwin);
-#ifndef __amigaos4__
- gwin->menu_os3 = ami_menu_create_os3(gwin, gwin->menu);
-#endif
+
+ menu = ami_menu_create(gwin);
SetAttrs(gwin->objects[OID_MAIN],
-#ifdef __amigaos4__
- WINDOW_NewMenu, gwin->menu,
-#else
- WINDOW_MenuStrip, gwin->menu_os3,
-#endif
+ WINDOW_MenuStrip, menu,
TAG_DONE);
}
@@ -905,25 +895,13 @@ static struct gui_window_2 *ami_menu_layout(struct gui_window_2 *gwin)
return gwin;
}
-#ifndef __amigaos4__
-void ami_menu_free_os3(struct gui_window_2 *gwin)
+void ami_menu_free(struct gui_window_2 *gwin)
{
- FreeMenus(gwin->menu_os3);
+ FreeMenus(gwin->imenu);
FreeVisualInfo(gwin->vi);
}
-struct Menu *ami_menu_create_os3(struct gui_window_2 *gwin, struct NewMenu *newmenu)
-{
- gwin->vi = GetVisualInfo(scrn, TAG_DONE);
- gwin->menu_os3 = CreateMenus(newmenu, TAG_DONE);
- LayoutMenus(gwin->menu_os3, gwin->vi,
- GTMN_NewLookMenus, TRUE, TAG_DONE);
-
- return gwin->menu_os3;
-}
-#endif
-
-struct NewMenu *ami_create_menu(struct gui_window_2 *gwin)
+struct Menu *ami_menu_create(struct gui_window_2 *gwin)
{
gwin->menu = ami_misc_allocvec_clear(sizeof(struct NewMenu) * (AMI_MENU_AREXX_MAX + 1), 0);
ami_init_menulabs(gwin);
@@ -944,7 +922,14 @@ struct NewMenu *ami_create_menu(struct gui_window_2 *gwin)
if(nsoption_bool(background_images) == true)
gwin->menu[M_IMGBACK].nm_Flags |= CHECKED;
- return(gwin->menu);
+ gwin->vi = GetVisualInfo(scrn, TAG_DONE);
+ gwin->imenu = CreateMenus(gwin->menu, TAG_DONE);
+ LayoutMenus(gwin->imenu, gwin->vi,
+ GTMN_NewLookMenus, TRUE, TAG_DONE);
+
+ /**\todo do we even need to store/keep gwin->menu? **/
+
+ return gwin->imenu;
}
void ami_menu_arexx_scan(struct gui_window_2 *gwin)
diff --git a/amiga/menu.h b/amiga/menu.h
index 516aedf..cff42dd 100755
--- a/amiga/menu.h
+++ b/amiga/menu.h
@@ -137,15 +137,12 @@ struct gui_window_2 *ami_menu_window_close;
bool ami_menu_check_toggled;
void ami_free_menulabs(struct gui_window_2 *gwin);
-struct NewMenu *ami_create_menu(struct gui_window_2 *gwin);
+struct Menu *ami_menu_create(struct gui_window_2 *gwin);
void ami_menu_refresh(struct gui_window_2 *gwin);
void ami_menu_update_checked(struct gui_window_2 *gwin);
void ami_menu_update_disabled(struct gui_window *g, hlcache_handle *c);
void ami_menu_free_glyphs(void);
+void ami_menu_free(struct gui_window_2 *gwin);
-#ifndef __amigaos4__
-void ami_menu_free_os3(struct gui_window_2 *gwin);
-struct Menu *ami_menu_create_os3(struct gui_window_2 *gwin, struct NewMenu *newmenu);
#endif
-#endif
diff --git a/amiga/options.h b/amiga/options.h
index 2e7833e..ec8a41b 100644
--- a/amiga/options.h
+++ b/amiga/options.h
@@ -34,7 +34,6 @@ NSOPTION_INTEGER(screen_ydpi, 85)
NSOPTION_INTEGER(cache_bitmaps, 0)
NSOPTION_STRING(theme, "PROGDIR:Resources/Themes/Default")
NSOPTION_BOOL(clipboard_write_utf8, false)
-NSOPTION_BOOL(context_menu, true)
NSOPTION_BOOL(truecolour_mouse_pointers, false)
NSOPTION_BOOL(os_mouse_pointers, true)
NSOPTION_BOOL(use_openurl_lib, false)
diff --git a/amiga/os3support.h b/amiga/os3support.h
index ac7f315..45a917a 100644
--- a/amiga/os3support.h
+++ b/amiga/os3support.h
@@ -73,6 +73,7 @@
#define GETFONT_ScalableOnly TAG_IGNORE
#define PDTA_PromoteMask TAG_IGNORE
#define RPTAG_APenColor TAG_IGNORE
+#define GA_ContextMenu TAG_IGNORE
#define GA_HintInfo TAG_IGNORE
#define GAUGEIA_Level TAG_IGNORE
#define IA_InBorder TAG_IGNORE
@@ -81,6 +82,7 @@
#define SBNA_Text TAG_IGNORE
#define TNA_CloseGadget TAG_IGNORE
#define TNA_HintInfo TAG_IGNORE
+#define WA_ContextMenuHook TAG_IGNORE
#define WA_ToolBox TAG_IGNORE
#define WINDOW_BuiltInScroll TAG_IGNORE
#define WINDOW_NewMenu TAG_IGNORE
diff --git a/amiga/selectmenu.c b/amiga/selectmenu.c
new file mode 100644
index 0000000..2593178
--- /dev/null
+++ b/amiga/selectmenu.c
@@ -0,0 +1,200 @@
+/*
+ * Copyright 2008 - 2011 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef __amigaos4__
+
+#include <stdbool.h>
+#include <proto/exec.h>
+#include <proto/intuition.h>
+#include <proto/popupmenu.h>
+#include <proto/utility.h>
+#include <reaction/reaction_macros.h>
+
+#include "utils/errors.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "render/form.h"
+#include "desktop/mouse.h"
+
+#include "amiga/gui.h"
+#include "amiga/selectmenu.h"
+#include "amiga/theme.h"
+#include "amiga/utf8.h"
+
+/* Maximum number of items for a popupmenu.class select menu.
+ * 50 is about the limit for my screen, and popupmenu doesn't scroll.
+ * We may need to calculate a value for this based on screen/font size.
+ *
+ * Additional entries will be added to a "More" menu...
+ */
+#define AMI_SELECTMENU_PAGE_MAX 40
+
+/* ...limited to the number of menus defined here... */
+#define AMI_SELECTMENU_MENU_MAX 10
+
+/* ...and resulting in this total number of entries. */
+#define AMI_SELECTMENU_MAX (AMI_SELECTMENU_PAGE_MAX * AMI_SELECTMENU_MENU_MAX)
+
+
+/** Exported interface documented in selectmenu.h **/
+BOOL ami_selectmenu_is_safe(void)
+{
+ struct Library *PopupMenuBase;
+ BOOL popupmenu_lib_ok = FALSE;
+
+ if((PopupMenuBase = OpenLibrary("popupmenu.library", 53))) {
+ LOG("popupmenu.library v%d.%d", PopupMenuBase->lib_Version, PopupMenuBase->lib_Revision);
+ if(LIB_IS_AT_LEAST((struct Library *)PopupMenuBase, 53, 11))
+ popupmenu_lib_ok = TRUE;
+ CloseLibrary(PopupMenuBase);
+ }
+
+ return popupmenu_lib_ok;
+}
+
+HOOKF(uint32, ami_popup_hook, Object *, item, APTR)
+{
+ uint32 itemid = 0;
+ struct gui_window *gwin = hook->h_Data;
+
+ if(GetAttr(PMIA_ID, item, &itemid)) {
+ form_select_process_selection(gwin->shared->control, itemid);
+ }
+
+ return itemid;
+}
+
+void gui_create_form_select_menu(struct gui_window *g,
+ struct form_control *control)
+{
+ struct Library *PopupMenuBase = NULL;
+ struct PopupMenuIFace *IPopupMenu = NULL;
+ struct Hook selectmenuhook;
+ Object *selectmenuobj;
+ Object *smenu = NULL;
+ Object *currentmenu;
+ Object *submenu = NULL;
+ char *selectmenu_item[AMI_SELECTMENU_MAX];
+ char *more_label;
+ struct form_option *opt = form_select_get_option(control, 0);
+ int i = 0;
+ int n = 0;
+
+ if(ami_selectmenu_is_safe() == FALSE) return;
+
+ if((PopupMenuBase = OpenLibrary("popupmenu.class", 0))) {
+ IPopupMenu = (struct PopupMenuIFace *)GetInterface(PopupMenuBase, "main", 1, NULL);
+ }
+
+ if(IPopupMenu == NULL) return;
+
+ ClearMem(selectmenu_item, AMI_SELECTMENU_MAX * 4);
+ more_label = ami_utf8_easy(messages_get("More"));
+
+ selectmenuhook.h_Entry = ami_popup_hook;
+ selectmenuhook.h_SubEntry = NULL;
+ selectmenuhook.h_Data = g;
+
+ g->shared->control = control;
+
+ selectmenuobj = PMMENU(form_control_get_name(control)),
+ PMA_MenuHandler, &selectmenuhook, End;
+
+ currentmenu = selectmenuobj;
+
+ while(opt) {
+ selectmenu_item[i] = ami_utf8_easy(opt->text);
+
+ IDoMethod(currentmenu, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)selectmenu_item[i],
+ PMIA_ID, i,
+ PMIA_CheckIt, TRUE,
+ PMIA_Checked, opt->selected,
+ TAG_DONE),
+ ~0);
+
+ opt = opt->next;
+ i++;
+ n++;
+
+ if(n == AMI_SELECTMENU_PAGE_MAX) {
+ if(submenu != NULL) {
+ /* attach the previous submenu */
+ IDoMethod(smenu, PM_INSERT,
+ NewObject(NULL, "popupmenuitem.class",
+ PMIA_Title, more_label,
+ PMIA_CheckIt, TRUE,
+ PMIA_SubMenu, submenu,
+ TAG_DONE),
+ ~0);
+ }
+
+ submenu = NewObject(NULL, "popupmenu.class", TAG_DONE);
+ smenu = currentmenu;
+ currentmenu = submenu;
+ n = 0;
+ }
+
+ if(i >= AMI_SELECTMENU_MAX) break;
+ }
+
+ if((submenu != NULL) && (n != 0)) {
+ /* attach the previous submenu */
+ IDoMethod(smenu, PM_INSERT,
+ NewObject(NULL, "popupmenuitem.class",
+ PMIA_Title, more_label,
+ PMIA_CheckIt, TRUE,
+ PMIA_SubMenu, submenu,
+ TAG_DONE),
+ ~0);
+ }
+
+ ami_set_pointer(g->shared, GUI_POINTER_DEFAULT, false); // Clear the menu-style pointer
+
+ IDoMethod(selectmenuobj, PM_OPEN, g->shared->win);
+
+ /* PM_OPEN is blocking, so dispose menu immediately... */
+ if(selectmenuobj) DisposeObject(selectmenuobj);
+
+ /* ...and get rid of popupmenu.class ASAP */
+ if(IPopupMenu) DropInterface((struct Interface *)IPopupMenu);
+ if(PopupMenuBase) CloseLibrary(PopupMenuBase);
+
+ /* Free the menu labels */
+ if(more_label) ami_utf8_free(more_label);
+ for(i = 0; i < AMI_SELECTMENU_MAX; i++) {
+ if(selectmenu_item[i] != NULL) {
+ ami_utf8_free(selectmenu_item[i]);
+ selectmenu_item[i] = NULL;
+ }
+ }
+}
+
+#else
+#include "amiga/selectmenu.h"
+void gui_create_form_select_menu(struct gui_window *g, struct form_control *control)
+{
+}
+
+BOOL ami_selectmenu_is_safe()
+{
+ return FALSE;
+}
+#endif
+
diff --git a/amiga/context_menu.h b/amiga/selectmenu.h
similarity index 74%
rename from amiga/context_menu.h
rename to amiga/selectmenu.h
index 5697b56..f55b6ca 100755
--- a/amiga/context_menu.h
+++ b/amiga/selectmenu.h
@@ -16,20 +16,24 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef AMIGA_CONTEXT_MENU_H
-#define AMIGA_CONTEXT_MENU_H
+#ifndef AMIGA_SELECTMENU_H
+#define AMIGA_SELECTMENU_H
+
+#include <exec/types.h>
-struct tree;
struct gui_window;
-struct gui_window_2;
struct form_control;
-void ami_context_menu_init(void);
-void ami_context_menu_free(void);
-BOOL ami_context_menu_mouse_trap(struct gui_window_2 *gwin, BOOL trap);
-void ami_context_menu_show(struct gui_window_2 *gwin, int x, int y);
+BOOL popupmenu_lib_ok;
void gui_create_form_select_menu(struct gui_window *g, struct form_control *control);
+/**
+ * Opens popupmenu.library to check the version.
+ * Versions older than 53.11 are dangerous!
+ *
+ * \returns TRUE if popupmenu is safe, FALSE otherwise.
+ */
+BOOL ami_selectmenu_is_safe(void);
#endif
diff --git a/javascript/duktape/Location.bnd b/javascript/duktape/Location.bnd
new file mode 100644
index 0000000..5acbde2
--- /dev/null
+++ b/javascript/duktape/Location.bnd
@@ -0,0 +1,206 @@
+/* Location binding for browser using duktape and libdom
+ *
+ * Copyright 2015 Vincent Sanders <vince(a)netsurf-browser.org>
+ * Copyright 2015 Daniel Silverstone <dsilvers(a)netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * Released under the terms of the MIT License,
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+class Location {
+ private "nsurl *" url;
+}
+
+init Location("nsurl *" url)
+%{
+ priv->url = url;
+ nsurl_ref(url);
+%}
+
+fini Location()
+%{
+ nsurl_unref(priv->url);
+%}
+
+getter Location::href()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_COMPLETE, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::protocol()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_SCHEME, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::username()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_USERNAME, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::password()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_PASSWORD, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::host()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_HOST, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::hostname()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_COMPLETE, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::port()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_PORT, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::pathname()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_PATH, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::search()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_QUERY, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::hash()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_FRAGMENT, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
diff --git a/javascript/duktape/Window.bnd b/javascript/duktape/Window.bnd
index 1aacd5a..4121ac6 100644
--- a/javascript/duktape/Window.bnd
+++ b/javascript/duktape/Window.bnd
@@ -76,3 +76,22 @@ getter Window::console()
}
return 1;
%}
+
+getter Window::location()
+%{
+ duk_push_this(ctx);
+ duk_get_prop_string(ctx, -1, MAGIC(Location));
+ if (duk_is_undefined(ctx, -1)) {
+ duk_pop(ctx);
+
+ duk_push_pointer(ctx, llcache_handle_get_url(priv->htmlc->base.llcache));
+
+ if (dukky_create_object(ctx, PROTO_NAME(LOCATION), 1) != DUK_EXEC_SUCCESS) {
+ duk_error(ctx, DUK_ERR_ERROR, "Unable to create location object");
+ return 0;
+ }
+ duk_dup(ctx, -1);
+ duk_put_prop_string(ctx, -3, MAGIC(Location));
+ }
+ return 1;
+%}
diff --git a/javascript/duktape/netsurf.bnd b/javascript/duktape/netsurf.bnd
index a75641a..56107b9 100644
--- a/javascript/duktape/netsurf.bnd
+++ b/javascript/duktape/netsurf.bnd
@@ -27,6 +27,7 @@ binding duk_libdom {
#include <dom/dom.h>
#include "utils/log.h"
+#include "utils/nsurl.h"
#include "javascript/duktape/duktape.h"
@@ -58,6 +59,7 @@ struct dom_html_br_element;
#include "NodeList.bnd"
#include "Element.bnd"
#include "HTMLCollection.bnd"
+#include "Location.bnd"
/* specialisations of html_element */
init HTMLUnknownElement("struct dom_html_element *" html_unknown_element::html_element);
diff --git a/render/box_construct.c b/render/box_construct.c
index 581c6f2..d518bd7 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -2619,6 +2619,7 @@ bool box_select(BOX_SPECIAL_PARAMS)
if (err != DOM_NO_ERR) {
dom_node_unref(c2);
dom_node_unref(c);
+ form_free_control(gadget);
return false;
}
diff --git a/render/form.h b/render/form.h
index 44f3839..744ac32 100644
--- a/render/form.h
+++ b/render/form.h
@@ -26,6 +26,7 @@
#define _NETSURF_RENDER_FORM_H_
struct form_control;
+struct rect;
/** Option in a select. */
struct form_option {
diff --git a/resources/FatMessages b/resources/FatMessages
index fa66125..e7e130a 100644
--- a/resources/FatMessages
+++ b/resources/FatMessages
@@ -3831,6 +3831,12 @@ de.all.OK:OK
fr.all.OK:OK
it.all.OK:OK
nl.all.OK:OK
+en.ami.More:More
+de.ami.More:More
+fr.ami.More:More
+it.ami.More:More
+nl.ami.More:More
+
# Interactive help
# ================
@@ -6159,6 +6165,11 @@ de.ami.OptionDocky:In AmiDock zeigen
fr.ami.OptionDocky:Afficher dans AmiDock
it.ami.OptionDocky:Mostra icona di NetSurf su AmiDock
nl.ami.OptionDocky:Show in AmiDock
+en.ami.PopupMenu:Use popupmenu for forms
+de.ami.PopupMenu:Use popupmenu for forms
+fr.ami.PopupMenu:Use popupmenu for forms
+it.ami.PopupMenu:Use popupmenu for forms
+nl.ami.PopupMenu:Use popupmenu for forms
en.all.Clipboard:Clipboard
de.all.Clipboard:Clipboard
fr.all.Clipboard:Presse-papiers
--
NetSurf Browser
8 years, 2 months
netsurf: branch master updated. release/3.3-346-g410f6fd
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/410f6fdb9ef5e12506dd5...
...commit http://git.netsurf-browser.org/netsurf.git/commit/410f6fdb9ef5e12506dd50a...
...tree http://git.netsurf-browser.org/netsurf.git/tree/410f6fdb9ef5e12506dd50ae6...
The branch, master has been updated
via 410f6fdb9ef5e12506dd50ae6dc74ebc4a06dae4 (commit)
from 1a43dd21b38805424d717c68a95635d4386bd6d8 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=410f6fdb9ef5e12506d...
commit 410f6fdb9ef5e12506dd50ae6dc74ebc4a06dae4
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Allow the popupmenu-based select menu to cascade into multiple sub-menus containing further items, when there are too many to fit on the screen in one column.
diff --git a/amiga/selectmenu.c b/amiga/selectmenu.c
index e6eae2a..2593178 100644
--- a/amiga/selectmenu.c
+++ b/amiga/selectmenu.c
@@ -27,6 +27,7 @@
#include "utils/errors.h"
#include "utils/log.h"
+#include "utils/messages.h"
#include "render/form.h"
#include "desktop/mouse.h"
@@ -37,8 +38,18 @@
/* Maximum number of items for a popupmenu.class select menu.
* 50 is about the limit for my screen, and popupmenu doesn't scroll.
+ * We may need to calculate a value for this based on screen/font size.
+ *
+ * Additional entries will be added to a "More" menu...
*/
-#define AMI_SELECTMENU_MAX 50
+#define AMI_SELECTMENU_PAGE_MAX 40
+
+/* ...limited to the number of menus defined here... */
+#define AMI_SELECTMENU_MENU_MAX 10
+
+/* ...and resulting in this total number of entries. */
+#define AMI_SELECTMENU_MAX (AMI_SELECTMENU_PAGE_MAX * AMI_SELECTMENU_MENU_MAX)
+
/** Exported interface documented in selectmenu.h **/
BOOL ami_selectmenu_is_safe(void)
@@ -75,9 +86,14 @@ void gui_create_form_select_menu(struct gui_window *g,
struct PopupMenuIFace *IPopupMenu = NULL;
struct Hook selectmenuhook;
Object *selectmenuobj;
+ Object *smenu = NULL;
+ Object *currentmenu;
+ Object *submenu = NULL;
char *selectmenu_item[AMI_SELECTMENU_MAX];
+ char *more_label;
struct form_option *opt = form_select_get_option(control, 0);
- ULONG i = 0;
+ int i = 0;
+ int n = 0;
if(ami_selectmenu_is_safe() == FALSE) return;
@@ -88,6 +104,7 @@ void gui_create_form_select_menu(struct gui_window *g,
if(IPopupMenu == NULL) return;
ClearMem(selectmenu_item, AMI_SELECTMENU_MAX * 4);
+ more_label = ami_utf8_easy(messages_get("More"));
selectmenuhook.h_Entry = ami_popup_hook;
selectmenuhook.h_SubEntry = NULL;
@@ -98,10 +115,12 @@ void gui_create_form_select_menu(struct gui_window *g,
selectmenuobj = PMMENU(form_control_get_name(control)),
PMA_MenuHandler, &selectmenuhook, End;
+ currentmenu = selectmenuobj;
+
while(opt) {
selectmenu_item[i] = ami_utf8_easy(opt->text);
- IDoMethod(selectmenuobj, PM_INSERT,
+ IDoMethod(currentmenu, PM_INSERT,
NewObject(POPUPMENU_GetItemClass(), NULL,
PMIA_Title, (ULONG)selectmenu_item[i],
PMIA_ID, i,
@@ -112,10 +131,40 @@ void gui_create_form_select_menu(struct gui_window *g,
opt = opt->next;
i++;
+ n++;
+
+ if(n == AMI_SELECTMENU_PAGE_MAX) {
+ if(submenu != NULL) {
+ /* attach the previous submenu */
+ IDoMethod(smenu, PM_INSERT,
+ NewObject(NULL, "popupmenuitem.class",
+ PMIA_Title, more_label,
+ PMIA_CheckIt, TRUE,
+ PMIA_SubMenu, submenu,
+ TAG_DONE),
+ ~0);
+ }
+
+ submenu = NewObject(NULL, "popupmenu.class", TAG_DONE);
+ smenu = currentmenu;
+ currentmenu = submenu;
+ n = 0;
+ }
if(i >= AMI_SELECTMENU_MAX) break;
}
+ if((submenu != NULL) && (n != 0)) {
+ /* attach the previous submenu */
+ IDoMethod(smenu, PM_INSERT,
+ NewObject(NULL, "popupmenuitem.class",
+ PMIA_Title, more_label,
+ PMIA_CheckIt, TRUE,
+ PMIA_SubMenu, submenu,
+ TAG_DONE),
+ ~0);
+ }
+
ami_set_pointer(g->shared, GUI_POINTER_DEFAULT, false); // Clear the menu-style pointer
IDoMethod(selectmenuobj, PM_OPEN, g->shared->win);
@@ -128,6 +177,7 @@ void gui_create_form_select_menu(struct gui_window *g,
if(PopupMenuBase) CloseLibrary(PopupMenuBase);
/* Free the menu labels */
+ if(more_label) ami_utf8_free(more_label);
for(i = 0; i < AMI_SELECTMENU_MAX; i++) {
if(selectmenu_item[i] != NULL) {
ami_utf8_free(selectmenu_item[i]);
diff --git a/resources/FatMessages b/resources/FatMessages
index 765f037..e7e130a 100644
--- a/resources/FatMessages
+++ b/resources/FatMessages
@@ -3831,6 +3831,12 @@ de.all.OK:OK
fr.all.OK:OK
it.all.OK:OK
nl.all.OK:OK
+en.ami.More:More
+de.ami.More:More
+fr.ami.More:More
+it.ami.More:More
+nl.ami.More:More
+
# Interactive help
# ================
-----------------------------------------------------------------------
Summary of changes:
amiga/selectmenu.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++---
resources/FatMessages | 6 ++++++
2 files changed, 59 insertions(+), 3 deletions(-)
diff --git a/amiga/selectmenu.c b/amiga/selectmenu.c
index e6eae2a..2593178 100644
--- a/amiga/selectmenu.c
+++ b/amiga/selectmenu.c
@@ -27,6 +27,7 @@
#include "utils/errors.h"
#include "utils/log.h"
+#include "utils/messages.h"
#include "render/form.h"
#include "desktop/mouse.h"
@@ -37,8 +38,18 @@
/* Maximum number of items for a popupmenu.class select menu.
* 50 is about the limit for my screen, and popupmenu doesn't scroll.
+ * We may need to calculate a value for this based on screen/font size.
+ *
+ * Additional entries will be added to a "More" menu...
*/
-#define AMI_SELECTMENU_MAX 50
+#define AMI_SELECTMENU_PAGE_MAX 40
+
+/* ...limited to the number of menus defined here... */
+#define AMI_SELECTMENU_MENU_MAX 10
+
+/* ...and resulting in this total number of entries. */
+#define AMI_SELECTMENU_MAX (AMI_SELECTMENU_PAGE_MAX * AMI_SELECTMENU_MENU_MAX)
+
/** Exported interface documented in selectmenu.h **/
BOOL ami_selectmenu_is_safe(void)
@@ -75,9 +86,14 @@ void gui_create_form_select_menu(struct gui_window *g,
struct PopupMenuIFace *IPopupMenu = NULL;
struct Hook selectmenuhook;
Object *selectmenuobj;
+ Object *smenu = NULL;
+ Object *currentmenu;
+ Object *submenu = NULL;
char *selectmenu_item[AMI_SELECTMENU_MAX];
+ char *more_label;
struct form_option *opt = form_select_get_option(control, 0);
- ULONG i = 0;
+ int i = 0;
+ int n = 0;
if(ami_selectmenu_is_safe() == FALSE) return;
@@ -88,6 +104,7 @@ void gui_create_form_select_menu(struct gui_window *g,
if(IPopupMenu == NULL) return;
ClearMem(selectmenu_item, AMI_SELECTMENU_MAX * 4);
+ more_label = ami_utf8_easy(messages_get("More"));
selectmenuhook.h_Entry = ami_popup_hook;
selectmenuhook.h_SubEntry = NULL;
@@ -98,10 +115,12 @@ void gui_create_form_select_menu(struct gui_window *g,
selectmenuobj = PMMENU(form_control_get_name(control)),
PMA_MenuHandler, &selectmenuhook, End;
+ currentmenu = selectmenuobj;
+
while(opt) {
selectmenu_item[i] = ami_utf8_easy(opt->text);
- IDoMethod(selectmenuobj, PM_INSERT,
+ IDoMethod(currentmenu, PM_INSERT,
NewObject(POPUPMENU_GetItemClass(), NULL,
PMIA_Title, (ULONG)selectmenu_item[i],
PMIA_ID, i,
@@ -112,10 +131,40 @@ void gui_create_form_select_menu(struct gui_window *g,
opt = opt->next;
i++;
+ n++;
+
+ if(n == AMI_SELECTMENU_PAGE_MAX) {
+ if(submenu != NULL) {
+ /* attach the previous submenu */
+ IDoMethod(smenu, PM_INSERT,
+ NewObject(NULL, "popupmenuitem.class",
+ PMIA_Title, more_label,
+ PMIA_CheckIt, TRUE,
+ PMIA_SubMenu, submenu,
+ TAG_DONE),
+ ~0);
+ }
+
+ submenu = NewObject(NULL, "popupmenu.class", TAG_DONE);
+ smenu = currentmenu;
+ currentmenu = submenu;
+ n = 0;
+ }
if(i >= AMI_SELECTMENU_MAX) break;
}
+ if((submenu != NULL) && (n != 0)) {
+ /* attach the previous submenu */
+ IDoMethod(smenu, PM_INSERT,
+ NewObject(NULL, "popupmenuitem.class",
+ PMIA_Title, more_label,
+ PMIA_CheckIt, TRUE,
+ PMIA_SubMenu, submenu,
+ TAG_DONE),
+ ~0);
+ }
+
ami_set_pointer(g->shared, GUI_POINTER_DEFAULT, false); // Clear the menu-style pointer
IDoMethod(selectmenuobj, PM_OPEN, g->shared->win);
@@ -128,6 +177,7 @@ void gui_create_form_select_menu(struct gui_window *g,
if(PopupMenuBase) CloseLibrary(PopupMenuBase);
/* Free the menu labels */
+ if(more_label) ami_utf8_free(more_label);
for(i = 0; i < AMI_SELECTMENU_MAX; i++) {
if(selectmenu_item[i] != NULL) {
ami_utf8_free(selectmenu_item[i]);
diff --git a/resources/FatMessages b/resources/FatMessages
index 765f037..e7e130a 100644
--- a/resources/FatMessages
+++ b/resources/FatMessages
@@ -3831,6 +3831,12 @@ de.all.OK:OK
fr.all.OK:OK
it.all.OK:OK
nl.all.OK:OK
+en.ami.More:More
+de.ami.More:More
+fr.ami.More:More
+it.ami.More:More
+nl.ami.More:More
+
# Interactive help
# ================
--
NetSurf Browser
8 years, 2 months
netsurf: branch master updated. release/3.3-345-g1a43dd2
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/1a43dd21b38805424d717...
...commit http://git.netsurf-browser.org/netsurf.git/commit/1a43dd21b38805424d717c6...
...tree http://git.netsurf-browser.org/netsurf.git/tree/1a43dd21b38805424d717c68a...
The branch, master has been updated
via 1a43dd21b38805424d717c68a95635d4386bd6d8 (commit)
via 1f07c457401a6d944c26319571beb32f3b9009f5 (commit)
from d137bda4547ec6ecc07dec4c32097428f022ed7c (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=1a43dd21b38805424d7...
commit 1a43dd21b38805424d717c68a95635d4386bd6d8
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Add initial readonly location implementation
diff --git a/javascript/duktape/Location.bnd b/javascript/duktape/Location.bnd
new file mode 100644
index 0000000..5acbde2
--- /dev/null
+++ b/javascript/duktape/Location.bnd
@@ -0,0 +1,206 @@
+/* Location binding for browser using duktape and libdom
+ *
+ * Copyright 2015 Vincent Sanders <vince(a)netsurf-browser.org>
+ * Copyright 2015 Daniel Silverstone <dsilvers(a)netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * Released under the terms of the MIT License,
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+class Location {
+ private "nsurl *" url;
+}
+
+init Location("nsurl *" url)
+%{
+ priv->url = url;
+ nsurl_ref(url);
+%}
+
+fini Location()
+%{
+ nsurl_unref(priv->url);
+%}
+
+getter Location::href()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_COMPLETE, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::protocol()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_SCHEME, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::username()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_USERNAME, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::password()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_PASSWORD, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::host()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_HOST, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::hostname()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_COMPLETE, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::port()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_PORT, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::pathname()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_PATH, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::search()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_QUERY, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::hash()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_FRAGMENT, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
diff --git a/javascript/duktape/Window.bnd b/javascript/duktape/Window.bnd
index 1aacd5a..4121ac6 100644
--- a/javascript/duktape/Window.bnd
+++ b/javascript/duktape/Window.bnd
@@ -76,3 +76,22 @@ getter Window::console()
}
return 1;
%}
+
+getter Window::location()
+%{
+ duk_push_this(ctx);
+ duk_get_prop_string(ctx, -1, MAGIC(Location));
+ if (duk_is_undefined(ctx, -1)) {
+ duk_pop(ctx);
+
+ duk_push_pointer(ctx, llcache_handle_get_url(priv->htmlc->base.llcache));
+
+ if (dukky_create_object(ctx, PROTO_NAME(LOCATION), 1) != DUK_EXEC_SUCCESS) {
+ duk_error(ctx, DUK_ERR_ERROR, "Unable to create location object");
+ return 0;
+ }
+ duk_dup(ctx, -1);
+ duk_put_prop_string(ctx, -3, MAGIC(Location));
+ }
+ return 1;
+%}
diff --git a/javascript/duktape/netsurf.bnd b/javascript/duktape/netsurf.bnd
index a75641a..56107b9 100644
--- a/javascript/duktape/netsurf.bnd
+++ b/javascript/duktape/netsurf.bnd
@@ -27,6 +27,7 @@ binding duk_libdom {
#include <dom/dom.h>
#include "utils/log.h"
+#include "utils/nsurl.h"
#include "javascript/duktape/duktape.h"
@@ -58,6 +59,7 @@ struct dom_html_br_element;
#include "NodeList.bnd"
#include "Element.bnd"
#include "HTMLCollection.bnd"
+#include "Location.bnd"
/* specialisations of html_element */
init HTMLUnknownElement("struct dom_html_element *" html_unknown_element::html_element);
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=1f07c457401a6d944c2...
commit 1f07c457401a6d944c26319571beb32f3b9009f5
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
fix gadget resource leak (coverity #1109875)
diff --git a/render/box_construct.c b/render/box_construct.c
index 581c6f2..d518bd7 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -2619,6 +2619,7 @@ bool box_select(BOX_SPECIAL_PARAMS)
if (err != DOM_NO_ERR) {
dom_node_unref(c2);
dom_node_unref(c);
+ form_free_control(gadget);
return false;
}
-----------------------------------------------------------------------
Summary of changes:
javascript/duktape/Location.bnd | 206 +++++++++++++++++++++++++++++++++++++++
javascript/duktape/Window.bnd | 19 ++++
javascript/duktape/netsurf.bnd | 2 +
render/box_construct.c | 1 +
4 files changed, 228 insertions(+)
create mode 100644 javascript/duktape/Location.bnd
diff --git a/javascript/duktape/Location.bnd b/javascript/duktape/Location.bnd
new file mode 100644
index 0000000..5acbde2
--- /dev/null
+++ b/javascript/duktape/Location.bnd
@@ -0,0 +1,206 @@
+/* Location binding for browser using duktape and libdom
+ *
+ * Copyright 2015 Vincent Sanders <vince(a)netsurf-browser.org>
+ * Copyright 2015 Daniel Silverstone <dsilvers(a)netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * Released under the terms of the MIT License,
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+class Location {
+ private "nsurl *" url;
+}
+
+init Location("nsurl *" url)
+%{
+ priv->url = url;
+ nsurl_ref(url);
+%}
+
+fini Location()
+%{
+ nsurl_unref(priv->url);
+%}
+
+getter Location::href()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_COMPLETE, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::protocol()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_SCHEME, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::username()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_USERNAME, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::password()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_PASSWORD, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::host()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_HOST, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::hostname()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_COMPLETE, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::port()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_PORT, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::pathname()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_PATH, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::search()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_QUERY, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
+getter Location::hash()
+%{
+ char *url_s = NULL;
+ size_t url_l;
+
+ nsurl_get(priv->url, NSURL_FRAGMENT, &url_s, &url_l);
+ if (url_s == NULL) {
+ return 0;
+ }
+
+ duk_push_lstring(ctx, url_s, url_l);
+
+ free(url_s);
+
+ return 1;
+%}
+
+
diff --git a/javascript/duktape/Window.bnd b/javascript/duktape/Window.bnd
index 1aacd5a..4121ac6 100644
--- a/javascript/duktape/Window.bnd
+++ b/javascript/duktape/Window.bnd
@@ -76,3 +76,22 @@ getter Window::console()
}
return 1;
%}
+
+getter Window::location()
+%{
+ duk_push_this(ctx);
+ duk_get_prop_string(ctx, -1, MAGIC(Location));
+ if (duk_is_undefined(ctx, -1)) {
+ duk_pop(ctx);
+
+ duk_push_pointer(ctx, llcache_handle_get_url(priv->htmlc->base.llcache));
+
+ if (dukky_create_object(ctx, PROTO_NAME(LOCATION), 1) != DUK_EXEC_SUCCESS) {
+ duk_error(ctx, DUK_ERR_ERROR, "Unable to create location object");
+ return 0;
+ }
+ duk_dup(ctx, -1);
+ duk_put_prop_string(ctx, -3, MAGIC(Location));
+ }
+ return 1;
+%}
diff --git a/javascript/duktape/netsurf.bnd b/javascript/duktape/netsurf.bnd
index a75641a..56107b9 100644
--- a/javascript/duktape/netsurf.bnd
+++ b/javascript/duktape/netsurf.bnd
@@ -27,6 +27,7 @@ binding duk_libdom {
#include <dom/dom.h>
#include "utils/log.h"
+#include "utils/nsurl.h"
#include "javascript/duktape/duktape.h"
@@ -58,6 +59,7 @@ struct dom_html_br_element;
#include "NodeList.bnd"
#include "Element.bnd"
#include "HTMLCollection.bnd"
+#include "Location.bnd"
/* specialisations of html_element */
init HTMLUnknownElement("struct dom_html_element *" html_unknown_element::html_element);
diff --git a/render/box_construct.c b/render/box_construct.c
index 581c6f2..d518bd7 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -2619,6 +2619,7 @@ bool box_select(BOX_SPECIAL_PARAMS)
if (err != DOM_NO_ERR) {
dom_node_unref(c2);
dom_node_unref(c);
+ form_free_control(gadget);
return false;
}
--
NetSurf Browser
8 years, 2 months
nsgenbind: branch master updated. release/0.1.2-59-g5b0ac45
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/nsgenbind.git/shortlog/5b0ac4502fd4407d51c...
...commit http://git.netsurf-browser.org/nsgenbind.git/commit/5b0ac4502fd4407d51c16...
...tree http://git.netsurf-browser.org/nsgenbind.git/tree/5b0ac4502fd4407d51c165e...
The branch, master has been updated
via 5b0ac4502fd4407d51c165e0ea4ef814b3253fa9 (commit)
from 83956295f66576becbf5de8cef915cd0d54f409b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/nsgenbind.git/commit/?id=5b0ac4502fd4407d5...
commit 5b0ac4502fd4407d51c165e0ea4ef814b3253fa9
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Cause string arguments to operations to be coerced.
It appears that string parameters to operations must be coerced from
other types instead of throwing a type error to conform to expected
behaviour.
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index aa44d38..ad40741 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -993,10 +993,11 @@ output_operation_argument_type_check(
switch (*argument_type) {
case WEBIDL_TYPE_STRING:
+ /* coerce values to string */
fprintf(outf,
"\t\tif (!duk_is_string(ctx, %d)) {\n"
- "\t\t\tduk_error(ctx, DUK_ERR_ERROR, %s_error_fmt_string_type, %d, \"%s\");\n"
- "\t\t}\n", argidx, DLPFX, argidx, argumente->name);
+ "\t\t\tduk_to_string(ctx, %d);\n"
+ "\t\t}\n", argidx, argidx);
break;
case WEBIDL_TYPE_BOOL:
diff --git a/src/duk-libdom.c b/src/duk-libdom.c
index f72bc96..084a68f 100644
--- a/src/duk-libdom.c
+++ b/src/duk-libdom.c
@@ -372,13 +372,12 @@ output_binding_header(struct ir *ir)
fprintf(bindf,
"/* Constant strings */\n"
"extern const char *%s_error_fmt_argument;\n"
- "extern const char *%s_error_fmt_string_type;\n"
"extern const char *%s_error_fmt_bool_type;\n"
"extern const char *%s_error_fmt_number_type;\n"
"extern const char *%s_magic_string_private;\n"
"extern const char *%s_magic_string_prototypes;\n"
"\n",
- DLPFX, DLPFX, DLPFX, DLPFX, DLPFX, DLPFX);
+ DLPFX, DLPFX, DLPFX, DLPFX, DLPFX);
fprintf(bindf,
"duk_bool_t %s_instanceof(duk_context *ctx, const char *klass);\n",
@@ -434,10 +433,9 @@ output_binding_src(struct ir *ir)
fprintf(bindf,
"/* Error format strings */\n"
"const char *%s_error_fmt_argument =\"%%d argument required, but ony %%d present.\";\n"
- "const char *%s_error_fmt_string_type =\"argument %%d (%%s) requires a string\";\n"
"const char *%s_error_fmt_bool_type =\"argument %%d (%%s) requires a bool\";\n"
"const char *%s_error_fmt_number_type =\"argument %%d (%%s) requires a number\";\n",
- DLPFX, DLPFX, DLPFX, DLPFX);
+ DLPFX, DLPFX, DLPFX);
fprintf(bindf, "\n");
-----------------------------------------------------------------------
Summary of changes:
src/duk-libdom-interface.c | 5 +++--
src/duk-libdom.c | 6 ++----
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index aa44d38..ad40741 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -993,10 +993,11 @@ output_operation_argument_type_check(
switch (*argument_type) {
case WEBIDL_TYPE_STRING:
+ /* coerce values to string */
fprintf(outf,
"\t\tif (!duk_is_string(ctx, %d)) {\n"
- "\t\t\tduk_error(ctx, DUK_ERR_ERROR, %s_error_fmt_string_type, %d, \"%s\");\n"
- "\t\t}\n", argidx, DLPFX, argidx, argumente->name);
+ "\t\t\tduk_to_string(ctx, %d);\n"
+ "\t\t}\n", argidx, argidx);
break;
case WEBIDL_TYPE_BOOL:
diff --git a/src/duk-libdom.c b/src/duk-libdom.c
index f72bc96..084a68f 100644
--- a/src/duk-libdom.c
+++ b/src/duk-libdom.c
@@ -372,13 +372,12 @@ output_binding_header(struct ir *ir)
fprintf(bindf,
"/* Constant strings */\n"
"extern const char *%s_error_fmt_argument;\n"
- "extern const char *%s_error_fmt_string_type;\n"
"extern const char *%s_error_fmt_bool_type;\n"
"extern const char *%s_error_fmt_number_type;\n"
"extern const char *%s_magic_string_private;\n"
"extern const char *%s_magic_string_prototypes;\n"
"\n",
- DLPFX, DLPFX, DLPFX, DLPFX, DLPFX, DLPFX);
+ DLPFX, DLPFX, DLPFX, DLPFX, DLPFX);
fprintf(bindf,
"duk_bool_t %s_instanceof(duk_context *ctx, const char *klass);\n",
@@ -434,10 +433,9 @@ output_binding_src(struct ir *ir)
fprintf(bindf,
"/* Error format strings */\n"
"const char *%s_error_fmt_argument =\"%%d argument required, but ony %%d present.\";\n"
- "const char *%s_error_fmt_string_type =\"argument %%d (%%s) requires a string\";\n"
"const char *%s_error_fmt_bool_type =\"argument %%d (%%s) requires a bool\";\n"
"const char *%s_error_fmt_number_type =\"argument %%d (%%s) requires a number\";\n",
- DLPFX, DLPFX, DLPFX, DLPFX);
+ DLPFX, DLPFX, DLPFX);
fprintf(bindf, "\n");
--
NetSurf Generator for JavaScript bindings
8 years, 2 months