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_ 287