15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_VIEWS_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_VIEWS_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/native/native_view_host.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionHost;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This handles the display portion of an ExtensionHost.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionViewViews : public views::NativeViewHost {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionViewViews(extensions::ExtensionHost* host, Browser* browser);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionViewViews();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A class that represents the container that this view is in.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (bottom shelf, side bar, etc.)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Container {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Container() {}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnExtensionSizeChanged(ExtensionViewViews* view) {}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnViewWasResized() {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* host() const { return host_; }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser() const { return browser_; }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension() const;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* render_view_host() const;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidStopLoading();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIsClipped(bool is_clipped);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // Sets a minimum size for the native view attached to this View.
49d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  void SetMinimumSize(const gfx::Size& min_size);
50d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notification from ExtensionHost.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResizeDueToAutoResize(const gfx::Size& new_size);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Method for the ExtensionHost to notify us when the RenderViewHost has a
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // connection.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RenderViewCreated();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the container for this view.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetContainer(Container* container) { container_ = container; }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles unhandled keyboard messages coming back from the renderer process.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleKeyboardEvent(const content::NativeWebKeyboardEvent& event);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::NativeViewHost:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::NativeCursor GetCursor(const ui::MouseEvent& event) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetVisible(bool is_visible) OVERRIDE;
67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void ViewHierarchyChanged(
68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const ViewHierarchyChangedDetails& details) OVERRIDE;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SkipDefaultKeyEventProcessing(const ui::KeyEvent& e) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void PreferredSizeChanged() OVERRIDE;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnFocus() OVERRIDE;
76d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  virtual gfx::Size GetMinimumSize() OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class extensions::ExtensionHost;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes the RenderWidgetHostView for this object.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateWidgetHostView();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We wait to show the ExtensionViewViews until several things have loaded.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowIfCompletelyLoaded();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore object to initial state. Called on shutdown or after a renderer
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crash.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CleanUp();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The running extension instance that we're displaying.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that host_ owns view
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* host_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser window that this view is in.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if we've been initialized.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool initialized_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // What we should set the preferred width to once the ExtensionViewViews has
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size pending_preferred_size_;
104d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  gfx::Size minimum_size_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The container this view is in (not necessarily its direct superview).
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: the view does not own its container.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Container* container_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether this extension view is clipped.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_clipped_;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A handler to handle unhandled keyboard messages coming back from the
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // renderer process.
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionViewViews);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_VIEWS_H_
121