OLD | NEW |
| (Empty) |
1 // Copyright (c) 2010 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/test/plugin/plugin_test.h" | |
6 | |
7 #include "base/strings/string_number_conversions.h" | |
8 #include "base/strings/string_util.h" | |
9 #include "content/test/plugin/npapi_constants.h" | |
10 | |
11 namespace NPAPIClient { | |
12 | |
13 PluginTest::PluginTest(NPP id, NPNetscapeFuncs *host_functions) { | |
14 id_ = id; | |
15 id_->pdata = this; | |
16 host_functions_ = host_functions; | |
17 test_completed_ = false; | |
18 } | |
19 | |
20 PluginTest::~PluginTest() {} | |
21 | |
22 bool PluginTest::IsWindowless() const { return false; } | |
23 | |
24 NPError PluginTest::New(uint16 mode, int16 argc, const char* argn[], | |
25 const char* argv[], NPSavedData* saved) { | |
26 test_name_ = this->GetArgValue("name", argc, argn, argv); | |
27 const char* id = this->GetArgValue("id", argc, argn, argv); | |
28 if (id) // NULL for NP_FULL | |
29 test_id_ = id; | |
30 return NPERR_NO_ERROR; | |
31 } | |
32 | |
33 NPError PluginTest::Destroy() { | |
34 return NPERR_NO_ERROR; | |
35 } | |
36 | |
37 NPError PluginTest::SetWindow(NPWindow* pNPWindow) { | |
38 return NPERR_NO_ERROR; | |
39 } | |
40 | |
41 // It's a shame I have to implement URLEncode. But, using webkit's | |
42 // or using chrome's means a ball of string of dlls and dependencies that | |
43 // is very very long. After spending far too much time on it, | |
44 // I'll just encode it myself. Too bad Microsoft doesn't implement | |
45 // this in a reusable way either. Both webkit and chrome will | |
46 // end up using libicu, which is a string of dependencies we don't | |
47 // want. | |
48 | |
49 inline unsigned char toHex(const unsigned char x) { | |
50 return x > 9 ? (x + 'A' - 10) : (x + '0'); | |
51 } | |
52 | |
53 std::string URLEncode(const std::string &sIn) { | |
54 std::string sOut; | |
55 | |
56 const size_t length = sIn.length(); | |
57 for (size_t idx = 0; idx < length;) { | |
58 const char ch = sIn.at(idx); | |
59 if (isalnum(ch)) { | |
60 sOut.append(1, ch); | |
61 } else if (isspace(ch) && ((ch != '\n') && (ch != '\r'))) { | |
62 sOut.append(1, '+'); | |
63 } else { | |
64 sOut.append(1, '%'); | |
65 sOut.append(1, toHex(ch>>4)); | |
66 sOut.append(1, toHex(ch%16)); | |
67 } | |
68 idx++; | |
69 } | |
70 return sOut; | |
71 } | |
72 | |
73 void PluginTest::SignalTestCompleted() { | |
74 NPObject *window_obj = NULL; | |
75 host_functions_->getvalue(id_, NPNVWindowNPObject, &window_obj); | |
76 if (!window_obj) | |
77 return; | |
78 | |
79 test_completed_ = true; | |
80 // To signal test completion, we expect a couple of | |
81 // javascript functions to be defined in the webpage | |
82 // which hosts this plugin: | |
83 // onSuccess(test_name, test_id) | |
84 // onFailure(test_name, test_id, error_message) | |
85 std::string script("javascript:"); | |
86 if (Succeeded()) { | |
87 script.append("onSuccess(\""); | |
88 script.append(test_name_); | |
89 script.append("\",\""); | |
90 script.append(test_id_); | |
91 script.append("\");"); | |
92 } else { | |
93 script.append("onFailure(\""); | |
94 script.append(test_name_); | |
95 script.append("\",\""); | |
96 script.append(test_id_); | |
97 script.append("\",\""); | |
98 script.append(test_status_); | |
99 script.append("\");"); | |
100 } | |
101 | |
102 NPString script_string; | |
103 script_string.UTF8Characters = script.c_str(); | |
104 script_string.UTF8Length = static_cast<unsigned int>(script.length()); | |
105 | |
106 NPVariant result_var; | |
107 host_functions_->evaluate(id_, window_obj, &script_string, &result_var); | |
108 } | |
109 | |
110 const char *PluginTest::GetArgValue(const char *name, const int16 argc, | |
111 const char *argn[], const char *argv[]) { | |
112 for (int idx = 0; idx < argc; idx++) | |
113 if (base::strcasecmp(argn[idx], name) == 0) | |
114 return argv[idx]; | |
115 return NULL; | |
116 } | |
117 | |
118 void PluginTest::SetError(const std::string &msg) { | |
119 test_status_.append(msg); | |
120 } | |
121 | |
122 void PluginTest::ExpectStringLowerCaseEqual(const std::string &val1, | |
123 const std::string &val2) { | |
124 if (!base::LowerCaseEqualsASCII(val1, val2.c_str())) { | |
125 std::string err; | |
126 err = "Expected Equal for '"; | |
127 err.append(val1); | |
128 err.append("' and '"); | |
129 err.append(val2); | |
130 err.append("'"); | |
131 SetError(err); | |
132 } | |
133 } | |
134 | |
135 void PluginTest::ExpectAsciiStringNotEqual(const char *val1, const char *val2) { | |
136 if (val1 == val2) { | |
137 std::string err; | |
138 err = "Expected Not Equal for '"; | |
139 err.append(val1); | |
140 err.append("' and '"); | |
141 err.append(val2); | |
142 err.append("'"); | |
143 SetError(err); | |
144 } | |
145 } | |
146 | |
147 void PluginTest::ExpectIntegerEqual(int val1, int val2) { | |
148 if (val1 != val2) { | |
149 std::string err; | |
150 err = "Expected Equal for '"; | |
151 err.append(base::IntToString(val1)); | |
152 err.append("' and '"); | |
153 err.append(base::IntToString(val2)); | |
154 err.append("'"); | |
155 SetError(err); | |
156 } | |
157 } | |
158 | |
159 NPError PluginTest::NewStream(NPMIMEType type, NPStream* stream, | |
160 NPBool seekable, uint16* stype) { | |
161 // There is no default action here. | |
162 return NPERR_NO_ERROR; | |
163 } | |
164 | |
165 int32 PluginTest::WriteReady(NPStream *stream) { | |
166 // Take data in small chunks | |
167 return 4096; | |
168 } | |
169 | |
170 int32 PluginTest::Write(NPStream *stream, int32 offset, int32 len, | |
171 void *buffer) { | |
172 // Pretend that we took all the data. | |
173 return len; | |
174 } | |
175 | |
176 NPError PluginTest::DestroyStream(NPStream *stream, NPError reason) { | |
177 // There is no default action. | |
178 return NPERR_NO_ERROR; | |
179 } | |
180 | |
181 void PluginTest::StreamAsFile(NPStream* stream, const char* fname) { | |
182 // There is no default action. | |
183 } | |
184 | |
185 void PluginTest::URLNotify(const char* url, NPReason reason, void* data) { | |
186 // There is no default action | |
187 } | |
188 | |
189 int16 PluginTest::HandleEvent(void* event) { | |
190 // There is no default action | |
191 return 0; | |
192 } | |
193 | |
194 void PluginTest::URLRedirectNotify(const char* url, int32_t status, | |
195 void* notify_data) { | |
196 // There is no default action | |
197 } | |
198 | |
199 } // namespace NPAPIClient | |
OLD | NEW |