blob: e41fd93da1d1952f247e1e89b83e0cf72cd71180 [file] [log] [blame]
estade@chromium.org144314a2008-11-05 10:34:30 +09001// 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
3// found in the LICENSE file.
4
estade@chromium.org144314a2008-11-05 10:34:30 +09005#include "base/clipboard.h"
6
7#include "base/logging.h"
8
estade@chromium.org31086192009-03-26 04:46:55 +09009namespace {
10
11// A compromised renderer could send us bad data, so validate it.
12bool IsBitmapSafe(const Clipboard::ObjectMapParams& params) {
13 const gfx::Size* size =
14 reinterpret_cast<const gfx::Size*>(&(params[1].front()));
15 return params[0].size() ==
16 static_cast<size_t>(size->width() * size->height() * 4);
17}
18
19}
20
estade@chromium.org144314a2008-11-05 10:34:30 +090021void Clipboard::DispatchObject(ObjectType type, const ObjectMapParams& params) {
22 switch (type) {
23 case CBF_TEXT:
24 WriteText(&(params[0].front()), params[0].size());
25 break;
26
27 case CBF_HTML:
28 if (params.size() == 2)
29 WriteHTML(&(params[0].front()), params[0].size(),
30 &(params[1].front()), params[1].size());
31 else
32 WriteHTML(&(params[0].front()), params[0].size(), NULL, 0);
33 break;
34
estade@chromium.org144314a2008-11-05 10:34:30 +090035 case CBF_BOOKMARK:
36 WriteBookmark(&(params[0].front()), params[0].size(),
37 &(params[1].front()), params[1].size());
38 break;
39
40 case CBF_LINK:
41 WriteHyperlink(&(params[0].front()), params[0].size(),
42 &(params[1].front()), params[1].size());
43 break;
44
45 case CBF_FILES:
46 WriteFiles(&(params[0].front()), params[0].size());
47 break;
estade@chromium.org144314a2008-11-05 10:34:30 +090048
estade@chromium.org144314a2008-11-05 10:34:30 +090049 case CBF_WEBKIT:
50 WriteWebSmartPaste();
51 break;
52
estade@chromium.orgfba052b2009-03-26 04:45:59 +090053#if defined(OS_WIN) || defined(OS_LINUX)
estade@chromium.org144314a2008-11-05 10:34:30 +090054 case CBF_BITMAP:
estade@chromium.org31086192009-03-26 04:46:55 +090055 if (!IsBitmapSafe(params))
56 return;
estade@chromium.org144314a2008-11-05 10:34:30 +090057 WriteBitmap(&(params[0].front()), &(params[1].front()));
58 break;
dsh@google.com7f1a82d2008-12-17 07:36:55 +090059#endif // defined(OS_WIN) || defined(OS_LINUX)
estade@chromium.org144314a2008-11-05 10:34:30 +090060
61 default:
62 NOTREACHED();
63 }
64}