1 | /* |
2 | * Copyright (C) 2009, Martin Robinson |
3 | * |
4 | * This library is free software; you can redistribute it and/or |
5 | * modify it under the terms of the GNU Lesser General Public |
6 | * License as published by the Free Software Foundation; either |
7 | * version 2 of the License, or (at your option) any later version. |
8 | * |
9 | * This library is distributed in the hope that it will be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | * Lesser General Public License for more details. |
13 | * |
14 | * You should have received a copy of the GNU Lesser General Public |
15 | * License along with this library; if not, write to the Free Software |
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
17 | */ |
18 | |
19 | #include "config.h" |
20 | #include "SelectionData.h" |
21 | |
22 | #include <wtf/glib/GUniquePtr.h> |
23 | #include <wtf/text/CString.h> |
24 | #include <wtf/text/StringBuilder.h> |
25 | |
26 | namespace WebCore { |
27 | |
28 | static void replaceNonBreakingSpaceWithSpace(String& str) |
29 | { |
30 | static const UChar NonBreakingSpaceCharacter = 0xA0; |
31 | static const UChar SpaceCharacter = ' '; |
32 | str.replace(NonBreakingSpaceCharacter, SpaceCharacter); |
33 | } |
34 | |
35 | void SelectionData::setText(const String& newText) |
36 | { |
37 | m_text = newText; |
38 | replaceNonBreakingSpaceWithSpace(m_text); |
39 | } |
40 | |
41 | void SelectionData::setURIList(const String& uriListString) |
42 | { |
43 | m_uriList = uriListString; |
44 | |
45 | // This code is originally from: platform/chromium/ChromiumDataObject.cpp. |
46 | // FIXME: We should make this code cross-platform eventually. |
47 | |
48 | // Line separator is \r\n per RFC 2483 - however, for compatibility |
49 | // reasons we also allow just \n here. |
50 | |
51 | // Process the input and copy the first valid URL into the url member. |
52 | // In case no URLs can be found, subsequent calls to getData("URL") |
53 | // will get an empty string. This is in line with the HTML5 spec (see |
54 | // "The DragEvent and DataTransfer interfaces"). Also extract all filenames |
55 | // from the URI list. |
56 | bool setURL = false; |
57 | for (auto& line : uriListString.split('\n')) { |
58 | line = line.stripWhiteSpace(); |
59 | if (line.isEmpty()) |
60 | continue; |
61 | if (line[0] == '#') |
62 | continue; |
63 | |
64 | URL url = URL(URL(), line); |
65 | if (url.isValid()) { |
66 | if (!setURL) { |
67 | m_url = url; |
68 | setURL = true; |
69 | } |
70 | |
71 | GUniqueOutPtr<GError> error; |
72 | GUniquePtr<gchar> filename(g_filename_from_uri(line.utf8().data(), 0, &error.outPtr())); |
73 | if (!error && filename) |
74 | m_filenames.append(String::fromUTF8(filename.get())); |
75 | } |
76 | } |
77 | } |
78 | |
79 | void SelectionData::setURL(const URL& url, const String& label) |
80 | { |
81 | m_url = url; |
82 | m_uriList = url; |
83 | setText(url.string()); |
84 | |
85 | String actualLabel(label); |
86 | if (actualLabel.isEmpty()) |
87 | actualLabel = url; |
88 | |
89 | StringBuilder markup; |
90 | markup.append("<a href=\"" ); |
91 | markup.append(url.string()); |
92 | markup.append("\">" ); |
93 | GUniquePtr<gchar> escaped(g_markup_escape_text(actualLabel.utf8().data(), -1)); |
94 | markup.append(String::fromUTF8(escaped.get())); |
95 | markup.append("</a>" ); |
96 | setMarkup(markup.toString()); |
97 | } |
98 | |
99 | const String& SelectionData::urlLabel() const |
100 | { |
101 | if (hasText()) |
102 | return text(); |
103 | |
104 | if (hasURL()) |
105 | return url(); |
106 | |
107 | return emptyString(); |
108 | } |
109 | |
110 | void SelectionData::clearAllExceptFilenames() |
111 | { |
112 | clearText(); |
113 | clearMarkup(); |
114 | clearURIList(); |
115 | clearURL(); |
116 | clearImage(); |
117 | |
118 | m_unknownTypeData.clear(); |
119 | m_canSmartReplace = false; |
120 | } |
121 | |
122 | void SelectionData::clearAll() |
123 | { |
124 | clearAllExceptFilenames(); |
125 | m_filenames.clear(); |
126 | } |
127 | |
128 | } // namespace WebCore |
129 | |