text: // Copyright (c) 2010 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_H_
  #define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_H_
  #pragma once
  
  #include "build/build_config.h"
  
  #include "third_party/skia/include/core/SkBitmap.h"
  #include "views/controls/native/native_view_host.h"
  
  class Browser;
  class Extension;
  class ExtensionHost;
  class ExtensionView;
  class RenderViewHost;
  
  // This handles the display portion of an ExtensionHost.
  class ExtensionView : public views::NativeViewHost {
   public:
    ExtensionView(ExtensionHost* host, Browser* browser);
    ~ExtensionView();
  
    // A class that represents the container that this view is in.
    // (bottom shelf, side bar, etc.)
    class Container {
     public:
      virtual ~Container() {}
      // Mouse event notifications from the view. (useful for hover UI).
      virtual void OnExtensionMouseMove(ExtensionView* view) = 0;
      virtual void OnExtensionMouseLeave(ExtensionView* view) = 0;
      virtual void OnExtensionPreferredSizeChanged(ExtensionView* view) {}
    };
  
    ExtensionHost* host() const { return host_; }
    Browser* browser() const { return browser_; }
    const Extension* extension() const;
    RenderViewHost* render_view_host() const;
    void DidStopLoading();
    void SetIsClipped(bool is_clipped);
  
    // Notification from ExtensionHost.
    void UpdatePreferredSize(const gfx::Size& new_size);
    void HandleMouseMove();
    void HandleMouseLeave();
  
    // Method for the ExtensionHost to notify us when the RenderViewHost has a
    // connection.
    void RenderViewCreated();
  
    // Set a custom background for the view. The background will be tiled.
    void SetBackground(const SkBitmap& background);
  
    // Sets the container for this view.
    void SetContainer(Container* container) { container_ = container; }
  
    // Overridden from views::NativeViewHost:
    virtual void SetVisible(bool is_visible) OVERRIDE;
    virtual void ViewHierarchyChanged(
        bool is_add, views::View *parent, views::View *child) OVERRIDE;
  
   protected:
    // Overridden from views::View.
    virtual void PreferredSizeChanged() OVERRIDE;
    virtual bool SkipDefaultKeyEventProcessing(const views::KeyEvent& e) OVERRIDE;
    virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
  
   private:
    friend class ExtensionHost;
  
    // Initializes the RenderWidgetHostView for this object.
    void CreateWidgetHostView();
  
    // We wait to show the ExtensionView until several things have loaded.
    void ShowIfCompletelyLoaded();
  
    // Restore object to initial state. Called on shutdown or after a renderer
    // crash.
    void CleanUp();
  
    // The running extension instance that we're displaying.
    // Note that host_ owns view
    ExtensionHost* host_;
  
    // The browser window that this view is in.
    Browser* browser_;
  
    // True if we've been initialized.
    bool initialized_;
  
    // The background the view should have once it is initialized. This is set
    // when the view has a custom background, but hasn't been initialized yet.
    SkBitmap pending_background_;
  
    // What we should set the preferred width to once the ExtensionView has
    // loaded.
    gfx::Size pending_preferred_size_;
  
    // The container this view is in (not necessarily its direct superview).
    // Note: the view does not own its container.
    Container* container_;
  
    // Whether this extension view is clipped.
    bool is_clipped_;
  
    DISALLOW_COPY_AND_ASSIGN(ExtensionView);
  };
  
  #endif  // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_VIEW_H_
  