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

Side by Side Diff: webkit/plugins/ppapi/ppb_flash_impl.cc

Issue 11225021: Move flash clipboard to the new proxy and add custom format support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 1 month 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 | « webkit/plugins/ppapi/ppb_flash_impl.h ('k') | webkit/tools/test_shell/simple_clipboard_impl.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) 2012 The Chromium Authors. All rights reserved. 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 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 #include "webkit/plugins/ppapi/ppb_flash_impl.h" 5 #include "webkit/plugins/ppapi/ppb_flash_impl.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 14 matching lines...) Expand all
25 #include "third_party/skia/include/core/SkCanvas.h" 25 #include "third_party/skia/include/core/SkCanvas.h"
26 #include "third_party/skia/include/core/SkMatrix.h" 26 #include "third_party/skia/include/core/SkMatrix.h"
27 #include "third_party/skia/include/core/SkPaint.h" 27 #include "third_party/skia/include/core/SkPaint.h"
28 #include "third_party/skia/include/core/SkPoint.h" 28 #include "third_party/skia/include/core/SkPoint.h"
29 #include "third_party/skia/include/core/SkTemplates.h" 29 #include "third_party/skia/include/core/SkTemplates.h"
30 #include "third_party/skia/include/core/SkTypeface.h" 30 #include "third_party/skia/include/core/SkTypeface.h"
31 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" 31 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
32 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" 32 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h"
33 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" 33 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h"
34 #include "ui/gfx/rect.h" 34 #include "ui/gfx/rect.h"
35 #include "webkit/glue/clipboard_client.h"
36 #include "webkit/glue/scoped_clipboard_writer_glue.h"
37 #include "webkit/plugins/ppapi/common.h" 35 #include "webkit/plugins/ppapi/common.h"
38 #include "webkit/plugins/ppapi/host_globals.h" 36 #include "webkit/plugins/ppapi/host_globals.h"
39 #include "webkit/plugins/ppapi/plugin_delegate.h" 37 #include "webkit/plugins/ppapi/plugin_delegate.h"
40 #include "webkit/plugins/ppapi/plugin_module.h" 38 #include "webkit/plugins/ppapi/plugin_module.h"
41 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" 39 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
42 #include "webkit/plugins/ppapi/ppb_file_ref_impl.h" 40 #include "webkit/plugins/ppapi/ppb_file_ref_impl.h"
43 #include "webkit/plugins/ppapi/resource_helper.h" 41 #include "webkit/plugins/ppapi/resource_helper.h"
44 #include "webkit/plugins/ppapi/ppb_image_data_impl.h" 42 #include "webkit/plugins/ppapi/ppb_image_data_impl.h"
45 43
46 using ppapi::PPTimeToTime; 44 using ppapi::PPTimeToTime;
47 using ppapi::StringVar; 45 using ppapi::StringVar;
48 using ppapi::TimeToPPTime; 46 using ppapi::TimeToPPTime;
49 using ppapi::thunk::EnterResource; 47 using ppapi::thunk::EnterResource;
50 using ppapi::thunk::EnterResourceNoLock; 48 using ppapi::thunk::EnterResourceNoLock;
51 using ppapi::thunk::PPB_FileRef_API; 49 using ppapi::thunk::PPB_FileRef_API;
52 using ppapi::thunk::PPB_ImageData_API; 50 using ppapi::thunk::PPB_ImageData_API;
53 using ppapi::thunk::PPB_URLRequestInfo_API; 51 using ppapi::thunk::PPB_URLRequestInfo_API;
54 52
55 namespace webkit { 53 namespace webkit {
56 namespace ppapi { 54 namespace ppapi {
57 55
58 namespace {
59
60 const size_t kMaxClipboardWriteSize = 1000000;
61
62 ui::Clipboard::Buffer ConvertClipboardType(
63 PP_Flash_Clipboard_Type type) {
64 switch (type) {
65 case PP_FLASH_CLIPBOARD_TYPE_STANDARD:
66 return ui::Clipboard::BUFFER_STANDARD;
67 case PP_FLASH_CLIPBOARD_TYPE_SELECTION:
68 return ui::Clipboard::BUFFER_SELECTION;
69 }
70 NOTREACHED();
71 return ui::Clipboard::BUFFER_STANDARD;
72 }
73
74 } // namespace
75
76 PPB_Flash_Impl::PPB_Flash_Impl(PluginInstance* instance) 56 PPB_Flash_Impl::PPB_Flash_Impl(PluginInstance* instance)
77 : instance_(instance) { 57 : instance_(instance) {
78 } 58 }
79 59
80 PPB_Flash_Impl::~PPB_Flash_Impl() { 60 PPB_Flash_Impl::~PPB_Flash_Impl() {
81 } 61 }
82 62
83 void PPB_Flash_Impl::SetInstanceAlwaysOnTop(PP_Instance instance, 63 void PPB_Flash_Impl::SetInstanceAlwaysOnTop(PP_Instance instance,
84 PP_Bool on_top) { 64 PP_Bool on_top) {
85 instance_->set_always_on_top(PP_ToBool(on_top)); 65 instance_->set_always_on_top(PP_ToBool(on_top));
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 } 251 }
272 } 252 }
273 253
274 PP_Bool PPB_Flash_Impl::SetCrashData(PP_Instance instance, 254 PP_Bool PPB_Flash_Impl::SetCrashData(PP_Instance instance,
275 PP_FlashCrashKey key, 255 PP_FlashCrashKey key,
276 PP_Var value) { 256 PP_Var value) {
277 // Not implemented in process. 257 // Not implemented in process.
278 return PP_FALSE; 258 return PP_FALSE;
279 } 259 }
280 260
281
282 PP_Bool PPB_Flash_Impl::IsClipboardFormatAvailable(
283 PP_Instance instance,
284 PP_Flash_Clipboard_Type clipboard_type,
285 PP_Flash_Clipboard_Format format) {
286 if (!InitClipboard())
287 return PP_FALSE;
288
289 if (clipboard_type != PP_FLASH_CLIPBOARD_TYPE_STANDARD) {
290 NOTIMPLEMENTED();
291 return PP_FALSE;
292 }
293
294 ui::Clipboard::Buffer buffer_type = ConvertClipboardType(clipboard_type);
295 switch (format) {
296 case PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT: {
297 bool plain = clipboard_client_->IsFormatAvailable(
298 ui::Clipboard::GetPlainTextFormatType(), buffer_type);
299 bool plainw = clipboard_client_->IsFormatAvailable(
300 ui::Clipboard::GetPlainTextWFormatType(), buffer_type);
301 return BoolToPPBool(plain || plainw);
302 }
303 case PP_FLASH_CLIPBOARD_FORMAT_HTML:
304 return BoolToPPBool(clipboard_client_->IsFormatAvailable(
305 ui::Clipboard::GetHtmlFormatType(), buffer_type));
306 case PP_FLASH_CLIPBOARD_FORMAT_RTF:
307 return BoolToPPBool(clipboard_client_->IsFormatAvailable(
308 ui::Clipboard::GetRtfFormatType(), buffer_type));
309 case PP_FLASH_CLIPBOARD_FORMAT_INVALID:
310 break;
311 }
312
313 return PP_FALSE;
314 }
315
316 PP_Var PPB_Flash_Impl::ReadClipboardData(
317 PP_Instance instance,
318 PP_Flash_Clipboard_Type clipboard_type,
319 PP_Flash_Clipboard_Format format) {
320 if (!InitClipboard())
321 return PP_MakeUndefined();
322
323 if (clipboard_type != PP_FLASH_CLIPBOARD_TYPE_STANDARD) {
324 NOTIMPLEMENTED();
325 return PP_MakeUndefined();
326 }
327
328 if (!IsClipboardFormatAvailable(instance, clipboard_type, format))
329 return PP_MakeNull();
330
331 ui::Clipboard::Buffer buffer_type = ConvertClipboardType(clipboard_type);
332
333 switch (format) {
334 case PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT: {
335 if (clipboard_client_->IsFormatAvailable(
336 ui::Clipboard::GetPlainTextWFormatType(), buffer_type)) {
337 string16 text;
338 clipboard_client_->ReadText(buffer_type, &text);
339 if (!text.empty())
340 return StringVar::StringToPPVar(UTF16ToUTF8(text));
341 }
342
343 if (clipboard_client_->IsFormatAvailable(
344 ui::Clipboard::GetPlainTextFormatType(), buffer_type)) {
345 std::string text;
346 clipboard_client_->ReadAsciiText(buffer_type, &text);
347 if (!text.empty())
348 return StringVar::StringToPPVar(text);
349 }
350
351 return PP_MakeNull();
352 }
353 case PP_FLASH_CLIPBOARD_FORMAT_HTML: {
354 string16 html;
355 GURL gurl;
356 uint32 fragment_start;
357 uint32 fragment_end;
358 clipboard_client_->ReadHTML(buffer_type,
359 &html,
360 &gurl,
361 &fragment_start,
362 &fragment_end);
363 return StringVar::StringToPPVar(UTF16ToUTF8(
364 html.substr(fragment_start, fragment_end - fragment_start)));
365 }
366 case PP_FLASH_CLIPBOARD_FORMAT_RTF: {
367 std::string result;
368 clipboard_client_->ReadRTF(buffer_type, &result);
369 return ::ppapi::PpapiGlobals::Get()->GetVarTracker()->
370 MakeArrayBufferPPVar(result.size(), result.data());
371 }
372 case PP_FLASH_CLIPBOARD_FORMAT_INVALID:
373 break;
374 }
375
376 return PP_MakeUndefined();
377 }
378
379 int32_t PPB_Flash_Impl::WriteClipboardData(
380 PP_Instance instance,
381 PP_Flash_Clipboard_Type clipboard_type,
382 uint32_t data_item_count,
383 const PP_Flash_Clipboard_Format formats[],
384 const PP_Var data_items[]) {
385 if (!InitClipboard())
386 return PP_ERROR_FAILED;
387
388 if (clipboard_type != PP_FLASH_CLIPBOARD_TYPE_STANDARD) {
389 NOTIMPLEMENTED();
390 return PP_ERROR_FAILED;
391 }
392
393 if (data_item_count == 0) {
394 clipboard_client_->Clear(ConvertClipboardType(clipboard_type));
395 return PP_OK;
396 }
397 ScopedClipboardWriterGlue scw(clipboard_client_.get());
398 for (uint32_t i = 0; i < data_item_count; ++i) {
399 int32_t res = WriteClipboardDataItem(formats[i], data_items[i], &scw);
400 if (res != PP_OK) {
401 // Need to clear the objects so nothing is written.
402 scw.Reset();
403 return res;
404 }
405 }
406
407 return PP_OK;
408 }
409
410 bool PPB_Flash_Impl::CreateThreadAdapterForInstance(PP_Instance instance) { 261 bool PPB_Flash_Impl::CreateThreadAdapterForInstance(PP_Instance instance) {
411 return false; // No multithreaded access allowed. 262 return false; // No multithreaded access allowed.
412 } 263 }
413 264
414 void PPB_Flash_Impl::ClearThreadAdapterForInstance(PP_Instance instance) { 265 void PPB_Flash_Impl::ClearThreadAdapterForInstance(PP_Instance instance) {
415 } 266 }
416 267
417 int32_t PPB_Flash_Impl::OpenFile(PP_Instance pp_instance, 268 int32_t PPB_Flash_Impl::OpenFile(PP_Instance pp_instance,
418 const char* path, 269 const char* path,
419 int32_t mode, 270 int32_t mode,
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 PP_Bool fullscreen) { 486 PP_Bool fullscreen) {
636 instance_->FlashSetFullscreen(PP_ToBool(fullscreen), true); 487 instance_->FlashSetFullscreen(PP_ToBool(fullscreen), true);
637 return PP_TRUE; 488 return PP_TRUE;
638 } 489 }
639 490
640 PP_Bool PPB_Flash_Impl::FlashGetScreenSize(PP_Instance instance, 491 PP_Bool PPB_Flash_Impl::FlashGetScreenSize(PP_Instance instance,
641 PP_Size* size) { 492 PP_Size* size) {
642 return instance_->GetScreenSize(instance, size); 493 return instance_->GetScreenSize(instance, size);
643 } 494 }
644 495
645 bool PPB_Flash_Impl::InitClipboard() {
646 // Initialize the ClipboardClient for writing to the clipboard.
647 if (!clipboard_client_.get()) {
648 if (!instance_)
649 return false;
650 PluginDelegate* plugin_delegate = instance_->delegate();
651 if (!plugin_delegate)
652 return false;
653 clipboard_client_.reset(plugin_delegate->CreateClipboardClient());
654 }
655 return true;
656 }
657
658 int32_t PPB_Flash_Impl::WriteClipboardDataItem(
659 const PP_Flash_Clipboard_Format format,
660 const PP_Var& data,
661 ScopedClipboardWriterGlue* scw) {
662 switch (format) {
663 case PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT: {
664 StringVar* text_string = StringVar::FromPPVar(data);
665 if (!text_string)
666 return PP_ERROR_BADARGUMENT;
667
668 if (text_string->value().length() > kMaxClipboardWriteSize)
669 return PP_ERROR_NOSPACE;
670
671 scw->WriteText(UTF8ToUTF16(text_string->value()));
672 return PP_OK;
673 }
674 case PP_FLASH_CLIPBOARD_FORMAT_HTML: {
675 StringVar* text_string = StringVar::FromPPVar(data);
676 if (!text_string)
677 return PP_ERROR_BADARGUMENT;
678
679 if (text_string->value().length() > kMaxClipboardWriteSize)
680 return PP_ERROR_NOSPACE;
681
682 scw->WriteHTML(UTF8ToUTF16(text_string->value()), "");
683 return PP_OK;
684 }
685 case PP_FLASH_CLIPBOARD_FORMAT_RTF: {
686 ::ppapi::ArrayBufferVar* rtf_data =
687 ::ppapi::ArrayBufferVar::FromPPVar(data);
688 if (!rtf_data)
689 return PP_ERROR_BADARGUMENT;
690
691 if (rtf_data->ByteLength() > kMaxClipboardWriteSize)
692 return PP_ERROR_NOSPACE;
693
694 scw->WriteRTF(std::string(static_cast<char*>(rtf_data->Map()),
695 rtf_data->ByteLength()));
696 return PP_OK;
697 }
698 case PP_FLASH_CLIPBOARD_FORMAT_INVALID:
699 break;
700 }
701
702 return PP_ERROR_BADARGUMENT;
703 }
704
705 } // namespace ppapi 496 } // namespace ppapi
706 } // namespace webkit 497 } // namespace webkit
OLDNEW
« no previous file with comments | « webkit/plugins/ppapi/ppb_flash_impl.h ('k') | webkit/tools/test_shell/simple_clipboard_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698