14a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file.
44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#ifndef CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_H_
64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_H_
74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once
84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "build/build_config.h"
104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "third_party/skia/include/core/SkBitmap.h"
124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/native/native_view_host.h"
134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Browser;
154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Extension;
164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ExtensionHost;
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ExtensionView;
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass RenderViewHost;
194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// This handles the display portion of an ExtensionHost.
214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ExtensionView : public views::NativeViewHost {
224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public:
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ExtensionView(ExtensionHost* host, Browser* browser);
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ~ExtensionView();
254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // A class that represents the container that this view is in.
274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // (bottom shelf, side bar, etc.)
284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  class Container {
294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch   public:
304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    virtual ~Container() {}
314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Mouse event notifications from the view. (useful for hover UI).
324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    virtual void OnExtensionMouseMove(ExtensionView* view) = 0;
334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    virtual void OnExtensionMouseLeave(ExtensionView* view) = 0;
344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    virtual void OnExtensionPreferredSizeChanged(ExtensionView* view) {}
354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  };
364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ExtensionHost* host() const { return host_; }
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Browser* browser() const { return browser_; }
394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  const Extension* extension() const;
404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  RenderViewHost* render_view_host() const;
414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void DidStopLoading();
424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SetIsClipped(bool is_clipped);
434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Notification from ExtensionHost.
454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void UpdatePreferredSize(const gfx::Size& new_size);
464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void HandleMouseMove();
474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void HandleMouseLeave();
484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Method for the ExtensionHost to notify us when the RenderViewHost has a
504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // connection.
514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void RenderViewCreated();
524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Set a custom background for the view. The background will be tiled.
544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SetBackground(const SkBitmap& background);
554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Sets the container for this view.
574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SetContainer(Container* container) { container_ = container; }
584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from views::NativeViewHost:
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetVisible(bool is_visible) OVERRIDE;
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ViewHierarchyChanged(
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      bool is_add, views::View *parent, views::View *child) OVERRIDE;
634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch protected:
654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from views::View.
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void PreferredSizeChanged() OVERRIDE;
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool SkipDefaultKeyEventProcessing(const views::KeyEvent& e) OVERRIDE;
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private:
714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  friend class ExtensionHost;
724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Initializes the RenderWidgetHostView for this object.
744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void CreateWidgetHostView();
754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // We wait to show the ExtensionView until several things have loaded.
774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ShowIfCompletelyLoaded();
784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Restore object to initial state. Called on shutdown or after a renderer
804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // crash.
814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void CleanUp();
824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The running extension instance that we're displaying.
844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Note that host_ owns view
854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ExtensionHost* host_;
864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The browser window that this view is in.
884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Browser* browser_;
894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // True if we've been initialized.
914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool initialized_;
924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The background the view should have once it is initialized. This is set
944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // when the view has a custom background, but hasn't been initialized yet.
954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  SkBitmap pending_background_;
964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // What we should set the preferred width to once the ExtensionView has
984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // loaded.
994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Size pending_preferred_size_;
1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The container this view is in (not necessarily its direct superview).
1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Note: the view does not own its container.
1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Container* container_;
1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Whether this extension view is clipped.
1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool is_clipped_;
1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionView);
1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif  // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_H_
112