1
// define this here so that protypes.h isn't included (and doesn't
2
// muck with our npapi.h)
3
#define NO_NSPR_10_SUPPORT
7
#include "ff3-bridge.h"
8
#include "plugin-class.h"
11
#include <nsIDOMElement.h>
12
#include <nsIDOMRange.h>
13
#include <nsIDOMDocumentRange.h>
14
#include <nsIDOMDocument.h>
15
#include <nsIDOMWindow.h>
16
#include <nsStringAPI.h>
19
#include <nsIDOMEvent.h>
20
#include <nsIDOMMouseEvent.h>
21
#include <nsIDOMEventTarget.h>
22
#include <nsIDOMEventListener.h>
26
#define DEBUG_WARN_NOTIMPLEMENTED(x) printf ("not implemented: (%s)\n" G_STRLOC, x)
29
#define DEBUG_WARN_NOTIMPLEMENTED(x)
33
#define STR_FROM_VARIANT(v) ((char *) NPVARIANT_TO_STRING (v).utf8characters)
35
class FF3DomEventWrapper : public nsIDOMEventListener {
38
NS_DECL_NSIDOMEVENTLISTENER
42
FF3DomEventWrapper () {
48
callback_dom_event *callback;
49
nsCOMPtr<nsIDOMEventTarget> target;
52
NS_IMPL_ISUPPORTS1(FF3DomEventWrapper, nsIDOMEventListener)
55
FF3DomEventWrapper::HandleEvent (nsIDOMEvent *aDOMEvent)
57
int client_x, client_y, offset_x, offset_y, mouse_button;
58
gboolean alt_key, ctrl_key, shift_key;
61
aDOMEvent->GetType (str_event);
63
client_x = client_y = offset_x = offset_y = mouse_button = 0;
64
alt_key = ctrl_key = shift_key = FALSE;
66
nsCOMPtr<nsIDOMMouseEvent> mouse_event = do_QueryInterface (aDOMEvent);
67
if (mouse_event != nsnull) {
68
int screen_x, screen_y;
70
mouse_event->GetScreenX (&screen_x);
71
mouse_event->GetScreenY (&screen_y);
73
mouse_event->GetClientX (&client_x);
74
mouse_event->GetClientY (&client_y);
76
offset_x = screen_x - client_x;
77
offset_y = screen_y - client_y;
79
mouse_event->GetAltKey (&alt_key);
80
mouse_event->GetCtrlKey (&ctrl_key);
81
mouse_event->GetShiftKey (&shift_key);
83
PRUint16 umouse_button;
84
mouse_event->GetButton (&umouse_button);
85
mouse_button = umouse_button;
88
callback (strdup (NS_ConvertUTF16toUTF8 (str_event).get ()), client_x, client_y, offset_x, offset_y,
89
alt_key, ctrl_key, shift_key, mouse_button);
94
static nsCOMPtr<nsIDOMDocument>
95
ff3_get_dom_document (NPP npp)
97
nsCOMPtr<nsIDOMWindow> dom_window;
98
NPN_GetValue (npp, NPNVDOMWindow, static_cast<nsIDOMWindow **>(getter_AddRefs(dom_window)));
100
d (printf ("No DOM window available\n"));
104
nsCOMPtr<nsIDOMDocument> dom_document;
105
dom_window->GetDocument (getter_AddRefs (dom_document));
106
if (dom_document == nsnull) {
107
d(printf ("No DOM document available\n"));
115
FF3BrowserBridge::HtmlElementGetText (NPP npp, const char *element_id)
119
nsCOMPtr<nsIDOMDocument> document;
120
document = ff3_get_dom_document (npp);
124
nsString ns_id = NS_ConvertUTF8toUTF16 (element_id, strlen (element_id));
125
nsCOMPtr<nsIDOMElement> element;
126
rv = document->GetElementById (ns_id, getter_AddRefs (element));
127
if (NS_FAILED (rv) || element == NULL)
130
nsCOMPtr<nsIDOMDocument> owner;
131
element->GetOwnerDocument (getter_AddRefs (owner));
133
nsCOMPtr<nsIDOMDocumentRange> doc_range = do_QueryInterface (owner);
137
nsCOMPtr<nsIDOMRange> range;
138
doc_range->CreateRange (getter_AddRefs (range));
142
range->SelectNodeContents (element);
145
range->ToString (text);
146
return g_strdup (NS_ConvertUTF16toUTF8 (text).get ());
150
FF3BrowserBridge::HtmlObjectAttachEvent (NPP npp, NPObject *npobj, const char *name, callback_dom_event cb)
154
NPIdentifier id_identifier = NPN_GetStringIdentifier ("id");
155
nsCOMPtr<nsISupports> item;
157
NPN_GetProperty (npp, npobj, id_identifier, &npresult);
159
if (NPVARIANT_IS_STRING (npresult) && strlen (STR_FROM_VARIANT (npresult)) > 0) {
160
NPString np_id = NPVARIANT_TO_STRING (npresult);
162
nsString ns_id = NS_ConvertUTF8toUTF16 (np_id.utf8characters, strlen (np_id.utf8characters));
163
nsCOMPtr<nsIDOMDocument> dom_document = ff3_get_dom_document (npp);
165
nsCOMPtr<nsIDOMElement> element;
166
rv = dom_document->GetElementById (ns_id, getter_AddRefs (element));
167
if (NS_FAILED (rv) || element == nsnull) {
173
NPObject *window = NULL;
174
NPIdentifier document_identifier = NPN_GetStringIdentifier ("document");
176
NPN_GetValue (npp, NPNVWindowNPObject, &window);
178
if (npobj == window) {
179
NPN_GetValue (npp, NPNVDOMWindow, static_cast<nsISupports **>(getter_AddRefs (item)));
182
NPN_GetProperty (npp, window, document_identifier, &docresult);
184
if (npobj == NPVARIANT_TO_OBJECT (docresult)) {
185
item = ff3_get_dom_document (npp);
187
const char *temp_id = "__moonlight_temp_id";
190
string_to_npvariant (temp_id, &npvalue);
191
NPN_SetProperty (npp, npobj, id_identifier, &npvalue);
192
NPN_ReleaseVariantValue (&npvalue);
194
nsString ns_id = NS_ConvertUTF8toUTF16 (temp_id, strlen (temp_id));
195
nsCOMPtr<nsIDOMDocument> dom_document = ff3_get_dom_document (npp);
197
nsCOMPtr<nsIDOMElement> element;
198
dom_document->GetElementById (ns_id, getter_AddRefs (element));
199
if (element == nsnull) {
200
d(printf ("Unable to find temp_id element\n"));
206
// reset to it's original empty value
207
NPN_SetProperty (npp, npobj, id_identifier, &npresult);
212
nsCOMPtr<nsIDOMEventTarget> target = do_QueryInterface (item);
214
FF3DomEventWrapper *wrapper = new FF3DomEventWrapper ();
215
wrapper->callback = cb;
216
wrapper->target = target;
218
rv = target->AddEventListener (NS_ConvertUTF8toUTF16 (name, strlen (name)), wrapper, PR_TRUE);
224
FF3BrowserBridge::HtmlObjectDetachEvent (NPP instance, const char *name, gpointer listener_ptr)
226
FF3DomEventWrapper *wrapper = (FF3DomEventWrapper *) listener_ptr;
228
wrapper->target->RemoveEventListener (NS_ConvertUTF8toUTF16 (name, strlen (name)), wrapper, PR_TRUE);