1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef UI_VIEWS_CONTROLS_WEBVIEW_WEBVIEW_H_
6 #define UI_VIEWS_CONTROLS_WEBVIEW_WEBVIEW_H_
8 #include "base/basictypes.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "content/public/browser/web_contents_delegate.h"
11 #include "content/public/browser/web_contents_observer.h"
12 #include "ui/views/accessibility/native_view_accessibility.h"
13 #include "ui/views/controls/webview/webview_export.h"
14 #include "ui/views/view.h"
20 // Provides a view of a WebContents instance. WebView can be used standalone,
21 // creating and displaying an internally-owned WebContents; or within a full
22 // browser where the browser swaps its own WebContents instances in/out (e.g.,
25 // WebView creates and owns a single child view, a NativeViewHost, which will
26 // hold and display the native view provided by a WebContents.
28 // EmbedFullscreenWidgetMode: When enabled, WebView will observe for WebContents
29 // fullscreen changes and automatically swap the normal native view with the
30 // fullscreen native view (if different). In addition, if the WebContents is
31 // being screen-captured, the view will be centered within WebView, sized to
32 // the aspect ratio of the capture video resolution, and scaling will be avoided
34 class WEBVIEW_EXPORT WebView
: public View
,
35 public content::WebContentsDelegate
,
36 public content::WebContentsObserver
{
38 static const char kViewClassName
[];
40 explicit WebView(content::BrowserContext
* browser_context
);
43 // This creates a WebContents if none is yet associated with this WebView. The
44 // WebView owns this implicitly created WebContents.
45 content::WebContents
* GetWebContents();
47 // WebView does not assume ownership of WebContents set via this method, only
48 // those it implicitly creates via GetWebContents() above.
49 void SetWebContents(content::WebContents
* web_contents
);
51 // If |mode| is true, WebView will register itself with WebContents as a
52 // WebContentsObserver, monitor for the showing/destruction of fullscreen
53 // render widgets, and alter its child view hierarchy to embed the fullscreen
54 // widget or restore the normal WebContentsView.
55 void SetEmbedFullscreenWidgetMode(bool mode
);
57 content::WebContents
* web_contents() const {
58 return content::WebContentsObserver::web_contents();
61 content::BrowserContext
* browser_context() { return browser_context_
; }
63 // Loads the initial URL to display in the attached WebContents. Creates the
64 // WebContents if none is attached yet. Note that this is intended as a
65 // convenience for loading the initial URL, and so URLs are navigated with
66 // PAGE_TRANSITION_AUTO_TOPLEVEL, so this is not intended as a general purpose
67 // navigation method - use WebContents' API directly.
68 void LoadInitialURL(const GURL
& url
);
70 // Controls how the attached WebContents is resized.
71 // false = WebContents' views' bounds are updated continuously as the
72 // WebView's bounds change (default).
73 // true = WebContents' views' position is updated continuously but its size
74 // is not (which may result in some clipping or under-painting) until
75 // a continuous size operation completes. This allows for smoother
76 // resizing performance during interactive resizes and animations.
77 void SetFastResize(bool fast_resize
);
79 // Called when the WebContents is focused.
80 // TODO(beng): This view should become a WebContentsViewObserver when a
81 // WebContents is attached, and not rely on the delegate to
82 // forward this notification.
83 void OnWebContentsFocused(content::WebContents
* web_contents
);
85 // When used to host UI, we need to explicitly allow accelerators to be
86 // processed. Default is false.
87 void set_allow_accelerators(bool allow_accelerators
) {
88 allow_accelerators_
= allow_accelerators
;
91 // Sets the preferred size. If empty, View's implementation of
92 // GetPreferredSize() is used.
93 void SetPreferredSize(const gfx::Size
& preferred_size
);
95 // Overridden from View:
96 virtual const char* GetClassName() const OVERRIDE
;
97 virtual ui::TextInputClient
* GetTextInputClient() OVERRIDE
;
100 // Overridden from View:
101 virtual void OnBoundsChanged(const gfx::Rect
& previous_bounds
) OVERRIDE
;
102 virtual void ViewHierarchyChanged(
103 const ViewHierarchyChangedDetails
& details
) OVERRIDE
;
104 virtual bool SkipDefaultKeyEventProcessing(
105 const ui::KeyEvent
& event
) OVERRIDE
;
106 virtual bool IsFocusable() const OVERRIDE
;
107 virtual void OnFocus() OVERRIDE
;
108 virtual void AboutToRequestFocusFromTabTraversal(bool reverse
) OVERRIDE
;
109 virtual void GetAccessibleState(ui::AXViewState
* state
) OVERRIDE
;
110 virtual gfx::NativeViewAccessible
GetNativeViewAccessible() OVERRIDE
;
111 virtual gfx::Size
GetPreferredSize() const OVERRIDE
;
113 // Overridden from content::WebContentsDelegate:
114 virtual void WebContentsFocused(content::WebContents
* web_contents
) OVERRIDE
;
115 virtual bool EmbedsFullscreenWidget() const OVERRIDE
;
117 // Overridden from content::WebContentsObserver:
118 virtual void RenderViewDeleted(
119 content::RenderViewHost
* render_view_host
) OVERRIDE
;
120 virtual void RenderProcessGone(base::TerminationStatus status
) OVERRIDE
;
121 virtual void RenderViewHostChanged(
122 content::RenderViewHost
* old_host
,
123 content::RenderViewHost
* new_host
) OVERRIDE
;
124 virtual void DidShowFullscreenWidget(int routing_id
) OVERRIDE
;
125 virtual void DidDestroyFullscreenWidget(int routing_id
) OVERRIDE
;
126 virtual void DidToggleFullscreenModeForTab(bool entered_fullscreen
) OVERRIDE
;
127 virtual void DidAttachInterstitialPage() OVERRIDE
;
128 virtual void DidDetachInterstitialPage() OVERRIDE
;
129 // Workaround for MSVC++ linker bug/feature that requires
130 // instantiation of the inline IPC::Listener methods in all translation units.
131 virtual void OnChannelConnected(int32 peer_id
) OVERRIDE
{}
132 virtual void OnChannelError() OVERRIDE
{}
133 virtual void OnBadMessageReceived(const IPC::Message
& message
) OVERRIDE
{}
136 void AttachWebContents();
137 void DetachWebContents();
138 void ReattachForFullscreenChange(bool enter_fullscreen
);
139 void NotifyMaybeTextInputClientChanged();
141 // Create a regular or test web contents (based on whether we're running
142 // in a unit test or not).
143 content::WebContents
* CreateWebContents(
144 content::BrowserContext
* browser_context
);
146 NativeViewHost
* const holder_
;
147 // Non-NULL if |web_contents()| was created and is owned by this WebView.
148 scoped_ptr
<content::WebContents
> wc_owner_
;
149 // When true, WebView auto-embeds fullscreen widgets as a child view.
150 bool embed_fullscreen_widget_mode_enabled_
;
151 // Set to true while WebView is embedding a fullscreen widget view as a child
152 // view instead of the normal WebContentsView render view. Note: This will be
153 // false in the case of non-Flash fullscreen.
154 bool is_embedding_fullscreen_widget_
;
155 content::BrowserContext
* browser_context_
;
156 bool allow_accelerators_
;
157 gfx::Size preferred_size_
;
159 DISALLOW_COPY_AND_ASSIGN(WebView
);
164 #endif // UI_VIEWS_CONTROLS_WEBVIEW_WEBVIEW_H_