summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/automation
diff options
context:
space:
mode:
authorinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-26 23:55:29 +0000
committerinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-26 23:55:29 +0000
commit09911bf300f1a419907a9412154760efd0b7abc3 (patch)
treef131325fb4e2ad12c6d3504ab75b16dd92facfed /chrome/renderer/automation
parent586acc5fe142f498261f52c66862fa417c3d52d2 (diff)
downloadchromium_src-09911bf300f1a419907a9412154760efd0b7abc3.zip
chromium_src-09911bf300f1a419907a9412154760efd0b7abc3.tar.gz
chromium_src-09911bf300f1a419907a9412154760efd0b7abc3.tar.bz2
Add chrome to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/automation')
-rw-r--r--chrome/renderer/automation/dom_automation_controller.cc125
-rw-r--r--chrome/renderer/automation/dom_automation_controller.h133
2 files changed, 258 insertions, 0 deletions
diff --git a/chrome/renderer/automation/dom_automation_controller.cc b/chrome/renderer/automation/dom_automation_controller.cc
new file mode 100644
index 0000000..4d6dca3
--- /dev/null
+++ b/chrome/renderer/automation/dom_automation_controller.cc
@@ -0,0 +1,125 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "chrome/renderer/automation/dom_automation_controller.h"
+
+#include "chrome/common/json_value_serializer.h"
+#include "chrome/common/render_messages.h"
+#include "base/string_util.h"
+
+IPC::Message::Sender* DomAutomationController::sender_(NULL);
+int DomAutomationController::routing_id_(MSG_ROUTING_NONE);
+int DomAutomationController::automation_id_(MSG_ROUTING_NONE);
+
+DomAutomationController::DomAutomationController(){
+ BindMethod("send", &DomAutomationController::send);
+ BindMethod("setAutomationId", &DomAutomationController::setAutomationId);
+}
+
+void DomAutomationController::send(const CppArgumentList& args,
+ CppVariant* result) {
+ if (args.size() != 1) {
+ result->SetNull();
+ return;
+ }
+
+ if (automation_id_ == MSG_ROUTING_NONE) {
+ result->SetNull();
+ return;
+ }
+
+ std::string json;
+ JSONStringValueSerializer serializer(&json);
+ Value* value = NULL;
+
+ // Warning: note that JSON officially requires the root-level object to be
+ // an object (e.g. {foo:3}) or an array, while here we're serializing
+ // strings, bools, etc. to "JSON". This only works because (a) the JSON
+ // writer is lenient, and (b) on the receiving side we wrap the JSON string
+ // in square brackets, converting it to an array, then parsing it and
+ // grabbing the 0th element to get the value out.
+ switch(args[0].type) {
+ case NPVariantType_String: {
+ value = Value::CreateStringValue(UTF8ToWide(args[0].ToString()));
+ break;
+ }
+ case NPVariantType_Bool: {
+ value = Value::CreateBooleanValue(args[0].ToBoolean());
+ break;
+ }
+ case NPVariantType_Int32: {
+ value = Value::CreateIntegerValue(args[0].ToInt32());
+ break;
+ }
+ case NPVariantType_Double: {
+ // The value that is sent back is an integer while it is treated
+ // as a double in this binding. The reason being that KJS treats
+ // any number value as a double. Refer for more details,
+ // chrome/third_party/webkit/src/JavaScriptCore/bindings/c/c_utility.cpp
+ value = Value::CreateIntegerValue(args[0].ToInt32());
+ break;
+ }
+ default: {
+ result->SetNull();
+ return;
+ }
+ }
+
+ bool succeeded = serializer.Serialize(*value);
+ if (!succeeded) {
+ result->SetNull();
+ return;
+ }
+
+ succeeded = sender_->Send(
+ new ViewHostMsg_DomOperationResponse(routing_id_, json, automation_id_));
+
+ automation_id_ = MSG_ROUTING_NONE;
+
+ result->Set(succeeded);
+ return;
+}
+
+void DomAutomationController::setAutomationId(
+ const CppArgumentList& args, CppVariant* result) {
+ if (args.size() != 1) {
+ result->SetNull();
+ return;
+ }
+
+ // The check here is for NumberType and not Int32 as
+ // KJS::JSType only defines a NumberType (no Int32)
+ if (!args[0].isNumber()) {
+ result->SetNull();
+ return;
+ }
+
+ automation_id_ = args[0].ToInt32();
+ result->Set(true);
+}
diff --git a/chrome/renderer/automation/dom_automation_controller.h b/chrome/renderer/automation/dom_automation_controller.h
new file mode 100644
index 0000000..d7ac44f
--- /dev/null
+++ b/chrome/renderer/automation/dom_automation_controller.h
@@ -0,0 +1,133 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CHROME_RENDERER_AUTOMATION_DOM_AUTOMATION_CONTROLLER_H__
+#define CHROME_RENDERER_AUTOMATION_DOM_AUTOMATION_CONTROLLER_H__
+
+#include "chrome/common/ipc_message.h"
+#include "webkit/glue/cpp_bound_class.h"
+
+/* DomAutomationController class:
+ Bound to Javascript window.domAutomationController object.
+ At the very basic, this object makes any native value (string, numbers,
+ boolean) from javascript available to the automation host in Cpp.
+ Any renderer implementation that is built with this binding will allow the
+ above facility.
+ The intended use of this object is to expose the DOM Objects and their
+ attributes to the automation host.
+
+ A typical usage would be like following (JS code):
+
+ var object = document.getElementById('some_id');
+ window.domAutomationController.send(object.nodeName); // get the tag name
+
+ For the exact mode of usage,
+ refer AutomationProxyTest.*DomAutomationController tests.
+
+ The class provides a single send method that can send variety of native
+ javascript values. (NPString, Number(double), Boolean)
+
+ The actual communication occurs in the following manner:
+
+ TEST MASTER RENDERER
+ (1) (3)
+ |AProxy| ----->|AProvider|----->|RenderView|------|
+ /\ | | |
+ | | | |
+ |(6) |(2) |(0) |(4)
+ | | \/ |
+ | |-------->|DAController|<----|
+ | |
+ | |(5)
+ |---------|WebContents|<----------|
+
+
+ Legends:
+ - AProxy = AutomationProxy
+ - AProvider = AutomationProvider
+ - DAController = DomAutomationController
+
+ (0) Initialization step where DAController is bound to the renderer
+ and the view_id of the renderer is supplied to the DAController for
+ routing message in (5). (routing_id_)
+ (1) A 'javascript:' url is sent from the test process to master as an IPC
+ message. A unique routing id is generated at this stage (automation_id_)
+ (2) The automation_id_ of step (1) is supplied to DAController by calling
+ the bound method setAutomationId(). This is required for routing message
+ in (6).
+ (3) The 'javascript:' url is sent for execution by calling into
+ Browser::LoadURL()
+ (4) A callback is generated as a result of domAutomationController.send()
+ into Cpp. The supplied value is received as a result of this callback.
+ (5) The value received in (4) is sent to the master along with the
+ stored automation_id_ as an IPC message. routing_id_ is used to route
+ the message. (IPC messages, ViewHostMsg_*DomAutomation* )
+ (6) The value and the automation_id_ is extracted out of the message received
+ in (5). This value is relayed to AProxy using another IPC message.
+ automation_id_ is used to route the message.
+ (IPC messages, AutomationMsg_Dom*Response)
+
+*/
+
+// TODO(vibhor): Add another method-pair like sendLater() and sendNow()
+// sendLater() should keep building a json serializer
+// sendNow() should send the above serializer as a string.
+class DomAutomationController : public CppBoundClass {
+ public:
+ DomAutomationController();
+ ~DomAutomationController() {}
+
+ // Makes the renderer send a javascript value to the app.
+ // The value to be sent can be either of type NPString,
+ // Number (double casted to int32) or boolean.
+ // The function returns true/false based on the result of actual send over
+ // IPC. It sets the return value to null on unexpected errors or arguments.
+ void send(const CppArgumentList& args, CppVariant* result);
+
+ void setAutomationId(const CppArgumentList& args, CppVariant* result);
+
+ // TODO(vibhor): Implement later
+ // static CppBindingObjectMethod sendLater;
+ // static CppBindingObjectMethod sendNow;
+
+ static void set_routing_id(int routing_id) { routing_id_ = routing_id; }
+
+ static void set_message_sender(IPC::Message::Sender* sender) {
+ sender_ = sender;
+ }
+
+ private:
+ static IPC::Message::Sender* sender_;
+
+ // Refer to the comments at the top of the file for more details.
+ static int routing_id_; // routing id to be used by first channel.
+ static int automation_id_; // routing id to be used by the next channel.
+};
+
+#endif // CHROME_RENDERER_AUTOMATION_DOM_AUTOMATION_CONTROLLER_H__