// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef CHROME_BROWSER_RENDER_WIDGET_HOST_CONTAINER_H__ #define CHROME_BROWSER_RENDER_WIDGET_HOST_CONTAINER_H__ #include #include #include #include #include "base/basictypes.h" #include "base/gfx/size.h" #include "base/scoped_handle.h" #include "base/shared_memory.h" #include "base/task.h" #include "chrome/browser/ime_input.h" #include "chrome/browser/render_widget_host_view.h" #include "chrome/common/render_messages.h" #include "chrome/views/focus_manager.h" namespace gfx { class Rect; } namespace IPC { class Message; } class RenderWidgetHost; class WebMouseEvent; class WebCursor; typedef CWinTraits RenderWidgetHostHWNDTraits; static const wchar_t* const kRenderWidgetHostHWNDClass = L"Chrome_RenderWidgetHostHWND"; /////////////////////////////////////////////////////////////////////////////// // RenderWidgetHostHWND // // An object representing the "View" of a rendered web page. This object is // responsible for displaying the content of the web page, receiving messages // and containing plugins HWNDs. // // Comment excerpted from render_widget_host.h: // // "The lifetime of the RenderWidgetHostHWND is tied to the render process. // If the render process dies, the RenderWidgetHostHWND goes away and all // references to it must become NULL." // class RenderWidgetHostHWND : public CWindowImpl, public RenderWidgetHostView { public: RenderWidgetHostHWND(RenderWidgetHost* render_widget_host); virtual ~RenderWidgetHostHWND(); void set_close_on_deactivate(bool close_on_deactivate) { close_on_deactivate_ = close_on_deactivate; } void set_parent_hwnd(HWND parent) { parent_hwnd_ = parent; } DECLARE_WND_CLASS_EX(kRenderWidgetHostHWNDClass, CS_DBLCLKS, 0); BEGIN_MSG_MAP(RenderWidgetHostHWND) MSG_WM_CREATE(OnCreate) MSG_WM_ACTIVATE(OnActivate) MSG_WM_DESTROY(OnDestroy) MSG_WM_PAINT(OnPaint) MSG_WM_NCPAINT(OnNCPaint) MSG_WM_ERASEBKGND(OnEraseBkgnd) MSG_WM_SETCURSOR(OnSetCursor) MSG_WM_SETFOCUS(OnSetFocus) MSG_WM_KILLFOCUS(OnKillFocus) MSG_WM_CAPTURECHANGED(OnCaptureChanged) MSG_WM_CANCELMODE(OnCancelMode) MSG_WM_INPUTLANGCHANGE(OnInputLangChange) MSG_WM_NOTIFY(OnNotify) MESSAGE_HANDLER(WM_IME_SETCONTEXT, OnImeSetContext) MESSAGE_HANDLER(WM_IME_STARTCOMPOSITION, OnImeStartComposition) MESSAGE_HANDLER(WM_IME_COMPOSITION, OnImeComposition) MESSAGE_HANDLER(WM_IME_ENDCOMPOSITION, OnImeEndComposition) MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseEvent) MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseEvent) MESSAGE_HANDLER(WM_LBUTTONDOWN, OnMouseEvent) MESSAGE_HANDLER(WM_MBUTTONDOWN, OnMouseEvent) MESSAGE_HANDLER(WM_RBUTTONDOWN, OnMouseEvent) MESSAGE_HANDLER(WM_LBUTTONUP, OnMouseEvent) MESSAGE_HANDLER(WM_MBUTTONUP, OnMouseEvent) MESSAGE_HANDLER(WM_RBUTTONUP, OnMouseEvent) MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnMouseEvent) MESSAGE_HANDLER(WM_MBUTTONDBLCLK, OnMouseEvent) MESSAGE_HANDLER(WM_RBUTTONDBLCLK, OnMouseEvent) MESSAGE_HANDLER(WM_SYSKEYDOWN, OnKeyEvent) MESSAGE_HANDLER(WM_SYSKEYUP, OnKeyEvent) MESSAGE_HANDLER(WM_KEYDOWN, OnKeyEvent) MESSAGE_HANDLER(WM_KEYUP, OnKeyEvent) MESSAGE_HANDLER(WM_MOUSEWHEEL, OnWheelEvent) MESSAGE_HANDLER(WM_HSCROLL, OnWheelEvent) MESSAGE_HANDLER(WM_VSCROLL, OnWheelEvent) MESSAGE_HANDLER(WM_CHAR, OnKeyEvent) MESSAGE_HANDLER(WM_SYSCHAR, OnKeyEvent) MESSAGE_HANDLER(WM_IME_CHAR, OnKeyEvent) MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize) MESSAGE_HANDLER(WM_SIZE, OnSize) MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate) END_MSG_MAP() // Overridden from RenderWidgetHostView: virtual void DidBecomeSelected(); virtual void WasHidden(); virtual void SetSize(const gfx::Size& size); virtual HWND GetPluginHWND(); virtual void ForwardMouseEventToRenderer(UINT message, WPARAM wparam, LPARAM lparam); virtual void Focus(); virtual void Blur(); virtual bool HasFocus(); virtual void Show(); virtual void Hide(); virtual gfx::Rect GetViewBounds() const; virtual void UpdateCursor(const WebCursor& cursor); virtual void UpdateCursorIfOverSelf(); virtual void SetIsLoading(bool is_loading); virtual void IMEUpdateStatus(ViewHostMsg_ImeControl control, int x, int y); virtual void DidPaintRect(const gfx::Rect& rect); virtual void DidScrollRect(const gfx::Rect& rect, int dx, int dy); virtual void RendererGone(); virtual void Destroy(); virtual void SetTooltipText(const std::wstring& tooltip_text); protected: // Windows Message Handlers LRESULT OnCreate(CREATESTRUCT* create_struct); void OnActivate(UINT, BOOL, HWND); void OnDestroy(); void OnPaint(HDC dc); void OnNCPaint(HRGN update_region); LRESULT OnEraseBkgnd(HDC dc); LRESULT OnSetCursor(HWND window, UINT hittest_code, UINT mouse_message_id); void OnSetFocus(HWND window); void OnKillFocus(HWND window); void OnCaptureChanged(HWND window); void OnCancelMode(); void OnInputLangChange(DWORD character_set, HKL input_language_id); LRESULT OnNotify(int w_param, NMHDR* header); LRESULT OnImeSetContext( UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); LRESULT OnImeStartComposition( UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); LRESULT OnImeComposition( UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); LRESULT OnImeEndComposition( UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); LRESULT OnMouseEvent( UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); LRESULT OnKeyEvent( UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); LRESULT OnWheelEvent( UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); // Handle WM_NCCALCSIZE and supress scrollbars LRESULT OnNcCalcSize(UINT, WPARAM, LPARAM, BOOL& handled); // Handle WM_SIZE and indicate that we have a valid scroll info // so that windows will give us the WS_HSCROLL and WS_VSCROLL style. LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL& handled); LRESULT OnMouseActivate(UINT, WPARAM, LPARAM, BOOL& handled); // Handle vertical scrolling LRESULT OnVScroll(int code, short position, HWND scrollbar_control); // Handle horizontal scrolling LRESULT OnHScroll(int code, short position, HWND scrollbar_control); void OnFinalMessage(HWND window); private: // Tells Windows that we want to hear about mouse exit messages. void TrackMouseLeave(bool start_tracking); // Sends a message to the RenderView in the renderer process. bool Send(IPC::Message* message); // Set the tooltip region to the size of the window, creating the tooltip // hwnd if it has not been created yet. void EnsureTooltip(); // Tooltips become invalid when the root ancestor changes. When the View // becomes hidden, this method is called to reset the tooltip. void ResetTooltip(); // Synthesize mouse wheel event. LRESULT SynthesizeMouseWheel(bool is_vertical, int scroll_code, short scroll_position); // A callback function for EnumThreadWindows to enumerate and dismiss // any owned popop windows static BOOL CALLBACK DismissOwnedPopups(HWND window, LPARAM arg); // Shuts down the render_widget_host_. This is a separate function so we can // invoke it from the message loop. void ShutdownHost(); // The associated Model. RenderWidgetHost* render_widget_host_; // The real cursor type for the page. WebCursor::Type real_cursor_type_; // The real cursor for the page. This is passed down from the renderer HCURSOR real_cursor_; // Indicates if the page is loading. bool is_loading_; // true if we are currently tracking WM_MOUSEEXIT messages. bool track_mouse_leave_; // Wrapper class for IME input. // (See "chrome/browser/ime_input.h" for its details.) ImeInput ime_input_; // Represents whether or not this browser process is receiving status // messages about the focused edit control from a renderer process. bool ime_notification_; // true if the View is not visible. bool is_hidden_; // true if the View should be closed when its HWND is deactivated (used to // support SELECT popups which are closed when they are deactivated). bool close_on_deactivate_; // Tooltips // The text to be shown in the tooltip, supplied by the renderer. std::wstring tooltip_text_; // The tooltip control hwnd HWND tooltip_hwnd_; // Whether or not a tooltip is currently visible. We use this to track // whether or not we want to force-close the tooltip when we receive mouse // move notifications from the renderer. See comment in OnMsgSetTooltipText. bool tooltip_showing_; // Factory used to safely scope delayed calls to ShutdownHost(). ScopedRunnableMethodFactory shutdown_factory_; // Our parent HWND. We keep a reference to it as we SetParent(NULL) when // hidden to prevent getting messages (Paint, Resize...), and we reattach // when shown again. HWND parent_hwnd_; // The time at which this view started displaying white pixels as a result of // not having anything to paint (empty backing store from renderer). This // value returns true for is_null() if we are not recording whiteout times. TimeTicks whiteout_start_time_; DISALLOW_EVIL_CONSTRUCTORS(RenderWidgetHostHWND); }; #endif // #ifndef CHROME_BROWSER_RENDER_WIDGET_HOST_CONTAINER_H__