| Index: chrome/browser/renderer_host/resource_message_filter_gtk.cc
 | 
| diff --git a/chrome/browser/renderer_host/resource_message_filter_gtk.cc b/chrome/browser/renderer_host/resource_message_filter_gtk.cc
 | 
| index 0616cd9ad17441fc4f07edbad693cc255fe372b9..750356a936e6a0e23aa362cb8afcc2794c40f42c 100644
 | 
| --- a/chrome/browser/renderer_host/resource_message_filter_gtk.cc
 | 
| +++ b/chrome/browser/renderer_host/resource_message_filter_gtk.cc
 | 
| @@ -6,42 +6,106 @@
 | 
|  
 | 
|  #include <gtk/gtk.h>
 | 
|  
 | 
| +#include "chrome/browser/chrome_thread.h"
 | 
| +#include "chrome/common/render_messages.h"
 | 
| +#include "chrome/common/x11_util.h"
 | 
| +
 | 
| +#include "third_party/WebKit/WebKit/chromium/public/WebScreenInfo.h"
 | 
| +#include "third_party/WebKit/WebKit/chromium/public/x11/WebScreenInfoFactory.h"
 | 
| +
 | 
| +using WebKit::WebScreenInfo;
 | 
| +using WebKit::WebScreenInfoFactory;
 | 
| +
 | 
|  // We get null window_ids passed into the two functions below; please see
 | 
|  // http://crbug.com/9060 for more details.
 | 
|  
 | 
