Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 // A simple C++ Pepper plugin for exercising deprecated PPAPI interfaces in | 5 // A simple C++ Pepper plugin for exercising deprecated PPAPI interfaces in |
| 6 // Blink layout tests. | 6 // Blink layout tests. |
| 7 // | 7 // |
| 8 // Most layout tests should prefer to use the normal Blink test plugin, with the | 8 // Most layout tests should prefer to use the normal Blink test plugin, with the |
| 9 // MIME type application/x-blink-test-plugin. For layout tests that absolutely | 9 // MIME type application/x-blink-test-plugin. For layout tests that absolutely |
| 10 // need to test deprecated synchronous scripting interfaces, this plugin can be | 10 // need to test deprecated synchronous scripting interfaces, this plugin can be |
| 11 // instantiated using the application/x-blink-deprecated-test-plugin MIME type. | 11 // instantiated using the application/x-blink-deprecated-test-plugin MIME type. |
| 12 | 12 |
| 13 #include <stdint.h> | 13 #include <stdint.h> |
| 14 | 14 |
| 15 #include <map> | 15 #include <map> |
| 16 #include <sstream> | 16 #include <sstream> |
| 17 #include <unordered_map> | |
| 17 #include <utility> | 18 #include <utility> |
| 18 | 19 |
| 19 #include "base/bind.h" | 20 #include "base/bind.h" |
| 20 #include "base/bind_helpers.h" | 21 #include "base/bind_helpers.h" |
| 21 #include "base/callback.h" | 22 #include "base/callback.h" |
| 22 #include "base/strings/stringprintf.h" | 23 #include "base/strings/stringprintf.h" |
| 23 #include "ppapi/cpp/dev/scriptable_object_deprecated.h" | 24 #include "ppapi/cpp/dev/scriptable_object_deprecated.h" |
| 25 #include "ppapi/cpp/input_event.h" | |
| 24 #include "ppapi/cpp/module.h" | 26 #include "ppapi/cpp/module.h" |
| 25 #include "ppapi/cpp/private/instance_private.h" | 27 #include "ppapi/cpp/private/instance_private.h" |
| 26 #include "ppapi/cpp/private/var_private.h" | 28 #include "ppapi/cpp/private/var_private.h" |
| 27 #include "ppapi/cpp/var.h" | 29 #include "ppapi/cpp/var.h" |
| 28 | 30 |
| 29 namespace { | 31 namespace { |
| 30 | 32 |
| 31 class ScriptableBase : public pp::deprecated::ScriptableObject { | 33 class ScriptableBase : public pp::deprecated::ScriptableObject { |
| 32 public: | 34 public: |
| 33 explicit ScriptableBase(pp::InstancePrivate* instance) | 35 explicit ScriptableBase(pp::InstancePrivate* instance) |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 119 } | 121 } |
| 120 | 122 |
| 121 pp::VarPrivate test_object_; | 123 pp::VarPrivate test_object_; |
| 122 }; | 124 }; |
| 123 | 125 |
| 124 class InstanceSO : public ScriptableBase { | 126 class InstanceSO : public ScriptableBase { |
| 125 public: | 127 public: |
| 126 explicit InstanceSO(pp::InstancePrivate* instance) | 128 explicit InstanceSO(pp::InstancePrivate* instance) |
| 127 : ScriptableBase(instance) { | 129 : ScriptableBase(instance) { |
| 128 methods_.insert(std::make_pair( | 130 methods_.insert(std::make_pair( |
| 131 "normalize", | |
|
dcheng
2016/03/22 18:03:05
Can we add add documentation about the various att
piman
2016/03/23 05:30:24
Done.
| |
| 132 base::Bind(&InstanceSO::Normalize, base::Unretained(this)))); | |
| 133 methods_.insert(std::make_pair( | |
| 134 "remember", | |
| 135 base::Bind(&InstanceSO::Remember, base::Unretained(this)))); | |
| 136 methods_.insert(std::make_pair( | |
| 137 "testCloneObject", | |
| 138 base::Bind(&InstanceSO::TestCloneObject, base::Unretained(this)))); | |
| 139 methods_.insert(std::make_pair( | |
| 129 "testExecuteScript", | 140 "testExecuteScript", |
| 130 base::Bind(&InstanceSO::TestExecuteScript, base::Unretained(this)))); | 141 base::Bind(&InstanceSO::TestExecuteScript, base::Unretained(this)))); |
| 131 methods_.insert(std::make_pair( | 142 methods_.insert(std::make_pair( |
| 132 "testGetProperty", | 143 "testGetProperty", |
| 133 base::Bind(&InstanceSO::TestGetProperty, base::Unretained(this)))); | 144 base::Bind(&InstanceSO::TestGetProperty, base::Unretained(this)))); |
| 134 methods_.insert(std::make_pair( | 145 methods_.insert(std::make_pair( |
| 135 "testPassTestObject", | 146 "testPassTestObject", |
| 136 base::Bind(&InstanceSO::TestPassTestObject, base::Unretained(this)))); | 147 base::Bind(&InstanceSO::TestPassTestObject, base::Unretained(this)))); |
| 148 // Note: the semantics of testScriptObjectInvoke are identical to the | |
| 149 // semantics of testPassTestObject: call args[0] with args[1] as a | |
| 150 // parameter. | |
| 151 methods_.insert( | |
| 152 std::make_pair("testScriptObjectInvoke", | |
| 153 base::Bind(&InstanceSO::TestPassTestObject, | |
| 154 base::Unretained(this)))); | |
| 137 properties_.insert(std::make_pair( | 155 properties_.insert(std::make_pair( |
| 138 "testObject", base::Bind(&InstanceSO::TestObjectAccessor, | 156 "testObject", base::Bind(&InstanceSO::TestObjectAccessor, |
| 139 base::Unretained(this)))); | 157 base::Unretained(this)))); |
| 140 } | 158 } |
| 141 ~InstanceSO() override {} | 159 ~InstanceSO() override {} |
| 142 | 160 |
| 143 private: | 161 private: |
| 162 // Requires no argument. | |
| 163 pp::Var Normalize(const std::vector<pp::Var>& args, pp::Var* exception) { | |
| 164 pp::VarPrivate object = instance_->GetWindowObject(); | |
| 165 return object.Call(pp::Var("pluginCallback"), exception); | |
| 166 } | |
| 167 | |
| 168 // Requires 1 argument. The argument is retained into remembered_ | |
| 169 pp::Var Remember(const std::vector<pp::Var>& args, pp::Var* exception) { | |
| 170 if (args.size() != 1) { | |
| 171 *exception = pp::Var("remember requires one argument"); | |
| 172 return pp::Var(); | |
| 173 } | |
| 174 remembered_ = args[0]; | |
| 175 return pp::Var(); | |
| 176 } | |
| 177 | |
| 178 // Requires no argument. | |
| 179 pp::Var TestCloneObject(const std::vector<pp::Var>& args, | |
| 180 pp::Var* exception) { | |
| 181 return pp::VarPrivate(instance_, new InstanceSO(instance_)); | |
| 182 } | |
| 183 | |
| 144 // Requires one argument. The argument is passed through as-is to | 184 // Requires one argument. The argument is passed through as-is to |
| 145 // pp::InstancePrivate::ExecuteScript(). | 185 // pp::InstancePrivate::ExecuteScript(). |
| 146 pp::Var TestExecuteScript(const std::vector<pp::Var>& args, | 186 pp::Var TestExecuteScript(const std::vector<pp::Var>& args, |
| 147 pp::Var* exception) { | 187 pp::Var* exception) { |
| 148 if (args.size() != 1) { | 188 if (args.size() != 1) { |
| 149 *exception = pp::Var("testExecuteScript requires one argument"); | 189 *exception = pp::Var("testExecuteScript requires one argument"); |
| 150 return pp::Var(); | 190 return pp::Var(); |
| 151 } | 191 } |
| 152 return instance_->ExecuteScript(args[0], exception); | 192 return instance_->ExecuteScript(args[0], exception); |
| 153 } | 193 } |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 184 | 224 |
| 185 void TestObjectAccessor(bool set, pp::Var* var) { | 225 void TestObjectAccessor(bool set, pp::Var* var) { |
| 186 if (set) | 226 if (set) |
| 187 return; | 227 return; |
| 188 if (test_object_.is_undefined()) | 228 if (test_object_.is_undefined()) |
| 189 test_object_ = pp::VarPrivate(instance_, new TestObjectSO(instance_)); | 229 test_object_ = pp::VarPrivate(instance_, new TestObjectSO(instance_)); |
| 190 *var = test_object_; | 230 *var = test_object_; |
| 191 } | 231 } |
| 192 | 232 |
| 193 pp::VarPrivate test_object_; | 233 pp::VarPrivate test_object_; |
| 234 pp::Var remembered_; | |
| 194 }; | 235 }; |
| 195 | 236 |
| 196 class BlinkDeprecatedTestInstance : public pp::InstancePrivate { | 237 class BlinkDeprecatedTestInstance : public pp::InstancePrivate { |
| 197 public: | 238 public: |
| 198 explicit BlinkDeprecatedTestInstance(PP_Instance instance) | 239 explicit BlinkDeprecatedTestInstance(PP_Instance instance) |
| 199 : pp::InstancePrivate(instance) {} | 240 : pp::InstancePrivate(instance) {} |
| 200 ~BlinkDeprecatedTestInstance() override { | 241 ~BlinkDeprecatedTestInstance() override { |
| 201 LogMessage("%s", "Destroying"); | 242 LogMessage("%s", "Destroying"); |
| 202 } | 243 } |
| 203 | 244 |
| 204 bool Init(uint32_t argc, const char* argn[], const char* argv[]) { | 245 // pp::Instance overrides |
| 246 bool Init(uint32_t argc, const char* argn[], const char* argv[]) override { | |
| 247 for (uint32_t i = 0; i < argc; ++i) | |
| 248 attributes_[argn[i]] = argv[i]; | |
| 249 | |
| 250 if (HasAttribute("onnew")) | |
| 251 ExecuteScript(attributes_["onnew"]); | |
| 252 | |
| 253 if (HasAttribute("loginit")) | |
| 254 LogMessage("%s", "Initializing"); | |
| 255 | |
| 256 if (HasAttribute("testwindowopen")) | |
| 257 return TestWindowOpen(); | |
| 258 | |
| 259 uint32_t event_classes = 0; | |
| 260 if (HasAttribute("keydownscript")) | |
| 261 event_classes |= PP_INPUTEVENT_CLASS_KEYBOARD; | |
| 262 if (HasAttribute("mousedownscript")) | |
| 263 event_classes |= PP_INPUTEVENT_CLASS_MOUSE; | |
| 264 RequestFilteringInputEvents(event_classes); | |
| 265 | |
| 205 return true; | 266 return true; |
| 206 } | 267 } |
| 207 | 268 |
| 269 virtual bool HandleInputEvent(const pp::InputEvent& event) override { | |
| 270 switch (event.GetType()) { | |
| 271 case PP_INPUTEVENT_TYPE_MOUSEDOWN: | |
| 272 if (HasAttribute("mousedownscript")) | |
| 273 ExecuteScript(attributes_["mousedownscript"]); | |
| 274 return true; | |
| 275 case PP_INPUTEVENT_TYPE_KEYDOWN: | |
| 276 if (HasAttribute("keydownscript")) | |
| 277 ExecuteScript(attributes_["keydownscript"]); | |
| 278 return true; | |
| 279 default: | |
| 280 return false; | |
| 281 } | |
| 282 } | |
| 283 | |
| 208 // pp::InstancePrivate overrides: | 284 // pp::InstancePrivate overrides: |
| 209 pp::Var GetInstanceObject() override { | 285 pp::Var GetInstanceObject() override { |
| 210 if (instance_var_.is_undefined()) { | 286 if (instance_var_.is_undefined()) { |
| 211 instance_so_ = new InstanceSO(this); | 287 instance_so_ = new InstanceSO(this); |
| 212 instance_var_ = pp::VarPrivate(this, instance_so_); | 288 instance_var_ = pp::VarPrivate(this, instance_so_); |
| 213 } | 289 } |
| 214 return instance_var_; | 290 return instance_var_; |
| 215 } | 291 } |
| 216 | 292 |
| 293 void NotifyTestCompletion() { | |
| 294 ExecuteScript("window.testRunner.notifyDone()"); | |
| 295 } | |
| 296 | |
| 297 bool TestWindowOpen() { | |
| 298 pp::Var result = GetWindowObject().Call( | |
| 299 pp::Var("open"), pp::Var("about:blank"), pp::Var("_blank")); | |
| 300 if (result.is_object()) | |
| 301 LogMessage("PLUGIN: WINDOW OPEN SUCCESS"); | |
| 302 NotifyTestCompletion(); | |
| 303 return true; | |
| 304 } | |
| 305 | |
| 217 void LogMessage(const char* format...) { | 306 void LogMessage(const char* format...) { |
| 218 va_list args; | 307 va_list args; |
| 219 va_start(args, format); | 308 va_start(args, format); |
| 220 LogToConsoleWithSource(PP_LOGLEVEL_LOG, | 309 LogToConsoleWithSource(PP_LOGLEVEL_LOG, |
| 221 pp::Var("Blink Deprecated Test Plugin"), | 310 pp::Var("Blink Deprecated Test Plugin"), |
| 222 pp::Var(base::StringPrintV(format, args))); | 311 pp::Var(base::StringPrintV(format, args))); |
| 223 va_end(args); | 312 va_end(args); |
| 224 } | 313 } |
| 225 | 314 |
| 226 private: | 315 private: |
| 316 bool HasAttribute(const std::string& name) { | |
| 317 return attributes_.find(name) != attributes_.end(); | |
| 318 } | |
|
dcheng
2016/03/22 18:03:05
Nit: newline.
piman
2016/03/23 05:30:24
Done.
| |
| 319 std::unordered_map<std::string, std::string> attributes_; | |
| 227 pp::VarPrivate instance_var_; | 320 pp::VarPrivate instance_var_; |
| 228 // Owned by |instance_var_|. | 321 // Owned by |instance_var_|. |
| 229 InstanceSO* instance_so_; | 322 InstanceSO* instance_so_; |
| 230 }; | 323 }; |
| 231 | 324 |
| 232 class BlinkDeprecatedTestModule : public pp::Module { | 325 class BlinkDeprecatedTestModule : public pp::Module { |
| 233 public: | 326 public: |
| 234 BlinkDeprecatedTestModule() {} | 327 BlinkDeprecatedTestModule() {} |
| 235 ~BlinkDeprecatedTestModule() override {} | 328 ~BlinkDeprecatedTestModule() override {} |
| 236 | 329 |
| 237 virtual pp::Instance* CreateInstance(PP_Instance instance) { | 330 virtual pp::Instance* CreateInstance(PP_Instance instance) { |
| 238 return new BlinkDeprecatedTestInstance(instance); | 331 return new BlinkDeprecatedTestInstance(instance); |
| 239 } | 332 } |
| 240 }; | 333 }; |
| 241 | 334 |
| 242 } // namespace | 335 } // namespace |
| 243 | 336 |
| 244 namespace pp { | 337 namespace pp { |
| 245 | 338 |
| 246 Module* CreateModule() { | 339 Module* CreateModule() { |
| 247 return new BlinkDeprecatedTestModule(); | 340 return new BlinkDeprecatedTestModule(); |
| 248 } | 341 } |
| 249 | 342 |
| 250 } // namespace pp | 343 } // namespace pp |
| OLD | NEW |