Add more accurate activity state tracking
[WebKit-https.git] / Source / WebKit2 / WebProcess / Plugins / Netscape / NPRuntimeObjectMap.h
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef NPJSObjectWrapperMap_h
27 #define NPJSObjectWrapperMap_h
28
29 #if ENABLE(NETSCAPE_PLUGIN_API)
30
31 #include <WebCore/RunLoop.h>
32 #include <heap/Weak.h>
33 #include <heap/WeakInlines.h>
34 #include <wtf/Forward.h>
35 #include <wtf/HashMap.h>
36
37 struct NPObject;
38 typedef struct _NPVariant NPVariant;
39
40 namespace JSC {
41     class ExecState;
42     class VM;
43     class JSGlobalObject;
44     class JSObject;
45     class JSValue;
46 }
47
48 namespace WebCore {
49     class PageThrottler;
50 }
51
52 namespace WebKit {
53
54 class JSNPObject;
55 class NPJSObject;
56 class PluginView;
57
58 // A per plug-in map of NPObjects that wrap JavaScript objects.
59 class NPRuntimeObjectMap : private JSC::WeakHandleOwner {
60 public:
61     explicit NPRuntimeObjectMap(PluginView*, WebCore::PageThrottler*);
62
63     class PluginProtector {
64     public:
65         explicit PluginProtector(NPRuntimeObjectMap* npRuntimeObjectMap);
66         ~PluginProtector();
67         
68     private:
69         RefPtr<PluginView> m_pluginView;
70     };
71
72     // Returns an NPObject that wraps the given JSObject object. If there is already an NPObject that wraps this JSObject, it will
73     // retain it and return it.
74     NPObject* getOrCreateNPObject(JSC::VM&, JSC::JSObject*);
75     void npJSObjectDestroyed(NPJSObject*);
76
77     // Returns a JSObject object that wraps the given NPObject.
78     JSC::JSObject* getOrCreateJSObject(JSC::JSGlobalObject*, NPObject*);
79     void jsNPObjectDestroyed(JSNPObject*);
80
81     void convertJSValueToNPVariant(JSC::ExecState*, JSC::JSValue, NPVariant&);
82     JSC::JSValue convertNPVariantToJSValue(JSC::ExecState*, JSC::JSGlobalObject*, const NPVariant&);
83
84     bool evaluate(NPObject*, const String& scriptString, NPVariant* result);
85
86     // Called when the plug-in is destroyed. Will invalidate all the NPObjects.
87     void invalidate();
88
89     JSC::JSGlobalObject* globalObject() const;
90     JSC::ExecState* globalExec() const;
91
92     static void setGlobalException(const String& exceptionString);
93     static void moveGlobalExceptionToExecState(JSC::ExecState*);
94
95 private:
96     // WeakHandleOwner
97     virtual void finalize(JSC::Handle<JSC::Unknown>, void* context);
98     void addToInvalidationQueue(NPObject*);
99     void invalidateQueuedObjects();
100
101     PluginView* m_pluginView;
102     RefPtr<WebCore::PageThrottler> m_pageThrottler;
103     HashMap<JSC::JSObject*, NPJSObject*> m_npJSObjects;
104     HashMap<NPObject*, JSC::Weak<JSNPObject>> m_jsNPObjects;
105     Vector<NPObject*> m_npObjectsToFinalize;
106     WebCore::RunLoop::Timer<NPRuntimeObjectMap> m_finalizationTimer;
107 };
108
109 } // namespace WebKit
110
111 #endif // ENABLE(NETSCAPE_PLUGIN_API)
112
113 #endif // NPJSObjectWrapperMap_h