| -void ResourceMessageFilter::OnGetWindowRect(gfx::NativeViewId window_id,
 | 
| -                                            gfx::Rect* rect) {
 | 
| -  if (!window_id) {
 | 
| -    *rect = gfx::Rect();
 | 
| -    return;
 | 
| +// Called on the IO thread.
 | 
| +void ResourceMessageFilter::SendBackgroundX11Reply(IPC::Message* reply_msg) {
 | 
| +  Send(reply_msg);
 | 
| +}
 | 
| +
 | 
| +// Called on the BACKGROUND_X11 thread.
 | 
| +void ResourceMessageFilter::DoOnGetScreenInfo(gfx::NativeViewId view,
 | 
| +                                              IPC::Message* reply_msg) {
 | 
| +  Display* display = x11_util::GetSecondaryDisplay();
 | 
| +  int screen = x11_util::GetDefaultScreen(display);
 | 
| +  WebScreenInfo results = WebScreenInfoFactory::screenInfo(display, screen);
 | 
| +  ViewHostMsg_GetScreenInfo::WriteReplyParams(reply_msg, results);
 | 
| +
 | 
| +  ChromeThread::GetMessageLoop(ChromeThread::IO)->PostTask(
 | 
| +      FROM_HERE, NewRunnableMethod(
 | 
| +        this, &ResourceMessageFilter::SendBackgroundX11Reply, reply_msg));
 | 
| +}
 | 
| +
 | 
| +// Called on the BACKGROUND_X11 thread.
 | 
| +void ResourceMessageFilter::DoOnGetWindowRect(gfx::NativeViewId view,
 | 
| +                                              IPC::Message* reply_msg) {
 | 
| +  gfx::Rect rect;
 | 
| +
 | 
| +  if (view) {
 | 
| +    XID window = x11_util::GetX11WindowFromGtkWidget(
 | 
| +        gfx::NativeViewFromId(view));
 | 
| +
 | 
| +    int x, y;
 | 
| +    unsigned width, height;
 | 
| +    x11_util::GetWindowGeometry(&x, &y, &width, &height, window);
 | 
| +    rect = gfx::Rect(x, y, width, height);
 | 
|    }
 | 
|  
 | 
| -  // Ideally this would be gtk_widget_get_window but that's only
 | 
| -  // from gtk 2.14 onwards. :(
 | 
| -  GdkWindow* window = gfx::NativeViewFromId(window_id)->window;
 | 
| -  DCHECK(window);
 | 
| -  gint x, y, width, height;
 | 
| -  // This is the "position of a window in root window coordinates".
 | 
| -  gdk_window_get_origin(window, &x, &y);
 | 
| -  gdk_window_get_size(window, &width, &height);
 | 
| -  *rect = gfx::Rect(x, y, width, height);
 | 
| +  ViewHostMsg_GetWindowRect::WriteReplyParams(reply_msg, rect);
 | 
| +
 | 
| +  ChromeThread::GetMessageLoop(ChromeThread::IO)->PostTask(
 | 
| +      FROM_HERE, NewRunnableMethod(
 | 
| +        this, &ResourceMessageFilter::SendBackgroundX11Reply, reply_msg));
 | 
|  }
 | 
|  
 | 
| -void ResourceMessageFilter::OnGetRootWindowRect(gfx::NativeViewId window_id,
 | 
| -                                                gfx::Rect* rect) {
 | 
| -  if (!window_id) {
 | 
| -    *rect = gfx::Rect();
 | 
| -    return;
 | 
| +// Called on the BACKGROUND_X11 thread.
 | 
| +void ResourceMessageFilter::DoOnGetRootWindowRect(gfx::NativeViewId view,
 | 
| +                                                  IPC::Message* reply_msg) {
 | 
| +  gfx::Rect rect;
 | 
| +
 | 
| +  if (view && gfx::NativeViewFromId(view)->window) {
 | 
| +    // Windows uses GetAncestor(window, GA_ROOT) here which probably means
 | 
| +    // we want the top level window.
 | 
| +    // TODO(agl): calling GTK from this thread is not safe. However, we still
 | 
| +    // have to solve the issue where we pass GtkWidget* into the renderer and
 | 
| +    // the solution to that should also fix this problem.
 | 
| +    GdkWindow* gdk_window =
 | 
| +        gdk_window_get_toplevel(gfx::NativeViewFromId(view)->window);
 | 
| +    XID window = x11_util::GetX11WindowFromGdkWindow(gdk_window);
 | 
| +    int x, y;
 | 
| +    unsigned width, height;
 | 
| +    x11_util::GetWindowGeometry(&x, &y, &width, &height, window);
 | 
| +    rect = gfx::Rect(x, y, width, height);
 | 
|    }
 | 
|  
 | 
| -  // Windows uses GetAncestor(window, GA_ROOT) here which probably means
 | 
| -  // we want the top level window.
 | 
| -  GdkWindow* window =
 | 
| -  gdk_window_get_toplevel(gfx::NativeViewFromId(window_id)->window);
 | 
| -  DCHECK(window);
 | 
| -  gint x, y, width, height;
 | 
| -  // This is the "position of a window in root window coordinates".
 | 
| -  gdk_window_get_origin(window, &x, &y);
 | 
| -  gdk_window_get_size(window, &width, &height);
 | 
| -  *rect = gfx::Rect(x, y, width, height);
 | 
| +  ViewHostMsg_GetRootWindowRect::WriteReplyParams(reply_msg, rect);
 | 
| +
 | 
| +  ChromeThread::GetMessageLoop(ChromeThread::IO)->PostTask(
 | 
| +      FROM_HERE, NewRunnableMethod(
 | 
| +        this, &ResourceMessageFilter::SendBackgroundX11Reply, reply_msg));
 | 
| +}
 | 
| +
 | 
| +// Called on the IO thread.
 | 
| +void ResourceMessageFilter::OnGetScreenInfo(gfx::NativeViewId view,
 | 
| +                                            IPC::Message* reply_msg) {
 | 
| +  ChromeThread::GetMessageLoop(ChromeThread::BACKGROUND_X11)->PostTask(
 | 
| +      FROM_HERE, NewRunnableMethod(
 | 
| +        this, &ResourceMessageFilter::DoOnGetScreenInfo, view, reply_msg));
 | 
| +}
 | 
| +
 | 
| +// Called on the IO thread.
 | 
| +void ResourceMessageFilter::OnGetWindowRect(gfx::NativeViewId view,
 | 
| +                                            IPC::Message* reply_msg) {
 | 
| +  ChromeThread::GetMessageLoop(ChromeThread::BACKGROUND_X11)->PostTask(
 | 
| +      FROM_HERE, NewRunnableMethod(
 | 
| +        this, &ResourceMessageFilter::DoOnGetWindowRect, view, reply_msg));
 | 
| +}
 | 
| +
 | 
| +// Called on the IO thread.
 | 
| +void ResourceMessageFilter::OnGetRootWindowRect(gfx::NativeViewId view,
 | 
| +                                                IPC::Message* reply_msg) {
 | 
| +  ChromeThread::GetMessageLoop(ChromeThread::BACKGROUND_X11)->PostTask(
 | 
| +      FROM_HERE, NewRunnableMethod(
 | 
| +        this, &ResourceMessageFilter::DoOnGetRootWindowRect, view, reply_msg));
 | 
|  }
 | 
| 
 |