1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/shell/renderer/shell_render_view_observer.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/command_line.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/renderer/render_thread.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/renderer/render_view.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/renderer/render_view_observer.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/shell/common/shell_messages.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/shell/common/shell_switches.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/shell/renderer/ipc_echo.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebTestingSupport.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebView.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochShellRenderViewObserver::ShellRenderViewObserver(RenderView* render_view)
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : RenderViewObserver(render_view) {
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ShellRenderViewObserver::~ShellRenderViewObserver() {
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ShellRenderViewObserver::DidClearWindowObject(
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame) {
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          switches::kExposeInternalsForTesting)) {
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebTestingSupport::injectInternalsObject(frame);
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          switches::kExposeIpcEcho)) {
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderView* view = render_view();
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (!ipc_echo_)
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ipc_echo_.reset(new IPCEcho(view->GetWebView()->mainFrame()->document(),
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                  RenderThread::Get(), view->GetRoutingID()));
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ipc_echo_->Install(view->GetWebView()->mainFrame());
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool ShellRenderViewObserver::OnMessageReceived(const IPC::Message& message) {
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool handled = true;
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(ShellRenderViewObserver, message)
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewMsg_EchoPong, OnEchoPong)
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return handled;
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void ShellRenderViewObserver::OnEchoPong(int id, const std::string& body) {
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ipc_echo_->DidRespondEcho(id, body.size());
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace content
58