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

Side by Side Diff: chrome/renderer/webplugin_delegate_pepper.cc

Issue 291001: Moved Pepper delegate definition to chrome\renderer to allow it to use... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « chrome/renderer/webplugin_delegate_pepper.h ('k') | third_party/npapi/bindings/npapi.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #define PEPPER_APIS_ENABLED 1 5 #define PEPPER_APIS_ENABLED 1
6 6
7 #include "webkit/glue/plugins/webplugin_delegate_pepper_impl.h" 7 #include "chrome/renderer/webplugin_delegate_pepper.h"
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
11 11
12 #include "app/gfx/blit.h"
12 #include "base/file_util.h" 13 #include "base/file_util.h"
13 #include "base/message_loop.h" 14 #include "base/message_loop.h"
14 #include "base/process_util.h" 15 #include "base/process_util.h"
15 #include "base/scoped_ptr.h" 16 #include "base/scoped_ptr.h"
16 #include "base/stats_counters.h" 17 #include "base/stats_counters.h"
17 #include "base/string_util.h" 18 #include "base/string_util.h"
18 #include "webkit/api/public/WebInputEvent.h" 19 #include "webkit/api/public/WebInputEvent.h"
19 #include "webkit/glue/glue_util.h" 20 #include "webkit/glue/glue_util.h"
20 #include "webkit/glue/plugins/plugin_constants_win.h" 21 #include "webkit/glue/plugins/plugin_constants_win.h"
21 #include "webkit/glue/plugins/plugin_instance.h" 22 #include "webkit/glue/plugins/plugin_instance.h"
22 #include "webkit/glue/plugins/plugin_lib.h" 23 #include "webkit/glue/plugins/plugin_lib.h"
23 #include "webkit/glue/plugins/plugin_list.h" 24 #include "webkit/glue/plugins/plugin_list.h"
24 #include "webkit/glue/plugins/plugin_stream_url.h" 25 #include "webkit/glue/plugins/plugin_stream_url.h"
25 #include "webkit/glue/webkit_glue.h" 26 #include "webkit/glue/webkit_glue.h"
26 27
27 using webkit_glue::WebPlugin; 28 using webkit_glue::WebPlugin;
28 using webkit_glue::WebPluginDelegate; 29 using webkit_glue::WebPluginDelegate;
29 using webkit_glue::WebPluginResourceClient; 30 using webkit_glue::WebPluginResourceClient;
30 using WebKit::WebCursorInfo; 31 using WebKit::WebCursorInfo;
31 using WebKit::WebKeyboardEvent; 32 using WebKit::WebKeyboardEvent;
32 using WebKit::WebInputEvent; 33 using WebKit::WebInputEvent;
33 using WebKit::WebMouseEvent; 34 using WebKit::WebMouseEvent;
34 using WebKit::WebMouseWheelEvent; 35 using WebKit::WebMouseWheelEvent;
35 36
37 namespace {
38 const uint32 kBytesPerPixel = 4; // Only 8888 RGBA for now.
39 } // namespace
36 40
37 WebPluginDelegatePepperImpl* WebPluginDelegatePepperImpl::Create( 41 uint32 WebPluginDelegatePepper::next_buffer_id = 0;
42
43 WebPluginDelegatePepper* WebPluginDelegatePepper::Create(
38 const FilePath& filename, 44 const FilePath& filename,
39 const std::string& mime_type, 45 const std::string& mime_type,
40 gfx::PluginWindowHandle containing_view) { 46 gfx::PluginWindowHandle containing_view) {
41 scoped_refptr<NPAPI::PluginLib> plugin_lib = 47 scoped_refptr<NPAPI::PluginLib> plugin_lib =
42 NPAPI::PluginLib::CreatePluginLib(filename); 48 NPAPI::PluginLib::CreatePluginLib(filename);
43 if (plugin_lib.get() == NULL) 49 if (plugin_lib.get() == NULL)
44 return NULL; 50 return NULL;
45 51
46 NPError err = plugin_lib->NP_Initialize(); 52 NPError err = plugin_lib->NP_Initialize();
47 if (err != NPERR_NO_ERROR) 53 if (err != NPERR_NO_ERROR)
48 return NULL; 54 return NULL;
49 55
50 scoped_refptr<NPAPI::PluginInstance> instance = 56 scoped_refptr<NPAPI::PluginInstance> instance =
51 plugin_lib->CreateInstance(mime_type); 57 plugin_lib->CreateInstance(mime_type);
52 return new WebPluginDelegatePepperImpl(containing_view, instance.get()); 58 return new WebPluginDelegatePepper(containing_view, instance.get());
53 } 59 }
54 60
55 bool WebPluginDelegatePepperImpl::Initialize( 61 bool WebPluginDelegatePepper::Initialize(
56 const GURL& url, 62 const GURL& url,
57 const std::vector<std::string>& arg_names, 63 const std::vector<std::string>& arg_names,
58 const std::vector<std::string>& arg_values, 64 const std::vector<std::string>& arg_values,
59 WebPlugin* plugin, 65 WebPlugin* plugin,
60 bool load_manually) { 66 bool load_manually) {
61 plugin_ = plugin; 67 plugin_ = plugin;
62 68
63 instance_->set_web_plugin(plugin_); 69 instance_->set_web_plugin(plugin_);
64 int argc = 0; 70 int argc = 0;
65 scoped_array<char*> argn(new char*[arg_names.size()]); 71 scoped_array<char*> argn(new char*[arg_names.size()]);
(...skipping 14 matching lines...) Expand all
80 // a valid window handle causes subtle bugs with plugins which retreive 86 // a valid window handle causes subtle bugs with plugins which retreive
81 // the window handle and validate the same. The window handle can be 87 // the window handle and validate the same. The window handle can be
82 // retreived via NPN_GetValue of NPNVnetscapeWindow. 88 // retreived via NPN_GetValue of NPNVnetscapeWindow.
83 instance_->set_window_handle(parent_); 89 instance_->set_window_handle(parent_);
84 90
85 plugin_url_ = url.spec(); 91 plugin_url_ = url.spec();
86 92
87 return true; 93 return true;
88 } 94 }
89 95
90 void WebPluginDelegatePepperImpl::DestroyInstance() { 96 void WebPluginDelegatePepper::DestroyInstance() {
91 if (instance_ && (instance_->npp()->ndata != NULL)) { 97 if (instance_ && (instance_->npp()->ndata != NULL)) {
92 // Shutdown all streams before destroying so that 98 // Shutdown all streams before destroying so that
93 // no streams are left "in progress". Need to do 99 // no streams are left "in progress". Need to do
94 // this before calling set_web_plugin(NULL) because the 100 // this before calling set_web_plugin(NULL) because the
95 // instance uses the helper to do the download. 101 // instance uses the helper to do the download.
96 instance_->CloseStreams(); 102 instance_->CloseStreams();
97 103
98 window_.window = NULL; 104 window_.window = NULL;
99 instance_->NPP_SetWindow(&window_); 105 instance_->NPP_SetWindow(&window_);
100 106
101 instance_->NPP_Destroy(); 107 instance_->NPP_Destroy();
102 108
103 instance_->set_web_plugin(NULL); 109 instance_->set_web_plugin(NULL);
104 110
105 instance_ = 0; 111 instance_ = 0;
106 } 112 }
107 } 113 }
108 114
109 void WebPluginDelegatePepperImpl::UpdateGeometry( 115 void WebPluginDelegatePepper::UpdateGeometry(
110 const gfx::Rect& window_rect, 116 const gfx::Rect& window_rect,
111 const gfx::Rect& clip_rect) { 117 const gfx::Rect& clip_rect) {
112 WindowlessUpdateGeometry(window_rect, clip_rect); 118 // Only resend to the instance if the geometry has changed.
119 if (window_rect == window_rect_ && clip_rect == clip_rect_)
120 return;
121
122 clip_rect_ = clip_rect;
123 cutout_rects_.clear();
124
125 if (window_rect_ == window_rect)
126 return;
127 window_rect_ = window_rect;
128 uint32 buffer_size = window_rect.height() *
129 window_rect.width() *
130 kBytesPerPixel;
131 if (buffer_size_ < buffer_size) {
132 buffer_size_ = buffer_size;
133 plugin_buffer_ = TransportDIB::Create(buffer_size, ++next_buffer_id);
134 }
135
136 if (!instance())
137 return;
138
139 // TODO(sehr): do we need all this?
140 window_.clipRect.top = clip_rect_.y();
141 window_.clipRect.left = clip_rect_.x();
142 window_.clipRect.bottom = clip_rect_.y() + clip_rect_.height();
143 window_.clipRect.right = clip_rect_.x() + clip_rect_.width();
144 window_.height = window_rect_.height();
145 window_.width = window_rect_.width();
146 window_.x = window_rect_.x();
147 window_.y = window_rect_.y();
148 window_.type = NPWindowTypeDrawable;
113 } 149 }
114 150
115 NPObject* WebPluginDelegatePepperImpl::GetPluginScriptableObject() { 151 NPObject* WebPluginDelegatePepper::GetPluginScriptableObject() {
116 return instance_->GetPluginScriptableObject(); 152 return instance_->GetPluginScriptableObject();
117 } 153 }
118 154
119 void WebPluginDelegatePepperImpl::DidFinishLoadWithReason( 155 void WebPluginDelegatePepper::DidFinishLoadWithReason(
120 const GURL& url, 156 const GURL& url,
121 NPReason reason, 157 NPReason reason,
122 intptr_t notify_data) { 158 intptr_t notify_data) {
123 instance()->DidFinishLoadWithReason( 159 instance()->DidFinishLoadWithReason(
124 url, reason, reinterpret_cast<void*>(notify_data)); 160 url, reason, reinterpret_cast<void*>(notify_data));
125 } 161 }
126 162
127 int WebPluginDelegatePepperImpl::GetProcessId() { 163 int WebPluginDelegatePepper::GetProcessId() {
128 // We are in process, so the plugin pid is this current process pid. 164 // We are in process, so the plugin pid is this current process pid.
129 return base::GetCurrentProcId(); 165 return base::GetCurrentProcId();
130 } 166 }
131 167
132 void WebPluginDelegatePepperImpl::SendJavaScriptStream( 168 void WebPluginDelegatePepper::SendJavaScriptStream(
133 const GURL& url, 169 const GURL& url,
134 const std::string& result, 170 const std::string& result,
135 bool success, 171 bool success,
136 bool notify_needed, 172 bool notify_needed,
137 intptr_t notify_data) { 173 intptr_t notify_data) {
138 instance()->SendJavaScriptStream(url, result, success, notify_needed, 174 instance()->SendJavaScriptStream(url, result, success, notify_needed,
139 notify_data); 175 notify_data);
140 } 176 }
141 177
142 void WebPluginDelegatePepperImpl::DidReceiveManualResponse( 178 void WebPluginDelegatePepper::DidReceiveManualResponse(
143 const GURL& url, const std::string& mime_type, 179 const GURL& url, const std::string& mime_type,
144 const std::string& headers, uint32 expected_length, uint32 last_modified) { 180 const std::string& headers, uint32 expected_length, uint32 last_modified) {
145 instance()->DidReceiveManualResponse(url, mime_type, headers, 181 instance()->DidReceiveManualResponse(url, mime_type, headers,
146 expected_length, last_modified); 182 expected_length, last_modified);
147 } 183 }
148 184
149 void WebPluginDelegatePepperImpl::DidReceiveManualData(const char* buffer, 185 void WebPluginDelegatePepper::DidReceiveManualData(const char* buffer,
150 int length) { 186 int length) {
151 instance()->DidReceiveManualData(buffer, length); 187 instance()->DidReceiveManualData(buffer, length);
152 } 188 }
153 189
154 void WebPluginDelegatePepperImpl::DidFinishManualLoading() { 190 void WebPluginDelegatePepper::DidFinishManualLoading() {
155 instance()->DidFinishManualLoading(); 191 instance()->DidFinishManualLoading();
156 } 192 }
157 193
158 void WebPluginDelegatePepperImpl::DidManualLoadFail() { 194 void WebPluginDelegatePepper::DidManualLoadFail() {
159 instance()->DidManualLoadFail(); 195 instance()->DidManualLoadFail();
160 } 196 }
161 197
162 FilePath WebPluginDelegatePepperImpl::GetPluginPath() { 198 FilePath WebPluginDelegatePepper::GetPluginPath() {
163 return instance()->plugin_lib()->plugin_info().path; 199 return instance()->plugin_lib()->plugin_info().path;
164 } 200 }
165 201
166 WebPluginResourceClient* WebPluginDelegatePepperImpl::CreateResourceClient( 202 WebPluginResourceClient* WebPluginDelegatePepper::CreateResourceClient(
167 int resource_id, const GURL& url, bool notify_needed, 203 int resource_id, const GURL& url, bool notify_needed,
168 intptr_t notify_data, intptr_t existing_stream) { 204 intptr_t notify_data, intptr_t existing_stream) {
169 // Stream already exists. This typically happens for range requests 205 // Stream already exists. This typically happens for range requests
170 // initiated via NPN_RequestRead. 206 // initiated via NPN_RequestRead.
171 if (existing_stream) { 207 if (existing_stream) {
172 NPAPI::PluginStream* plugin_stream = 208 NPAPI::PluginStream* plugin_stream =
173 reinterpret_cast<NPAPI::PluginStream*>(existing_stream); 209 reinterpret_cast<NPAPI::PluginStream*>(existing_stream);
174 210
175 return plugin_stream->AsResourceClient(); 211 return plugin_stream->AsResourceClient();
176 } 212 }
177 213
178 std::string mime_type; 214 std::string mime_type;
179 NPAPI::PluginStreamUrl *stream = instance()->CreateStream( 215 NPAPI::PluginStreamUrl *stream = instance()->CreateStream(
180 resource_id, url, mime_type, notify_needed, 216 resource_id, url, mime_type, notify_needed,
181 reinterpret_cast<void*>(notify_data)); 217 reinterpret_cast<void*>(notify_data));
182 return stream; 218 return stream;
183 } 219 }
184 220
185 bool WebPluginDelegatePepperImpl::IsPluginDelegateWindow( 221 bool WebPluginDelegatePepper::IsPluginDelegateWindow(
186 gfx::NativeWindow window) { 222 gfx::NativeWindow window) {
187 return false; 223 return false;
188 } 224 }
189 225
190 bool WebPluginDelegatePepperImpl::GetPluginNameFromWindow( 226 bool WebPluginDelegatePepper::GetPluginNameFromWindow(
191 gfx::NativeWindow window, std::wstring *plugin_name) { 227 gfx::NativeWindow window, std::wstring *plugin_name) {
192 return false; 228 return false;
193 } 229 }
194 230
195 bool WebPluginDelegatePepperImpl::IsDummyActivationWindow( 231 bool WebPluginDelegatePepper::IsDummyActivationWindow(
196 gfx::NativeWindow window) { 232 gfx::NativeWindow window) {
197 return false; 233 return false;
198 } 234 }
199 235
200 WebPluginDelegatePepperImpl::WebPluginDelegatePepperImpl( 236 WebPluginDelegatePepper::WebPluginDelegatePepper(
201 gfx::PluginWindowHandle containing_view, 237 gfx::PluginWindowHandle containing_view,
202 NPAPI::PluginInstance *instance) 238 NPAPI::PluginInstance *instance)
203 : plugin_(NULL), 239 : plugin_(NULL),
204 instance_(instance), 240 instance_(instance),
205 parent_(containing_view) { 241 parent_(containing_view),
242 buffer_size_(0),
243 plugin_buffer_(0),
244 background_canvas_(0) {
206 memset(&window_, 0, sizeof(window_)); 245 memset(&window_, 0, sizeof(window_));
207 } 246 }
208 247
209 WebPluginDelegatePepperImpl::~WebPluginDelegatePepperImpl() { 248 WebPluginDelegatePepper::~WebPluginDelegatePepper() {
210 DestroyInstance(); 249 DestroyInstance();
211 } 250 }
212 251
213 void WebPluginDelegatePepperImpl::PluginDestroyed() { 252 void WebPluginDelegatePepper::PluginDestroyed() {
214 delete this; 253 delete this;
215 } 254 }
216 255
217 void WebPluginDelegatePepperImpl::Paint(gfx::NativeDrawingContext context, const gfx::Rect& rect) { 256 void WebPluginDelegatePepper::Paint(gfx::NativeDrawingContext context,
257 const gfx::Rect& rect) {
258 static StatsRate plugin_paint("Plugin.Paint");
259 StatsScope<StatsRate> scope(plugin_paint);
260 // Blit from background_context to context.
261 if (background_canvas_ != NULL) {
262 gfx::Point origin(window_rect_.origin().x(), window_rect_.origin().y());
263 gfx::BlitCanvasToContext(context, rect, background_canvas_, origin);
264 }
265 }
266
267 void WebPluginDelegatePepper::Print(gfx::NativeDrawingContext context) {
218 NOTIMPLEMENTED(); 268 NOTIMPLEMENTED();
219 } 269 }
220 270
221 void WebPluginDelegatePepperImpl::Print(gfx::NativeDrawingContext context) { 271 void WebPluginDelegatePepper::InstallMissingPlugin() {
222 NOTIMPLEMENTED(); 272 NOTIMPLEMENTED();
223 } 273 }
224 274
225 void WebPluginDelegatePepperImpl::InstallMissingPlugin() { 275 void WebPluginDelegatePepper::SetFocus() {
226 NOTIMPLEMENTED();
227 }
228
229 void WebPluginDelegatePepperImpl::WindowlessUpdateGeometry(
230 const gfx::Rect& window_rect,
231 const gfx::Rect& clip_rect) {
232 // Only resend to the instance if the geometry has changed.
233 if (window_rect == window_rect_ && clip_rect == clip_rect_)
234 return;
235
236 // We will inform the instance of this change when we call NPP_SetWindow.
237 clip_rect_ = clip_rect;
238 cutout_rects_.clear();
239
240 if (window_rect_ != window_rect) {
241 window_rect_ = window_rect;
242 WindowlessSetWindow(true);
243 // TODO(sehr): update the context here?
244 }
245 }
246
247 void WebPluginDelegatePepperImpl::WindowlessPaint(
248 gfx::NativeDrawingContext context,
249 const gfx::Rect& damage_rect) {
250 static StatsRate plugin_paint("Plugin.Paint");
251 StatsScope<StatsRate> scope(plugin_paint);
252 // TODO(sehr): save the context here?
253 }
254
255 void WebPluginDelegatePepperImpl::WindowlessSetWindow(bool force_set_window) {
256 if (!instance())
257 return;
258
259 if (window_rect_.IsEmpty()) // wait for geometry to be set.
260 return;
261
262 window_.clipRect.top = clip_rect_.y();
263 window_.clipRect.left = clip_rect_.x();
264 window_.clipRect.bottom = clip_rect_.y() + clip_rect_.height();
265 window_.clipRect.right = clip_rect_.x() + clip_rect_.width();
266 window_.height = window_rect_.height();
267 window_.width = window_rect_.width();
268 window_.x = window_rect_.x();
269 window_.y = window_rect_.y();
270 window_.type = NPWindowTypeDrawable;
271
272 NPError err = instance()->NPP_SetWindow(&window_);
273 DCHECK(err == NPERR_NO_ERROR);
274 }
275
276 void WebPluginDelegatePepperImpl::SetFocus() {
277 NPEvent npevent; 276 NPEvent npevent;
278 277
279 npevent.type = NPEventType_Focus; 278 npevent.type = NPEventType_Focus;
280 npevent.size = sizeof(NPEvent); 279 npevent.size = sizeof(NPEvent);
281 // TODO(sehr): what timestamp should this have? 280 // TODO(sehr): what timestamp should this have?
282 npevent.timeStampSeconds = 0.0; 281 npevent.timeStampSeconds = 0.0;
283 // Currently this API only supports gaining focus. 282 // Currently this API only supports gaining focus.
284 npevent.u.focus.value = 1; 283 npevent.u.focus.value = 1;
285 instance()->NPP_HandleEvent(&npevent); 284 instance()->NPP_HandleEvent(&npevent);
286 } 285 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 reinterpret_cast<const WebMouseWheelEvent*>(event); 350 reinterpret_cast<const WebMouseWheelEvent*>(event);
352 npevent->u.wheel.modifier = mouse_wheel_event->modifiers; 351 npevent->u.wheel.modifier = mouse_wheel_event->modifiers;
353 npevent->u.wheel.deltaX = mouse_wheel_event->deltaX; 352 npevent->u.wheel.deltaX = mouse_wheel_event->deltaX;
354 npevent->u.wheel.deltaY = mouse_wheel_event->deltaY; 353 npevent->u.wheel.deltaY = mouse_wheel_event->deltaY;
355 npevent->u.wheel.wheelTicksX = mouse_wheel_event->wheelTicksX; 354 npevent->u.wheel.wheelTicksX = mouse_wheel_event->wheelTicksX;
356 npevent->u.wheel.wheelTicksY = mouse_wheel_event->wheelTicksY; 355 npevent->u.wheel.wheelTicksY = mouse_wheel_event->wheelTicksY;
357 npevent->u.wheel.scrollByPage = mouse_wheel_event->scrollByPage; 356 npevent->u.wheel.scrollByPage = mouse_wheel_event->scrollByPage;
358 } 357 }
359 } // namespace 358 } // namespace
360 359
361 bool WebPluginDelegatePepperImpl::HandleInputEvent(const WebInputEvent& event, 360 bool WebPluginDelegatePepper::HandleInputEvent(const WebInputEvent& event,
362 WebCursorInfo* cursor_info) { 361 WebCursorInfo* cursor_info) {
363 NPEvent npevent; 362 NPEvent npevent;
364 363
365 npevent.type = ConvertEventTypes(event.type); 364 npevent.type = ConvertEventTypes(event.type);
366 npevent.size = sizeof(NPEvent); 365 npevent.size = sizeof(NPEvent);
367 npevent.timeStampSeconds = event.timeStampSeconds; 366 npevent.timeStampSeconds = event.timeStampSeconds;
368 switch (npevent.type) { 367 switch (npevent.type) {
369 case NPEventType_Undefined: 368 case NPEventType_Undefined:
370 return false; 369 return false;
371 case NPEventType_MouseDown: 370 case NPEventType_MouseDown:
372 case NPEventType_MouseUp: 371 case NPEventType_MouseUp:
(...skipping 13 matching lines...) Expand all
386 BuildCharEvent(&event, &npevent); 385 BuildCharEvent(&event, &npevent);
387 break; 386 break;
388 case NPEventType_Minimize: 387 case NPEventType_Minimize:
389 case NPEventType_Focus: 388 case NPEventType_Focus:
390 case NPEventType_Device: 389 case NPEventType_Device:
391 NOTIMPLEMENTED(); 390 NOTIMPLEMENTED();
392 break; 391 break;
393 } 392 }
394 return instance()->NPP_HandleEvent(&npevent) != 0; 393 return instance()->NPP_HandleEvent(&npevent) != 0;
395 } 394 }
395
396 NPError WebPluginDelegatePepper::InitializeRenderContext(
397 NPRenderType type, NPRenderContext* context) {
398 switch (type) {
399 case NPRenderGraphicsRGBA: {
400 int width = window_rect_.width();
401 int height = window_rect_.height();
402 background_canvas_ = new skia::PlatformCanvas(width, height, false);
403 plugin_canvas_ = plugin_buffer_->GetPlatformCanvas(width, height);
404 if (background_canvas_ == NULL || plugin_canvas_ == NULL) {
405 return NPERR_GENERIC_ERROR;
406 }
407 context->u.graphicsRgba.region = plugin_buffer_->memory();
408 context->u.graphicsRgba.stride = width * kBytesPerPixel;
409 return NPERR_NO_ERROR;
410 }
411 default:
412 return NPERR_GENERIC_ERROR;
413 }
414 }
415
416 NPError WebPluginDelegatePepper::FlushRenderContext(
417 NPRenderContext* context) {
418 gfx::BlitCanvasToCanvas(background_canvas_,
419 window_rect_,
420 plugin_canvas_,
421 window_rect_.origin());
422 return NPERR_NO_ERROR;
423 }
OLDNEW
« no previous file with comments | « chrome/renderer/webplugin_delegate_pepper.h ('k') | third_party/npapi/bindings/npapi.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698