|
1 /* -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*- */ |
|
2 /* vim: set sw=2 ts=8 et tw=80 : */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 #include "PluginMessageUtils.h" |
|
8 #include "nsIRunnable.h" |
|
9 #include "nsThreadUtils.h" |
|
10 |
|
11 #include "PluginInstanceParent.h" |
|
12 #include "PluginInstanceChild.h" |
|
13 #include "PluginScriptableObjectParent.h" |
|
14 #include "PluginScriptableObjectChild.h" |
|
15 |
|
16 using std::string; |
|
17 |
|
18 using mozilla::ipc::MessageChannel; |
|
19 |
|
20 namespace { |
|
21 |
|
22 class DeferNPObjectReleaseRunnable : public nsRunnable |
|
23 { |
|
24 public: |
|
25 DeferNPObjectReleaseRunnable(const NPNetscapeFuncs* f, NPObject* o) |
|
26 : mFuncs(f) |
|
27 , mObject(o) |
|
28 { |
|
29 NS_ASSERTION(o, "no release null objects"); |
|
30 } |
|
31 |
|
32 NS_IMETHOD Run(); |
|
33 |
|
34 private: |
|
35 const NPNetscapeFuncs* mFuncs; |
|
36 NPObject* mObject; |
|
37 }; |
|
38 |
|
39 NS_IMETHODIMP |
|
40 DeferNPObjectReleaseRunnable::Run() |
|
41 { |
|
42 mFuncs->releaseobject(mObject); |
|
43 return NS_OK; |
|
44 } |
|
45 |
|
46 } // anonymous namespace |
|
47 |
|
48 namespace mozilla { |
|
49 namespace plugins { |
|
50 |
|
51 NPRemoteWindow::NPRemoteWindow() : |
|
52 window(0), x(0), y(0), width(0), height(0), type(NPWindowTypeDrawable) |
|
53 #if defined(MOZ_X11) && defined(XP_UNIX) && !defined(XP_MACOSX) |
|
54 , visualID(0) |
|
55 , colormap(0) |
|
56 #endif /* XP_UNIX */ |
|
57 #if defined(XP_WIN) |
|
58 ,surfaceHandle(0) |
|
59 #endif |
|
60 #if defined(XP_MACOSX) |
|
61 ,contentsScaleFactor(1.0) |
|
62 #endif |
|
63 { |
|
64 clipRect.top = 0; |
|
65 clipRect.left = 0; |
|
66 clipRect.bottom = 0; |
|
67 clipRect.right = 0; |
|
68 } |
|
69 |
|
70 ipc::RacyInterruptPolicy |
|
71 MediateRace(const MessageChannel::Message& parent, |
|
72 const MessageChannel::Message& child) |
|
73 { |
|
74 switch (parent.type()) { |
|
75 case PPluginInstance::Msg_Paint__ID: |
|
76 case PPluginInstance::Msg_NPP_SetWindow__ID: |
|
77 case PPluginInstance::Msg_NPP_HandleEvent_Shmem__ID: |
|
78 case PPluginInstance::Msg_NPP_HandleEvent_IOSurface__ID: |
|
79 // our code relies on the frame list not changing during paints and |
|
80 // reflows |
|
81 return ipc::RIPParentWins; |
|
82 |
|
83 default: |
|
84 return ipc::RIPChildWins; |
|
85 } |
|
86 } |
|
87 |
|
88 #if defined(OS_LINUX) |
|
89 static string |
|
90 ReplaceAll(const string& haystack, const string& needle, const string& with) |
|
91 { |
|
92 string munged = haystack; |
|
93 string::size_type i = 0; |
|
94 |
|
95 while (string::npos != (i = munged.find(needle, i))) { |
|
96 munged.replace(i, needle.length(), with); |
|
97 i += with.length(); |
|
98 } |
|
99 |
|
100 return munged; |
|
101 } |
|
102 #endif |
|
103 |
|
104 string |
|
105 MungePluginDsoPath(const string& path) |
|
106 { |
|
107 #if defined(OS_LINUX) |
|
108 // https://bugzilla.mozilla.org/show_bug.cgi?id=519601 |
|
109 return ReplaceAll(path, "netscape", "netsc@pe"); |
|
110 #else |
|
111 return path; |
|
112 #endif |
|
113 } |
|
114 |
|
115 string |
|
116 UnmungePluginDsoPath(const string& munged) |
|
117 { |
|
118 #if defined(OS_LINUX) |
|
119 return ReplaceAll(munged, "netsc@pe", "netscape"); |
|
120 #else |
|
121 return munged; |
|
122 #endif |
|
123 } |
|
124 |
|
125 |
|
126 PRLogModuleInfo* |
|
127 GetPluginLog() |
|
128 { |
|
129 static PRLogModuleInfo *sLog; |
|
130 if (!sLog) |
|
131 sLog = PR_NewLogModule("IPCPlugins"); |
|
132 return sLog; |
|
133 } |
|
134 |
|
135 void |
|
136 DeferNPObjectLastRelease(const NPNetscapeFuncs* f, NPObject* o) |
|
137 { |
|
138 if (!o) |
|
139 return; |
|
140 |
|
141 if (o->referenceCount > 1) { |
|
142 f->releaseobject(o); |
|
143 return; |
|
144 } |
|
145 |
|
146 NS_DispatchToCurrentThread(new DeferNPObjectReleaseRunnable(f, o)); |
|
147 } |
|
148 |
|
149 void DeferNPVariantLastRelease(const NPNetscapeFuncs* f, NPVariant* v) |
|
150 { |
|
151 if (!NPVARIANT_IS_OBJECT(*v)) { |
|
152 f->releasevariantvalue(v); |
|
153 return; |
|
154 } |
|
155 DeferNPObjectLastRelease(f, v->value.objectValue); |
|
156 VOID_TO_NPVARIANT(*v); |
|
157 } |
|
158 |
|
159 #ifdef XP_WIN |
|
160 |
|
161 // The private event used for double-pass widgetless plugin rendering. |
|
162 UINT DoublePassRenderingEvent() |
|
163 { |
|
164 static UINT gEventID = 0; |
|
165 if (!gEventID) |
|
166 gEventID = ::RegisterWindowMessage(L"MozDoublePassMsg"); |
|
167 return gEventID; |
|
168 } |
|
169 |
|
170 #endif |
|
171 |
|
172 } // namespace plugins |
|
173 } // namespace mozilla |