Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(399)

Side by Side Diff: content/plugin/webplugin_delegate_stub.cc

Issue 1852593004: Remove content/plugin (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@remove_npapi_test_plugin
Patch Set: . Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/plugin/webplugin_delegate_stub.h ('k') | content/plugin/webplugin_proxy.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/plugin/webplugin_delegate_stub.h"
6
7 #include "build/build_config.h"
8
9 #include "base/bind.h"
10 #include "base/command_line.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "content/child/npapi/plugin_instance.h"
13 #include "content/child/npapi/webplugin_delegate_impl.h"
14 #include "content/child/npapi/webplugin_resource_client.h"
15 #include "content/child/plugin_messages.h"
16 #include "content/common/cursors/webcursor.h"
17 #include "content/plugin/plugin_channel.h"
18 #include "content/plugin/plugin_thread.h"
19 #include "content/plugin/webplugin_proxy.h"
20 #include "content/public/common/content_client.h"
21 #include "content/public/common/content_constants.h"
22 #include "content/public/common/content_switches.h"
23 #include "third_party/WebKit/public/platform/WebCursorInfo.h"
24 #include "third_party/npapi/bindings/npapi.h"
25 #include "third_party/npapi/bindings/npruntime.h"
26
27 using blink::WebCursorInfo;
28
29 namespace content {
30
31 static void DestroyWebPluginAndDelegate(
32 WebPluginDelegateImpl* delegate,
33 WebPlugin* webplugin) {
34 if (delegate)
35 delegate->PluginDestroyed();
36
37 delete webplugin;
38 }
39
40 WebPluginDelegateStub::WebPluginDelegateStub(
41 const std::string& mime_type, int instance_id, PluginChannel* channel) :
42 mime_type_(mime_type),
43 instance_id_(instance_id),
44 channel_(channel),
45 delegate_(NULL),
46 webplugin_(NULL),
47 in_destructor_(false) {
48 DCHECK(channel);
49 }
50
51 WebPluginDelegateStub::~WebPluginDelegateStub() {
52 in_destructor_ = true;
53 GetContentClient()->SetActiveURL(page_url_);
54
55 if (channel_->in_send()) {
56 // The delegate or an npobject is in the callstack, so don't delete it
57 // right away.
58 base::MessageLoop::current()->PostNonNestableTask(
59 FROM_HERE,
60 base::Bind(&DestroyWebPluginAndDelegate,
61 delegate_,
62 webplugin_));
63 } else {
64 // Safe to delete right away.
65 DestroyWebPluginAndDelegate(delegate_, webplugin_);
66 }
67 }
68
69 bool WebPluginDelegateStub::OnMessageReceived(const IPC::Message& msg) {
70 GetContentClient()->SetActiveURL(page_url_);
71
72 // A plugin can execute a script to delete itself in any of its NPP methods.
73 // Hold an extra reference to ourself so that if this does occur and we're
74 // handling a sync message, we don't crash when attempting to send a reply.
75 // The exception to this is when we're already in the destructor.
76 if (!in_destructor_)
77 AddRef();
78
79 bool handled = true;
80 IPC_BEGIN_MESSAGE_MAP(WebPluginDelegateStub, msg)
81 IPC_MESSAGE_HANDLER(PluginMsg_Init, OnInit)
82 IPC_MESSAGE_HANDLER(PluginMsg_SetFocus, OnSetFocus)
83 IPC_MESSAGE_HANDLER(PluginMsg_HandleInputEvent, OnHandleInputEvent)
84 IPC_MESSAGE_HANDLER(PluginMsg_Paint, OnPaint)
85 IPC_MESSAGE_HANDLER(PluginMsg_DidPaint, OnDidPaint)
86 IPC_MESSAGE_HANDLER(PluginMsg_UpdateGeometry, OnUpdateGeometry)
87 IPC_MESSAGE_HANDLER(PluginMsg_UpdateGeometrySync, OnUpdateGeometry)
88 IPC_MESSAGE_HANDLER(PluginMsg_SetContentAreaFocus, OnSetContentAreaFocus)
89 #if defined(OS_MACOSX)
90 IPC_MESSAGE_HANDLER(PluginMsg_SetWindowFocus, OnSetWindowFocus)
91 IPC_MESSAGE_HANDLER(PluginMsg_ContainerHidden, OnContainerHidden)
92 IPC_MESSAGE_HANDLER(PluginMsg_ContainerShown, OnContainerShown)
93 IPC_MESSAGE_HANDLER(PluginMsg_WindowFrameChanged, OnWindowFrameChanged)
94 IPC_MESSAGE_HANDLER(PluginMsg_ImeCompositionCompleted,
95 OnImeCompositionCompleted)
96 #endif
97 IPC_MESSAGE_UNHANDLED(handled = false)
98 IPC_END_MESSAGE_MAP()
99
100 if (!in_destructor_)
101 Release();
102
103 DCHECK(handled);
104 return handled;
105 }
106
107 bool WebPluginDelegateStub::Send(IPC::Message* msg) {
108 return channel_->Send(msg);
109 }
110
111 void WebPluginDelegateStub::OnInit(const PluginMsg_Init_Params& params,
112 bool* transparent,
113 bool* result) {
114 page_url_ = params.page_url;
115 GetContentClient()->SetActiveURL(page_url_);
116
117 *transparent = false;
118 *result = false;
119 if (params.arg_names.size() != params.arg_values.size()) {
120 NOTREACHED();
121 return;
122 }
123
124 const base::CommandLine& command_line =
125 *base::CommandLine::ForCurrentProcess();
126 base::FilePath path =
127 command_line.GetSwitchValuePath(switches::kPluginPath);
128
129 webplugin_ = new WebPluginProxy(channel_.get(),
130 instance_id_,
131 page_url_,
132 params.host_render_view_routing_id);
133 delegate_ = WebPluginDelegateImpl::Create(webplugin_, path, mime_type_);
134 if (delegate_) {
135 if (delegate_->GetQuirks() &
136 WebPluginDelegateImpl::PLUGIN_QUIRK_DIE_AFTER_UNLOAD) {
137 PluginThread::current()->SetForcefullyTerminatePluginProcess();
138 }
139
140 webplugin_->set_delegate(delegate_);
141 std::vector<std::string> arg_names = params.arg_names;
142 std::vector<std::string> arg_values = params.arg_values;
143
144 *result = delegate_->Initialize(params.url,
145 arg_names,
146 arg_values,
147 params.load_manually);
148 *transparent = delegate_->instance()->transparent();
149 }
150 }
151
152 void WebPluginDelegateStub::OnSetFocus(bool focused) {
153 delegate_->SetFocus(focused);
154 }
155
156 void WebPluginDelegateStub::OnHandleInputEvent(
157 const blink::WebInputEvent *event,
158 bool* handled,
159 WebCursor* cursor) {
160 WebCursor::CursorInfo cursor_info;
161 *handled = delegate_->HandleInputEvent(*event, &cursor_info);
162 cursor->InitFromCursorInfo(cursor_info);
163 }
164
165 void WebPluginDelegateStub::OnPaint(const gfx::Rect& damaged_rect) {
166 webplugin_->Paint(damaged_rect);
167 }
168
169 void WebPluginDelegateStub::OnDidPaint() {
170 webplugin_->DidPaint();
171 }
172
173 void WebPluginDelegateStub::OnUpdateGeometry(
174 const PluginMsg_UpdateGeometry_Param& param) {
175 webplugin_->UpdateGeometry(
176 param.window_rect, param.clip_rect,
177 param.windowless_buffer0, param.windowless_buffer1,
178 param.windowless_buffer_index);
179 }
180
181 void WebPluginDelegateStub::OnSetContentAreaFocus(bool has_focus) {
182 if (delegate_)
183 delegate_->SetContentAreaHasFocus(has_focus);
184 }
185
186 #if defined(OS_MACOSX)
187 void WebPluginDelegateStub::OnSetWindowFocus(bool has_focus) {
188 if (delegate_)
189 delegate_->SetWindowHasFocus(has_focus);
190 }
191
192 void WebPluginDelegateStub::OnContainerHidden() {
193 if (delegate_)
194 delegate_->SetContainerVisibility(false);
195 }
196
197 void WebPluginDelegateStub::OnContainerShown(gfx::Rect window_frame,
198 gfx::Rect view_frame,
199 bool has_focus) {
200 if (delegate_) {
201 delegate_->WindowFrameChanged(window_frame, view_frame);
202 delegate_->SetContainerVisibility(true);
203 delegate_->SetWindowHasFocus(has_focus);
204 }
205 }
206
207 void WebPluginDelegateStub::OnWindowFrameChanged(const gfx::Rect& window_frame,
208 const gfx::Rect& view_frame) {
209 if (delegate_)
210 delegate_->WindowFrameChanged(window_frame, view_frame);
211 }
212
213 void WebPluginDelegateStub::OnImeCompositionCompleted(
214 const base::string16& text) {
215 if (delegate_)
216 delegate_->ImeCompositionCompleted(text);
217 }
218 #endif // OS_MACOSX
219
220 } // namespace content
OLDNEW
« no previous file with comments | « content/plugin/webplugin_delegate_stub.h ('k') | content/plugin/webplugin_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698