~ubuntu-branches/ubuntu/trusty/moon/trusty

« back to all changes in this revision

Viewing changes to plugin/firefox/ff3/ff3-dom.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jo Shields
  • Date: 2009-02-14 12:01:08 UTC
  • Revision ID: james.westby@ubuntu.com-20090214120108-06539vb25vhbd8bn
Tags: upstream-1.0
Import upstream version 1.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
4
 
 
5
#include "plugin.h"
 
6
 
 
7
#include "ff3-bridge.h"
 
8
#include "plugin-class.h"
 
9
 
 
10
#include <nsCOMPtr.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>
 
17
 
 
18
// Events
 
19
#include <nsIDOMEvent.h>
 
20
#include <nsIDOMMouseEvent.h>
 
21
#include <nsIDOMEventTarget.h>
 
22
#include <nsIDOMEventListener.h>
 
23
 
 
24
 
 
25
#ifdef DEBUG
 
26
#define DEBUG_WARN_NOTIMPLEMENTED(x) printf ("not implemented: (%s)\n" G_STRLOC, x)
 
27
#define d(x) x
 
28
#else
 
29
#define DEBUG_WARN_NOTIMPLEMENTED(x)
 
30
#define d(x)
 
31
#endif
 
32
 
 
33
#define STR_FROM_VARIANT(v) ((char *) NPVARIANT_TO_STRING (v).utf8characters)
 
34
 
 
35
class FF3DomEventWrapper : public nsIDOMEventListener {
 
36
 
 
37
        NS_DECL_ISUPPORTS
 
38
        NS_DECL_NSIDOMEVENTLISTENER
 
39
 
 
40
 public:
 
41
 
 
42
        FF3DomEventWrapper () {
 
43
                callback = NULL;
 
44
 
 
45
                NS_INIT_ISUPPORTS ();
 
46
        }
 
47
 
 
48
        callback_dom_event *callback;
 
49
        nsCOMPtr<nsIDOMEventTarget> target;
 
50
};
 
51
 
 
52
NS_IMPL_ISUPPORTS1(FF3DomEventWrapper, nsIDOMEventListener)
 
53
 
 
54
NS_IMETHODIMP
 
55
FF3DomEventWrapper::HandleEvent (nsIDOMEvent *aDOMEvent)
 
56
{
 
57
        int client_x, client_y, offset_x, offset_y, mouse_button;
 
58
        gboolean alt_key, ctrl_key, shift_key;
 
59
        nsString str_event;
 
60
        
 
61
        aDOMEvent->GetType (str_event);
 
62
 
 
63
        client_x = client_y = offset_x = offset_y = mouse_button = 0;
 
64
        alt_key = ctrl_key = shift_key = FALSE;
 
65
 
 
66
        nsCOMPtr<nsIDOMMouseEvent> mouse_event = do_QueryInterface (aDOMEvent);
 
67
        if (mouse_event != nsnull) {
 
68
                int screen_x, screen_y;
 
69
 
 
70
                mouse_event->GetScreenX (&screen_x);
 
71
                mouse_event->GetScreenY (&screen_y);
 
72
 
 
73
                mouse_event->GetClientX (&client_x);
 
74
                mouse_event->GetClientY (&client_y);
 
75
 
 
76
                offset_x = screen_x - client_x;
 
77
                offset_y = screen_y - client_y;
 
78
 
 
79
                mouse_event->GetAltKey (&alt_key);
 
80
                mouse_event->GetCtrlKey (&ctrl_key);
 
81
                mouse_event->GetShiftKey (&shift_key);
 
82
 
 
83
                PRUint16 umouse_button;
 
84
                mouse_event->GetButton (&umouse_button);
 
85
                mouse_button = umouse_button;
 
86
        }
 
87
 
 
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);
 
90
 
 
91
        return NS_OK;
 
92
}
 
93
 
 
94
static nsCOMPtr<nsIDOMDocument>
 
95
ff3_get_dom_document (NPP npp)
 
96
{
 
97
        nsCOMPtr<nsIDOMWindow> dom_window;
 
98
        NPN_GetValue (npp, NPNVDOMWindow, static_cast<nsIDOMWindow **>(getter_AddRefs(dom_window)));
 
99
        if (!dom_window) {
 
100
                d (printf ("No DOM window available\n"));
 
101
                return NULL;
 
102
        }
 
103
 
 
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"));
 
108
                return NULL;
 
109
        }
 
110
 
 
111
        return dom_document;
 
112
}
 
113
 
 
114
const char*
 
115
FF3BrowserBridge::HtmlElementGetText (NPP npp, const char *element_id)
 
116
{
 
117
        nsresult rv = NS_OK;
 
118
 
 
119
        nsCOMPtr<nsIDOMDocument> document;
 
120
        document = ff3_get_dom_document (npp);
 
121
        if (!document)
 
122
                return NULL;
 
123
 
 
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)
 
