15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/test/plugin/plugin_npobject_identity_test.h" 6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NPThingy : public NPObject { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPThingy() : NPObject() {} 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static NPObject* Allocate(NPP npp, NPClass* npclass) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new NPThingy(); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Deallocate(NPObject* npobject) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete static_cast<NPThingy*>(npobject); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPClass* GetNPThingyClass() { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static NPClass plugin_class = { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NP_CLASS_STRUCT_VERSION, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPThingy::Allocate, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPThingy::Deallocate, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // Invalidate 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // HasMethod 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // Invoke 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // InvokeDefault 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // HasProperty 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // GetProperty 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // SetProperty 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // RemoveProperty 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &plugin_class; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace NPAPIClient { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPObjectIdentityTest::NPObjectIdentityTest(NPP id, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPNetscapeFuncs *host_functions) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : PluginTest(id, host_functions) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError NPObjectIdentityTest::SetWindow(NPWindow* pNPWindow) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pNPWindow->window == NULL) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPERR_NO_ERROR; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPIdentifier are_these_the_same_id = HostFunctions()->getstringidentifier( 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "areTheseTheSame"); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get a function from window.areTheseTheSame. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPObject* window; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostFunctions()->getvalue(id(), NPNVWindowNPObject, &window); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPVariant func_var; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostFunctions()->getproperty(id(), window, are_these_the_same_id, &func_var); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPObject* func = NPVARIANT_TO_OBJECT(func_var); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a custom NPObject and pass it in both arguments to areTheseTheSame. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPObject* thingy = HostFunctions()->createobject(id(), GetNPThingyClass()); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPVariant func_args[2]; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OBJECT_TO_NPVARIANT(thingy, func_args[0]); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OBJECT_TO_NPVARIANT(thingy, func_args[1]); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPVariant were_the_same_var; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostFunctions()->invokeDefault(id(), func, (const NPVariant*)&func_args, 2, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &were_the_same_var); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Confirm that JavaScript could see that the objects were the same. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool were_the_same = NPVARIANT_TO_BOOLEAN(were_the_same_var); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!were_the_same) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetError("Identity was lost in passing from NPAPI into JavaScript."); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostFunctions()->releaseobject(thingy); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this test failed, then we'd have crashed by now. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPERR_NO_ERROR; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace NPAPIClient 91