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#ifndef CONTENT_RENDERER_WEB_UI_MOJO_H_
6#define CONTENT_RENDERER_WEB_UI_MOJO_H_
7
8#include <string>
9
10#include "content/public/renderer/render_frame_observer.h"
11#include "content/public/renderer/render_view_observer.h"
12#include "content/public/renderer/render_view_observer_tracker.h"
13#include "mojo/public/cpp/system/core.h"
14
15namespace gin {
16class PerContextData;
17}
18
19namespace content {
20
21class WebUIMojoContextState;
22
23// WebUIMojo is responsible for enabling the renderer side of mojo bindings.
24// It creates (and destroys) a WebUIMojoContextState at the appropriate times
25// and handles the necessary browser messages. WebUIMojo destroys itself when
26// the RendererView it is created with is destroyed.
27class WebUIMojo
28    : public RenderViewObserver,
29      public RenderViewObserverTracker<WebUIMojo> {
30 public:
31  explicit WebUIMojo(RenderView* render_view);
32
33 private:
34  class MainFrameObserver : public RenderFrameObserver {
35   public:
36    explicit MainFrameObserver(WebUIMojo* web_ui_mojo);
37    virtual ~MainFrameObserver();
38
39    // RenderFrameObserver overrides:
40    virtual void WillReleaseScriptContext(v8::Handle<v8::Context> context,
41                                          int world_id) OVERRIDE;
42    virtual void DidFinishDocumentLoad() OVERRIDE;
43
44   private:
45    WebUIMojo* web_ui_mojo_;
46
47    DISALLOW_COPY_AND_ASSIGN(MainFrameObserver);
48  };
49
50  virtual ~WebUIMojo();
51
52  void CreateContextState();
53  void DestroyContextState(v8::Handle<v8::Context> context);
54
55  // Invoked when the frame finishes loading. Invokes Run() on the
56  // WebUIMojoContextState.
57  void OnDidFinishDocumentLoad();
58
59  WebUIMojoContextState* GetContextState();
60
61  // RenderViewObserver overrides:
62  virtual void DidCreateDocumentElement(blink::WebLocalFrame* frame) OVERRIDE;
63  virtual void DidClearWindowObject(blink::WebLocalFrame* frame) OVERRIDE;
64
65  MainFrameObserver main_frame_observer_;
66
67  DISALLOW_COPY_AND_ASSIGN(WebUIMojo);
68};
69
70}  // namespace content
71
72#endif  // CONTENT_RENDERER_WEB_UI_MOJO_H_
73