OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/tab_contents/tab_contents_view_gtk.h" | 5 #include "chrome/browser/tab_contents/tab_contents_view_gtk.h" |
6 | 6 |
7 #include <gdk/gdk.h> | 7 #include <gdk/gdk.h> |
8 #include <gdk/gdkkeysyms.h> | 8 #include <gdk/gdkkeysyms.h> |
9 #include <gtk/gtk.h> | 9 #include <gtk/gtk.h> |
10 | 10 |
11 #include <algorithm> | 11 #include <algorithm> |
12 | 12 |
13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
14 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
15 #include "build/build_config.h" | 15 #include "build/build_config.h" |
16 #include "chrome/browser/browser_shutdown.h" | |
17 #include "chrome/browser/tab_contents/render_view_context_menu_gtk.h" | 16 #include "chrome/browser/tab_contents/render_view_context_menu_gtk.h" |
18 #include "chrome/browser/tab_contents/web_drag_bookmark_handler_gtk.h" | 17 #include "chrome/browser/tab_contents/web_drag_bookmark_handler_gtk.h" |
19 #include "chrome/browser/ui/gtk/constrained_window_gtk.h" | 18 #include "chrome/browser/ui/gtk/constrained_window_gtk.h" |
20 #include "chrome/browser/ui/gtk/sad_tab_gtk.h" | |
21 #include "content/browser/renderer_host/render_view_host.h" | 19 #include "content/browser/renderer_host/render_view_host.h" |
22 #include "content/browser/renderer_host/render_view_host_factory.h" | 20 #include "content/browser/renderer_host/render_view_host_factory.h" |
23 #include "content/browser/renderer_host/render_widget_host_view_gtk.h" | 21 #include "content/browser/renderer_host/render_widget_host_view_gtk.h" |
24 #include "content/browser/tab_contents/interstitial_page.h" | 22 #include "content/browser/tab_contents/interstitial_page.h" |
25 #include "content/browser/tab_contents/tab_contents.h" | 23 #include "content/browser/tab_contents/tab_contents.h" |
26 #include "content/browser/tab_contents/tab_contents_delegate.h" | 24 #include "content/browser/tab_contents/tab_contents_delegate.h" |
27 #include "content/browser/tab_contents/web_drag_dest_gtk.h" | 25 #include "content/browser/tab_contents/web_drag_dest_gtk.h" |
28 #include "content/browser/tab_contents/web_drag_source_gtk.h" | 26 #include "content/browser/tab_contents/web_drag_source_gtk.h" |
29 #include "content/public/browser/notification_source.h" | |
30 #include "content/public/browser/notification_types.h" | |
31 #include "ui/base/gtk/gtk_expanded_container.h" | 27 #include "ui/base/gtk/gtk_expanded_container.h" |
32 #include "ui/base/gtk/gtk_floating_container.h" | 28 #include "ui/base/gtk/gtk_floating_container.h" |
33 #include "ui/gfx/point.h" | 29 #include "ui/gfx/point.h" |
34 #include "ui/gfx/rect.h" | 30 #include "ui/gfx/rect.h" |
35 #include "ui/gfx/size.h" | 31 #include "ui/gfx/size.h" |
36 #include "webkit/glue/webdropdata.h" | 32 #include "webkit/glue/webdropdata.h" |
37 | 33 |
38 using WebKit::WebDragOperation; | 34 using WebKit::WebDragOperation; |
39 using WebKit::WebDragOperationsMask; | 35 using WebKit::WebDragOperationsMask; |
40 | 36 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 | 70 |
75 return FALSE; | 71 return FALSE; |
76 } | 72 } |
77 | 73 |
78 } // namespace | 74 } // namespace |
79 | 75 |
80 TabContentsViewGtk::TabContentsViewGtk(TabContents* tab_contents) | 76 TabContentsViewGtk::TabContentsViewGtk(TabContents* tab_contents) |
81 : tab_contents_(tab_contents), | 77 : tab_contents_(tab_contents), |
82 floating_(gtk_floating_container_new()), | 78 floating_(gtk_floating_container_new()), |
83 expanded_(gtk_expanded_container_new()), | 79 expanded_(gtk_expanded_container_new()), |
84 constrained_window_(NULL) { | 80 constrained_window_(NULL), |
| 81 overlaid_view_(NULL) { |
85 gtk_widget_set_name(expanded_, "chrome-tab-contents-view"); | 82 gtk_widget_set_name(expanded_, "chrome-tab-contents-view"); |
86 g_signal_connect(expanded_, "size-allocate", | 83 g_signal_connect(expanded_, "size-allocate", |
87 G_CALLBACK(OnSizeAllocateThunk), this); | 84 G_CALLBACK(OnSizeAllocateThunk), this); |
88 g_signal_connect(expanded_, "child-size-request", | 85 g_signal_connect(expanded_, "child-size-request", |
89 G_CALLBACK(OnChildSizeRequestThunk), this); | 86 G_CALLBACK(OnChildSizeRequestThunk), this); |
90 g_signal_connect(floating_.get(), "set-floating-position", | 87 g_signal_connect(floating_.get(), "set-floating-position", |
91 G_CALLBACK(OnSetFloatingPositionThunk), this); | 88 G_CALLBACK(OnSetFloatingPositionThunk), this); |
92 | 89 |
93 gtk_container_add(GTK_CONTAINER(floating_.get()), expanded_); | 90 gtk_container_add(GTK_CONTAINER(floating_.get()), expanded_); |
94 gtk_widget_show(expanded_); | 91 gtk_widget_show(expanded_); |
95 gtk_widget_show(floating_.get()); | 92 gtk_widget_show(floating_.get()); |
96 registrar_.Add(this, content::NOTIFICATION_TAB_CONTENTS_CONNECTED, | |
97 content::Source<TabContents>(tab_contents)); | |
98 drag_source_.reset(new content::WebDragSourceGtk(tab_contents)); | 93 drag_source_.reset(new content::WebDragSourceGtk(tab_contents)); |
99 } | 94 } |
100 | 95 |
101 TabContentsViewGtk::~TabContentsViewGtk() { | 96 TabContentsViewGtk::~TabContentsViewGtk() { |
102 floating_.Destroy(); | 97 floating_.Destroy(); |
103 } | 98 } |
104 | 99 |
105 void TabContentsViewGtk::AttachConstrainedWindow( | 100 void TabContentsViewGtk::AttachConstrainedWindow( |
106 ConstrainedWindowGtk* constrained_window) { | 101 ConstrainedWindowGtk* constrained_window) { |
107 DCHECK(constrained_window_ == NULL); | 102 DCHECK(constrained_window_ == NULL); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 void TabContentsViewGtk::SetPageTitle(const string16& title) { | 186 void TabContentsViewGtk::SetPageTitle(const string16& title) { |
192 // Set the window name to include the page title so it's easier to spot | 187 // Set the window name to include the page title so it's easier to spot |
193 // when debugging (e.g. via xwininfo -tree). | 188 // when debugging (e.g. via xwininfo -tree). |
194 gfx::NativeView content_view = GetContentNativeView(); | 189 gfx::NativeView content_view = GetContentNativeView(); |
195 if (content_view && content_view->window) | 190 if (content_view && content_view->window) |
196 gdk_window_set_title(content_view->window, UTF16ToUTF8(title).c_str()); | 191 gdk_window_set_title(content_view->window, UTF16ToUTF8(title).c_str()); |
197 } | 192 } |
198 | 193 |
199 void TabContentsViewGtk::OnTabCrashed(base::TerminationStatus status, | 194 void TabContentsViewGtk::OnTabCrashed(base::TerminationStatus status, |
200 int error_code) { | 195 int error_code) { |
201 // Only show the sad tab if we're not in browser shutdown, so that TabContents | |
202 // objects that are not in a browser (e.g., HTML dialogs) and thus are | |
203 // visible do not flash a sad tab page. | |
204 if (browser_shutdown::GetShutdownType() != browser_shutdown::NOT_VALID) | |
205 return; | |
206 | |
207 if (tab_contents_ != NULL && !sad_tab_.get()) { | |
208 sad_tab_.reset(new SadTabGtk( | |
209 tab_contents_, | |
210 status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED ? | |
211 SadTabGtk::KILLED : SadTabGtk::CRASHED)); | |
212 InsertIntoContentArea(sad_tab_->widget()); | |
213 gtk_widget_show(sad_tab_->widget()); | |
214 } | |
215 } | 196 } |
216 | 197 |
217 void TabContentsViewGtk::SizeContents(const gfx::Size& size) { | 198 void TabContentsViewGtk::SizeContents(const gfx::Size& size) { |
218 // We don't need to manually set the size of of widgets in GTK+, but we do | 199 // We don't need to manually set the size of of widgets in GTK+, but we do |
219 // need to pass the sizing information on to the RWHV which will pass the | 200 // need to pass the sizing information on to the RWHV which will pass the |
220 // sizing information on to the renderer. | 201 // sizing information on to the renderer. |
221 requested_size_ = size; | 202 requested_size_ = size; |
222 RenderWidgetHostView* rwhv = tab_contents_->GetRenderWidgetHostView(); | 203 RenderWidgetHostView* rwhv = tab_contents_->GetRenderWidgetHostView(); |
223 if (rwhv) | 204 if (rwhv) |
224 rwhv->SetSize(size); | 205 rwhv->SetSize(size); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 void TabContentsViewGtk::GetViewBounds(gfx::Rect* out) const { | 253 void TabContentsViewGtk::GetViewBounds(gfx::Rect* out) const { |
273 if (!floating_->window) { | 254 if (!floating_->window) { |
274 out->SetRect(0, 0, requested_size_.width(), requested_size_.height()); | 255 out->SetRect(0, 0, requested_size_.width(), requested_size_.height()); |
275 return; | 256 return; |
276 } | 257 } |
277 int x = 0, y = 0, w, h; | 258 int x = 0, y = 0, w, h; |
278 gdk_window_get_geometry(floating_->window, &x, &y, &w, &h, NULL); | 259 gdk_window_get_geometry(floating_->window, &x, &y, &w, &h, NULL); |
279 out->SetRect(x, y, w, h); | 260 out->SetRect(x, y, w, h); |
280 } | 261 } |
281 | 262 |
| 263 void TabContentsViewGtk::InstallOverlayView(gfx::NativeView view) { |
| 264 DCHECK(!overlaid_view_); |
| 265 overlaid_view_ = view; |
| 266 InsertIntoContentArea(view); |
| 267 gtk_widget_show(view); |
| 268 } |
| 269 |
| 270 void TabContentsViewGtk::RemoveOverlayView() { |
| 271 DCHECK(overlaid_view_); |
| 272 gtk_container_remove(GTK_CONTAINER(expanded_), overlaid_view_); |
| 273 overlaid_view_ = NULL; |
| 274 } |
| 275 |
282 void TabContentsViewGtk::SetFocusedWidget(GtkWidget* widget) { | 276 void TabContentsViewGtk::SetFocusedWidget(GtkWidget* widget) { |
283 focus_store_.SetWidget(widget); | 277 focus_store_.SetWidget(widget); |
284 } | 278 } |
285 | 279 |
286 void TabContentsViewGtk::UpdateDragCursor(WebDragOperation operation) { | 280 void TabContentsViewGtk::UpdateDragCursor(WebDragOperation operation) { |
287 drag_dest_->UpdateDragStatus(operation); | 281 drag_dest_->UpdateDragStatus(operation); |
288 } | 282 } |
289 | 283 |
290 void TabContentsViewGtk::GotFocus() { | 284 void TabContentsViewGtk::GotFocus() { |
291 // This is only used in the views FocusManager stuff but it bleeds through | 285 // This is only used in the views FocusManager stuff but it bleeds through |
292 // all subclasses. http://crbug.com/21875 | 286 // all subclasses. http://crbug.com/21875 |
293 } | 287 } |
294 | 288 |
295 // This is called when we the renderer asks us to take focus back (i.e., it has | 289 // This is called when we the renderer asks us to take focus back (i.e., it has |
296 // iterated past the last focusable element on the page). | 290 // iterated past the last focusable element on the page). |
297 void TabContentsViewGtk::TakeFocus(bool reverse) { | 291 void TabContentsViewGtk::TakeFocus(bool reverse) { |
298 if (!tab_contents_->delegate()->TakeFocus(reverse)) { | 292 if (!tab_contents_->delegate()->TakeFocus(reverse)) { |
299 gtk_widget_child_focus(GTK_WIDGET(GetTopLevelNativeWindow()), | 293 gtk_widget_child_focus(GTK_WIDGET(GetTopLevelNativeWindow()), |
300 reverse ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD); | 294 reverse ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD); |
301 } | 295 } |
302 } | 296 } |
303 | 297 |
304 void TabContentsViewGtk::Observe(int type, | |
305 const content::NotificationSource& source, | |
306 const content::NotificationDetails& details) { | |
307 switch (type) { | |
308 case content::NOTIFICATION_TAB_CONTENTS_CONNECTED: { | |
309 // No need to remove the SadTabGtk's widget from the container since | |
310 // the new RenderWidgetHostViewGtk instance already removed all the | |
311 // vbox's children. | |
312 sad_tab_.reset(); | |
313 break; | |
314 } | |
315 default: | |
316 NOTREACHED() << "Got a notification we didn't register for."; | |
317 break; | |
318 } | |
319 } | |
320 | |
321 | |
322 void TabContentsViewGtk::CreateNewWindow( | 298 void TabContentsViewGtk::CreateNewWindow( |
323 int route_id, | 299 int route_id, |
324 const ViewHostMsg_CreateWindow_Params& params) { | 300 const ViewHostMsg_CreateWindow_Params& params) { |
325 delegate_view_helper_.CreateNewWindowFromTabContents( | 301 delegate_view_helper_.CreateNewWindowFromTabContents( |
326 tab_contents_, route_id, params); | 302 tab_contents_, route_id, params); |
327 } | 303 } |
328 | 304 |
329 void TabContentsViewGtk::CreateNewWidget( | 305 void TabContentsViewGtk::CreateNewWidget( |
330 int route_id, WebKit::WebPopupType popup_type) { | 306 int route_id, WebKit::WebPopupType popup_type) { |
331 delegate_view_helper_.CreateNewWidget(route_id, popup_type, | 307 delegate_view_helper_.CreateNewWidget(route_id, popup_type, |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 g_value_set_int(&value, child_x); | 479 g_value_set_int(&value, child_x); |
504 gtk_container_child_set_property(GTK_CONTAINER(floating_container), | 480 gtk_container_child_set_property(GTK_CONTAINER(floating_container), |
505 widget, "x", &value); | 481 widget, "x", &value); |
506 | 482 |
507 int child_y = std::max((allocation->height - requisition.height) / 2, 0); | 483 int child_y = std::max((allocation->height - requisition.height) / 2, 0); |
508 g_value_set_int(&value, child_y); | 484 g_value_set_int(&value, child_y); |
509 gtk_container_child_set_property(GTK_CONTAINER(floating_container), | 485 gtk_container_child_set_property(GTK_CONTAINER(floating_container), |
510 widget, "y", &value); | 486 widget, "y", &value); |
511 g_value_unset(&value); | 487 g_value_unset(&value); |
512 } | 488 } |
OLD | NEW |