OLD | NEW |
| (Empty) |
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. | |
4 #ifndef CONTENT_SHELL_SHELL_H_ | |
5 #define CONTENT_SHELL_SHELL_H_ | |
6 | |
7 | |
8 #include <vector> | |
9 | |
10 #include "base/basictypes.h" | |
11 #include "base/callback_forward.h" | |
12 #include "base/memory/scoped_ptr.h" | |
13 #include "base/strings/string_piece.h" | |
14 #include "content/public/browser/notification_observer.h" | |
15 #include "content/public/browser/notification_registrar.h" | |
16 #include "content/public/browser/web_contents_delegate.h" | |
17 #include "ipc/ipc_channel.h" | |
18 #include "ui/gfx/native_widget_types.h" | |
19 #include "ui/gfx/size.h" | |
20 | |
21 #if defined(TOOLKIT_GTK) | |
22 #include <gtk/gtk.h> | |
23 #include "ui/base/gtk/gtk_signal.h" | |
24 | |
25 typedef struct _GtkToolItem GtkToolItem; | |
26 #elif defined(OS_ANDROID) | |
27 #include "base/android/scoped_java_ref.h" | |
28 #elif defined(USE_AURA) | |
29 #if defined(OS_CHROMEOS) | |
30 namespace content { | |
31 class MinimalShell; | |
32 } | |
33 #endif | |
34 namespace views { | |
35 class Widget; | |
36 class ViewsDelegate; | |
37 } | |
38 #endif | |
39 | |
40 class GURL; | |
41 namespace content { | |
42 | |
43 class BrowserContext; | |
44 class ShellDevToolsFrontend; | |
45 class ShellJavaScriptDialogManager; | |
46 class SiteInstance; | |
47 class WebContents; | |
48 | |
49 // This represents one window of the Content Shell, i.e. all the UI including | |
50 // buttons and url bar, as well as the web content area. | |
51 class Shell : public WebContentsDelegate, | |
52 public NotificationObserver { | |
53 public: | |
54 static const int kDefaultTestWindowWidthDip; | |
55 static const int kDefaultTestWindowHeightDip; | |
56 | |
57 virtual ~Shell(); | |
58 | |
59 void LoadURL(const GURL& url); | |
60 void LoadURLForFrame(const GURL& url, const std::string& frame_name); | |
61 void GoBackOrForward(int offset); | |
62 void Reload(); | |
63 void Stop(); | |
64 void UpdateNavigationControls(); | |
65 void Close(); | |
66 void ShowDevTools(); | |
67 void CloseDevTools(); | |
68 #if (defined(OS_WIN) && !defined(USE_AURA)) || \ | |
69 defined(TOOLKIT_GTK) || defined(OS_MACOSX) | |
70 // Resizes the main window to the given dimensions. | |
71 void SizeTo(int width, int height); | |
72 #endif | |
73 | |
74 // Do one time initialization at application startup. | |
75 static void Initialize(); | |
76 | |
77 static Shell* CreateNewWindow(BrowserContext* browser_context, | |
78 const GURL& url, | |
79 SiteInstance* site_instance, | |
80 int routing_id, | |
81 const gfx::Size& initial_size); | |
82 | |
83 // Returns the Shell object corresponding to the given RenderViewHost. | |
84 static Shell* FromRenderViewHost(RenderViewHost* rvh); | |
85 | |
86 // Returns the currently open windows. | |
87 static std::vector<Shell*>& windows() { return windows_; } | |
88 | |
89 // Closes all windows and returns. This runs a message loop. | |
90 static void CloseAllWindows(); | |
91 | |
92 // Closes all windows and exits. | |
93 static void PlatformExit(); | |
94 | |
95 // Used for content_browsertests. Called once. | |
96 static void SetShellCreatedCallback( | |
97 base::Callback<void(Shell*)> shell_created_callback); | |
98 | |
99 WebContents* web_contents() const { return web_contents_.get(); } | |
100 gfx::NativeWindow window() { return window_; } | |
101 | |
102 #if defined(OS_MACOSX) | |
103 // Public to be called by an ObjC bridge object. | |
104 void ActionPerformed(int control); | |
105 void URLEntered(std::string url_string); | |
106 #elif defined(OS_ANDROID) | |
107 // Registers the Android Java to native methods. | |
108 static bool Register(JNIEnv* env); | |
109 #endif | |
110 | |
111 // WebContentsDelegate | |
112 virtual WebContents* OpenURLFromTab(WebContents* source, | |
113 const OpenURLParams& params) OVERRIDE; | |
114 virtual void LoadingStateChanged(WebContents* source) OVERRIDE; | |
115 #if defined(OS_ANDROID) | |
116 virtual void LoadProgressChanged(WebContents* source, | |
117 double progress) OVERRIDE; | |
118 #endif | |
119 virtual void ToggleFullscreenModeForTab(WebContents* web_contents, | |
120 bool enter_fullscreen) OVERRIDE; | |
121 virtual bool IsFullscreenForTabOrPending( | |
122 const WebContents* web_contents) const OVERRIDE; | |
123 virtual void RequestToLockMouse(WebContents* web_contents, | |
124 bool user_gesture, | |
125 bool last_unlocked_by_target) OVERRIDE; | |
126 virtual void CloseContents(WebContents* source) OVERRIDE; | |
127 virtual bool CanOverscrollContent() const OVERRIDE; | |
128 virtual void WebContentsCreated(WebContents* source_contents, | |
129 int64 source_frame_id, | |
130 const string16& frame_name, | |
131 const GURL& target_url, | |
132 WebContents* new_contents) OVERRIDE; | |
133 virtual void DidNavigateMainFramePostCommit( | |
134 WebContents* web_contents) OVERRIDE; | |
135 virtual JavaScriptDialogManager* GetJavaScriptDialogManager() OVERRIDE; | |
136 #if defined(OS_MACOSX) | |
137 virtual void HandleKeyboardEvent( | |
138 WebContents* source, | |
139 const NativeWebKeyboardEvent& event) OVERRIDE; | |
140 #endif | |
141 virtual bool AddMessageToConsole(WebContents* source, | |
142 int32 level, | |
143 const string16& message, | |
144 int32 line_no, | |
145 const string16& source_id) OVERRIDE; | |
146 virtual void RendererUnresponsive(WebContents* source) OVERRIDE; | |
147 virtual void ActivateContents(WebContents* contents) OVERRIDE; | |
148 virtual void DeactivateContents(WebContents* contents) OVERRIDE; | |
149 virtual void WorkerCrashed(WebContents* source) OVERRIDE; | |
150 | |
151 private: | |
152 enum UIControl { | |
153 BACK_BUTTON, | |
154 FORWARD_BUTTON, | |
155 STOP_BUTTON | |
156 }; | |
157 | |
158 class DevToolsWebContentsObserver; | |
159 | |
160 explicit Shell(WebContents* web_contents); | |
161 | |
162 // Helper to create a new Shell given a newly created WebContents. | |
163 static Shell* CreateShell(WebContents* web_contents, | |
164 const gfx::Size& initial_size); | |
165 | |
166 // Helper for one time initialization of application | |
167 static void PlatformInitialize(const gfx::Size& default_window_size); | |
168 | |
169 // All the methods that begin with Platform need to be implemented by the | |
170 // platform specific Shell implementation. | |
171 // Called from the destructor to let each platform do any necessary cleanup. | |
172 void PlatformCleanUp(); | |
173 // Creates the main window GUI. | |
174 void PlatformCreateWindow(int width, int height); | |
175 // Links the WebContents into the newly created window. | |
176 void PlatformSetContents(); | |
177 // Resize the content area and GUI. | |
178 void PlatformResizeSubViews(); | |
179 // Enable/disable a button. | |
180 void PlatformEnableUIControl(UIControl control, bool is_enabled); | |
181 // Updates the url in the url bar. | |
182 void PlatformSetAddressBarURL(const GURL& url); | |
183 // Sets whether the spinner is spinning. | |
184 void PlatformSetIsLoading(bool loading); | |
185 // Set the title of shell window | |
186 void PlatformSetTitle(const string16& title); | |
187 #if defined(OS_ANDROID) | |
188 void PlatformToggleFullscreenModeForTab(WebContents* web_contents, | |
189 bool enter_fullscreen); | |
190 bool PlatformIsFullscreenForTabOrPending( | |
191 const WebContents* web_contents) const; | |
192 #endif | |
193 | |
194 gfx::NativeView GetContentView(); | |
195 | |
196 // NotificationObserver | |
197 virtual void Observe(int type, | |
198 const NotificationSource& source, | |
199 const NotificationDetails& details) OVERRIDE; | |
200 | |
201 void OnDevToolsWebContentsDestroyed(); | |
202 | |
203 #if defined(OS_WIN) && !defined(USE_AURA) | |
204 static ATOM RegisterWindowClass(); | |
205 static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); | |
206 static LRESULT CALLBACK EditWndProc(HWND, UINT, WPARAM, LPARAM); | |
207 #elif defined(TOOLKIT_GTK) | |
208 CHROMEGTK_CALLBACK_0(Shell, void, OnBackButtonClicked); | |
209 CHROMEGTK_CALLBACK_0(Shell, void, OnForwardButtonClicked); | |
210 CHROMEGTK_CALLBACK_0(Shell, void, OnReloadButtonClicked); | |
211 CHROMEGTK_CALLBACK_0(Shell, void, OnStopButtonClicked); | |
212 CHROMEGTK_CALLBACK_0(Shell, void, OnURLEntryActivate); | |
213 CHROMEGTK_CALLBACK_0(Shell, gboolean, OnWindowDestroyed); | |
214 | |
215 CHROMEG_CALLBACK_3(Shell, gboolean, OnCloseWindowKeyPressed, GtkAccelGroup*, | |
216 GObject*, guint, GdkModifierType); | |
217 CHROMEG_CALLBACK_3(Shell, gboolean, OnNewWindowKeyPressed, GtkAccelGroup*, | |
218 GObject*, guint, GdkModifierType); | |
219 CHROMEG_CALLBACK_3(Shell, gboolean, OnHighlightURLView, GtkAccelGroup*, | |
220 GObject*, guint, GdkModifierType); | |
221 CHROMEG_CALLBACK_3(Shell, gboolean, OnReloadKeyPressed, GtkAccelGroup*, | |
222 GObject*, guint, GdkModifierType); | |
223 #endif | |
224 | |
225 scoped_ptr<ShellJavaScriptDialogManager> dialog_manager_; | |
226 | |
227 scoped_ptr<WebContents> web_contents_; | |
228 | |
229 scoped_ptr<DevToolsWebContentsObserver> devtools_observer_; | |
230 ShellDevToolsFrontend* devtools_frontend_; | |
231 | |
232 bool is_fullscreen_; | |
233 | |
234 gfx::NativeWindow window_; | |
235 gfx::NativeEditView url_edit_view_; | |
236 | |
237 // Notification manager | |
238 NotificationRegistrar registrar_; | |
239 | |
240 #if defined(OS_WIN) && !defined(USE_AURA) | |
241 WNDPROC default_edit_wnd_proc_; | |
242 static HINSTANCE instance_handle_; | |
243 #elif defined(TOOLKIT_GTK) | |
244 GtkWidget* vbox_; | |
245 | |
246 GtkToolItem* back_button_; | |
247 GtkToolItem* forward_button_; | |
248 GtkToolItem* reload_button_; | |
249 GtkToolItem* stop_button_; | |
250 | |
251 GtkWidget* spinner_; | |
252 GtkToolItem* spinner_item_; | |
253 | |
254 int content_width_; | |
255 int content_height_; | |
256 int ui_elements_height_; // height of menubar, toolbar, etc. | |
257 #elif defined(OS_ANDROID) | |
258 base::android::ScopedJavaGlobalRef<jobject> java_object_; | |
259 #elif defined(USE_AURA) | |
260 #if defined(OS_CHROMEOS) | |
261 static content::MinimalShell* minimal_shell_; | |
262 #endif | |
263 static views::ViewsDelegate* views_delegate_; | |
264 | |
265 views::Widget* window_widget_; | |
266 #elif defined(OS_MACOSX) | |
267 int content_width_; | |
268 int content_height_; | |
269 #endif | |
270 | |
271 bool headless_; | |
272 | |
273 // A container of all the open windows. We use a vector so we can keep track | |
274 // of ordering. | |
275 static std::vector<Shell*> windows_; | |
276 | |
277 static base::Callback<void(Shell*)> shell_created_callback_; | |
278 | |
279 // True if the destructur of Shell should post a quit closure on the current | |
280 // message loop if the destructed Shell object was the last one. | |
281 static bool quit_message_loop_; | |
282 }; | |
283 | |
284 } // namespace content | |
285 | |
286 #endif // CONTENT_SHELL_SHELL_H_ | |
OLD | NEW |