Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(384)

Side by Side Diff: chrome_frame/np_browser_functions.cc

Issue 7276037: Remove NPAPI support from Chrome Frame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome_frame/np_browser_functions.h"
6
7 #include "base/logging.h"
8
9 namespace npapi {
10
11 // global function pointers (within this namespace) for the NPN functions.
12 struct NpVersion {
13 struct {
14 uint8 minor;
15 uint8 major;
16 } v;
17
18 void set_version(uint16 version) {
19 v.minor = version & 0xFF;
20 v.major = version >> 8;
21 }
22
23 uint16 version() const {
24 return v.minor | (v.major << 8);
25 }
26 };
27
28 NpVersion g_version = {0};
29
30 NPN_GetURLProcPtr g_geturl = NULL;
31 NPN_PostURLProcPtr g_posturl = NULL;
32 NPN_RequestReadProcPtr g_requestread = NULL;
33 NPN_NewStreamProcPtr g_newstream = NULL;
34 NPN_WriteProcPtr g_write = NULL;
35 NPN_DestroyStreamProcPtr g_destroystream = NULL;
36 NPN_StatusProcPtr g_status = NULL;
37 NPN_UserAgentProcPtr g_useragent = NULL;
38 NPN_MemAllocProcPtr g_memalloc = NULL;
39 NPN_MemFreeProcPtr g_memfree = NULL;
40 NPN_MemFlushProcPtr g_memflush = NULL;
41 NPN_ReloadPluginsProcPtr g_reloadplugins = NULL;
42 NPN_GetJavaEnvProcPtr g_getJavaEnv = NULL;
43 NPN_GetJavaPeerProcPtr g_getJavaPeer = NULL;
44 NPN_GetURLNotifyProcPtr g_geturlnotify = NULL;
45 NPN_PostURLNotifyProcPtr g_posturlnotify = NULL;
46 NPN_GetValueProcPtr g_getvalue = NULL;
47 NPN_SetValueProcPtr g_setvalue = NULL;
48 NPN_InvalidateRectProcPtr g_invalidaterect = NULL;
49 NPN_InvalidateRegionProcPtr g_invalidateregion = NULL;
50 NPN_ForceRedrawProcPtr g_forceredraw = NULL;
51 NPN_GetStringIdentifierProcPtr g_getstringidentifier = NULL;
52 NPN_GetStringIdentifiersProcPtr g_getstringidentifiers = NULL;
53 NPN_GetIntIdentifierProcPtr g_getintidentifier = NULL;
54 NPN_IdentifierIsStringProcPtr g_identifierisstring = NULL;
55 NPN_UTF8FromIdentifierProcPtr g_utf8fromidentifier = NULL;
56 NPN_IntFromIdentifierProcPtr g_intfromidentifier = NULL;
57 NPN_CreateObjectProcPtr g_createobject = NULL;
58 NPN_RetainObjectProcPtr g_retainobject = NULL;
59 NPN_ReleaseObjectProcPtr g_releaseobject = NULL;
60 NPN_InvokeProcPtr g_invoke = NULL;
61 NPN_InvokeDefaultProcPtr g_invoke_default = NULL;
62 NPN_EvaluateProcPtr g_evaluate = NULL;
63 NPN_GetPropertyProcPtr g_getproperty = NULL;
64 NPN_SetPropertyProcPtr g_setproperty = NULL;
65 NPN_RemovePropertyProcPtr g_removeproperty = NULL;
66 NPN_HasPropertyProcPtr g_hasproperty = NULL;
67 NPN_HasMethodProcPtr g_hasmethod = NULL;
68 NPN_ReleaseVariantValueProcPtr g_releasevariantvalue = NULL;
69 NPN_SetExceptionProcPtr g_setexception = NULL;
70 NPN_PushPopupsEnabledStateProcPtr g_pushpopupsenabledstate = NULL;
71 NPN_PopPopupsEnabledStateProcPtr g_poppopupsenabledstate = NULL;
72 NPN_EnumerateProcPtr g_enumerate = NULL;
73 NPN_PluginThreadAsyncCallProcPtr g_pluginthreadasynccall = NULL;
74 NPN_ConstructProcPtr g_construct = NULL;
75 NPN_GetValueForURLPtr g_getvalueforurl = NULL;
76 NPN_SetValueForURLPtr g_setvalueforurl = NULL;
77 NPN_GetAuthenticationInfoPtr g_getauthenticationinfo = NULL;
78 NPN_URLRedirectResponsePtr g_urlredirectresponse = NULL;
79
80 // Must be called prior to calling any of the browser functions below.
81 void InitializeBrowserFunctions(NPNetscapeFuncs* functions) {
82 CHECK(functions);
83 DCHECK(g_geturl == NULL || g_geturl == functions->geturl);
84
85 g_version.set_version(functions->version);
86
87 g_geturl = functions->geturl;
88 g_posturl = functions->posturl;
89 g_requestread = functions->requestread;
90 g_newstream = functions->newstream;
91 g_write = functions->write;
92 g_destroystream = functions->destroystream;
93 g_status = functions->status;
94 g_useragent = functions->uagent;
95 g_memalloc = functions->memalloc;
96 g_memfree = functions->memfree;
97 g_memflush = functions->memflush;
98 g_reloadplugins = functions->reloadplugins;
99 g_getJavaEnv = functions->getJavaEnv;
100 g_getJavaPeer = functions->getJavaPeer;
101 g_geturlnotify = functions->geturlnotify;
102 g_posturlnotify = functions->posturlnotify;
103 g_getvalue = functions->getvalue;
104 g_setvalue = functions->setvalue;
105 g_invalidaterect = functions->invalidaterect;
106 g_invalidateregion = functions->invalidateregion;
107 g_forceredraw = functions->forceredraw;
108 g_getstringidentifier = functions->getstringidentifier;
109 g_getstringidentifiers = functions->getstringidentifiers;
110 g_getintidentifier = functions->getintidentifier;
111 g_identifierisstring = functions->identifierisstring;
112 g_utf8fromidentifier = functions->utf8fromidentifier;
113 g_intfromidentifier = functions->intfromidentifier;
114 g_createobject = functions->createobject;
115 g_retainobject = functions->retainobject;
116 g_releaseobject = functions->releaseobject;
117 g_invoke = functions->invoke;
118 g_invoke_default = functions->invokeDefault;
119 g_evaluate = functions->evaluate;
120 g_getproperty = functions->getproperty;
121 g_setproperty = functions->setproperty;
122 g_removeproperty = functions->removeproperty;
123 g_hasproperty = functions->hasproperty;
124 g_hasmethod = functions->hasmethod;
125 g_releasevariantvalue = functions->releasevariantvalue;
126 g_setexception = functions->setexception;
127 g_pushpopupsenabledstate = functions->pushpopupsenabledstate;
128 g_poppopupsenabledstate = functions->poppopupsenabledstate;
129 g_enumerate = functions->enumerate;
130 g_pluginthreadasynccall = functions->pluginthreadasynccall;
131 g_construct = functions->construct;
132 g_urlredirectresponse = functions->urlredirectresponse;
133
134 if (g_version.v.minor >= NPVERS_HAS_URL_AND_AUTH_INFO) {
135 g_getvalueforurl = functions->getvalueforurl;
136 g_setvalueforurl = functions->setvalueforurl;
137 g_getauthenticationinfo = functions->getauthenticationinfo;
138 }
139 }
140
141 void UninitializeBrowserFunctions() {
142 g_version.set_version(0);
143
144 // We skip doing this in the official build as it doesn't serve much purpose
145 // during shutdown. The reason for it being here in the other types of builds
146 // is to spot potential browser bugs whereby the browser leaves living objects
147 // in our DLL after shutdown has been called. In theory those objects could
148 // trigger a call to the browser functions after shutdown has been called
149 // and for non official builds we want that to simply crash.
150 // For official builds we leave the function pointers around since they
151 // continue to valid.
152 g_geturl = NULL;
153 g_posturl = NULL;
154 g_requestread = NULL;
155 g_newstream = NULL;
156 g_write = NULL;
157 g_destroystream = NULL;
158 g_status = NULL;
159 g_useragent = NULL;
160 g_memalloc = NULL;
161 g_memfree = NULL;
162 g_memflush = NULL;
163 g_reloadplugins = NULL;
164 g_getJavaEnv = NULL;
165 g_getJavaPeer = NULL;
166 g_geturlnotify = NULL;
167 g_posturlnotify = NULL;
168 g_getvalue = NULL;
169 g_setvalue = NULL;
170 g_invalidaterect = NULL;
171 g_invalidateregion = NULL;
172 g_forceredraw = NULL;
173 g_getstringidentifier = NULL;
174 g_getstringidentifiers = NULL;
175 g_getintidentifier = NULL;
176 g_identifierisstring = NULL;
177 g_utf8fromidentifier = NULL;
178 g_intfromidentifier = NULL;
179 g_createobject = NULL;
180 g_retainobject = NULL;
181 g_releaseobject = NULL;
182 g_invoke = NULL;
183 g_invoke_default = NULL;
184 g_evaluate = NULL;
185 g_getproperty = NULL;
186 g_setproperty = NULL;
187 g_removeproperty = NULL;
188 g_hasproperty = NULL;
189 g_hasmethod = NULL;
190 g_releasevariantvalue = NULL;
191 g_setexception = NULL;
192 g_pushpopupsenabledstate = NULL;
193 g_poppopupsenabledstate = NULL;
194 g_enumerate = NULL;
195 g_pluginthreadasynccall = NULL;
196 g_construct = NULL;
197 g_getvalueforurl = NULL;
198 g_setvalueforurl = NULL;
199 g_getauthenticationinfo = NULL;
200 }
201
202 bool IsInitialized() {
203 // We only check one function for convenience.
204 return g_getvalue != NULL;
205 }
206
207 // Function stubs for functions that the host browser implements.
208 uint8 VersionMinor() {
209 return g_version.v.minor;
210 }
211
212 uint8 VersionMajor() {
213 return g_version.v.major;
214 }
215
216 NPError GetURL(NPP instance, const char* URL, const char* window) {
217 DCHECK(IsInitialized()) << __FUNCTION__;
218 return g_geturl(instance, URL, window);
219 }
220
221 NPError PostURL(NPP instance, const char* URL, const char* window, uint32 len,
222 const char* buf, NPBool file) {
223 DCHECK(IsInitialized()) << __FUNCTION__;
224 return g_posturl(instance, URL, window, len, buf, file);
225 }
226
227 NPError RequestRead(NPStream* stream, NPByteRange* rangeList) {
228 DCHECK(IsInitialized()) << __FUNCTION__;
229 return g_requestread(stream, rangeList);
230 }
231
232 NPError NewStream(NPP instance, NPMIMEType type, const char* window,
233 NPStream** stream) {
234 DCHECK(IsInitialized()) << __FUNCTION__;
235 return g_newstream(instance, type, window, stream);
236 }
237
238 int32 Write(NPP instance, NPStream* stream, int32 len, void* buffer) {
239 DCHECK(IsInitialized()) << __FUNCTION__;
240 return g_write(instance, stream, len, buffer);
241 }
242
243 NPError DestroyStream(NPP instance, NPStream* stream, NPReason reason) {
244 DCHECK(IsInitialized()) << __FUNCTION__;
245 return g_destroystream(instance, stream, reason);
246 }
247
248 void Status(NPP instance, const char* message) {
249 DCHECK(IsInitialized()) << __FUNCTION__;
250 return g_status(instance, message);
251 }
252
253 const char* UserAgent(NPP instance) {
254 DCHECK(IsInitialized()) << __FUNCTION__;
255 return g_useragent(instance);
256 }
257
258 void* MemAlloc(uint32 size) {
259 DCHECK(IsInitialized()) << __FUNCTION__;
260 return g_memalloc(size);
261 }
262
263 void MemFree(void* ptr) {
264 DCHECK(IsInitialized()) << __FUNCTION__;
265 return g_memfree(ptr);
266 }
267
268 uint32 MemFlush(uint32 size) {
269 DCHECK(IsInitialized()) << __FUNCTION__;
270 return g_memflush(size);
271 }
272
273 void ReloadPlugins(NPBool reloadPages) {
274 DCHECK(IsInitialized()) << __FUNCTION__;
275 return g_reloadplugins(reloadPages);
276 }
277
278 void* GetJavaEnv() {
279 DCHECK(IsInitialized()) << __FUNCTION__;
280 return g_getJavaEnv();
281 }
282
283 void* GetJavaPeer(NPP instance) {
284 DCHECK(IsInitialized()) << __FUNCTION__;
285 return g_getJavaPeer(instance);
286 }
287
288 NPError GetURLNotify(NPP instance, const char* URL, const char* window,
289 void* notifyData) {
290 DCHECK(IsInitialized()) << __FUNCTION__;
291 return g_geturlnotify(instance, URL, window, notifyData);
292 }
293
294 NPError PostURLNotify(NPP instance, const char* URL, const char* window,
295 uint32 len, const char* buf, NPBool file,
296 void* notifyData) {
297 DCHECK(IsInitialized()) << __FUNCTION__;
298 return g_posturlnotify(instance, URL, window, len, buf, file, notifyData);
299 }
300
301 NPError GetValue(NPP instance, NPNVariable variable, void* ret_value) {
302 DCHECK(IsInitialized()) << __FUNCTION__;
303 return g_getvalue(instance, variable, ret_value);
304 }
305
306 NPError SetValue(NPP instance, NPPVariable variable, void* value) {
307 DCHECK(IsInitialized()) << __FUNCTION__;
308 return g_setvalue(instance, variable, value);
309 }
310
311 void InvalidateRect(NPP instance, NPRect* rect) {
312 DCHECK(IsInitialized()) << __FUNCTION__;
313 return g_invalidaterect(instance, rect);
314 }
315
316 void InvalidateRegion(NPP instance, NPRegion region) {
317 DCHECK(IsInitialized()) << __FUNCTION__;
318 return g_invalidateregion(instance, region);
319 }
320
321 void ForceRedraw(NPP instance) {
322 DCHECK(IsInitialized()) << __FUNCTION__;
323 return g_forceredraw(instance);
324 }
325
326 void ReleaseVariantValue(NPVariant* variant) {
327 DCHECK(IsInitialized()) << __FUNCTION__;
328 return g_releasevariantvalue(variant);
329 }
330
331 NPIdentifier GetStringIdentifier(const NPUTF8* name) {
332 DCHECK(IsInitialized()) << __FUNCTION__;
333 return g_getstringidentifier(name);
334 }
335
336 void GetStringIdentifiers(const NPUTF8** names, int nameCount,
337 NPIdentifier* identifiers) {
338 DCHECK(IsInitialized()) << __FUNCTION__;
339 return g_getstringidentifiers(names, nameCount, identifiers);
340 }
341
342 NPIdentifier GetIntIdentifier(int32_t intid) {
343 DCHECK(IsInitialized()) << __FUNCTION__;
344 return g_getintidentifier(intid);
345 }
346
347 int32_t IntFromIdentifier(NPIdentifier identifier) {
348 DCHECK(IsInitialized()) << __FUNCTION__;
349 return g_intfromidentifier(identifier);
350 }
351
352 bool IdentifierIsString(NPIdentifier identifier) {
353 DCHECK(IsInitialized()) << __FUNCTION__;
354 return g_identifierisstring(identifier);
355
356 }
357
358 NPUTF8* UTF8FromIdentifier(NPIdentifier identifier) {
359 DCHECK(IsInitialized()) << __FUNCTION__;
360 return g_utf8fromidentifier(identifier);
361
362 }
363
364 NPObject* CreateObject(NPP instance, NPClass* aClass) {
365 DCHECK(IsInitialized()) << __FUNCTION__;
366 return g_createobject(instance, aClass);
367
368 }
369
370 NPObject* RetainObject(NPObject* obj) {
371 DCHECK(IsInitialized()) << __FUNCTION__;
372 return g_retainobject(obj);
373
374 }
375
376 void ReleaseObject(NPObject* obj) {
377 DCHECK(IsInitialized()) << __FUNCTION__;
378 return g_releaseobject(obj);
379
380 }
381
382 bool Invoke(NPP npp, NPObject* obj, NPIdentifier methodName,
383 const NPVariant* args, unsigned argCount, NPVariant* result) {
384 DCHECK(IsInitialized()) << __FUNCTION__;
385 return g_invoke(npp, obj, methodName, args, argCount, result);
386 }
387
388 bool InvokeDefault(NPP npp, NPObject* obj, const NPVariant* args,
389 unsigned argCount, NPVariant* result) {
390 DCHECK(IsInitialized()) << __FUNCTION__;
391 return g_invoke_default(npp, obj, args, argCount, result);
392 }
393
394 bool Evaluate(NPP npp, NPObject* obj, NPString* script, NPVariant* result) {
395 DCHECK(IsInitialized()) << __FUNCTION__;
396 return g_evaluate(npp, obj, script, result);
397 }
398
399 bool GetProperty(NPP npp, NPObject* obj, NPIdentifier propertyName,
400 NPVariant* result) {
401 DCHECK(IsInitialized()) << __FUNCTION__;
402 return g_getproperty(npp, obj, propertyName, result);
403 }
404
405 bool SetProperty(NPP npp, NPObject* obj, NPIdentifier propertyName,
406 const NPVariant* value) {
407 DCHECK(IsInitialized()) << __FUNCTION__;
408 return g_setproperty(npp, obj, propertyName, value);
409 }
410
411 bool HasProperty(NPP npp, NPObject* npobj, NPIdentifier propertyName) {
412 DCHECK(IsInitialized()) << __FUNCTION__;
413 return g_hasproperty(npp, npobj, propertyName);
414 }
415
416 bool HasMethod(NPP npp, NPObject* npobj, NPIdentifier methodName) {
417 DCHECK(IsInitialized()) << __FUNCTION__;
418 return g_hasmethod(npp, npobj, methodName);
419 }
420
421 bool RemoveProperty(NPP npp, NPObject* obj, NPIdentifier propertyName) {
422 DCHECK(IsInitialized()) << __FUNCTION__;
423 return g_removeproperty(npp, obj, propertyName);
424 }
425
426 void SetException(NPObject* obj, const NPUTF8* message) {
427 DCHECK(IsInitialized()) << __FUNCTION__;
428 return g_setexception(obj, message);
429 }
430
431 void PushPopupsEnabledState(NPP npp, NPBool enabled) {
432 DCHECK(IsInitialized()) << __FUNCTION__;
433 return g_pushpopupsenabledstate(npp, enabled);
434 }
435
436 void PopPopupsEnabledState(NPP npp) {
437 DCHECK(IsInitialized()) << __FUNCTION__;
438 return g_poppopupsenabledstate(npp);
439 }
440
441 bool Enumerate(NPP npp, NPObject* obj, NPIdentifier** identifier,
442 uint32_t* count) {
443 DCHECK(IsInitialized()) << __FUNCTION__;
444 return g_enumerate(npp, obj, identifier, count);
445 }
446
447 void PluginThreadAsyncCall(NPP instance, void (*func)(void*), void* userData) {
448 DCHECK(IsInitialized()) << __FUNCTION__;
449 return g_pluginthreadasynccall(instance, func, userData);
450 }
451
452 bool Construct(NPP npp, NPObject* obj, const NPVariant* args, uint32_t argCount,
453 NPVariant* result) {
454 DCHECK(IsInitialized()) << __FUNCTION__;
455 return g_construct(npp, obj, args, argCount, result);
456 }
457
458 NPError GetValueForURL(NPP instance, NPNURLVariable variable, const char* url,
459 char** value, uint32* len) {
460 DCHECK(IsInitialized()) << __FUNCTION__;
461 DCHECK(npapi::VersionMinor() >= NPVERS_HAS_URL_AND_AUTH_INFO);
462 if (!g_getvalueforurl) {
463 NOTREACHED();
464 return NPERR_INCOMPATIBLE_VERSION_ERROR;
465 }
466
467 return g_getvalueforurl(instance, variable, url, value, len);
468 }
469
470 NPError SetValueForURL(NPP instance, NPNURLVariable variable, const char* url,
471 const char* value, uint32 len) {
472 DCHECK(IsInitialized()) << __FUNCTION__;
473 DCHECK(npapi::VersionMinor() >= NPVERS_HAS_URL_AND_AUTH_INFO);
474 if (!g_setvalueforurl) {
475 NOTREACHED();
476 return NPERR_INCOMPATIBLE_VERSION_ERROR;
477 }
478
479 return g_setvalueforurl(instance, variable, url, value, len);
480 }
481
482 NPError GetAuthenticationInfo(NPP instance, const char* protocol,
483 const char* host, int32 port, const char* scheme,
484 const char *realm, char** username, uint32* ulen,
485 char** password, uint32* plen) {
486 DCHECK(IsInitialized()) << __FUNCTION__;
487 DCHECK(npapi::VersionMinor() >= NPVERS_HAS_URL_AND_AUTH_INFO);
488 if (g_getauthenticationinfo) {
489 NOTREACHED();
490 return NPERR_INCOMPATIBLE_VERSION_ERROR;
491 }
492
493 return g_getauthenticationinfo(instance, protocol, host, port, scheme,
494 realm, username, ulen, password, plen);
495 }
496
497 void URLRedirectResponse(NPP instance, void* notify_data, NPBool allow) {
498 if (!g_urlredirectresponse) {
499 NOTREACHED() << "Unexpected call to NPN_URLRedirectResponse";
500 return;
501 }
502 return g_urlredirectresponse(instance, notify_data, allow);
503 }
504
505 std::string StringFromIdentifier(NPIdentifier identifier) {
506 std::string ret;
507 NPUTF8* utf8 = UTF8FromIdentifier(identifier);
508 if (utf8) {
509 ret = utf8;
510 MemFree(utf8);
511 }
512 return ret;
513 }
514
515 } // namespace npapi
516
517 void AllocateStringVariant(const std::string& str, NPVariant* var) {
518 DCHECK(var);
519
520 int len = str.length();
521 NPUTF8* buffer = reinterpret_cast<NPUTF8*>(npapi::MemAlloc(len + 1));
522 if (buffer) {
523 buffer[len] = '\0';
524 memcpy(buffer, str.c_str(), len);
525 STRINGN_TO_NPVARIANT(buffer, len, *var);
526 } else {
527 NULL_TO_NPVARIANT(*var);
528 }
529 }
530
531 bool BrowserSupportsRedirectNotification() {
532 return npapi::g_urlredirectresponse != NULL;
533 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698