128
                return NULL;
 
129
 
 
130
        nsCOMPtr<nsIDOMDocument> owner;
 
131
        element->GetOwnerDocument (getter_AddRefs (owner));
 
132
        
 
133
        nsCOMPtr<nsIDOMDocumentRange> doc_range = do_QueryInterface (owner);
 
134
        if (!doc_range)
 
135
                return NULL;
 
136
 
 
137
        nsCOMPtr<nsIDOMRange> range;
 
138
        doc_range->CreateRange (getter_AddRefs (range));
 
139
        if (!range)
 
140
                return NULL;
 
141
 
 
142
        range->SelectNodeContents (element);
 
143
 
 
144
        nsString text;
 
145
        range->ToString (text);
 
146
        return g_strdup (NS_ConvertUTF16toUTF8 (text).get ());
 
147
}
 
148
 
 
149
gpointer
 
150
FF3BrowserBridge::HtmlObjectAttachEvent (NPP npp, NPObject *npobj, const char *name, callback_dom_event cb)
 
151
{
 
152
        nsresult rv;
 
153
        NPVariant npresult;
 
154
        NPIdentifier id_identifier = NPN_GetStringIdentifier ("id");
 
155
        nsCOMPtr<nsISupports> item;
 
156
 
 
157
        NPN_GetProperty (npp, npobj, id_identifier, &npresult);
 
158
 
 
159
        if (NPVARIANT_IS_STRING (npresult) && strlen (STR_FROM_VARIANT (npresult)) > 0) {
 
160
                NPString np_id = NPVARIANT_TO_STRING (npresult);
 
161
 
 
162
                nsString ns_id = NS_ConvertUTF8toUTF16 (np_id.utf8characters, strlen (np_id.utf8characters));
 
163
                nsCOMPtr<nsIDOMDocument> dom_document = ff3_get_dom_document (npp);
 
164
 
 
165
                nsCOMPtr<nsIDOMElement> element;
 
166
                rv = dom_document->GetElementById (ns_id, getter_AddRefs (element));
 
167
                if (NS_FAILED (rv) || element == nsnull) {
 
168
                        return NULL;
 
169
                }
 
170
 
 
171
                item = element;
 
172
        } else {
 
173
                NPObject *window = NULL;
 
174
                NPIdentifier document_identifier = NPN_GetStringIdentifier ("document");
 
175
 
 
176
                NPN_GetValue (npp, NPNVWindowNPObject, &window);
 
177
 
 
178
                if (npobj == window) {
 
179
                        NPN_GetValue (npp, NPNVDOMWindow, static_cast<nsISupports **>(getter_AddRefs (item)));
 
180
                } else {
 
181
                        NPVariant docresult;
 
182
                        NPN_GetProperty (npp, window, document_identifier, &docresult);
 
183
 
 
184
                        if (npobj == NPVARIANT_TO_OBJECT (docresult)) {
 
185
                                item = ff3_get_dom_document (npp);
 
186
                        } else {
 
187
                                const char *temp_id = "__moonlight_temp_id";
 
188
                                NPVariant npvalue;
 
189
 
 
190
                                string_to_npvariant (temp_id, &npvalue);
 
191
                                NPN_SetProperty (npp, npobj, id_identifier, &npvalue);
 
192
                                NPN_ReleaseVariantValue (&npvalue);
 
193
 
 
194
                                nsString ns_id = NS_ConvertUTF8toUTF16 (temp_id, strlen (temp_id));
 
195
                                nsCOMPtr<nsIDOMDocument> dom_document = ff3_get_dom_document (npp);
 
196
 
 
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"));
 
201
                                        return NULL;
 
202
                                }
 
203
 
 
204
                                item = element;
 
205
 
 
206
                                // reset to it's original empty value
 
207
                                NPN_SetProperty (npp, npobj, id_identifier, &npresult);
 
208
                        }
 
209
                }
 
210
        }
 
211
 
 
212
        nsCOMPtr<nsIDOMEventTarget> target = do_QueryInterface (item);
 
213
 
 
214
        FF3DomEventWrapper *wrapper = new FF3DomEventWrapper ();
 
215
        wrapper->callback = cb;
 
216
        wrapper->target = target;
 
217
 
 
218
        rv = target->AddEventListener (NS_ConvertUTF8toUTF16 (name, strlen (name)), wrapper, PR_TRUE);
 
219
 
 
220
        return wrapper;
 
221
}
 
222
 
 
223
void
 
224
FF3BrowserBridge::HtmlObjectDetachEvent (NPP instance, const char *name, gpointer listener_ptr)
 
225
{
 
226
        FF3DomEventWrapper *wrapper = (FF3DomEventWrapper *) listener_ptr;
 
227
 
 
228
        wrapper->target->RemoveEventListener (NS_ConvertUTF8toUTF16 (name, strlen (name)), wrapper, PR_TRUE);
 
229
}