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)