1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/shell/renderer/ipc_echo.h" 6 7#include "base/logging.h" 8#include "content/shell/common/shell_messages.h" 9#include "content/shell/renderer/binding_helpers.h" 10#include "gin/object_template_builder.h" 11#include "gin/wrappable.h" 12#include "ipc/ipc_sender.h" 13#include "third_party/WebKit/public/web/WebDOMCustomEvent.h" 14#include "third_party/WebKit/public/web/WebDOMEvent.h" 15#include "third_party/WebKit/public/web/WebSerializedScriptValue.h" 16 17namespace content { 18 19class IPCEchoBindings : public gin::Wrappable<IPCEchoBindings> { 20public: 21 static gin::WrapperInfo kWrapperInfo; 22 static void Install(base::WeakPtr<IPCEcho> echo, blink::WebFrame* frame); 23 24 explicit IPCEchoBindings(base::WeakPtr<IPCEcho>); 25 26 void RequestEcho(int id, int size); 27 int GetLastEchoId() const; 28 int GetLastEchoSize() const; 29 30private: 31 virtual gin::ObjectTemplateBuilder GetObjectTemplateBuilder( 32 v8::Isolate*) OVERRIDE; 33 34 base::WeakPtr<IPCEcho> native_; 35}; 36 37IPCEchoBindings::IPCEchoBindings(base::WeakPtr<IPCEcho> native) 38 : native_(native) { 39} 40 41void IPCEchoBindings::RequestEcho(int id, int size) { 42 if (!native_) 43 return; 44 native_->RequestEcho(id, size); 45} 46 47int IPCEchoBindings::GetLastEchoId() const { 48 if (!native_) 49 return 0; 50 return native_->last_echo_id(); 51} 52 53int IPCEchoBindings::GetLastEchoSize() const { 54 if (!native_) 55 return 0; 56 return native_->last_echo_size(); 57} 58 59gin::WrapperInfo IPCEchoBindings::kWrapperInfo = { 60 gin::kEmbedderNativeGin }; 61 62gin::ObjectTemplateBuilder IPCEchoBindings::GetObjectTemplateBuilder( 63 v8::Isolate* isolate) { 64 return gin::Wrappable<IPCEchoBindings>::GetObjectTemplateBuilder(isolate) 65 .SetMethod("requestEcho", 66 &IPCEchoBindings::RequestEcho) 67 .SetProperty("lastEchoId", 68 &IPCEchoBindings::GetLastEchoId) 69 .SetProperty("lastEchoSize", 70 &IPCEchoBindings::GetLastEchoSize); 71} 72 73// static 74void IPCEchoBindings::Install(base::WeakPtr<IPCEcho> echo, 75 blink::WebFrame* frame) { 76 std::vector<std::string> names; 77 names.push_back("ipcEcho"); 78 return InstallAsWindowProperties( 79 new IPCEchoBindings(echo), frame, names); 80} 81 82IPCEcho::IPCEcho(blink::WebDocument document, 83 IPC::Sender* sender, 84 int routing_id) 85 : document_(document), sender_(sender), routing_id_(routing_id), 86 last_echo_id_(0), 87 weak_factory_(this) { 88} 89 90IPCEcho::~IPCEcho() { 91} 92 93void IPCEcho::RequestEcho(int id, int size) { 94 sender_->Send(new ShellViewHostMsg_EchoPing( 95 routing_id_, id, std::string(size, '*'))); 96} 97 98void IPCEcho::DidRespondEcho(int id, int size) { 99 last_echo_id_ = id; 100 last_echo_size_ = size; 101 blink::WebString eventName = blink::WebString::fromUTF8("CustomEvent"); 102 blink::WebString eventType = blink::WebString::fromUTF8("pong"); 103 blink::WebDOMEvent event = document_.createEvent(eventName); 104 event.to<blink::WebDOMCustomEvent>().initCustomEvent( 105 eventType, false, false, blink::WebSerializedScriptValue()); 106 document_.dispatchEvent(event); 107} 108 109void IPCEcho::Install(blink::WebFrame* frame) { 110 IPCEchoBindings::Install(weak_factory_.GetWeakPtr(), frame); 111} 112 113} // namespace content 114