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

Side by Side Diff: webkit/glue/plugins/pepper_var.cc

Issue 2148001: Chromium side of supporting property enumeration, memory allocation, querying... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 7 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
« no previous file with comments | « webkit/glue/plugins/pepper_var.h ('k') | webkit/glue/plugins/pepper_webplugin_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/glue/plugins/pepper_var.h" 5 #include "webkit/glue/plugins/pepper_var.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/scoped_ptr.h" 8 #include "base/scoped_ptr.h"
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "third_party/ppapi/c/pp_var.h" 10 #include "third_party/ppapi/c/pp_var.h"
11 #include "third_party/ppapi/c/ppb_var.h" 11 #include "third_party/ppapi/c/ppb_var.h"
12 #include "third_party/ppapi/c/ppp_class.h" 12 #include "third_party/ppapi/c/ppp_class.h"
13 #include "third_party/WebKit/WebKit/chromium/public/WebBindings.h" 13 #include "third_party/WebKit/WebKit/chromium/public/WebBindings.h"
14 #include "webkit/glue/plugins/pepper_string.h" 14 #include "webkit/glue/plugins/pepper_string.h"
15 #include "v8/include/v8.h" 15 #include "v8/include/v8.h"
16 16
17 // Uncomment to enable catching JS exceptions
18 // #define HAVE_WEBBINDINGS_EXCEPTION_HANDLER 1
19
20 using WebKit::WebBindings; 17 using WebKit::WebBindings;
21 18
22 namespace pepper { 19 namespace pepper {
23 20
24 namespace { 21 namespace {
25 22
26 void Release(PP_Var var); 23 void Release(PP_Var var);
27 PP_Var VarFromUtf8(const char* data, uint32_t len); 24 PP_Var VarFromUtf8(const char* data, uint32_t len);
28 25
29 // --------------------------------------------------------------------------- 26 // ---------------------------------------------------------------------------
30 // Exceptions 27 // Exceptions
31 28
32 class TryCatch { 29 class TryCatch {
33 public: 30 public:
34 TryCatch(PP_Var* exception) : exception_(exception) { 31 TryCatch(PP_Var* exception) : exception_(exception) {
35 #ifdef HAVE_WEBBINDINGS_EXCEPTION_HANDLER
36 WebBindings::pushExceptionHandler(&TryCatch::Catch, this); 32 WebBindings::pushExceptionHandler(&TryCatch::Catch, this);
37 #endif
38 } 33 }
39 34
40 ~TryCatch() { 35 ~TryCatch() {
41 #ifdef HAVE_WEBBINDINGS_EXCEPTION_HANDLER
42 WebBindings::popExceptionHandler(); 36 WebBindings::popExceptionHandler();
43 #endif
44 } 37 }
45 38
46 bool HasException() const { 39 bool HasException() const {
47 return exception_ && exception_->type != PP_VarType_Void; 40 return exception_ && exception_->type != PP_VarType_Void;
48 } 41 }
49 42
50 void SetException(const char* message) { 43 void SetException(const char* message) {
51 DCHECK(!HasException()); 44 DCHECK(!HasException());
52 if (exception_) 45 if (exception_)
53 *exception_ = VarFromUtf8(message, strlen(message)); 46 *exception_ = VarFromUtf8(message, strlen(message));
(...skipping 29 matching lines...) Expand all
83 String* GetString(PP_Var var) { 76 String* GetString(PP_Var var) {
84 if (var.type != PP_VarType_String) 77 if (var.type != PP_VarType_String)
85 return NULL; 78 return NULL;
86 return GetStringUnchecked(var); 79 return GetStringUnchecked(var);
87 } 80 }
88 81
89 NPObject* GetNPObjectUnchecked(PP_Var var) { 82 NPObject* GetNPObjectUnchecked(PP_Var var) {
90 return reinterpret_cast<NPObject*>(var.value.as_id); 83 return reinterpret_cast<NPObject*>(var.value.as_id);
91 } 84 }
92 85
93 NPObject* GetNPObject(PP_Var var) {
94 if (var.type != PP_VarType_Object)
95 return NULL;
96 return GetNPObjectUnchecked(var);
97 }
98
99 // Returns a PP_Var that corresponds to the given NPVariant. The contents of 86 // Returns a PP_Var that corresponds to the given NPVariant. The contents of
100 // the NPVariant will be copied unless the NPVariant corresponds to an object. 87 // the NPVariant will be copied unless the NPVariant corresponds to an object.
101 PP_Var NPVariantToPPVar(const NPVariant* variant) { 88 PP_Var NPVariantToPPVar(const NPVariant* variant) {
102 switch (variant->type) { 89 switch (variant->type) {
103 case NPVariantType_Void: 90 case NPVariantType_Void:
104 return PP_MakeVoid(); 91 return PP_MakeVoid();
105 case NPVariantType_Null: 92 case NPVariantType_Null:
106 return PP_MakeNull(); 93 return PP_MakeNull();
107 case NPVariantType_Bool: 94 case NPVariantType_Bool:
108 return PP_MakeBool(NPVARIANT_TO_BOOLEAN(*variant)); 95 return PP_MakeBool(NPVARIANT_TO_BOOLEAN(*variant));
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 if (exception.type != PP_VarType_Void) { 397 if (exception.type != PP_VarType_Void) {
411 ThrowException(object, exception); 398 ThrowException(object, exception);
412 Release(exception); 399 Release(exception);
413 return false; 400 return false;
414 } 401 }
415 return true; 402 return true;
416 } 403 }
417 404
418 bool WrapperClass_Enumerate(NPObject* object, NPIdentifier** values, 405 bool WrapperClass_Enumerate(NPObject* object, NPIdentifier** values,
419 uint32_t* count) { 406 uint32_t* count) {
420 // TODO(darin): Implement this method! 407 WrapperObject* wrapper = ToWrapper(object);
421 WebBindings::setException(object, kUnableToGetAllPropertiesException); 408
422 return false; 409 uint32_t property_count = 0;
410 PP_Var* properties = NULL;
411 PP_Var exception = PP_MakeVoid();
412 wrapper->ppp_class->GetAllPropertyNames(wrapper->ppp_class_data,
413 &property_count,
414 &properties,
415 &exception);
416
417 bool rv;
418 if (exception.type == PP_VarType_Void) {
419 rv = true;
420 if (property_count == 0) {
421 *values = NULL;
422 *count = 0;
423 } else {
424 *values = static_cast<NPIdentifier*>(
425 malloc(sizeof(NPIdentifier) * property_count));
426 *count = property_count;
427 for (uint32_t i = 0; i < property_count; ++i)
428 (*values)[i] = PPVarToNPIdentifier(properties[i]);
429 }
430 } else {
431 rv = false;
432 ThrowException(object, exception);
433 Release(exception);
434 }
435
436 for (uint32_t i = 0; i < property_count; ++i)
437 Release(properties[i]);
438 free(properties);
439 return rv;
423 } 440 }
424 441
425 bool WrapperClass_Construct(NPObject* object, const NPVariant* argv, 442 bool WrapperClass_Construct(NPObject* object, const NPVariant* argv,
426 uint32_t argc, NPVariant* result) { 443 uint32_t argc, NPVariant* result) {
427 WrapperObject* wrapper = ToWrapper(object); 444 WrapperObject* wrapper = ToWrapper(object);
428 445
429 scoped_array<PP_Var> args; 446 scoped_array<PP_Var> args;
430 if (argc) { 447 if (argc) {
431 args.reset(new PP_Var[argc]); 448 args.reset(new PP_Var[argc]);
432 for (uint32_t i = 0; i < argc; ++i) 449 for (uint32_t i = 0; i < argc; ++i)
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 601
585 PP_Var ret = NPVariantToPPVar(&result); 602 PP_Var ret = NPVariantToPPVar(&result);
586 WebBindings::releaseVariantValue(&result); 603 WebBindings::releaseVariantValue(&result);
587 return ret; 604 return ret;
588 } 605 }
589 606
590 void GetAllPropertyNames(PP_Var var, 607 void GetAllPropertyNames(PP_Var var,
591 uint32_t* property_count, 608 uint32_t* property_count,
592 PP_Var** properties, 609 PP_Var** properties,
593 PP_Var* exception) { 610 PP_Var* exception) {
611 *properties = NULL;
612 *property_count = 0;
613
594 TryCatch try_catch(exception); 614 TryCatch try_catch(exception);
595 if (try_catch.HasException()) 615 if (try_catch.HasException())
596 return; 616 return;
597 617
598 // TODO(darin): Implement this method! 618 NPObject* object = GetNPObject(var);
599 try_catch.SetException(kUnableToGetAllPropertiesException); 619 if (!object) {
620 try_catch.SetException(kInvalidObjectException);
621 return;
622 }
623
624 NPIdentifier* identifiers = NULL;
625 uint32_t count = 0;
626 if (!WebBindings::enumerate(NULL, object, &identifiers, &count)) {
627 if (!try_catch.HasException())
628 try_catch.SetException(kUnableToGetAllPropertiesException);
629 return;
630 }
631
632 if (count == 0)
633 return;
634
635 *property_count = count;
636 *properties = static_cast<PP_Var*>(malloc(sizeof(PP_Var) * count));
637 for (uint32_t i = 0; i < count; ++i)
638 (*properties)[i] = NPIdentifierToPPVar(identifiers[i]);
639 free(identifiers);
600 } 640 }
601 641
602 void SetProperty(PP_Var var, 642 void SetProperty(PP_Var var,
603 PP_Var name, 643 PP_Var name,
604 PP_Var value, 644 PP_Var value,
605 PP_Var* exception) { 645 PP_Var* exception) {
606 TryCatch try_catch(exception); 646 TryCatch try_catch(exception);
607 if (try_catch.HasException()) 647 if (try_catch.HasException())
608 return; 648 return;
609 649
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
792 } 832 }
793 833
794 PP_Var NPObjectToPPVar(NPObject* object) { 834 PP_Var NPObjectToPPVar(NPObject* object) {
795 PP_Var ret; 835 PP_Var ret;
796 ret.type = PP_VarType_Object; 836 ret.type = PP_VarType_Object;
797 ret.value.as_id = reinterpret_cast<intptr_t>(object); 837 ret.value.as_id = reinterpret_cast<intptr_t>(object);
798 WebBindings::retainObject(object); 838 WebBindings::retainObject(object);
799 return ret; 839 return ret;
800 } 840 }
801 841
842 NPObject* GetNPObject(PP_Var var) {
843 if (var.type != PP_VarType_Object)
844 return NULL;
845 return GetNPObjectUnchecked(var);
846 }
847
802 } // namespace pepper 848 } // namespace pepper
OLDNEW
« no previous file with comments | « webkit/glue/plugins/pepper_var.h ('k') | webkit/glue/plugins/pepper_webplugin_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698