diff options
Diffstat (limited to 'webkit/glue')
21 files changed, 3405 insertions, 843 deletions
diff --git a/webkit/glue/SConscript b/webkit/glue/SConscript index a06bfe1..f59d7aa 100644 --- a/webkit/glue/SConscript +++ b/webkit/glue/SConscript @@ -48,6 +48,15 @@ input_files = [ 'cpp_bound_class.cc', 'cpp_variant.cc', 'debugger_bridge.cc', + 'devtools/devtools_rpc.cc', + 'devtools/devtools_rpc.h', + 'devtools/dom_agent.h', + 'devtools/dom_agent_impl.cc', + 'devtools/dom_agent_impl.h', + 'devtools/net_agent.h', + 'devtools/net_agent_impl.cc', + 'devtools/net_agent_impl.h', + 'devtools/tools_agent.h', 'dom_operations.cc', 'dom_serializer.cc', 'dragclient_impl.cc', @@ -82,6 +91,14 @@ input_files = [ 'webclipboard_impl.cc', 'webcursor.cc', 'webdatasource_impl.cc', + 'webdevtoolsagent.h', + 'webdevtoolsagent_delegate.h', + 'webdevtoolsagent_impl.cc', + 'webdevtoolsagent_impl.h', + 'webdevtoolsclient.h', + 'webdevtoolsclient_delegate.h', + 'webdevtoolsclient_impl.cc', + 'webdevtoolsclient_impl.h', 'webdocumentloader_impl.cc', 'weberror_impl.cc', 'webframe_impl.cc', diff --git a/webkit/glue/devtools/devtools_mock_rpc.h b/webkit/glue/devtools/devtools_mock_rpc.h new file mode 100644 index 0000000..1a56b2f --- /dev/null +++ b/webkit/glue/devtools/devtools_mock_rpc.h @@ -0,0 +1,52 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_MOCK_RPC_H_ +#define WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_MOCK_RPC_H_ + +#include <string> + +#include "base/string_util.h" +#include "PlatformString.h" + +#include "webkit/glue/devtools/devtools_rpc.h" +#include "webkit/glue/glue_util.h" + +using WebCore::String; + +// Universal mock delegate for DevToolsRpc. Typical usage of the mock is: +// mock->Method1(); // Set expectation. +// mock->Replay(); +// // Do Something here; +// mock->Verify(); // Verify. +class DevToolsMockRpc : public DevToolsRpc::Delegate { + public: + DevToolsMockRpc() {} + ~DevToolsMockRpc() {} + + virtual void SendRpcMessage(const std::string& msg) { + log_ = StringPrintf("%s\n%s", log_.c_str(), msg.c_str()); + } + + void Replay() { + ref_log_ = log_; + log_ = ""; + } + + void Verify() { + EXPECT_EQ(ref_log_, log_); + } + + void Reset() { + ref_log_ = ""; + log_ = ""; + } + + private: + std::string log_; + std::string ref_log_; + DISALLOW_COPY_AND_ASSIGN(DevToolsMockRpc); +}; + +#endif // WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_MOCK_RPC_H_ diff --git a/webkit/glue/devtools/devtools_rpc.cc b/webkit/glue/devtools/devtools_rpc.cc new file mode 100644 index 0000000..29cbd78 --- /dev/null +++ b/webkit/glue/devtools/devtools_rpc.cc @@ -0,0 +1,86 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "webkit/glue/devtools/devtools_rpc.h" + +#include "PlatformString.h" + +// TODO(pfeldman): Remove these once JSON is available in +// WebCore namespace. +#include "base/json_reader.h" +#include "base/json_writer.h" +#include "base/values.h" +#include "webkit/glue/glue_util.h" + +DevToolsRpc::DevToolsRpc(Delegate* delegate) : delegate_(delegate) { +} + +DevToolsRpc::~DevToolsRpc() { +} + +void DevToolsRpc::SendValueMessage(const Value* value) { + std::string json; + JSONWriter::Write(value, false, &json); + delegate_->SendRpcMessage(json); +} + +// static +Value* DevToolsRpc::ParseMessage(const std::string& raw_msg) { + return JSONReader::Read(raw_msg, false); +} + +// static +void DevToolsRpc::GetListValue( + const ListValue& message, + int index, + bool* value) { + message.GetBoolean(index, value); +} + +// static +void DevToolsRpc::GetListValue( + const ListValue& message, + int index, + int* value) { + message.GetInteger(index, value); +} + +// static +void DevToolsRpc::GetListValue( + const ListValue& message, + int index, + String* value) { + std::string tmp; + message.GetString(index, &tmp); + *value = webkit_glue::StdStringToString(tmp); +} + +// static +void DevToolsRpc::GetListValue( + const ListValue& message, + int index, + Value** value) { + message.Get(index, value); +} + +// static +Value* DevToolsRpc::CreateValue(const String* value) { + return Value::CreateStringValue( + webkit_glue::StringToStdString(*value)); +} + +// static +Value* DevToolsRpc::CreateValue(int* value) { + return Value::CreateIntegerValue(*value); +} + +// static +Value* DevToolsRpc::CreateValue(bool* value) { + return Value::CreateBooleanValue(*value); +} + +// static +Value* DevToolsRpc::CreateValue(const Value* value) { + return value->DeepCopy(); +} diff --git a/webkit/glue/devtools/devtools_rpc.h b/webkit/glue/devtools/devtools_rpc.h new file mode 100644 index 0000000..3fbcc7d --- /dev/null +++ b/webkit/glue/devtools/devtools_rpc.h @@ -0,0 +1,324 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// DevTools RPC subsystem is a simple string serialization-based rpc +// implementation. The client is responsible for defining the Rpc-enabled +// interface in terms of its macros: +// +// #define MYAPI_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3) +// METHOD0(Method1) +// METHOD3(Method2, int, String, Value) +// METHOD1(Method3, int) +// (snippet above should be multiline macro, add trailing backslashes) +// +// DEFINE_RPC_CLASS(MyApi, MYAPI_STRUCT) +// +// The snippet above will generate three classes: MyApi, MyApiStub and +// MyApiDispatch. +// +// 1. For each method defined in the marco MyApi will have a +// pure virtual function generated, so that MyApi would look like: +// +// class MyApi { +// private: +// MyApi() {} +// ~MyApi() {} +// virtual void Method1() = 0; +// virtual void Method2( +// int param1, +// const String& param2, +// const Value& param3) = 0; +// virtual void Method3(int param1) = 0; +// }; +// +// 2. MyApiStub will implement MyApi interface and would serialize all calls +// into the string-based calls of the underlying transport: +// +// DevToolsRpc::Delegate* transport; +// my_api = new MyApiStub(transport); +// my_api->Method1(); +// my_api->Method3(2); +// +// 3. MyApiDelegate is capable of dispatching the calls and convert them to the +// calls to the underlying MyApi methods: +// +// MyApi* real_object; +// MyApiDispatch dispatch; +// dispatch.Dispatch(real_object, raw_string_call_generated_by_stub); +// +// will make corresponding calls to the real object. + +#ifndef WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_RPC_H_ +#define WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_RPC_H_ + +#include <string> + +#include "PlatformString.h" +#include <wtf/OwnPtr.h> + +#include "base/basictypes.h" +#include "base/values.h" + +using WebCore::String; + +/////////////////////////////////////////////////////// +// RPC dispatch macro + +template<typename T> +struct RpcTypeTrait { + typedef T ApiType; + typedef T DispatchType; + static const DispatchType& Pass(const DispatchType& t) { + return t; + } +}; + +template<> +struct RpcTypeTrait<Value> { + typedef const Value& ApiType; + typedef Value* DispatchType; + static const Value& Pass(Value* t) { + return *t; + } +}; + +template<> +struct RpcTypeTrait<String> { + typedef const String& ApiType; + typedef String DispatchType; + static const DispatchType& Pass(const DispatchType& t) { + return t; + } +}; + +/////////////////////////////////////////////////////// +// RPC Api method declarations + +#define TOOLS_RPC_API_METHOD0(Method) \ + virtual void Method() = 0; + +#define TOOLS_RPC_API_METHOD1(Method, T1) \ + virtual void Method(RpcTypeTrait<T1>::ApiType t1) = 0; + +#define TOOLS_RPC_API_METHOD2(Method, T1, T2) \ + virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ + RpcTypeTrait<T2>::ApiType t2) = 0; + +#define TOOLS_RPC_API_METHOD3(Method, T1, T2, T3) \ + virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ + RpcTypeTrait<T2>::ApiType t2, \ + RpcTypeTrait<T3>::ApiType t3) = 0; + +#define TOOLS_RPC_ENUM_LITERAL0(Method) METHOD_##Method, +#define TOOLS_RPC_ENUM_LITERAL1(Method, T1) METHOD_##Method, +#define TOOLS_RPC_ENUM_LITERAL2(Method, T1, T2) METHOD_##Method, +#define TOOLS_RPC_ENUM_LITERAL3(Method, T1, T2, T3) METHOD_##Method, + +/////////////////////////////////////////////////////// +// RPC stub method implementations + +#define TOOLS_RPC_STUB_METHOD0(Method) \ + virtual void Method() { \ + InvokeAsync(METHOD_##Method); \ + } + +#define TOOLS_RPC_STUB_METHOD1(Method, T1) \ + virtual void Method(RpcTypeTrait<T1>::ApiType t1) { \ + InvokeAsync(METHOD_##Method, &t1); \ + } + +#define TOOLS_RPC_STUB_METHOD2(Method, T1, T2) \ + virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ + RpcTypeTrait<T2>::ApiType t2) { \ + InvokeAsync(METHOD_##Method, &t1, &t2); \ + } + +#define TOOLS_RPC_STUB_METHOD3(Method, T1, T2, T3) \ + virtual void Method(RpcTypeTrait<T1>::ApiType t1, \ + RpcTypeTrait<T2>::ApiType t2, \ + RpcTypeTrait<T3>::ApiType t3) { \ + InvokeAsync(METHOD_##Method, &t1, &t2, &t3); \ + } + +/////////////////////////////////////////////////////// +// RPC dispatch method implementations + +#define TOOLS_RPC_DISPATCH0(Method) \ +case CLASS::METHOD_##Method: { \ + delegate->Method(); \ + return true; \ +} + +#define TOOLS_RPC_DISPATCH1(Method, T1) \ +case CLASS::METHOD_##Method: { \ + RpcTypeTrait<T1>::DispatchType t1; \ + DevToolsRpc::GetListValue(*message.get(), 1, &t1); \ + delegate->Method( \ + RpcTypeTrait<T1>::Pass(t1)); \ +} + +#define TOOLS_RPC_DISPATCH2(Method, T1, T2) \ +case CLASS::METHOD_##Method: { \ + RpcTypeTrait<T1>::DispatchType t1; \ + RpcTypeTrait<T2>::DispatchType t2; \ + DevToolsRpc::GetListValue(*message.get(), 1, &t1); \ + DevToolsRpc::GetListValue(*message.get(), 2, &t2); \ + delegate->Method( \ + RpcTypeTrait<T1>::Pass(t1), \ + RpcTypeTrait<T2>::Pass(t2) \ + ); \ + return true; \ +} + +#define TOOLS_RPC_DISPATCH3(Method, T1, T2, T3) \ +case CLASS::METHOD_##Method: { \ + RpcTypeTrait<T1>::DispatchType t1; \ + RpcTypeTrait<T2>::DispatchType t2; \ + RpcTypeTrait<T3>::DispatchType t3; \ + DevToolsRpc::GetListValue(*message.get(), 1, &t1); \ + DevToolsRpc::GetListValue(*message.get(), 2, &t2); \ + DevToolsRpc::GetListValue(*message.get(), 3, &t3); \ + delegate->Method( \ + RpcTypeTrait<T1>::Pass(t1), \ + RpcTypeTrait<T2>::Pass(t2), \ + RpcTypeTrait<T3>::Pass(t3) \ + ); \ + return true; \ +} + +#define TOOLS_END_RPC_DISPATCH() \ +} + +// This macro defines three classes: Class with the Api, ClassStub that is +// serializing method calls and ClassDispatch that is capable of dispatching +// the serialized message into its delegate. +#define DEFINE_RPC_CLASS(Class, STRUCT) \ +class Class {\ + public: \ + Class() {} \ + ~Class() {} \ + \ + enum MethodNames { \ + STRUCT(TOOLS_RPC_ENUM_LITERAL0, TOOLS_RPC_ENUM_LITERAL1, \ + TOOLS_RPC_ENUM_LITERAL2, TOOLS_RPC_ENUM_LITERAL3) \ + }; \ + \ + STRUCT( \ + TOOLS_RPC_API_METHOD0, \ + TOOLS_RPC_API_METHOD1, \ + TOOLS_RPC_API_METHOD2, \ + TOOLS_RPC_API_METHOD3) \ + private: \ + DISALLOW_COPY_AND_ASSIGN(Class); \ +}; \ +\ +class Class##Stub : public Class, public DevToolsRpc { \ + public: \ + explicit Class##Stub(Delegate* delegate) : DevToolsRpc(delegate) {} \ + virtual ~Class##Stub() {} \ + STRUCT( \ + TOOLS_RPC_STUB_METHOD0, \ + TOOLS_RPC_STUB_METHOD1, \ + TOOLS_RPC_STUB_METHOD2, \ + TOOLS_RPC_STUB_METHOD3) \ + private: \ + DISALLOW_COPY_AND_ASSIGN(Class##Stub); \ +}; \ +\ +class Class##Dispatch { \ + public: \ + Class##Dispatch() {} \ + virtual ~Class##Dispatch() {} \ + bool Dispatch(Class* delegate, const std::string& raw_msg) { \ + OwnPtr<ListValue> message( \ + static_cast<ListValue*>(DevToolsRpc::ParseMessage(raw_msg))); \ + int method; \ + message->GetInteger(0, &method); \ + typedef Class CLASS; \ + switch (method) { \ + STRUCT( \ + TOOLS_RPC_DISPATCH0, \ + TOOLS_RPC_DISPATCH1, \ + TOOLS_RPC_DISPATCH2, \ + TOOLS_RPC_DISPATCH3) \ + default: return false; \ + } \ + } \ + private: \ + DISALLOW_COPY_AND_ASSIGN(Class##Dispatch); \ +}; + +/////////////////////////////////////////////////////// +// RPC base class +class DevToolsRpc { + public: + class Delegate { + public: + Delegate() {} + virtual ~Delegate() {} + virtual void SendRpcMessage(const std::string& msg) = 0; + private: + DISALLOW_COPY_AND_ASSIGN(Delegate); + }; + + explicit DevToolsRpc(Delegate* delegate); + virtual ~DevToolsRpc(); + + void InvokeAsync(int method) { + ListValue message; + message.Append(CreateValue(&method)); + SendValueMessage(&message); + } + template<class T1> + void InvokeAsync(int method, T1 t1) { + ListValue message; + message.Append(CreateValue(&method)); + message.Append(CreateValue(t1)); + SendValueMessage(&message); + } + template<class T1, class T2> + void InvokeAsync(int method, T1 t1, T2 t2) { + ListValue message; + message.Append(CreateValue(&method)); + message.Append(CreateValue(t1)); + message.Append(CreateValue(t2)); + SendValueMessage(&message); + } + template<class T1, class T2, class T3> + void InvokeAsync(int method, T1 t1, T2 t2, T3 t3) { + ListValue message; + message.Append(CreateValue(&method)); + message.Append(CreateValue(t1)); + message.Append(CreateValue(t2)); + message.Append(CreateValue(t3)); + SendValueMessage(&message); + } + + static Value* ParseMessage(const std::string& raw_msg); + static void GetListValue(const ListValue& message, int index, bool* value); + static void GetListValue(const ListValue& message, int index, int* value); + static void GetListValue( + const ListValue& message, + int index, + String* value); + static void GetListValue(const ListValue& message, int index, Value** value); + + protected: + // Primarily for unit testing. + void set_delegate(Delegate* delegate) { this->delegate_ = delegate; } + + private: + // Value adapters for supported Rpc types. + static Value* CreateValue(const String* value); + static Value* CreateValue(int* value); + static Value* CreateValue(bool* value); + static Value* CreateValue(const Value* value); + + void SendValueMessage(const Value* value); + + Delegate* delegate_; + DISALLOW_COPY_AND_ASSIGN(DevToolsRpc); +}; + +#endif // WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_RPC_H_ diff --git a/webkit/glue/devtools/dom_agent.h b/webkit/glue/devtools/dom_agent.h new file mode 100644 index 0000000..a2d8818 --- /dev/null +++ b/webkit/glue/devtools/dom_agent.h @@ -0,0 +1,60 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_DEVTOOLS_DOM_AGENT_H_ +#define WEBKIT_GLUE_DEVTOOLS_DOM_AGENT_H_ + +#include "webkit/glue/devtools/devtools_rpc.h" + +// DomAgent is a utility object that covers DOM-related functionality of the +// WebDevToolsAgent. It is capable of sending DOM tree to the client as well +// as providing DOM notifications for the nodes known to the client. +// DomAgent's environment is represented with the DomAgentDelegate interface. +#define DOM_AGENT_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3) \ + /* Requests that the document root element is sent to the delegate. */ \ + METHOD0(GetDocumentElement) \ + \ + /* Requests that the element's children are sent to the client. */ \ + METHOD1(GetChildNodes, int /* id */) \ + \ + /* Sets attribute value in the element with given id. */ \ + METHOD3(SetAttribute, int /* id */, String /* name */, String /* value */) \ + \ + /* Removes attribute from the element with given id. */ \ + METHOD2(RemoveAttribute, int /* id */, String /* name */) \ + \ + /* Sets text node value in the node with given id. */ \ + METHOD2(SetTextNodeValue, int /* id */, String /* text */) \ + \ + /* Tells dom agent that the client has lost all of the dom-related + information and is no longer interested in the notifications related to the + nodes issued earlier. */ \ + METHOD0(DiscardBindings) + +DEFINE_RPC_CLASS(DomAgent, DOM_AGENT_STRUCT) + +#define DOM_AGENT_DELEGATE_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3) \ + /* Notifies the delegate that document element is available. */ \ + METHOD1(DocumentElementUpdated, Value /* node */) \ + \ + /* Notifies the delegate that element's attributes are updated. */ \ + METHOD2(AttributesUpdated, int /* id */, Value /* attributes */) \ + \ + /* Notifies the delegate that element's child nodes have been updated. */ \ + METHOD2(ChildNodesUpdated, int /* id */, Value /* node */) \ + \ + /* Notifies the delegate that element's 'has children' state has been + updated */ \ + METHOD2(HasChildrenUpdated, int /* id */, bool /* new_value */) \ + \ + /* Notifies the delegate that child node has been inserted. */ \ + METHOD3(ChildNodeInserted, int /* parent_id */ , int /* prev_id */, \ + Value /* node */) \ + \ + /* Notifies the delegate that child node has been deleted. */ \ + METHOD2(ChildNodeRemoved, int /* parent_id */, int /* id */) + +DEFINE_RPC_CLASS(DomAgentDelegate, DOM_AGENT_DELEGATE_STRUCT) + +#endif // WEBKIT_GLUE_DEVTOOLS_DOM_AGENT_H_ diff --git a/webkit/glue/devtools/dom_agent_impl.cc b/webkit/glue/devtools/dom_agent_impl.cc new file mode 100644 index 0000000..5f7a66a --- /dev/null +++ b/webkit/glue/devtools/dom_agent_impl.cc @@ -0,0 +1,406 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "config.h" + +#include "webkit/glue/devtools/dom_agent_impl.h" + +#include "AtomicString.h" +#include "Document.h" +#include "Event.h" +#include "EventListener.h" +#include "EventNames.h" +#include "EventTarget.h" +#include "HTMLFrameOwnerElement.h" +#include "markup.h" +#include "MutationEvent.h" +#include "Node.h" +#include "Text.h" +#include <wtf/OwnPtr.h> +#include <wtf/Vector.h> +#undef LOG + +#include "base/values.h" +#include "webkit/glue/glue_util.h" + +using namespace WebCore; + +// static +PassRefPtr<DomAgentImpl::EventListenerWrapper> + DomAgentImpl::EventListenerWrapper::Create( + DomAgentImpl* dom_agent_impl) { + return adoptRef(new EventListenerWrapper(dom_agent_impl)); +} + +DomAgentImpl::EventListenerWrapper::EventListenerWrapper( + DomAgentImpl* dom_agent_impl) : dom_agent_impl_(dom_agent_impl) { +} + +void DomAgentImpl::EventListenerWrapper::handleEvent( + Event* event, + bool isWindowEvent) { + dom_agent_impl_->handleEvent(event, isWindowEvent); +} + +DomAgentImpl::DomAgentImpl(DomAgentDelegate* delegate) + : delegate_(delegate), + last_node_id_(1), + document_element_requested_(false) { + event_listener_ = EventListenerWrapper::Create(this); +} + +DomAgentImpl::~DomAgentImpl() { + SetDocument(NULL); +} + +void DomAgentImpl::SetDocument(Document* doc) { + DiscardBindings(); + + ListHashSet<RefPtr<Document> > copy = documents_; + for (ListHashSet<RefPtr<Document> >::iterator it = copy.begin(); + it != copy.end(); ++it) { + StopListening((*it).get()); + } + ASSERT(documents_.size() == 0); + + if (doc) { + StartListening(doc); + if (document_element_requested_) { + GetDocumentElement(); + document_element_requested_ = false; + } + } +} + +void DomAgentImpl::StartListening(Document* doc) { + if (documents_.find(doc) != documents_.end()) + return; + doc->addEventListener(eventNames().DOMContentLoadedEvent, event_listener_, + false); + doc->addEventListener(eventNames().DOMNodeInsertedEvent, event_listener_, + false); + doc->addEventListener(eventNames().DOMNodeRemovedEvent, event_listener_, + false); + doc->addEventListener(eventNames().DOMNodeRemovedFromDocumentEvent, + event_listener_, false); + doc->addEventListener(eventNames().DOMAttrModifiedEvent, event_listener_, + false); + documents_.add(doc); +} + +void DomAgentImpl::StopListening(Document* doc) { + doc->removeEventListener(eventNames().DOMContentLoadedEvent, + event_listener_.get(), false); + doc->removeEventListener(eventNames().DOMNodeInsertedEvent, + event_listener_.get(), false); + doc->removeEventListener(eventNames().DOMNodeRemovedEvent, + event_listener_.get(), false); + doc->removeEventListener(eventNames().DOMNodeRemovedFromDocumentEvent, + event_listener_.get(), false); + doc->removeEventListener(eventNames().DOMAttrModifiedEvent, + event_listener_.get(), false); + documents_.remove(doc); +} + +int DomAgentImpl::Bind(Node* node) { + HashMap<Node*, int>::iterator it = node_to_id_.find(node); + if (it != node_to_id_.end()) + return it->second; + int id = last_node_id_++; + node_to_id_.set(node, id); + id_to_node_.set(id, node); + return id; +} + +void DomAgentImpl::Unbind(Node* node) { + if (node->isFrameOwnerElement()) { + const HTMLFrameOwnerElement* frame_owner = + static_cast<const HTMLFrameOwnerElement*>(node); + StopListening(frame_owner->contentDocument()); + } + + HashMap<Node*, int>::iterator it = node_to_id_.find(node); + if (it != node_to_id_.end()) { + id_to_node_.remove(id_to_node_.find(it->second)); + children_requested_.remove(children_requested_.find(it->second)); + node_to_id_.remove(it); + } +} + +void DomAgentImpl::DiscardBindings() { + node_to_id_.clear(); + id_to_node_.clear(); + children_requested_.clear(); +} + +Node* DomAgentImpl::GetNodeForId(int id) { + HashMap<int, Node*>::iterator it = id_to_node_.find(id); + if (it != id_to_node_.end()) { + return it->second; + } + return NULL; +} + +int DomAgentImpl::GetIdForNode(Node* node) { + if (node == NULL) { + return 0; + } + HashMap<Node*, int>::iterator it = node_to_id_.find(node); + if (it != node_to_id_.end()) { + return it->second; + } + return 0; +} + +void DomAgentImpl::handleEvent(Event* event, bool isWindowEvent) { + AtomicString type = event->type(); + Node* node = event->target()->toNode(); + + // Remove mapping entry if necessary. + if (type == eventNames().DOMNodeRemovedFromDocumentEvent) { + Unbind(node); + return; + } + + if (type == eventNames().DOMAttrModifiedEvent) { + int id = GetIdForNode(node); + if (!id) { + // Node is not mapped yet -> ignore the event. + return; + } + Element* element = static_cast<Element*>(node); + OwnPtr<Value> attributesValue(BuildValueForElementAttributes(element)); + delegate_->AttributesUpdated(id, *attributesValue.get()); + } else if (type == eventNames().DOMNodeInsertedEvent) { + Node* parent = static_cast<MutationEvent*>(event)->relatedNode(); + int parent_id = GetIdForNode(parent); + if (!parent_id) { + // Parent is not mapped yet -> ignore the event. + return; + } + HashSet<int>::iterator cit = children_requested_.find(parent_id); + if (cit == children_requested_.end()) { + // No children are mapped yet -> only notify on changes of hasChildren. + delegate_->HasChildrenUpdated(parent_id, true); + } else { + // Children have been requested -> return value of a new child. + int prev_id = GetIdForNode(node->previousSibling()); + OwnPtr<Value> value(BuildValueForNode(node, 0)); + delegate_->ChildNodeInserted(parent_id, prev_id, *value.get()); + } + } else if (type == eventNames().DOMNodeRemovedEvent) { + Node* parent = static_cast<MutationEvent*>(event)->relatedNode(); + int parent_id = GetIdForNode(parent); + if (!parent_id) { + // Parent is not mapped yet -> ignore the event. + return; + } + HashSet<int>::iterator cit = children_requested_.find(parent_id); + if (cit == children_requested_.end()) { + // No children are mapped yet -> only notify on changes of hasChildren. + if (parent->childNodeCount() == 1) + delegate_->HasChildrenUpdated(parent_id, false); + } else { + int id = GetIdForNode(node); + delegate_->ChildNodeRemoved(parent_id, id); + } + } else if (type == eventNames().DOMContentLoadedEvent) { + //TODO(pfeldman): handle content load event. + } +} + +void DomAgentImpl::GetDocumentElement() { + if (documents_.size() > 0) { + OwnPtr<Value> value( + BuildValueForNode((*documents_.begin())->documentElement(), 0)); + delegate_->DocumentElementUpdated(*value.get()); + } else { + document_element_requested_ = true; + } +} + +void DomAgentImpl::GetChildNodes(int element_id) { + Node* node = GetNodeForId(element_id); + if (!node || (node->nodeType() != Node::ELEMENT_NODE)) + return; + + Element* element = static_cast<Element*>(node); + OwnPtr<Value> children(BuildValueForElementChildren(element, 1)); + children_requested_.add(element_id); + delegate_->ChildNodesUpdated(element_id, *children.get()); +} + +int DomAgentImpl::GetPathToNode(Node* node_to_select) { + ASSERT(node_to_select); // Invalid input + + // Return id in case the node is known. + int result = GetIdForNode(node_to_select); + if (result) + return result; + + Element* element = InnerParentElement(node_to_select); + ASSERT(element); // Node is detached or is a document itself + + Vector<Element*> path; + while (element && !GetIdForNode(element)) { + path.append(element); + element = InnerParentElement(element); + } + // element is known to the client + ASSERT(element); + path.append(element); + + for (int i = path.size() - 1; i >= 0; --i) { + element = path.at(i); + OwnPtr<Value> children(BuildValueForElementChildren(element, 1)); + delegate_->ChildNodesUpdated(GetIdForNode(element), *children.get()); + } + return GetIdForNode(node_to_select); +} + +void DomAgentImpl::SetAttribute( + int element_id, + const String& name, + const String& value) { + Node* node = GetNodeForId(element_id); + if (node && (node->nodeType() == Node::ELEMENT_NODE)) { + Element* element = static_cast<Element*>(node); + ExceptionCode ec = 0; + element->setAttribute(name, value, ec); + } +} + +void DomAgentImpl::RemoveAttribute(int element_id, const String& name) { + Node* node = GetNodeForId(element_id); + if (node && (node->nodeType() == Node::ELEMENT_NODE)) { + Element* element = static_cast<Element*>(node); + ExceptionCode ec = 0; + element->removeAttribute(name, ec); + } +} + +void DomAgentImpl::SetTextNodeValue(int element_id, const String& value) { + Node* node = GetNodeForId(element_id); + if (node && (node->nodeType() == Node::TEXT_NODE)) { + Text* text_node = static_cast<Text*>(node); + ExceptionCode ec = 0; + // TODO(pfeldman): Add error handling + text_node->replaceWholeText(value, ec); + } +} + +ListValue* DomAgentImpl::BuildValueForNode(Node* node, int depth) { + OwnPtr<ListValue> value(new ListValue()); + int id = Bind(node); + String nodeName; + String nodeValue; + + switch (node->nodeType()) { + case Node::TEXT_NODE: + case Node::COMMENT_NODE: + nodeValue = node->nodeValue(); + break; + case Node::ATTRIBUTE_NODE: + case Node::DOCUMENT_NODE: + case Node::DOCUMENT_FRAGMENT_NODE: + break; + case Node::ELEMENT_NODE: + default: { + nodeName = node->nodeName(); + break; + } + } + + value->Append(Value::CreateIntegerValue(id)); + value->Append(Value::CreateIntegerValue(node->nodeType())); + value->Append(Value::CreateStringValue( + webkit_glue::StringToStdWString(nodeName))); + value->Append(Value::CreateStringValue( + webkit_glue::StringToStdWString(nodeValue))); + + if (node->nodeType() == Node::ELEMENT_NODE) { + Element* element = static_cast<Element*>(node); + value->Append(BuildValueForElementAttributes(element)); + int nodeCount = InnerChildNodeCount(element); + value->Append(Value::CreateIntegerValue(nodeCount)); + OwnPtr<ListValue> children(BuildValueForElementChildren(element, depth)); + if (children->GetSize() > 0) { + value->Append(children.release()); + } + } + return value.release(); +} + +ListValue* DomAgentImpl::BuildValueForElementAttributes(Element* element) { + OwnPtr<ListValue> attributesValue(new ListValue()); + // Go through all attributes and serialize them. + const NamedAttrMap *attrMap = element->attributes(true); + if (!attrMap) { + return attributesValue.release(); + } + unsigned numAttrs = attrMap->length(); + for (unsigned i = 0; i < numAttrs; i++) { + // Add attribute pair + const Attribute *attribute = attrMap->attributeItem(i); + OwnPtr<Value> name(Value::CreateStringValue( + webkit_glue::StringToStdWString(attribute->name().toString()))); + OwnPtr<Value> value(Value::CreateStringValue( + webkit_glue::StringToStdWString(attribute->value()))); + attributesValue->Append(name.release()); + attributesValue->Append(value.release()); + } + return attributesValue.release(); +} + +ListValue* DomAgentImpl::BuildValueForElementChildren( + Element* element, + int depth) { + OwnPtr<ListValue> children(new ListValue()); + if (depth == 0) { + // Special case the_only text child. + if (element->childNodeCount() == 1) { + Node *child = element->firstChild(); + if (child->nodeType() == Node::TEXT_NODE) { + children->Append(BuildValueForNode(child, 0)); + } + } + return children.release(); + } else if (depth > 0) { + depth--; + } + + for (Node *child = InnerFirstChild(element); child != NULL; + child = child->nextSibling()) { + children->Append(BuildValueForNode(child, depth)); + } + return children.release(); +} + +Node* DomAgentImpl::InnerFirstChild(Node* node) { + if (node->isFrameOwnerElement()) { + HTMLFrameOwnerElement* frame_owner = + static_cast<HTMLFrameOwnerElement*>(node); + Document* doc = frame_owner->contentDocument(); + StartListening(doc); + return doc->firstChild(); + } else { + return node->firstChild(); + } +} + +int DomAgentImpl::InnerChildNodeCount(Node* node) { + if (node->isFrameOwnerElement()) { + return 1; + } else { + return node->childNodeCount(); + } +} + +Element* DomAgentImpl::InnerParentElement(Node* node) { + Element* element = node->parentElement(); + if (!element) { + return node->ownerDocument()->ownerElement(); + } + return element; +} diff --git a/webkit/glue/devtools/dom_agent_impl.h b/webkit/glue/devtools/dom_agent_impl.h new file mode 100644 index 0000000..12d7540 --- /dev/null +++ b/webkit/glue/devtools/dom_agent_impl.h @@ -0,0 +1,119 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_DEVTOOLS_DOM_AGENT_IMPL_H_ +#define WEBKIT_GLUE_DEVTOOLS_DOM_AGENT_IMPL_H_ + +#include "config.h" + +#include "EventListener.h" +#include <wtf/ListHashSet.h> +#include <wtf/HashMap.h> +#include <wtf/HashSet.h> +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +#include "webkit/glue/devtools/dom_agent.h" + +namespace WebCore { +class Document; +class Element; +class Event; +class Node; +} + +class ListValue; +class Value; + +// DomAgent implementation. +class DomAgentImpl : public DomAgent { + public: + explicit DomAgentImpl(DomAgentDelegate* delegate); + virtual ~DomAgentImpl(); + + // DomAgent implementation. + void GetDocumentElement(); + void GetChildNodes(int element_id); + void SetAttribute( + int element_id, + const WebCore::String& name, + const WebCore::String& value); + void RemoveAttribute(int element_id, const WebCore::String& name); + void SetTextNodeValue(int element_id, const WebCore::String& value); + void DiscardBindings(); + + // Initializes dom agent with the given document. + void SetDocument(WebCore::Document* document); + + // Returns node for given id according to the present binding. + WebCore::Node* GetNodeForId(int id); + + // Returns id for given node according to the present binding. + int GetIdForNode(WebCore::Node* node); + + // Sends path to a given node to the client. Returns node's id according to + // the resulting binding. + int GetPathToNode(WebCore::Node* node); + + private: + // Convenience EventListner wrapper for cleaner Ref management. + class EventListenerWrapper : public WebCore::EventListener { + public: + static PassRefPtr<EventListenerWrapper> Create( + DomAgentImpl* dom_agent_impl); + virtual ~EventListenerWrapper() {} + virtual void handleEvent(WebCore::Event* event, bool isWindowEvent); + private: + explicit EventListenerWrapper(DomAgentImpl* dom_agent_impl); + DomAgentImpl* dom_agent_impl_; + DISALLOW_COPY_AND_ASSIGN(EventListenerWrapper); + }; + + void StartListening(WebCore::Document* document); + + void StopListening(WebCore::Document* document); + + // EventListener implementation + friend class EventListenerWrapper; + virtual void handleEvent(WebCore::Event* event, bool isWindowEvent); + + // Binds given node and returns its generated id. + int Bind(WebCore::Node* node); + + // Releases Node to int binding. + void Unbind(WebCore::Node* node); + + // Serializes given node into the list value. + ListValue* BuildValueForNode( + WebCore::Node* node, + int depth); + + // Serializes given element's attributes into the list value. + ListValue* BuildValueForElementAttributes(WebCore::Element* elemen); + + // Serializes given elements's children into the list value. + ListValue* BuildValueForElementChildren( + WebCore::Element* element, + int depth); + + // We represent embedded doms as a part of the same hierarchy. Hence we + // treat children of frame owners differently. Following two methods + // encapsulate frame owner specifics. + WebCore::Node* InnerFirstChild(WebCore::Node* node); + int InnerChildNodeCount(WebCore::Node* node); + WebCore::Element* InnerParentElement(WebCore::Node* node); + + DomAgentDelegate* delegate_; + HashMap<WebCore::Node*, int> node_to_id_; + HashMap<int, WebCore::Node*> id_to_node_; + HashSet<int> children_requested_; + int last_node_id_; + ListHashSet<RefPtr<WebCore::Document> > documents_; + RefPtr<WebCore::EventListener> event_listener_; + bool document_element_requested_; + + DISALLOW_COPY_AND_ASSIGN(DomAgentImpl); +}; + +#endif // WEBKIT_GLUE_DEVTOOLS_DOM_AGENT_IMPL_H_ diff --git a/webkit/glue/devtools/dom_agent_unittest.cc b/webkit/glue/devtools/dom_agent_unittest.cc new file mode 100644 index 0000000..8c01e04 --- /dev/null +++ b/webkit/glue/devtools/dom_agent_unittest.cc @@ -0,0 +1,421 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "config.h" + +#include <wtf/OwnPtr.h> + +#include "CString.h" +#include "Document.h" +#include "HTMLFrameOwnerElement.h" +#include "PlatformString.h" +#undef LOG + +#include "base/file_path.h" +#include "base/string_util.h" +#include "base/values.h" +#include "net/base/net_util.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "webkit/glue/devtools/devtools_mock_rpc.h" +#include "webkit/glue/devtools/devtools_rpc.h" +#include "webkit/glue/devtools/dom_agent.h" +#include "webkit/glue/devtools/dom_agent_impl.h" +#include "webkit/glue/dom_operations.h" +#include "webkit/glue/glue_util.h" +#include "webkit/glue/webframe.h" +#include "webkit/glue/webframe_impl.h" +#include "webkit/glue/webview.h" +#include "webkit/tools/test_shell/test_shell_test.h" + +using WebCore::Document; +using WebCore::Element; +using WebCore::ExceptionCode; +using WebCore::HTMLFrameOwnerElement; +using WebCore::Node; +using WebCore::String; + +namespace { + +class MockDomAgentDelegate : public DomAgentDelegateStub, + public DevToolsMockRpc { + public: + MockDomAgentDelegate() : DomAgentDelegateStub(NULL) { + set_delegate(this); + } + ~MockDomAgentDelegate() {} +}; + +class DomAgentTests : public TestShellTest { + public: + DomAgentTests() : ec_(0) {} + + protected: + // testing::Test + virtual void SetUp() { + TestShellTest::SetUp(); + test_shell_->ResetTestController(); + GURL file_url = net::FilePathToFileURL(data_dir_); + WebFrame* main_frame = test_shell_->webView()->GetMainFrame(); + main_frame->LoadHTMLString("<html><body/></html>", + file_url); + WebFrameImpl* main_frame_impl = static_cast<WebFrameImpl*>(main_frame); + + document_ = main_frame_impl->frame()->document(); + Node* html = document_->documentElement(); + body_ = static_cast<Element*>(html->firstChild()); + + mock_delegate_.set(new MockDomAgentDelegate()); + dom_agent_.set(new DomAgentImpl(mock_delegate_.get())); + dom_agent_->SetDocument(document_.get()); + } + + virtual void TearDown() { + TestShellTest::TearDown(); + dom_agent_.set(NULL); + body_ = NULL; + document_ = NULL; + } + + static const int kHtmlElemId = 1; + static const int kBodyElemId = 2; + + RefPtr<Document> document_; + RefPtr<Element> body_; + OwnPtr<DomAgentImpl> dom_agent_; + ExceptionCode ec_; + OwnPtr<MockDomAgentDelegate> mock_delegate_; +}; + +// Requests document node and tests that the callback with the serialized +// version is called. +TEST_F(DomAgentTests, DocumentElementUpdated) { + OwnPtr<Value> v(DevToolsRpc::ParseMessage("[1,1,\"HTML\",\"\",[],1]")); + mock_delegate_->DocumentElementUpdated(*v.get()); + mock_delegate_->Replay(); + + dom_agent_->GetDocumentElement(); + mock_delegate_->Verify(); +} + +// Requests element's children and tests that the callback with the serialized +// version is called. +TEST_F(DomAgentTests, ChildNodesUpdated) { + dom_agent_->GetDocumentElement(); + mock_delegate_->Reset(); + + OwnPtr<Value> v(DevToolsRpc::ParseMessage("[[2,1,\"BODY\",\"\",[],0]]")); + mock_delegate_->ChildNodesUpdated(1, *v.get()); + mock_delegate_->Replay(); + + dom_agent_->GetChildNodes(kHtmlElemId); + mock_delegate_->Verify(); +} + +// Tests that "child node inserted" event is being fired. +TEST_F(DomAgentTests, ChildNodeInsertedUnknownParent) { + dom_agent_->GetDocumentElement(); + mock_delegate_->Reset(); + + // There should be no events fired until parent node is known to client. + RefPtr<Element> div = document_->createElement("DIV", ec_); + body_->appendChild(div, ec_); + mock_delegate_->Replay(); + mock_delegate_->Verify(); +} + +// Tests that "child node inserted" event is being fired. +TEST_F(DomAgentTests, ChildNodeInsertedKnownParent) { + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + mock_delegate_->Reset(); + + // There should be an event fired in case parent node is known to client, + // but the event should not be specific. + mock_delegate_->HasChildrenUpdated(kBodyElemId, true); + mock_delegate_->Replay(); + + RefPtr<Element> div = document_->createElement("DIV", ec_); + body_->appendChild(div, ec_); + mock_delegate_->Verify(); +} + +// Tests that "child node inserted" event is being fired. +TEST_F(DomAgentTests, ChildNodeInsertedKnownChildren) { + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + dom_agent_->GetChildNodes(kBodyElemId); + mock_delegate_->Reset(); + + // There should be an event fired in case parent node is known to client, + // Since children were already requested, event should have all the + // new child data. + OwnPtr<Value> v(DevToolsRpc::ParseMessage("[3,1,\"DIV\",\"\",[],0]")); + mock_delegate_->ChildNodeInserted(kBodyElemId, 0, *v.get()); + mock_delegate_->Replay(); + + RefPtr<Element> div = document_->createElement("DIV", ec_); + body_->appendChild(div, ec_); + mock_delegate_->Verify(); +} + +// Tests that "child node inserted" event is being fired. +TEST_F(DomAgentTests, ChildNodePrepend) { + RefPtr<Element> div = document_->createElement("DIV", ec_); + body_->appendChild(div, ec_); + + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + dom_agent_->GetChildNodes(kBodyElemId); + mock_delegate_->Reset(); + + // There should be an event fired in case parent node is known to client, + // Since children were already requested, event should have all the + // new child data. + OwnPtr<Value> v(DevToolsRpc::ParseMessage("[4,1,\"DIV\",\"\",[],0]")); + mock_delegate_->ChildNodeInserted(kBodyElemId, 0, *v.get()); + mock_delegate_->Replay(); + + RefPtr<Element> new_div = document_->createElement("DIV", ec_); + body_->insertBefore(new_div, div.get(), ec_, false); + mock_delegate_->Verify(); +} + +// Tests that "child node inserted" event is being fired. +TEST_F(DomAgentTests, ChildNodeAppend) { + RefPtr<Element> div = document_->createElement("DIV", ec_); + body_->appendChild(div, ec_); + + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + dom_agent_->GetChildNodes(kBodyElemId); + mock_delegate_->Reset(); + + // There should be an event fired in case parent node is known to client, + // Since children were already requested, event should have all the + // new child data. + OwnPtr<Value> v(DevToolsRpc::ParseMessage("[4,1,\"DIV\",\"\",[],0]")); + mock_delegate_->ChildNodeInserted(kBodyElemId, 3, *v.get()); + mock_delegate_->Replay(); + + RefPtr<Element> new_div = document_->createElement("DIV", ec_); + body_->appendChild(new_div, ec_, false); + mock_delegate_->Verify(); +} + +// Tests that "child node inserted" event is being fired. +TEST_F(DomAgentTests, ChildNodeInsert) { + RefPtr<Element> div1 = document_->createElement("DIV", ec_); + body_->appendChild(div1, ec_); + RefPtr<Element> div2 = document_->createElement("DIV", ec_); + body_->appendChild(div2, ec_); + + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + dom_agent_->GetChildNodes(kBodyElemId); + mock_delegate_->Reset(); + + // There should be an event fired in case parent node is known to client, + // Since children were already requested, event should have all the + // new child data. + OwnPtr<Value> v(DevToolsRpc::ParseMessage("[5,1,\"DIV\",\"\",[],0]")); + mock_delegate_->ChildNodeInserted(kBodyElemId, 3, *v.get()); + mock_delegate_->Replay(); + + RefPtr<Element> new_div = document_->createElement("DIV", ec_); + body_->insertBefore(new_div, div2.get(), ec_, false); + mock_delegate_->Verify(); +} + +// Tests that "child node inserted" event is being fired. +TEST_F(DomAgentTests, ChildNodeRemovedUnknownParent) { + RefPtr<Element> div = document_->createElement("DIV", ec_); + body_->appendChild(div, ec_); + + dom_agent_->GetDocumentElement(); + mock_delegate_->Reset(); + + // There should be no events fired until parent node is known to client. + mock_delegate_->Replay(); + body_->removeChild(div.get(), ec_); + mock_delegate_->Verify(); +} + +// Tests that "child node inserted" event is being fired. +TEST_F(DomAgentTests, ChildNodeRemovedKnownParent) { + RefPtr<Element> div = document_->createElement("DIV", ec_); + body_->appendChild(div, ec_); + + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + mock_delegate_->Reset(); + + // There should be an event fired in case parent node is known to client, + // but the event should not be specific. + mock_delegate_->HasChildrenUpdated(kBodyElemId, false); + mock_delegate_->Replay(); + + body_->removeChild(div.get(), ec_); + mock_delegate_->Verify(); +} + +// Tests that "child node inserted" event is being fired. +TEST_F(DomAgentTests, ChildNodeRemovedKnownChildren) { + RefPtr<Element> div = document_->createElement("DIV", ec_); + body_->appendChild(div, ec_); + + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + dom_agent_->GetChildNodes(kBodyElemId); + mock_delegate_->Reset(); + + // There should be an event fired in case parent node is known to client, + // Since children were already requested, event should have removed child id. + mock_delegate_->ChildNodeRemoved(kBodyElemId, 3); + mock_delegate_->Replay(); + + body_->removeChild(div.get(), ec_); + mock_delegate_->Verify(); +} + +// Tests that "GetPathToNode" sends all missing events in path. +TEST_F(DomAgentTests, GetPathToKnownNode) { + RefPtr<Element> div1 = document_->createElement("DIV", ec_); + body_->appendChild(div1, ec_); + + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + dom_agent_->GetChildNodes(kBodyElemId); + mock_delegate_->Reset(); + + // We expect no messages - node is already known. + mock_delegate_->Replay(); + + int id = dom_agent_->GetPathToNode(div1.get()); + mock_delegate_->Verify(); + EXPECT_EQ(3, id); +} + +// Tests that "GetPathToNode" sends all missing events in path. +TEST_F(DomAgentTests, GetPathToKnownParent) { + RefPtr<Element> div1 = document_->createElement("DIV", ec_); + body_->appendChild(div1, ec_); + + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + mock_delegate_->Reset(); + + OwnPtr<Value> v1(DevToolsRpc::ParseMessage("[[3,1,\"DIV\",\"\",[],0]]")); + mock_delegate_->ChildNodesUpdated(kBodyElemId, *v1.get()); + mock_delegate_->Replay(); + + int id = dom_agent_->GetPathToNode(div1.get()); + mock_delegate_->Verify(); + EXPECT_EQ(3, id); +} + +// Tests that "GetPathToNode" sends all missing events in path. +TEST_F(DomAgentTests, GetPathToUnknownNode) { + RefPtr<Element> div1 = document_->createElement("DIV", ec_); + RefPtr<Element> div2 = document_->createElement("DIV", ec_); + RefPtr<Element> div3 = document_->createElement("DIV", ec_); + RefPtr<Element> div4 = document_->createElement("DIV", ec_); + body_->appendChild(div1, ec_); + div1->appendChild(div2, ec_); + div2->appendChild(div3, ec_); + div3->appendChild(div4, ec_); + + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + mock_delegate_->Reset(); + + OwnPtr<Value> v1(DevToolsRpc::ParseMessage("[[3,1,\"DIV\",\"\",[],1]]")); + OwnPtr<Value> v2(DevToolsRpc::ParseMessage("[[4,1,\"DIV\",\"\",[],1]]")); + OwnPtr<Value> v3(DevToolsRpc::ParseMessage("[[5,1,\"DIV\",\"\",[],1]]")); + OwnPtr<Value> v4(DevToolsRpc::ParseMessage("[[6,1,\"DIV\",\"\",[],0]]")); + mock_delegate_->ChildNodesUpdated(kBodyElemId, *v1.get()); + mock_delegate_->ChildNodesUpdated(3, *v2.get()); + mock_delegate_->ChildNodesUpdated(4, *v3.get()); + mock_delegate_->ChildNodesUpdated(5, *v4.get()); + mock_delegate_->Replay(); + + int id = dom_agent_->GetPathToNode(div4.get()); + mock_delegate_->Verify(); + EXPECT_EQ(6, id); +} + +// Tests that "GetChildNodes" crosses frame owner boundaries. +TEST_F(DomAgentTests, GetChildNodesOfFrameOwner) { + RefPtr<Element> iframe = document_->createElement("IFRAME", ec_); + body_->appendChild(iframe, ec_); + + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + dom_agent_->GetChildNodes(kBodyElemId); + mock_delegate_->Reset(); + + // Expecting HTML child with single (body) child. + OwnPtr<Value> v(DevToolsRpc::ParseMessage("[[4,1,\"HTML\",\"\",[],1]]")); + mock_delegate_->ChildNodesUpdated(3, *v.get()); + mock_delegate_->Replay(); + + dom_agent_->GetChildNodes(3); + mock_delegate_->Verify(); +} + +// Tests that "GetPathToNode" crosses frame owner boundaries. +TEST_F(DomAgentTests, GetPathToNodeOverFrameOwner) { + RefPtr<Element> iframe = document_->createElement("IFRAME", ec_); + body_->appendChild(iframe, ec_); + HTMLFrameOwnerElement* frame_owner = + static_cast<HTMLFrameOwnerElement*>(iframe.get()); + Node* inner_body = frame_owner->contentDocument()->firstChild()-> + firstChild(); + + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + mock_delegate_->Reset(); + + OwnPtr<Value> v1(DevToolsRpc::ParseMessage("[[3,1,\"IFRAME\",\"\",[],1]]")); + OwnPtr<Value> v2(DevToolsRpc::ParseMessage("[[4,1,\"HTML\",\"\",[],1]]")); + OwnPtr<Value> v3(DevToolsRpc::ParseMessage("[[5,1,\"BODY\",\"\",[],0]]")); + mock_delegate_->ChildNodesUpdated(2, *v1.get()); + mock_delegate_->ChildNodesUpdated(3, *v2.get()); + mock_delegate_->ChildNodesUpdated(4, *v3.get()); + + mock_delegate_->Replay(); + + dom_agent_->GetPathToNode(inner_body); + mock_delegate_->Verify(); +} + +// Tests that "child node inserted" event is being fired. +TEST_F(DomAgentTests, ChildNodeInsertUnderFrameOwner) { + RefPtr<Element> iframe = document_->createElement("IFRAME", ec_); + body_->appendChild(iframe, ec_); + HTMLFrameOwnerElement* frame_owner = + static_cast<HTMLFrameOwnerElement*>(iframe.get()); + Node* inner_body = frame_owner->contentDocument()->firstChild()-> + firstChild(); + + dom_agent_->GetDocumentElement(); + dom_agent_->GetChildNodes(kHtmlElemId); + dom_agent_->GetChildNodes(kBodyElemId); + dom_agent_->GetChildNodes(3); // IFrame children + dom_agent_->GetChildNodes(4); // IFrame html's children + dom_agent_->GetChildNodes(5); // IFrame body's children + mock_delegate_->Reset(); + + // There should be an event fired in case parent node is known to client, + // Since children were already requested, event should have all the + // new child data. + OwnPtr<Value> v(DevToolsRpc::ParseMessage("[6,1,\"DIV\",\"\",[],0]")); + mock_delegate_->ChildNodeInserted(5, 0, *v.get()); + mock_delegate_->Replay(); + + RefPtr<Element> new_div = document_->createElement("DIV", ec_); + inner_body->appendChild(new_div.get(), ec_, false); + mock_delegate_->Verify(); +} + +} // namespace diff --git a/webkit/glue/devtools/net_agent.h b/webkit/glue/devtools/net_agent.h new file mode 100644 index 0000000..00db4af0 --- /dev/null +++ b/webkit/glue/devtools/net_agent.h @@ -0,0 +1,40 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_DEVTOOLS_NET_AGENT_H_ +#define WEBKIT_GLUE_DEVTOOLS_NET_AGENT_H_ + +#include "webkit/glue/devtools/devtools_rpc.h" + +// NetAgent is a utility object that covers network-related functionality of the +// WebDevToolsAgent. It is capable of sniffing network calls and passing the +// HTTPRequest-related data to the client. +// NetAgent's environment is represented with the NetAgentDelegate interface. +#define NET_AGENT_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3) \ + /* Requests that the agent sends content of the resource with given id to the + delegate. */ \ + METHOD2(GetResourceContent, int /* identifier */, String /* url */) + +DEFINE_RPC_CLASS(NetAgent, NET_AGENT_STRUCT) + +#define NET_AGENT_DELEGATE_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3) \ + /* Notifies the delegate that a request is about to be sent out. */ \ + METHOD2(WillSendRequest, int, Value) \ + \ + /* Notifies the delegate that response has been received. */ \ + METHOD2(DidReceiveResponse, int /* identifier */, Value /* request */) \ + \ + /* Notifies the delegate that resource loading has been finished with no + errors */ \ + METHOD2(DidFinishLoading, int /* identifier */, Value /* response */) \ + \ + /* Notifies the delegate that resource loading has failed. */ \ + METHOD2(DidFailLoading, int /* identifier */, Value /* response */) \ + \ + /* Calls delegate back with requested resource content. */ \ + METHOD2(SetResourceContent, int /* identifier */, String /* content */) + +DEFINE_RPC_CLASS(NetAgentDelegate, NET_AGENT_DELEGATE_STRUCT) + +#endif // WEBKIT_GLUE_DEVTOOLS_NET_AGENT_H_ diff --git a/webkit/glue/devtools/net_agent_impl.cc b/webkit/glue/devtools/net_agent_impl.cc new file mode 100644 index 0000000..67fe1b8 --- /dev/null +++ b/webkit/glue/devtools/net_agent_impl.cc @@ -0,0 +1,204 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "config.h" + +#include "webkit/glue/devtools/net_agent_impl.h" + +#include "CachedCSSStyleSheet.h" +#include "CachedResource.h" +#include "CachedScript.h" +#include "CachedXSLStyleSheet.h" +#include "DocLoader.h" +#include "Document.h" +#include "DocumentLoader.h" +#include "FrameLoader.h" +#include "HTTPHeaderMap.h" +#include "KURL.h" +#include "PlatformString.h" +#include "ResourceError.h" +#include "ResourceRequest.h" +#include "ResourceResponse.h" +#include "TextEncoding.h" +#include <wtf/CurrentTime.h> +#undef LOG + +#include "base/basictypes.h" +#include "base/values.h" +#include "googleurl/src/gurl.h" +#include "webkit/glue/glue_util.h" + +using namespace WebCore; + +NetAgentImpl::NetAgentImpl(NetAgentDelegate* delegate) + : delegate_(delegate), + document_(NULL), + last_cached_identifier_(-2) { +} + +NetAgentImpl::~NetAgentImpl() { + SetDocument(NULL); +} + +void NetAgentImpl::SetDocument(Document* doc) { +// loaders_.clear(); + document_ = doc; +} + +void NetAgentImpl::AssignIdentifierToRequest( + DocumentLoader* loader, + int identifier, + const ResourceRequest& request) { + loaders_.set(identifier, loader); +} + +void NetAgentImpl::WillSendRequest( + DocumentLoader* loader, + int identifier, + const ResourceRequest& request) { + KURL url = request.url(); + DictionaryValue value; + value.SetReal(L"startTime", WTF::currentTime()); + value.SetString(L"url", webkit_glue::StringToStdString(url.string())); + value.SetString(L"domain", webkit_glue::StringToStdString(url.host())); + value.SetString(L"path", webkit_glue::StringToStdString(url.path())); + value.SetString(L"lastPathComponent", + webkit_glue::StringToStdString(url.lastPathComponent())); + value.Set(L"requestHeaders", + BuildValueForHeaders(request.httpHeaderFields())); + delegate_->WillSendRequest(identifier, value); +} + +void NetAgentImpl::DidReceiveResponse( + DocumentLoader* loader, + int identifier, + const ResourceResponse &response) { + if (!document_) { + return; + } + KURL url = response.url(); + + DictionaryValue value; + value.SetReal(L"responseReceivedTime", WTF::currentTime()); + value.SetString(L"url", + webkit_glue::StringToStdWString(url.string())); + value.SetInteger(L"expectedContentLength", + static_cast<int>(response.expectedContentLength())); + value.SetInteger(L"responseStatusCode", response.httpStatusCode()); + value.SetString(L"mimeType", + webkit_glue::StringToStdWString(response.mimeType())); + value.SetString(L"suggestedFilename", + webkit_glue::StringToStdWString(response.suggestedFilename())); + value.Set(L"responseHeaders", + BuildValueForHeaders(response.httpHeaderFields())); + + delegate_->DidReceiveResponse(identifier, value); +} + +void NetAgentImpl::DidReceiveContentLength( + DocumentLoader* loader, + int identifier, + int length) { +} + +void NetAgentImpl::DidFinishLoading( + DocumentLoader* loader, + int identifier) { + DictionaryValue value; + value.SetReal(L"endTime", WTF::currentTime()); + delegate_->DidFinishLoading(identifier, value); +} + +void NetAgentImpl::DidFailLoading( + DocumentLoader* loader, + int identifier, + const ResourceError& error) { + DictionaryValue value; + value.SetReal(L"endTime", WTF::currentTime()); + value.SetInteger(L"errorCode", error.errorCode()); + value.SetString(L"localizedDescription", + webkit_glue::StringToStdString(error.localizedDescription())); + delegate_->DidFailLoading(identifier, value); +} + +void NetAgentImpl::DidLoadResourceFromMemoryCache( + DocumentLoader* loader, + const ResourceRequest& request, + const ResourceResponse& response, + int length) { + int identifier = last_cached_identifier_--; + loaders_.set(identifier, loader); +} + +void NetAgentImpl::GetResourceContent( + int identifier, + const String& url) { + if (!document_) { + return; + } + HashMap<int, RefPtr<DocumentLoader> >::iterator it = + loaders_.find(identifier); + if (it == loaders_.end() || !it->second) { + return; + } + + RefPtr<DocumentLoader> loader = it->second; + String source; + + if (url == loader->requestURL()) { + RefPtr<SharedBuffer> buffer = loader->mainResourceData(); + String text_encoding_name = document_->inputEncoding(); + if (buffer) { + WebCore::TextEncoding encoding(text_encoding_name); + if (!encoding.isValid()) + encoding = WindowsLatin1Encoding(); + source = encoding.decode(buffer->data(), buffer->size()); + } + } else { + CachedResource* cachedResource = document_-> + docLoader()->cachedResource(url); + if (!cachedResource->isPurgeable()) { + // TODO(pfeldman): Try making unpurgeable. + return; + } + + // Try to get the decoded source. Only applies to some CachedResource + // types. + switch (cachedResource->type()) { + case CachedResource::CSSStyleSheet: { + CachedCSSStyleSheet *sheet = + reinterpret_cast<CachedCSSStyleSheet*>(cachedResource); + source = sheet->sheetText(); + break; + } + case CachedResource::Script: { + CachedScript *script = + reinterpret_cast<CachedScript*>(cachedResource); + source = script->script(); + break; + } +#if ENABLE(XSLT) + case CachedResource::XSLStyleSheet: { + CachedXSLStyleSheet *sheet = + reinterpret_cast<CachedXSLStyleSheet*>(cachedResource); + source = sheet->sheet(); + break; + } +#endif + default: + break; + } + } + delegate_->SetResourceContent(identifier, source); +} + +Value* NetAgentImpl::BuildValueForHeaders(const HTTPHeaderMap& headers) { + OwnPtr<DictionaryValue> value(new DictionaryValue()); + HTTPHeaderMap::const_iterator end = headers.end(); + for (HTTPHeaderMap::const_iterator it = headers.begin(); it != end; ++it) { + value->SetString(webkit_glue::StringToStdWString(it->first), + webkit_glue::StringToStdString(it->second)); + } + return value.release(); +} diff --git a/webkit/glue/devtools/net_agent_impl.h b/webkit/glue/devtools/net_agent_impl.h new file mode 100644 index 0000000..b9d56fc --- /dev/null +++ b/webkit/glue/devtools/net_agent_impl.h @@ -0,0 +1,80 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_DEVTOOLS_NET_AGENT_IMPL_H_ +#define WEBKIT_GLUE_DEVTOOLS_NET_AGENT_IMPL_H_ + +#include <wtf/HashMap.h> +#include <wtf/RefCounted.h> +#include <wtf/RefPtr.h> + +#include "webkit/glue/devtools/net_agent.h" + +namespace WebCore { +class Document; +class DocumentLoader; +class HTTPHeaderMap; +class ResourceError; +class ResourceResponse; +class String; +struct ResourceRequest; +} + +class Value; + +// NetAgent is a utility object that covers network-related functionality of the +// WebDevToolsAgent. It is capable of sniffing network calls and passing the +// HttpRequest-related data to the client. +// NetAgent's environment is represented with the NetAgentDelegate interface. +class NetAgentImpl : public NetAgent { + public: + explicit NetAgentImpl(NetAgentDelegate* delegate); + virtual ~NetAgentImpl(); + + // Initializes net agent with the given document. + void SetDocument(WebCore::Document* document); + + // NetAgent implementation. + void GetResourceContent(int identifier, const WebCore::String& request_url); + void AssignIdentifierToRequest( + WebCore::DocumentLoader* loader, + int identifier, + const WebCore::ResourceRequest& request); + void WillSendRequest( + WebCore::DocumentLoader* loader, + int identifier, + const WebCore::ResourceRequest& request); + void DidReceiveResponse( + WebCore::DocumentLoader* loader, + int identifier, + const WebCore::ResourceResponse &response); + void DidReceiveContentLength( + WebCore::DocumentLoader* loader, + int identifier, + int length); + void DidFinishLoading( + WebCore::DocumentLoader* loader, + int identifier); + void DidFailLoading( + WebCore::DocumentLoader* loader, + int identifier, + const WebCore::ResourceError& error); + void DidLoadResourceFromMemoryCache( + WebCore::DocumentLoader* loader, + const WebCore::ResourceRequest& request, + const WebCore::ResourceResponse& response, + int length); + + private: + // Serializes headers map into a value. + Value* BuildValueForHeaders(const WebCore::HTTPHeaderMap& headers); + + NetAgentDelegate* delegate_; + WebCore::Document* document_; + HashMap<int, RefPtr<WebCore::DocumentLoader> > loaders_; + int last_cached_identifier_; + DISALLOW_COPY_AND_ASSIGN(NetAgentImpl); +}; + +#endif // WEBKIT_GLUE_DEVTOOLS_NET_AGENT_IMPL_H_ diff --git a/webkit/glue/devtools/tools_agent.h b/webkit/glue/devtools/tools_agent.h new file mode 100644 index 0000000..0d1bde9 --- /dev/null +++ b/webkit/glue/devtools/tools_agent.h @@ -0,0 +1,32 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_DEVTOOLS_TOOLS_AGENT_H_ +#define WEBKIT_GLUE_DEVTOOLS_TOOLS_AGENT_H_ + +#include "webkit/glue/devtools/devtools_rpc.h" + +// Tools agent provides API for enabling / disabling other agents as well as +// API for auxiliary UI functions such as dom elements highlighting. +#define TOOLS_AGENT_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3) \ + /* Enables / disables Dom agent. */ \ + METHOD1(SetDomAgentEnabled, bool /* enabled */) \ + \ + /* Enables / disables Net agent */ \ + METHOD1(SetNetAgentEnabled, bool /* enabled */) \ + \ + /* Highlights Dom node with given ID */ \ + METHOD1(HighlightDOMNode, int /* node_id */) \ + \ + /* Clears Dom Node highlight. */ \ + METHOD0(HideDOMNodeHighlight) + +DEFINE_RPC_CLASS(ToolsAgent, TOOLS_AGENT_STRUCT) + +#define TOOLS_AGENT_DELEGATE_STRUCT(METHOD0, METHOD1, METHOD2, METHOD3) \ + METHOD1(UpdateFocusedNode, int /* node_id */) \ + +DEFINE_RPC_CLASS(ToolsAgentDelegate, TOOLS_AGENT_DELEGATE_STRUCT) + +#endif // WEBKIT_GLUE_DEVTOOLS_TOOLS_AGENT_H_ diff --git a/webkit/glue/glue.vcproj b/webkit/glue/glue.vcproj index f88923e..332bb54 100644 --- a/webkit/glue/glue.vcproj +++ b/webkit/glue/glue.vcproj @@ -1,843 +1,915 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8.00"
- Name="Glue"
- ProjectGUID="{C66B126D-0ECE-4CA2-B6DC-FA780AFBBF09}"
- RootNamespace="glue"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- ConfigurationType="4"
- InheritedPropertySheets="$(SolutionDir)..\build\debug.vsprops;.\glue.vsprops;..\build\WebKit\using_WebKit.vsprops"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- ConfigurationType="4"
- InheritedPropertySheets="$(SolutionDir)..\build\release.vsprops;.\glue.vsprops;..\build\WebKit\using_WebKit.vsprops"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="API"
- >
- <File
- RelativePath=".\autofill_form.cc"
- >
- </File>
- <File
- RelativePath=".\autofill_form.h"
- >
- </File>
- <File
- RelativePath=".\cache_manager.h"
- >
- </File>
- <File
- RelativePath=".\console_message_level.h"
- >
- </File>
- <File
- RelativePath=".\context_menu.h"
- >
- </File>
- <File
- RelativePath=".\cpp_bound_class.h"
- >
- </File>
- <File
- RelativePath=".\cpp_variant.h"
- >
- </File>
- <File
- RelativePath=".\dom_operations.h"
- >
- </File>
- <File
- RelativePath=".\form_data.h"
- >
- </File>
- <File
- RelativePath=".\image_decoder.h"
- >
- </File>
- <File
- RelativePath=".\password_form.h"
- >
- </File>
- <File
- RelativePath=".\resource_type.h"
- >
- </File>
- <File
- RelativePath=".\screen_info.h"
- >
- </File>
- <File
- RelativePath=".\webdatasource.h"
- >
- </File>
- <File
- RelativePath=".\weberror.h"
- >
- </File>
- <File
- RelativePath=".\webframe.h"
- >
- </File>
- <File
- RelativePath=".\webhistoryitem.h"
- >
- </File>
- <File
- RelativePath=".\webinputevent.h"
- >
- </File>
- <File
- RelativePath=".\webinputevent_win.cc"
- >
- </File>
- <File
- RelativePath=".\webmediaplayer.h"
- >
- </File>
- <File
- RelativePath=".\webmediaplayer_delegate.h"
- >
- </File>
- <File
- RelativePath=".\webplugin.h"
- >
- </File>
- <File
- RelativePath=".\webplugin_delegate.h"
- >
- </File>
- <File
- RelativePath=".\webpreferences.h"
- >
- </File>
- <File
- RelativePath=".\webresponse.h"
- >
- </File>
- <File
- RelativePath=".\webtextinput.h"
- >
- </File>
- <File
- RelativePath=".\weburlrequest.h"
- >
- </File>
- <File
- RelativePath=".\webview.h"
- >
- </File>
- <File
- RelativePath=".\webview_delegate.h"
- >
- </File>
- <File
- RelativePath=".\webwidget.h"
- >
- </File>
- <File
- RelativePath=".\webwidget_delegate.h"
- >
- </File>
- <File
- RelativePath=".\webworker.h"
- >
- </File>
- <File
- RelativePath=".\webworkerclient.h"
- >
- </File>
- <File
- RelativePath=".\window_open_disposition.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Library"
- >
- <File
- RelativePath="..\pending\AccessibleBase.cpp"
- >
- </File>
- <File
- RelativePath="..\pending\AccessibleBase.h"
- >
- </File>
- <File
- RelativePath="..\pending\AccessibleDocument.cpp"
- >
- </File>
- <File
- RelativePath="..\pending\AccessibleDocument.h"
- >
- </File>
- <File
- RelativePath=".\alt_404_page_resource_fetcher.cc"
- >
- </File>
- <File
- RelativePath=".\alt_404_page_resource_fetcher.h"
- >
- </File>
- <File
- RelativePath=".\alt_error_page_resource_fetcher.cc"
- >
- </File>
- <File
- RelativePath=".\alt_error_page_resource_fetcher.h"
- >
- </File>
- <File
- RelativePath=".\back_forward_list_client_impl.cc"
- >
- </File>
- <File
- RelativePath=".\back_forward_list_client_impl.h"
- >
- </File>
- <File
- RelativePath=".\cache_manager.cc"
- >
- </File>
- <File
- RelativePath=".\chrome_client_impl.cc"
- >
- </File>
- <File
- RelativePath=".\chrome_client_impl.h"
- >
- </File>
- <File
- RelativePath=".\chromium_bridge_impl.cc"
- >
- </File>
- <File
- RelativePath=".\clipboard_conversion.cc"
- >
- </File>
- <File
- RelativePath=".\clipboard_conversion.h"
- >
- </File>
- <File
- RelativePath=".\context_menu_client_impl.cc"
- >
- </File>
- <File
- RelativePath=".\context_menu_client_impl.h"
- >
- </File>
- <File
- RelativePath=".\cpp_binding_example.cc"
- >
- </File>
- <File
- RelativePath=".\cpp_bound_class.cc"
- >
- </File>
- <File
- RelativePath=".\cpp_variant.cc"
- >
- </File>
- <File
- RelativePath=".\debugger_bridge.cc"
- >
- </File>
- <File
- RelativePath=".\debugger_bridge.h"
- >
- </File>
- <File
- RelativePath=".\dom_operations.cc"
- >
- </File>
- <File
- RelativePath=".\dom_operations_private.h"
- >
- </File>
- <File
- RelativePath=".\dom_serializer.cc"
- >
- </File>
- <File
- RelativePath=".\dom_serializer.h"
- >
- </File>
- <File
- RelativePath=".\dom_serializer_delegate.h"
- >
- </File>
- <File
- RelativePath=".\dragclient_impl.cc"
- >
- </File>
- <File
- RelativePath=".\dragclient_impl.h"
- >
- </File>
- <File
- RelativePath=".\editor_client_impl.cc"
- >
- </File>
- <File
- RelativePath=".\editor_client_impl.h"
- >
- </File>
- <File
- RelativePath=".\entity_map.cc"
- >
- </File>
- <File
- RelativePath=".\entity_map.h"
- >
- </File>
- <File
- RelativePath=".\event_conversion.cc"
- >
- </File>
- <File
- RelativePath=".\event_conversion.h"
- >
- </File>
- <File
- RelativePath=".\feed_preview.cc"
- >
- </File>
- <File
- RelativePath=".\feed_preview.h"
- >
- </File>
- <File
- RelativePath=".\glue_accessibility.cc"
- >
- </File>
- <File
- RelativePath=".\glue_accessibility.h"
- >
- </File>
- <File
- RelativePath=".\glue_serialize.cc"
- >
- </File>
- <File
- RelativePath=".\glue_serialize.h"
- >
- </File>
- <File
- RelativePath=".\glue_util.cc"
- >
- </File>
- <File
- RelativePath=".\glue_util.h"
- >
- </File>
- <File
- RelativePath=".\image_decoder.cc"
- >
- </File>
- <File
- RelativePath=".\image_resource_fetcher.cc"
- >
- </File>
- <File
- RelativePath=".\image_resource_fetcher.h"
- >
- </File>
- <File
- RelativePath=".\inspector_client_impl.cc"
- >
- </File>
- <File
- RelativePath=".\inspector_client_impl.h"
- >
- </File>
- <File
- RelativePath=".\localized_strings.cc"
- >
- </File>
- <File
- RelativePath=".\media_player_private_impl.cc"
- >
- </File>
- <File
- RelativePath=".\multipart_response_delegate.cc"
- >
- </File>
- <File
- RelativePath=".\multipart_response_delegate.h"
- >
- </File>
- <File
- RelativePath=".\npruntime_util.cc"
- >
- </File>
- <File
- RelativePath=".\npruntime_util.h"
- >
- </File>
- <File
- RelativePath=".\password_autocomplete_listener.cc"
- >
- </File>
- <File
- RelativePath=".\password_autocomplete_listener.h"
- >
- </File>
- <File
- RelativePath=".\password_form_dom_manager.cc"
- >
- </File>
- <File
- RelativePath=".\password_form_dom_manager.h"
- >
- </File>
- <File
- RelativePath=".\resource.h"
- >
- </File>
- <File
- RelativePath=".\resource_fetcher.cc"
- >
- </File>
- <File
- RelativePath=".\resource_fetcher.h"
- >
- </File>
- <File
- RelativePath=".\resource_handle_impl.cc"
- >
- </File>
- <File
- RelativePath=".\resource_loader_bridge.cc"
- >
- </File>
- <File
- RelativePath=".\resource_loader_bridge.h"
- >
- </File>
- <File
- RelativePath=".\scoped_clipboard_writer_glue.h"
- >
- </File>
- <File
- RelativePath=".\searchable_form_data.cc"
- >
- </File>
- <File
- RelativePath=".\searchable_form_data.h"
- >
- </File>
- <File
- RelativePath=".\simple_webmimeregistry_impl.cc"
- >
- </File>
- <File
- RelativePath=".\simple_webmimeregistry_impl.h"
- >
- </File>
- <File
- RelativePath=".\stacking_order_iterator.cc"
- >
- </File>
- <File
- RelativePath=".\stacking_order_iterator.h"
- >
- </File>
- <File
- RelativePath=".\webclipboard_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webclipboard_impl.h"
- >
- </File>
- <File
- RelativePath=".\webcursor.cc"
- >
- </File>
- <File
- RelativePath=".\webcursor.h"
- >
- </File>
- <File
- RelativePath=".\webcursor_win.cc"
- >
- </File>
- <File
- RelativePath=".\webdatasource_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webdatasource_impl.h"
- >
- </File>
- <File
- RelativePath=".\webdocumentloader_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webdocumentloader_impl.h"
- >
- </File>
- <File
- RelativePath=".\webdropdata.cc"
- >
- </File>
- <File
- RelativePath=".\webdropdata.h"
- >
- </File>
- <File
- RelativePath=".\weberror_impl.cc"
- >
- </File>
- <File
- RelativePath=".\weberror_impl.h"
- >
- </File>
- <File
- RelativePath=".\webframe_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webframe_impl.h"
- >
- </File>
- <File
- RelativePath=".\webframeloaderclient_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webframeloaderclient_impl.h"
- >
- </File>
- <File
- RelativePath=".\webhistoryitem_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webhistoryitem_impl.h"
- >
- </File>
- <File
- RelativePath=".\webinputevent_util.cc"
- >
- </File>
- <File
- RelativePath=".\webinputevent_util.h"
- >
- </File>
- <File
- RelativePath=".\webkit_glue.cc"
- >
- </File>
- <File
- RelativePath=".\webkit_glue.h"
- >
- </File>
- <File
- RelativePath=".\webkit_glue_win.cc"
- >
- </File>
- <File
- RelativePath=".\webkitclient_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webkitclient_impl.h"
- >
- </File>
- <File
- RelativePath=".\webmediaplayer_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webmediaplayer_impl.h"
- >
- </File>
- <File
- RelativePath=".\webplugin_delegate.cc"
- >
- </File>
- <File
- RelativePath=".\webplugin_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webplugin_impl.h"
- >
- </File>
- <File
- RelativePath=".\webresponse_impl.h"
- >
- </File>
- <File
- RelativePath=".\webtextinput_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webtextinput_impl.h"
- >
- </File>
- <File
- RelativePath=".\webthemeengine_impl_win.cc"
- >
- </File>
- <File
- RelativePath=".\webthemeengine_impl_win.h"
- >
- </File>
- <File
- RelativePath=".\weburlrequest_impl.cc"
- >
- </File>
- <File
- RelativePath=".\weburlrequest_impl.h"
- >
- </File>
- <File
- RelativePath=".\webview_delegate.cc"
- >
- </File>
- <File
- RelativePath=".\webview_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webview_impl.h"
- >
- </File>
- <File
- RelativePath=".\webwidget_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webwidget_impl.h"
- >
- </File>
- <File
- RelativePath=".\webworker_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webworker_impl.h"
- >
- </File>
- <File
- RelativePath=".\webworkerclient_impl.cc"
- >
- </File>
- <File
- RelativePath=".\webworkerclient_impl.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Plugins"
- >
- <File
- RelativePath=".\plugins\mozilla_extensions.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\mozilla_extensions.h"
- >
- </File>
- <File
- RelativePath=".\plugins\nphostapi.h"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_constants_win.h"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_host.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_host.h"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_instance.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_instance.h"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_lib.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_lib.h"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_lib_win.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_list.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_list.h"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_list_win.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_stream.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_stream.h"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_stream_url.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_stream_url.h"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_stream_win.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_string_stream.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\plugin_string_stream.h"
- >
- </File>
- <File
- RelativePath=".\plugins\webplugin_delegate_impl.cc"
- >
- </File>
- <File
- RelativePath=".\plugins\webplugin_delegate_impl.h"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="Glue" + ProjectGUID="{C66B126D-0ECE-4CA2-B6DC-FA780AFBBF09}" + RootNamespace="glue" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + ConfigurationType="4" + InheritedPropertySheets="$(SolutionDir)..\build\debug.vsprops;.\glue.vsprops;..\build\WebKit\using_WebKit.vsprops" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="4" + InheritedPropertySheets="$(SolutionDir)..\build\release.vsprops;.\glue.vsprops;..\build\WebKit\using_WebKit.vsprops" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="API" + > + <File + RelativePath=".\autofill_form.cc" + > + </File> + <File + RelativePath=".\autofill_form.h" + > + </File> + <File + RelativePath=".\cache_manager.h" + > + </File> + <File + RelativePath=".\console_message_level.h" + > + </File> + <File + RelativePath=".\context_menu.h" + > + </File> + <File + RelativePath=".\cpp_bound_class.h" + > + </File> + <File + RelativePath=".\cpp_variant.h" + > + </File> + <File + RelativePath=".\dom_operations.h" + > + </File> + <File + RelativePath=".\form_data.h" + > + </File> + <File + RelativePath=".\image_decoder.h" + > + </File> + <File + RelativePath=".\password_form.h" + > + </File> + <File + RelativePath=".\resource_type.h" + > + </File> + <File + RelativePath=".\screen_info.h" + > + </File> + <File + RelativePath=".\webdatasource.h" + > + </File> + <File + RelativePath=".\weberror.h" + > + </File> + <File + RelativePath=".\webframe.h" + > + </File> + <File + RelativePath=".\webhistoryitem.h" + > + </File> + <File + RelativePath=".\webinputevent.h" + > + </File> + <File + RelativePath=".\webinputevent_win.cc" + > + </File> + <File + RelativePath=".\webmediaplayer.h" + > + </File> + <File + RelativePath=".\webmediaplayer_delegate.h" + > + </File> + <File + RelativePath=".\webplugin.h" + > + </File> + <File + RelativePath=".\webplugin_delegate.h" + > + </File> + <File + RelativePath=".\webpreferences.h" + > + </File> + <File + RelativePath=".\webresponse.h" + > + </File> + <File + RelativePath=".\webtextinput.h" + > + </File> + <File + RelativePath=".\weburlrequest.h" + > + </File> + <File + RelativePath=".\webview.h" + > + </File> + <File + RelativePath=".\webview_delegate.h" + > + </File> + <File + RelativePath=".\webwidget.h" + > + </File> + <File + RelativePath=".\webwidget_delegate.h" + > + </File> + <File + RelativePath=".\webworker.h" + > + </File> + <File + RelativePath=".\webworkerclient.h" + > + </File> + <File + RelativePath=".\window_open_disposition.h" + > + </File> + </Filter> + <Filter + Name="Library" + > + <File + RelativePath="..\pending\AccessibleBase.cpp" + > + </File> + <File + RelativePath="..\pending\AccessibleBase.h" + > + </File> + <File + RelativePath="..\pending\AccessibleDocument.cpp" + > + </File> + <File + RelativePath="..\pending\AccessibleDocument.h" + > + </File> + <File + RelativePath=".\alt_404_page_resource_fetcher.cc" + > + </File> + <File + RelativePath=".\alt_404_page_resource_fetcher.h" + > + </File> + <File + RelativePath=".\alt_error_page_resource_fetcher.cc" + > + </File> + <File + RelativePath=".\alt_error_page_resource_fetcher.h" + > + </File> + <File + RelativePath=".\back_forward_list_client_impl.cc" + > + </File> + <File + RelativePath=".\back_forward_list_client_impl.h" + > + </File> + <File + RelativePath=".\cache_manager.cc" + > + </File> + <File + RelativePath=".\chrome_client_impl.cc" + > + </File> + <File + RelativePath=".\chrome_client_impl.h" + > + </File> + <File + RelativePath=".\chromium_bridge_impl.cc" + > + </File> + <File + RelativePath=".\clipboard_conversion.cc" + > + </File> + <File + RelativePath=".\clipboard_conversion.h" + > + </File> + <File + RelativePath=".\context_menu_client_impl.cc" + > + </File> + <File + RelativePath=".\context_menu_client_impl.h" + > + </File> + <File + RelativePath=".\cpp_binding_example.cc" + > + </File> + <File + RelativePath=".\cpp_bound_class.cc" + > + </File> + <File + RelativePath=".\cpp_variant.cc" + > + </File> + <File + RelativePath=".\debugger_bridge.cc" + > + </File> + <File + RelativePath=".\debugger_bridge.h" + > + </File> + <File + RelativePath=".\dom_operations.cc" + > + </File> + <File + RelativePath=".\dom_operations_private.h" + > + </File> + <File + RelativePath=".\dom_serializer.cc" + > + </File> + <File + RelativePath=".\dom_serializer.h" + > + </File> + <File + RelativePath=".\dom_serializer_delegate.h" + > + </File> + <File + RelativePath=".\dragclient_impl.cc" + > + </File> + <File + RelativePath=".\dragclient_impl.h" + > + </File> + <File + RelativePath=".\editor_client_impl.cc" + > + </File> + <File + RelativePath=".\editor_client_impl.h" + > + </File> + <File + RelativePath=".\entity_map.cc" + > + </File> + <File + RelativePath=".\entity_map.h" + > + </File> + <File + RelativePath=".\event_conversion.cc" + > + </File> + <File + RelativePath=".\event_conversion.h" + > + </File> + <File + RelativePath=".\feed_preview.cc" + > + </File> + <File + RelativePath=".\feed_preview.h" + > + </File> + <File + RelativePath=".\glue_accessibility.cc" + > + </File> + <File + RelativePath=".\glue_accessibility.h" + > + </File> + <File + RelativePath=".\glue_serialize.cc" + > + </File> + <File + RelativePath=".\glue_serialize.h" + > + </File> + <File + RelativePath=".\glue_util.cc" + > + </File> + <File + RelativePath=".\glue_util.h" + > + </File> + <File + RelativePath=".\image_decoder.cc" + > + </File> + <File + RelativePath=".\image_resource_fetcher.cc" + > + </File> + <File + RelativePath=".\image_resource_fetcher.h" + > + </File> + <File + RelativePath=".\inspector_client_impl.cc" + > + </File> + <File + RelativePath=".\inspector_client_impl.h" + > + </File> + <File + RelativePath=".\localized_strings.cc" + > + </File> + <File + RelativePath=".\media_player_private_impl.cc" + > + </File> + <File + RelativePath=".\multipart_response_delegate.cc" + > + </File> + <File + RelativePath=".\multipart_response_delegate.h" + > + </File> + <File + RelativePath=".\npruntime_util.cc" + > + </File> + <File + RelativePath=".\npruntime_util.h" + > + </File> + <File + RelativePath=".\password_autocomplete_listener.cc" + > + </File> + <File + RelativePath=".\password_autocomplete_listener.h" + > + </File> + <File + RelativePath=".\password_form_dom_manager.cc" + > + </File> + <File + RelativePath=".\password_form_dom_manager.h" + > + </File> + <File + RelativePath=".\resource.h" + > + </File> + <File + RelativePath=".\resource_fetcher.cc" + > + </File> + <File + RelativePath=".\resource_fetcher.h" + > + </File> + <File + RelativePath=".\resource_handle_impl.cc" + > + </File> + <File + RelativePath=".\resource_loader_bridge.cc" + > + </File> + <File + RelativePath=".\resource_loader_bridge.h" + > + </File> + <File + RelativePath=".\scoped_clipboard_writer_glue.h" + > + </File> + <File + RelativePath=".\searchable_form_data.cc" + > + </File> + <File + RelativePath=".\searchable_form_data.h" + > + </File> + <File + RelativePath=".\simple_webmimeregistry_impl.cc" + > + </File> + <File + RelativePath=".\simple_webmimeregistry_impl.h" + > + </File> + <File + RelativePath=".\stacking_order_iterator.cc" + > + </File> + <File + RelativePath=".\stacking_order_iterator.h" + > + </File> + <File + RelativePath=".\webclipboard_impl.cc" + > + </File> + <File + RelativePath=".\webclipboard_impl.h" + > + </File> + <File + RelativePath=".\webcursor.cc" + > + </File> + <File + RelativePath=".\webcursor.h" + > + </File> + <File + RelativePath=".\webcursor_win.cc" + > + </File> + <File + RelativePath=".\webdatasource_impl.cc" + > + </File> + <File + RelativePath=".\webdatasource_impl.h" + > + </File> + <File + RelativePath=".\webdevtoolsagent.h" + > + </File> + <File + RelativePath=".\webdevtoolsagent_delegate.h" + > + </File> + <File + RelativePath=".\webdevtoolsagent_impl.cc" + > + </File> + <File + RelativePath=".\webdevtoolsagent_impl.h" + > + </File> + <File + RelativePath=".\webdevtoolsclient.h" + > + </File> + <File + RelativePath=".\webdevtoolsclient_delegate.h" + > + </File> + <File + RelativePath=".\webdevtoolsclient_impl.cc" + > + </File> + <File + RelativePath=".\webdevtoolsclient_impl.h" + > + </File> + <File + RelativePath=".\webdocumentloader_impl.cc" + > + </File> + <File + RelativePath=".\webdocumentloader_impl.h" + > + </File> + <File + RelativePath=".\webdropdata.cc" + > + </File> + <File + RelativePath=".\webdropdata.h" + > + </File> + <File + RelativePath=".\weberror_impl.cc" + > + </File> + <File + RelativePath=".\weberror_impl.h" + > + </File> + <File + RelativePath=".\webframe_impl.cc" + > + </File> + <File + RelativePath=".\webframe_impl.h" + > + </File> + <File + RelativePath=".\webframeloaderclient_impl.cc" + > + </File> + <File + RelativePath=".\webframeloaderclient_impl.h" + > + </File> + <File + RelativePath=".\webhistoryitem_impl.cc" + > + </File> + <File + RelativePath=".\webhistoryitem_impl.h" + > + </File> + <File + RelativePath=".\webinputevent_util.cc" + > + </File> + <File + RelativePath=".\webinputevent_util.h" + > + </File> + <File + RelativePath=".\webkit_glue.cc" + > + </File> + <File + RelativePath=".\webkit_glue.h" + > + </File> + <File + RelativePath=".\webkit_glue_win.cc" + > + </File> + <File + RelativePath=".\webkitclient_impl.cc" + > + </File> + <File + RelativePath=".\webkitclient_impl.h" + > + </File> + <File + RelativePath=".\webmediaplayer_impl.cc" + > + </File> + <File + RelativePath=".\webmediaplayer_impl.h" + > + </File> + <File + RelativePath=".\webplugin_delegate.cc" + > + </File> + <File + RelativePath=".\webplugin_impl.cc" + > + </File> + <File + RelativePath=".\webplugin_impl.h" + > + </File> + <File + RelativePath=".\webresponse_impl.h" + > + </File> + <File + RelativePath=".\webtextinput_impl.cc" + > + </File> + <File + RelativePath=".\webtextinput_impl.h" + > + </File> + <File + RelativePath=".\webthemeengine_impl_win.cc" + > + </File> + <File + RelativePath=".\webthemeengine_impl_win.h" + > + </File> + <File + RelativePath=".\weburlrequest_impl.cc" + > + </File> + <File + RelativePath=".\weburlrequest_impl.h" + > + </File> + <File + RelativePath=".\webview_delegate.cc" + > + </File> + <File + RelativePath=".\webview_impl.cc" + > + </File> + <File + RelativePath=".\webview_impl.h" + > + </File> + <File + RelativePath=".\webwidget_impl.cc" + > + </File> + <File + RelativePath=".\webwidget_impl.h" + > + </File> + <File + RelativePath=".\webworker_impl.cc" + > + </File> + <File + RelativePath=".\webworker_impl.h" + > + </File> + <File + RelativePath=".\webworkerclient_impl.cc" + > + </File> + <File + RelativePath=".\webworkerclient_impl.h" + > + </File> + </Filter> + <Filter + Name="Plugins" + > + <File + RelativePath=".\plugins\mozilla_extensions.cc" + > + </File> + <File + RelativePath=".\plugins\mozilla_extensions.h" + > + </File> + <File + RelativePath=".\plugins\nphostapi.h" + > + </File> + <File + RelativePath=".\plugins\plugin_constants_win.h" + > + </File> + <File + RelativePath=".\plugins\plugin_host.cc" + > + </File> + <File + RelativePath=".\plugins\plugin_host.h" + > + </File> + <File + RelativePath=".\plugins\plugin_instance.cc" + > + </File> + <File + RelativePath=".\plugins\plugin_instance.h" + > + </File> + <File + RelativePath=".\plugins\plugin_lib.cc" + > + </File> + <File + RelativePath=".\plugins\plugin_lib.h" + > + </File> + <File + RelativePath=".\plugins\plugin_lib_win.cc" + > + </File> + <File + RelativePath=".\plugins\plugin_list.cc" + > + </File> + <File + RelativePath=".\plugins\plugin_list.h" + > + </File> + <File + RelativePath=".\plugins\plugin_list_win.cc" + > + </File> + <File + RelativePath=".\plugins\plugin_stream.cc" + > + </File> + <File + RelativePath=".\plugins\plugin_stream.h" + > + </File> + <File + RelativePath=".\plugins\plugin_stream_url.cc" + > + </File> + <File + RelativePath=".\plugins\plugin_stream_url.h" + > + </File> + <File + RelativePath=".\plugins\plugin_stream_win.cc" + > + </File> + <File + RelativePath=".\plugins\plugin_string_stream.cc" + > + </File> + <File + RelativePath=".\plugins\plugin_string_stream.h" + > + </File> + <File + RelativePath=".\plugins\webplugin_delegate_impl.cc" + > + </File> + <File + RelativePath=".\plugins\webplugin_delegate_impl.h" + > + </File> + </Filter> + <Filter + Name="DevTools" + > + <File + RelativePath=".\devtools\devtools_rpc.cc" + > + </File> + <File + RelativePath=".\devtools\devtools_rpc.h" + > + </File> + <File + RelativePath=".\devtools\dom_agent.h" + > + </File> + <File + RelativePath=".\devtools\dom_agent_impl.cc" + > + </File> + <File + RelativePath=".\devtools\dom_agent_impl.h" + > + </File> + <File + RelativePath=".\devtools\net_agent.h" + > + </File> + <File + RelativePath=".\devtools\net_agent_impl.cc" + > + </File> + <File + RelativePath=".\devtools\net_agent_impl.h" + > + </File> + <File + RelativePath=".\devtools\tools_agent.h" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/webkit/glue/webdevtoolsagent.h b/webkit/glue/webdevtoolsagent.h new file mode 100644 index 0000000..c6b7650 --- /dev/null +++ b/webkit/glue/webdevtoolsagent.h @@ -0,0 +1,23 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_WEBDEVTOOLSAGENT_H_ +#define WEBKIT_GLUE_WEBDEVTOOLSAGENT_H_ + +#include <string> +#include "base/basictypes.h" + +// WebDevToolsAgent represents DevTools agent sitting in the Glue. It provides +// direct and delegate Apis to the host. +class WebDevToolsAgent { + public: + WebDevToolsAgent() {} + virtual ~WebDevToolsAgent() {} + + virtual void DispatchMessageFromClient(const std::string& raw_msg) = 0; + private: + DISALLOW_COPY_AND_ASSIGN(WebDevToolsAgent); +}; + +#endif // WEBKIT_GLUE_WEBDEVTOOLSAGENT_H_ diff --git a/webkit/glue/webdevtoolsagent_delegate.h b/webkit/glue/webdevtoolsagent_delegate.h new file mode 100644 index 0000000..d1305a3 --- /dev/null +++ b/webkit/glue/webdevtoolsagent_delegate.h @@ -0,0 +1,22 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_WEBDEVTOOLSAGENT_DELEGATE_H_ +#define WEBKIT_GLUE_WEBDEVTOOLSAGENT_DELEGATE_H_ + +#include <string> +#include "base/basictypes.h" + +class WebDevToolsAgentDelegate { + public: + WebDevToolsAgentDelegate() {} + virtual ~WebDevToolsAgentDelegate() {} + + virtual void SendMessageToClient(const std::string& raw_msg) = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(WebDevToolsAgentDelegate); +}; + +#endif // WEBKIT_GLUE_WEBDEVTOOLSAGENT_DELEGATE_H_ diff --git a/webkit/glue/webdevtoolsagent_impl.cc b/webkit/glue/webdevtoolsagent_impl.cc new file mode 100644 index 0000000..ecf199c --- /dev/null +++ b/webkit/glue/webdevtoolsagent_impl.cc @@ -0,0 +1,113 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "config.h" +#include "webkit/glue/webdevtoolsagent_impl.h" + +#include <string> + +#include "Document.h" +#include "InspectorController.h" +#include "Node.h" +#include "Page.h" +#include "PlatformString.h" +#undef LOG + +#include "base/values.h" +#include "webkit/glue/devtools/dom_agent_impl.h" +#include "webkit/glue/devtools/net_agent_impl.h" +#include "webkit/glue/glue_util.h" +#include "webkit/glue/webdevtoolsagent_delegate.h" +#include "webkit/glue/webview_impl.h" + +using WebCore::Document; +using WebCore::InspectorController; +using WebCore::Node; +using WebCore::Page; +using WebCore::String; + +WebDevToolsAgentImpl::WebDevToolsAgentImpl( + WebViewImpl* web_view_impl, + WebDevToolsAgentDelegate* delegate) + : delegate_(delegate), + web_view_impl_(web_view_impl), + document_(NULL) { + dom_agent_delegate_stub_.reset(new DomAgentDelegateStub(this)); + net_agent_delegate_stub_.reset(new NetAgentDelegateStub(this)); + tools_agent_delegate_stub_.reset(new ToolsAgentDelegateStub(this)); +} + +WebDevToolsAgentImpl::~WebDevToolsAgentImpl() { +} + +void WebDevToolsAgentImpl::SetDomAgentEnabled(bool enabled) { + if (enabled && !dom_agent_impl_.get()) { + dom_agent_impl_.reset(new DomAgentImpl(dom_agent_delegate_stub_.get())); + if (document_) + dom_agent_impl_->SetDocument(document_); + } else if (!enabled && dom_agent_impl_.get()) { + dom_agent_impl_.reset(NULL); + } +} + +void WebDevToolsAgentImpl::SetNetAgentEnabled(bool enabled) { + if (enabled && !net_agent_impl_.get()) { + net_agent_impl_.reset(new NetAgentImpl(net_agent_delegate_stub_.get())); + if (document_) + net_agent_impl_->SetDocument(document_); + } else if (!enabled && net_agent_impl_.get()) { + net_agent_impl_.reset(NULL); + } +} + +void WebDevToolsAgentImpl::SetMainFrameDocumentReady(bool ready) { + if (ready) { + Page* page = web_view_impl_->page(); + document_ = page->mainFrame()->document(); + } else { + document_ = NULL; + } + if (dom_agent_impl_.get()) + dom_agent_impl_->SetDocument(document_); + if (net_agent_impl_.get()) + net_agent_impl_->SetDocument(document_); +} + +void WebDevToolsAgentImpl::HighlightDOMNode(int node_id) { + if (!dom_agent_impl_.get()) + return; + Node* node = dom_agent_impl_->GetNodeForId(node_id); + if (!node) + return; + Page* page = web_view_impl_->page(); + page->inspectorController()->highlight(node); +} + +void WebDevToolsAgentImpl::HideDOMNodeHighlight() { + Page* page = web_view_impl_->page(); + page->inspectorController()->hideHighlight(); +} + +void WebDevToolsAgentImpl::Inspect(Node* node) { + if (!dom_agent_impl_.get()) + return; + + int node_id = dom_agent_impl_->GetPathToNode(node); + tools_agent_delegate_stub_->UpdateFocusedNode(node_id); +} + +void WebDevToolsAgentImpl::DispatchMessageFromClient( + const std::string& raw_msg) { + if (dom_agent_impl_.get() && + dom_agent_dispatch_.Dispatch(dom_agent_impl_.get(), raw_msg)) + return; + if (net_agent_impl_.get() && + net_agent_dispatch_.Dispatch(net_agent_impl_.get(), raw_msg)) + return; + tools_agent_dispatch_.Dispatch(this, raw_msg); +} + +void WebDevToolsAgentImpl::SendRpcMessage(const std::string& raw_msg) { + delegate_->SendMessageToClient(raw_msg); +} diff --git a/webkit/glue/webdevtoolsagent_impl.h b/webkit/glue/webdevtoolsagent_impl.h new file mode 100644 index 0000000..a3f2620 --- /dev/null +++ b/webkit/glue/webdevtoolsagent_impl.h @@ -0,0 +1,72 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_WEBDEVTOOLSAGENT_IMPL_H_ +#define WEBKIT_GLUE_WEBDEVTOOLSAGENT_IMPL_H_ + +#include <string> + +#include "base/scoped_ptr.h" +#include "webkit/glue/devtools/devtools_rpc.h" +#include "webkit/glue/devtools/dom_agent.h" +#include "webkit/glue/devtools/net_agent.h" +#include "webkit/glue/devtools/tools_agent.h" +#include "webkit/glue/webdevtoolsagent.h" + +namespace WebCore { +class Document; +class Node; +} + +class DomAgentImpl; +class NetAgentImpl; +class Value; +class WebDevToolsAgentDelegate; +class WebViewImpl; + +class WebDevToolsAgentImpl + : public WebDevToolsAgent, + public ToolsAgent, + public DevToolsRpc::Delegate { + public: + WebDevToolsAgentImpl(WebViewImpl* web_view_impl, + WebDevToolsAgentDelegate* delegate); + virtual ~WebDevToolsAgentImpl(); + + // ToolsAgent implementation. + virtual void SetDomAgentEnabled(bool enabled); + virtual void SetNetAgentEnabled(bool enabled); + virtual void HighlightDOMNode(int node_id); + virtual void HideDOMNodeHighlight(); + + // WebDevToolsAgent implementation. + virtual void DispatchMessageFromClient(const std::string& raw_msg); + + // DevToolsRpc::Delegate implementation. + void SendRpcMessage(const std::string& raw_msg); + + // Methods called by the glue. + void SetMainFrameDocumentReady(bool ready); + void Inspect(WebCore::Node* node); + + DomAgentImpl* dom_agent_impl() { return dom_agent_impl_.get(); } + NetAgentImpl* net_agent_impl() { return net_agent_impl_.get(); } + WebViewImpl* web_view_impl() { return web_view_impl_; } + + private: + WebDevToolsAgentDelegate* delegate_; + WebViewImpl* web_view_impl_; + WebCore::Document* document_; + scoped_ptr<DomAgentImpl> dom_agent_impl_; + scoped_ptr<NetAgentImpl> net_agent_impl_; + scoped_ptr<DomAgentDelegateStub> dom_agent_delegate_stub_; + scoped_ptr<NetAgentDelegateStub> net_agent_delegate_stub_; + scoped_ptr<ToolsAgentDelegateStub> tools_agent_delegate_stub_; + DomAgentDispatch dom_agent_dispatch_; + NetAgentDispatch net_agent_dispatch_; + ToolsAgentDispatch tools_agent_dispatch_; + DISALLOW_COPY_AND_ASSIGN(WebDevToolsAgentImpl); +}; + +#endif // WEBKIT_GLUE_WEBDEVTOOLSAGENT_IMPL_H_ diff --git a/webkit/glue/webdevtoolsclient.h b/webkit/glue/webdevtoolsclient.h new file mode 100644 index 0000000..23529c6 --- /dev/null +++ b/webkit/glue/webdevtoolsclient.h @@ -0,0 +1,31 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_WEBDEVTOOLSCLIENT_H_ +#define WEBKIT_GLUE_WEBDEVTOOLSCLIENT_H_ + +#include <string> +#include "base/basictypes.h" + +class WebDevToolsClientDelegate; +class WebView; + +// WebDevToolsClient represents DevTools client sitting in the Glue. It provides +// direct and delegate Apis to the host. +class WebDevToolsClient { + public: + static WebDevToolsClient* Create( + WebView* view, + WebDevToolsClientDelegate* delegate); + + WebDevToolsClient() {} + virtual ~WebDevToolsClient() {} + + virtual void DispatchMessageFromAgent(const std::string& raw_msg) = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(WebDevToolsClient); +}; + +#endif // WEBKIT_GLUE_WEBDEVTOOLSCLIENT_H_ diff --git a/webkit/glue/webdevtoolsclient_delegate.h b/webkit/glue/webdevtoolsclient_delegate.h new file mode 100644 index 0000000..fc1b1d6 --- /dev/null +++ b/webkit/glue/webdevtoolsclient_delegate.h @@ -0,0 +1,22 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_WEBDEVTOOLSCLIENT_DELEGATE_H_ +#define WEBKIT_GLUE_WEBDEVTOOLSCLIENT_DELEGATE_H_ + +#include <string> +#include "base/basictypes.h" + +class WebDevToolsClientDelegate { + public: + WebDevToolsClientDelegate() {} + virtual ~WebDevToolsClientDelegate() {} + + virtual void SendMessageToAgent(const std::string& raw_msg) = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(WebDevToolsClientDelegate); +}; + +#endif // WEBKIT_GLUE_WEBDEVTOOLSAGENT_DELEGATE_H_ diff --git a/webkit/glue/webdevtoolsclient_impl.cc b/webkit/glue/webdevtoolsclient_impl.cc new file mode 100644 index 0000000..07f0055 --- /dev/null +++ b/webkit/glue/webdevtoolsclient_impl.cc @@ -0,0 +1,225 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "config.h" +#include "webkit/glue/webdevtoolsclient_impl.h" + +#include <string> + +#include "CString.h" +#include "Document.h" +#include "InspectorController.h" +#include "Node.h" +#include "Page.h" +#include "PlatformString.h" + +#include "base/json_reader.h" +#include "base/json_writer.h" +#include "base/string_util.h" +#include "base/values.h" + +#include "webkit/glue/glue_util.h" +#include "webkit/glue/webdevtoolsclient_delegate.h" +#include "webkit/glue/webframe.h" +#include "webkit/glue/webview_impl.h" + +using WebCore::CString; +using WebCore::Document; +using WebCore::InspectorController; +using WebCore::Node; +using WebCore::Page; +using WebCore::String; + +/*static*/ +WebDevToolsClient* WebDevToolsClient::Create( + WebView* view, + WebDevToolsClientDelegate* delegate) { + return new WebDevToolsClientImpl(static_cast<WebViewImpl*>(view), delegate); +} + +WebDevToolsClientImpl::WebDevToolsClientImpl( + WebViewImpl* web_view_impl, + WebDevToolsClientDelegate* delegate) + : web_view_impl_(web_view_impl), + delegate_(delegate) { + dom_agent_stub_.reset(new DomAgentStub(this)); + net_agent_stub_.reset(new NetAgentStub(this)); + tools_agent_stub_.reset(new ToolsAgentStub(this)); + + BindToJavascript(web_view_impl_->GetMainFrame(), L"DevToolsHost"); + BindMethod("getDocumentElement", + &WebDevToolsClientImpl::JsGetDocumentElement); + BindMethod("getChildNodes", &WebDevToolsClientImpl::JsGetChildNodes); + BindMethod("setAttribute", &WebDevToolsClientImpl::JsSetAttribute); + BindMethod("removeAttribute", &WebDevToolsClientImpl::JsRemoveAttribute); + BindMethod("setTextNodeValue", &WebDevToolsClientImpl::JsSetTextNodeValue); + BindMethod("highlightDOMNode", &WebDevToolsClientImpl::JsHighlightDOMNode); + BindMethod("hideDOMNodeHighlight", + &WebDevToolsClientImpl::JsHideDOMNodeHighlight); +} + +WebDevToolsClientImpl::~WebDevToolsClientImpl() { +} + +// DomAgent::DomAgentDelegate implementation. +void WebDevToolsClientImpl::DocumentElementUpdated(const Value& value) { + MakeJsCall("dom.setDocumentElement", &value); +} + +void WebDevToolsClientImpl::AttributesUpdated(int id, const Value& attributes) { + MakeJsCall("dom.setAttributes", id, &attributes); +} + +void WebDevToolsClientImpl::ChildNodesUpdated(int id, const Value& children) { + MakeJsCall("dom.setChildren", id, &children); +} + +void WebDevToolsClientImpl::ChildNodeInserted( + int parent_id, + int prev_id, + const Value& value) { + MakeJsCall("dom.nodeInserted", parent_id, prev_id, &value); +} + +void WebDevToolsClientImpl::ChildNodeRemoved(int parent_id, int id) { + MakeJsCall("dom.nodeRemoved", parent_id, id); +} + +void WebDevToolsClientImpl::HasChildrenUpdated(int id, bool new_value) { + MakeJsCall("dom.setHasChildren", id, true); +} + +// NetAgent::NetAgentDelegate implementation. +void WebDevToolsClientImpl::WillSendRequest( + int identifier, + const Value& request) { + MakeJsCall("net.willSendRequest", identifier, &request); +} + +void WebDevToolsClientImpl::DidReceiveResponse( + int identifier, + const Value& response) { + MakeJsCall("net.didReceiveResponse", identifier, &response); +} + +void WebDevToolsClientImpl::DidFinishLoading(int identifier, + const Value& response) { + MakeJsCall("net.didFinishLoading", identifier, &response); +} + +void WebDevToolsClientImpl::DidFailLoading(int identifier, + const Value& response) { + MakeJsCall("net.didFailLoading", identifier, &response); +} + +void WebDevToolsClientImpl::SetResourceContent( + int identifier, + const String& content) { + MakeJsCall("net.setResourceContent", identifier, content); +} + +void WebDevToolsClientImpl::UpdateFocusedNode(int node_id) { + MakeJsCall("tools.updateFocusedNode", node_id); +} + +void WebDevToolsClientImpl::JsGetResourceSource( + const CppArgumentList& args, + CppVariant* result) { + net_agent_stub_->GetResourceContent(args[0].ToInt32(), + webkit_glue::StdStringToString(args[1].ToString())); +} + +void WebDevToolsClientImpl::JsGetDocumentElement( + const CppArgumentList& args, + CppVariant* result) { + tools_agent_stub_->SetDomAgentEnabled(true); + tools_agent_stub_->SetNetAgentEnabled(true); + dom_agent_stub_->GetDocumentElement(); + result->SetNull(); +} + +void WebDevToolsClientImpl::JsGetChildNodes( + const CppArgumentList& args, + CppVariant* result) { + dom_agent_stub_->GetChildNodes(args[0].ToInt32()); + result->SetNull(); +} + +void WebDevToolsClientImpl::JsSetAttribute( + const CppArgumentList& args, + CppVariant* result) { + dom_agent_stub_->SetAttribute(args[0].ToInt32(), + webkit_glue::StdStringToString(args[1].ToString()), + webkit_glue::StdStringToString(args[2].ToString())); + result->SetNull(); +} + +void WebDevToolsClientImpl::JsRemoveAttribute( + const CppArgumentList& args, + CppVariant* result) { + dom_agent_stub_->RemoveAttribute(args[0].ToInt32(), + webkit_glue::StdStringToString(args[1].ToString())); + result->SetNull(); +} + +void WebDevToolsClientImpl::JsSetTextNodeValue( + const CppArgumentList& args, + CppVariant* result) { + dom_agent_stub_->SetTextNodeValue(args[0].ToInt32(), + webkit_glue::StdStringToString(args[1].ToString())); + result->SetNull(); +} + +void WebDevToolsClientImpl::JsHighlightDOMNode( + const CppArgumentList& args, + CppVariant* result) { + tools_agent_stub_->HighlightDOMNode(args[0].ToInt32()); + result->SetNull(); +} + +void WebDevToolsClientImpl::JsHideDOMNodeHighlight(const CppArgumentList& args, + CppVariant* result) { + tools_agent_stub_->HideDOMNodeHighlight(); + result->SetNull(); +} + +void WebDevToolsClientImpl::EvaluateJs(const String& expr) { + web_view_impl_->GetMainFrame()->ExecuteJavaScript( + webkit_glue::StringToStdString(expr), + GURL(), // script url + 1); // base line number +} + +void WebDevToolsClientImpl::DispatchMessageFromAgent( + const std::string& raw_msg) { + if (dom_agent_delegate_dispatch_.Dispatch(this, raw_msg)) + return; + if (net_agent_delegate_dispatch_.Dispatch(this, raw_msg)) + return; + if (tools_agent_delegate_dispatch_.Dispatch(this, raw_msg)) + return; +} + +void WebDevToolsClientImpl::SendRpcMessage(const std::string& raw_msg) { + delegate_->SendMessageToAgent(raw_msg); +} + +// static +CString WebDevToolsClientImpl::ToJSON(const String& value) { + StringValue str(webkit_glue::StringToStdString(value)); + return ToJSON(&str); +} + +// static +CString WebDevToolsClientImpl::ToJSON(int value) { + FundamentalValue fund(value); + return ToJSON(&fund); +} + +// static +CString WebDevToolsClientImpl::ToJSON(const Value* value) { + std::string json; + JSONWriter::Write(value, false, &json); + return webkit_glue::StdStringToString(json).utf8(); +} diff --git a/webkit/glue/webdevtoolsclient_impl.h b/webkit/glue/webdevtoolsclient_impl.h new file mode 100644 index 0000000..fb1daea --- /dev/null +++ b/webkit/glue/webdevtoolsclient_impl.h @@ -0,0 +1,141 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_GLUE_WEBDEVTOOLSCLIENT_IMPL_H_ +#define WEBKIT_GLUE_WEBDEVTOOLSCLIENT_IMPL_H_ + +#include <string> + +#include "CString.h" +#include "PlatformString.h" +#undef LOG + +#include "webkit/glue/cpp_bound_class.h" +#include "webkit/glue/devtools/devtools_rpc.h" +#include "webkit/glue/devtools/dom_agent.h" +#include "webkit/glue/devtools/net_agent.h" +#include "webkit/glue/devtools/tools_agent.h" +#include "webkit/glue/webdevtoolsclient.h" + +class DomAgentStub; +class NetAgentStub; +class ToolsAgentStub; +class WebDevToolsClientDelegate; +class WebViewImpl; + +class WebDevToolsClientImpl : public WebDevToolsClient, + public CppBoundClass, + public DevToolsRpc::Delegate, + public DomAgentDelegate, + public NetAgentDelegate, + public ToolsAgentDelegate { + public: + WebDevToolsClientImpl( + WebViewImpl* web_view_impl, + WebDevToolsClientDelegate* delegate); + virtual ~WebDevToolsClientImpl(); + + // DomAgentDelegate implementation. + virtual void DocumentElementUpdated(const Value& value); + virtual void AttributesUpdated(int id, const Value& attributes); + virtual void ChildNodesUpdated(int id, const Value& value); + virtual void ChildNodeInserted( + int parent_id, + int prev_id, + const Value& value); + virtual void ChildNodeRemoved(int parent_id, int id); + virtual void HasChildrenUpdated(int id, bool new_value); + + // NetAgentDelegate implementation. + virtual void WillSendRequest( + int identifier, + const Value& request); + virtual void DidReceiveResponse( + int identifier, + const Value& response); + virtual void DidFinishLoading(int identifier, const Value& response); + virtual void DidFailLoading(int identifier, const Value& response); + virtual void SetResourceContent( + int identifier, + const WebCore::String& content); + + // ToolsAgentDelegate implementation. + virtual void UpdateFocusedNode(int node_id); + + // DevToolsRpc::Delegate implementation. + virtual void SendRpcMessage(const std::string& raw_msg); + + // WebDevToolsClient implementation. + virtual void DispatchMessageFromAgent(const std::string& raw_msg); + + private: + // MakeJsCall templates. + void MakeJsCall(const WebCore::String& func) { + EvaluateJs(WebCore::String::format("%s()", func.utf8().data())); + } + template<class T1> + void MakeJsCall(const WebCore::String& func, T1 t1) { + EvaluateJs(WebCore::String::format("%s(%s)", func.utf8().data(), + ToJSON(t1).data())); + } + template<class T1, class T2> + void MakeJsCall(const WebCore::String& func, T1 t1, T2 t2) { + EvaluateJs(WebCore::String::format("%s(%s, %s)", func.utf8().data(), + ToJSON(t1).data(), ToJSON(t2).data())); + } + template<class T1, class T2, class T3> + void MakeJsCall(const WebCore::String& func, T1 t1, T2 t2, T3 t3) { + EvaluateJs(WebCore::String::format("%s(%s, %s, %s)", func.utf8().data(), + ToJSON(t1).data(), ToJSON(t2).data(), ToJSON(t3).data())); + } + template<class T1, class T2, class T3, class T4> + void MakeJsCall(const WebCore::String& func, T1 t1, T2 t2, T3 t3, T4 t4) { + EvaluateJs(WebCore::String::format("%s(%s, %s, %s, %s)", func.utf8().data(), + ToJSON(t1).data(), ToJSON(t2).data(), ToJSON(t3).data(), + ToJSON(t4).data())); + } + template<class T1, class T2, class T3, class T4, class T5> + void MakeJsCall(const WebCore::String& func, T1 t1, T2 t2, T3 t3, T4 t4, + T5 t5) { + EvaluateJs(WebCore::String::format("%s(%s, %s, %s, %s, %s)", + func.utf8().data(), ToJSON(t1).data(), ToJSON(t2).data(), + ToJSON(t3).data(), ToJSON(t4).data(), ToJSON(t5).data())); + } + + void EvaluateJs(const WebCore::String& expr); + + void JsGetResourceSource(const CppArgumentList& args, CppVariant* result); + + void JsGetDocumentElement(const CppArgumentList& args, CppVariant* result); + + void JsGetChildNodes(const CppArgumentList& args, CppVariant* result); + + void JsSetAttribute(const CppArgumentList& args, CppVariant* result); + + void JsRemoveAttribute(const CppArgumentList& args, CppVariant* result); + + void JsSetTextNodeValue(const CppArgumentList& args, CppVariant* result); + + void JsHighlightDOMNode(const CppArgumentList& args, CppVariant* result); + + void JsHideDOMNodeHighlight(const CppArgumentList& args, CppVariant* result); + + private: + // Serializers + static WebCore::CString ToJSON(const WebCore::String& value); + static WebCore::CString ToJSON(int value); + static WebCore::CString ToJSON(const Value* value); + + WebViewImpl* web_view_impl_; + WebDevToolsClientDelegate* delegate_; + scoped_ptr<DomAgentStub> dom_agent_stub_; + scoped_ptr<NetAgentStub> net_agent_stub_; + scoped_ptr<ToolsAgentStub> tools_agent_stub_; + DomAgentDelegateDispatch dom_agent_delegate_dispatch_; + NetAgentDelegateDispatch net_agent_delegate_dispatch_; + ToolsAgentDelegateDispatch tools_agent_delegate_dispatch_; + DISALLOW_COPY_AND_ASSIGN(WebDevToolsClientImpl); +}; + +#endif // WEBKIT_GLUE_WEBDEVTOOLSCLIENT_IMPL_H_ |