Home | History | Annotate | Download | only in plugin
      1 // Copyright (c) 2011 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 "content/test/plugin/plugin_npobject_identity_test.h"
      6 
      7 #include "base/basictypes.h"
      8 #include "base/compiler_specific.h"
      9 
     10 namespace {
     11 
     12 class NPThingy : public NPObject {
     13  public:
     14   NPThingy() : NPObject() {}
     15 
     16   static NPObject* Allocate(NPP npp, NPClass* npclass) {
     17     return new NPThingy();
     18   }
     19 
     20   static void Deallocate(NPObject* npobject) {
     21     delete static_cast<NPThingy*>(npobject);
     22   }
     23 };
     24 
     25 NPClass* GetNPThingyClass() {
     26   static NPClass plugin_class = {
     27     NP_CLASS_STRUCT_VERSION,
     28     NPThingy::Allocate,
     29     NPThingy::Deallocate,
     30     NULL, // Invalidate
     31     NULL, // HasMethod
     32     NULL, // Invoke
     33     NULL, // InvokeDefault
     34     NULL, // HasProperty
     35     NULL, // GetProperty
     36     NULL, // SetProperty
     37     NULL, // RemoveProperty
     38   };
     39   return &plugin_class;
     40 }
     41 
     42 
     43 }  // namespace
     44 
     45 namespace NPAPIClient {
     46 
     47 NPObjectIdentityTest::NPObjectIdentityTest(NPP id,
     48                                            NPNetscapeFuncs *host_functions)
     49     : PluginTest(id, host_functions) {
     50 }
     51 
     52 NPError NPObjectIdentityTest::SetWindow(NPWindow* pNPWindow) {
     53 #if !defined(OS_MACOSX)
     54   if (pNPWindow->window == NULL)
     55     return NPERR_NO_ERROR;
     56 #endif
     57 
     58   NPIdentifier are_these_the_same_id = HostFunctions()->getstringidentifier(
     59       "areTheseTheSame");
     60 
     61   // Get a function from window.areTheseTheSame.
     62   NPObject* window;
     63   HostFunctions()->getvalue(id(), NPNVWindowNPObject, &window);
     64   NPVariant func_var;
     65   HostFunctions()->getproperty(id(), window, are_these_the_same_id, &func_var);
     66   NPObject* func = NPVARIANT_TO_OBJECT(func_var);
     67 
     68   // Create a custom NPObject and pass it in both arguments to areTheseTheSame.
     69   NPObject* thingy = HostFunctions()->createobject(id(), GetNPThingyClass());
     70   NPVariant func_args[2];
     71   OBJECT_TO_NPVARIANT(thingy, func_args[0]);
     72   OBJECT_TO_NPVARIANT(thingy, func_args[1]);
     73   NPVariant were_the_same_var;
     74   HostFunctions()->invokeDefault(id(), func, (const NPVariant*)&func_args, 2,
     75                                  &were_the_same_var);
     76 
     77   // Confirm that JavaScript could see that the objects were the same.
     78   bool were_the_same = NPVARIANT_TO_BOOLEAN(were_the_same_var);
     79   if (!were_the_same)
     80     SetError("Identity was lost in passing from NPAPI into JavaScript.");
     81 
     82   HostFunctions()->releaseobject(thingy);
     83 
     84   // If this test failed, then we'd have crashed by now.
     85   SignalTestCompleted();
     86 
     87   return NPERR_NO_ERROR;
     88 }
     89 
     90 } // namespace NPAPIClient
     91