summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gardiner <paulg.artifex@glidos.net>2012-09-25 17:07:19 +0100
committerPaul Gardiner <paulg.artifex@glidos.net>2012-09-25 17:07:19 +0100
commitae14bea1c5a26e85bdabacbc105fca037808429e (patch)
tree188e85b57074450e7a625b8dc9e3684dc22a7fc4
parent9edce60dbb86110b2a89baa46db1b01fa192d1d8 (diff)
downloadmupdf-ae14bea1c5a26e85bdabacbc105fca037808429e.tar.xz
Forms: handle app.launchUrl, currently by displaying a warning
-rw-r--r--apps/pdfapp.c8
-rw-r--r--fitz/fitz.h17
-rw-r--r--pdf/mupdf-internal.h1
-rw-r--r--pdf/pdf_event.c29
-rw-r--r--pdf/pdf_js.c16
5 files changed, 71 insertions, 0 deletions
diff --git a/apps/pdfapp.c b/apps/pdfapp.c
index 608db8b8..682c0db2 100644
--- a/apps/pdfapp.c
+++ b/apps/pdfapp.c
@@ -133,6 +133,14 @@ static void event_cb(fz_doc_event *event, void *data)
case FZ_DOCUMENT_EVENT_EXEC_DIALOG:
pdfapp_warn(app, "The document attempted to open a dialog box. (Not supported)");
break;
+
+ case FZ_DOCUMENT_EVENT_LAUNCH_URL:
+ {
+ fz_launch_url_event *launch_url = fz_access_launch_url_event(event);
+
+ pdfapp_warn(app, "The document attempted to open url: %s. (Not supported by app)", launch_url->url);
+ }
+ break;
}
}
diff --git a/fitz/fitz.h b/fitz/fitz.h
index cb71418a..3a34535c 100644
--- a/fitz/fitz.h
+++ b/fitz/fitz.h
@@ -2676,6 +2676,23 @@ typedef struct
*/
fz_submit_event *fz_access_submit_event(fz_doc_event *event);
+/*
+ fz_launch_url_event: details of a launch-url event. The app should
+ open the url, either in a new frame or in the current window.
+*/
+typedef struct
+{
+ char *url;
+ int new_frame;
+} fz_launch_url_event;
+
+/*
+ fz_access_launch_url_event: access the details of a launch-url
+ event. The returned pointer and all data referred to by the structure
+ are owned by mupdf and need not be freed by the caller.
+*/
+fz_launch_url_event *fz_access_launch_url_event(fz_doc_event *event);
+
typedef struct fz_write_options_s fz_write_options;
/*
diff --git a/pdf/mupdf-internal.h b/pdf/mupdf-internal.h
index 8c058195..7ac97f2a 100644
--- a/pdf/mupdf-internal.h
+++ b/pdf/mupdf-internal.h
@@ -636,6 +636,7 @@ void pdf_event_issue_alert(pdf_document *doc, fz_alert_event *event);
void pdf_event_issue_print(pdf_document *doc);
void pdf_event_issue_exec_menu_item(pdf_document *doc, char *item);
void pdf_event_issue_exec_dialog(pdf_document *doc);
+void pdf_event_issue_launch_url(pdf_document *doc, char *url, int new_frame);
/*
* Javascript handler
diff --git a/pdf/pdf_event.c b/pdf/pdf_event.c
index 61af6a29..f76058ce 100644
--- a/pdf/pdf_event.c
+++ b/pdf/pdf_event.c
@@ -79,6 +79,35 @@ void pdf_event_issue_exec_dialog(pdf_document *doc)
doc->event_cb(&e, doc->event_cb_data);
}
+typedef struct
+{
+ fz_doc_event base;
+ fz_launch_url_event launch_url;
+} fz_launch_url_event_internal;
+
+fz_launch_url_event *fz_access_launch_url_event(fz_doc_event *event)
+{
+ fz_launch_url_event *launch_url = NULL;
+
+ if (event->type == FZ_DOCUMENT_EVENT_LAUNCH_URL)
+ launch_url = &((fz_launch_url_event_internal *)event)->launch_url;
+
+ return launch_url;
+}
+
+void pdf_event_issue_launch_url(pdf_document *doc, char *url, int new_frame)
+{
+ if (doc->event_cb)
+ {
+ fz_launch_url_event_internal e;
+
+ e.base.type = FZ_DOCUMENT_EVENT_LAUNCH_URL;
+ e.launch_url.url = url;
+ e.launch_url.new_frame = new_frame;
+ doc->event_cb((fz_doc_event *)&e, doc->event_cb_data);
+ }
+}
+
void pdf_set_doc_event_callback(pdf_document *doc, fz_doc_event_cb *fn, void *data)
{
doc->event_cb = fn;
diff --git a/pdf/pdf_js.c b/pdf/pdf_js.c
index d401b3a2..e690ad09 100644
--- a/pdf/pdf_js.c
+++ b/pdf/pdf_js.c
@@ -120,6 +120,22 @@ static pdf_jsimp_obj *app_execMenuItem(void *jsctx, void *obj, int argc, pdf_jsi
static pdf_jsimp_obj *app_launchURL(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
{
+ pdf_js *js = (pdf_js *)jsctx;
+ char *cUrl;
+ int bNewFrame = 0;
+
+ switch(argc)
+ {
+ default:
+ return NULL;
+ case 2:
+ bNewFrame = (int)pdf_jsimp_to_number(js->imp, args[1]);
+ case 1:
+ cUrl = pdf_jsimp_to_string(js->imp, args[0]);
+ }
+
+ pdf_event_issue_launch_url(js->doc, cUrl, bNewFrame);
+
return NULL;
}