15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#ifndef EXTENSIONS_BROWSER_GUEST_VIEW_GUEST_VIEW_H_
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define EXTENSIONS_BROWSER_GUEST_VIEW_GUEST_VIEW_H_
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/bind.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/browser/render_frame_host.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/guest_view/guest_view_base.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace extensions {
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// A GuestView is the templated base class for out-of-process frames in the
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// chrome layer. GuestView is templated on its derived type to allow for type-
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// safe access. See GuestViewBase for more information.
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutemplate <typename T>
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass GuestView : public GuestViewBase {
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void Register() {
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    GuestViewBase::RegisterGuestViewType(T::Type, base::Bind(&T::Create));
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static T* From(int embedder_process_id, int guest_instance_id) {
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    GuestViewBase* guest =
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        GuestViewBase::From(embedder_process_id, guest_instance_id);
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (!guest)
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return NULL;
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return guest->As<T>();
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static T* FromWebContents(content::WebContents* contents) {
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    GuestViewBase* guest = GuestViewBase::FromWebContents(contents);
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return guest ? guest->As<T>() : NULL;
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static T* FromFrameID(int render_process_id, int render_frame_id) {
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    content::RenderFrameHost* render_frame_host =
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        content::RenderFrameHost::FromID(render_process_id, render_frame_id);
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!render_frame_host) {
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return NULL;
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    content::WebContents* web_contents =
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        content::WebContents::FromRenderFrameHost(render_frame_host);
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return FromWebContents(web_contents);
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  T* GetOpener() const {
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GuestViewBase* guest = GuestViewBase::GetOpener();
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!guest)
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return NULL;
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return guest->As<T>();
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SetOpener(T* opener) {
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GuestViewBase::SetOpener(opener);
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // GuestViewBase implementation.
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual const char* GetViewType() const OVERRIDE {
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return T::Type;
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu protected:
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GuestView(content::BrowserContext* browser_context,
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            int guest_instance_id)
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : GuestViewBase(browser_context, guest_instance_id) {}
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~GuestView() {}
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(GuestView);
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace extensions
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif  // EXTENSIONS_BROWSER_GUEST_VIEW_GUEST_VIEW_H_
77