17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "PluginTest.h" 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using namespace std; 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LeakWindowScriptableObject : public PluginTest { 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public: 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LeakWindowScriptableObject(NPP npp, const string& identifier) 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : PluginTest(npp, identifier) 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)private: 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual NPError NPP_New(NPMIMEType pluginType, 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) uint16_t mode, 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int16_t argc, 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) char* argn[], 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char* argv[], 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NPSavedData* saved) OVERRIDE { 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Get a new reference to the window script object. 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NPObject* window; 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (NPN_GetValue(NPNVWindowNPObject, &window) != NPERR_NO_ERROR) { 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) log("Fail: Cannot fetch window script object"); 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return NPERR_NO_ERROR; 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Get another reference to the same object via window.self. 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NPIdentifier self_name = NPN_GetStringIdentifier("self"); 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NPVariant window_self_variant; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!NPN_GetProperty(window, self_name, &window_self_variant)) { 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) log("Fail: Cannot query window.self"); 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NPERR_NO_ERROR; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!NPVARIANT_IS_OBJECT(window_self_variant)) { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) log("Fail: window.self is not an object"); 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NPERR_NO_ERROR; 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Leak both references to the window script object. 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NPERR_NO_ERROR; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static PluginTest::Register<LeakWindowScriptableObject> leakWindowScriptableObject("leak-window-scriptable-object"); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)