diff --git a/app/app.gyp b/app/app.gyp
index e503bd1f0025fa30aba675353aeefcb8b8ddbe81..7e883f043c296e0c86254af00f54c8500e8d1508 100644
--- a/app/app.gyp
+++ b/app/app.gyp
@@ -115,7 +115,6 @@
         'gfx/native_theme_win.h',
         'gfx/gtk_native_view_id_manager.cc',
         'gfx/gtk_native_view_id_manager.h',
-        'gfx/path.cc',
         'gfx/path_gtk.cc',
         'gfx/path_win.cc',
         'gfx/path.h',
diff --git a/app/gfx/native_widget_types.h b/app/gfx/native_widget_types.h
index eda722d11483df7a98afd0e46af8f637e1b83da2..0153194796b295ba33ea58dbb587bec493dfaf27 100644
--- a/app/gfx/native_widget_types.h
+++ b/app/gfx/native_widget_types.h
@@ -51,7 +51,6 @@ typedef struct _GdkCursor GdkCursor;
 typedef struct _GtkWidget GtkWidget;
 typedef struct _GtkWindow GtkWindow;
 typedef struct _cairo cairo_t;
-typedef struct _GdkRegion GdkRegion;
 #endif
 
 namespace gfx {
@@ -63,7 +62,6 @@ typedef HWND NativeEditView;
 typedef HDC NativeDrawingContext;
 typedef HCURSOR NativeCursor;
 typedef HMENU NativeMenu;
-typedef HRGN NativeRegion;
 #elif defined(OS_MACOSX)
 typedef NSView* NativeView;
 typedef NSWindow* NativeWindow;
@@ -78,7 +76,6 @@ typedef GtkWidget* NativeEditView;
 typedef cairo_t* NativeDrawingContext;
 typedef GdkCursor* NativeCursor;
 typedef GtkWidget* NativeMenu;
-typedef GdkRegion* NativeRegion;
 #endif
 
 // Note: for test_shell we're packing a pointer into the NativeViewId. So, if
diff --git a/app/gfx/path.cc b/app/gfx/path.cc
deleted file mode 100644
index b5eeeca215d02704b828657daf8c9f77702589d0..0000000000000000000000000000000000000000
--- a/app/gfx/path.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "app/gfx/path.h"
-
-#include "base/logging.h"
-
-namespace gfx {
-
-Path::Path(const Point* points, size_t count) {
-  DCHECK(count > 1);
-  moveTo(SkIntToScalar(points[0].x), SkIntToScalar(points[0].y));
-  for (size_t i = 1; i < count; ++i)
-    lineTo(SkIntToScalar(points[i].x), SkIntToScalar(points[i].y));
-}
-
-}  // namespace gfx
diff --git a/app/gfx/path.h b/app/gfx/path.h
index bc84ca8792e0be4d15f8174ce61493c56fade27b..e2150c270f99694bb825dd867819672d80c19869 100644
--- a/app/gfx/path.h
+++ b/app/gfx/path.h
@@ -5,44 +5,31 @@
 #ifndef APP_GFX_PATH_H_
 #define APP_GFX_PATH_H_
 
-#include "app/gfx/native_widget_types.h"
 #include "base/basictypes.h"
 
+#if defined(OS_WIN)
+#include <windows.h>
+#elif defined(OS_LINUX)
+typedef struct _GdkRegion GdkRegion;
+#endif
+
 #include "third_party/skia/include/core/SkPath.h"
 
 namespace gfx {
 
 class Path : public SkPath {
  public:
-  // Used by Path(Point,size_t) constructor.
-  struct Point {
-    int x;
-    int y;
-  };
-
   Path() : SkPath() { moveTo(0, 0); }
 
-  // Creates a path populated with the specified points.
-  Path(const Point* points, size_t count);
-
-#if defined(OS_WIN) || defined(USE_X11)
-  // Creates a NativeRegion from the path. The caller is responsible for freeing
-  // resources used by this region. This only supports polygon paths.
-  NativeRegion CreateNativeRegion() const;
-
-  // Returns the intersection of the two regions. The caller owns the returned
-  // object.
-  static gfx::NativeRegion IntersectRegions(gfx::NativeRegion r1,
-                                            gfx::NativeRegion r2);
-
-  // Returns the union of the two regions. The caller owns the returned object.
-  static gfx::NativeRegion CombineRegions(gfx::NativeRegion r1,
-                                          gfx::NativeRegion r2);
-
-  // Returns the difference of the two regions. The caller owns the returned
-  // object.
-  static gfx::NativeRegion SubtractRegion(gfx::NativeRegion r1,
-                                          gfx::NativeRegion r2);
+#if defined(OS_WIN)
+  // Creates a HRGN from the path. The caller is responsible for freeing
+  // resources used by this region.  This only supports polygon paths.
+  HRGN CreateHRGN() const;
+#elif defined(OS_LINUX)
+  // Creates a Gdkregion from the path. The caller is responsible for freeing
+  // resources used by this region.  This only supports polygon paths.
+  // WARNING: this returns NULL for an empty Path.
+  GdkRegion* CreateGdkRegion() const;
 #endif
 
  private:
diff --git a/app/gfx/path_gtk.cc b/app/gfx/path_gtk.cc
index e9aee05c28f6e31a313f6de135f74558fc72ad0a..9a2b92c64b173dee986d045db6566649e41b4ed7 100644
--- a/app/gfx/path_gtk.cc
+++ b/app/gfx/path_gtk.cc
@@ -11,7 +11,7 @@
 
 namespace gfx {
 
-GdkRegion* Path::CreateNativeRegion() const {
+GdkRegion* Path::CreateGdkRegion() const {
   int point_count = getPoints(NULL, 0);
   if (point_count <= 1) {
     // NOTE: ideally this would return gdk_empty_region, but that returns a
@@ -31,25 +31,4 @@ GdkRegion* Path::CreateNativeRegion() const {
   return gdk_region_polygon(gdk_points.get(), point_count, GDK_EVEN_ODD_RULE);
 }
 
-// static
-NativeRegion Path::IntersectRegions(NativeRegion r1, NativeRegion r2) {
-  GdkRegion* copy = gdk_region_copy(r1);
-  gdk_region_intersect(copy, r2);
-  return copy;
-}
-
-// static
-NativeRegion Path::CombineRegions(NativeRegion r1, NativeRegion r2) {
-  GdkRegion* copy = gdk_region_copy(r1);
-  gdk_region_union(copy, r2);
-  return copy;
-}
-
-// static
-NativeRegion Path::SubtractRegion(NativeRegion r1, NativeRegion r2) {
-  GdkRegion* copy = gdk_region_copy(r1);
-  gdk_region_subtract(copy, r2);
-  return copy;
-}
-
 }  // namespace gfx
diff --git a/app/gfx/path_win.cc b/app/gfx/path_win.cc
index 5a337bb13b0eb7c57efd90c60128f1a0589c12c0..72fce717359e5e6a90a03f125dd708b1c96add27 100644
--- a/app/gfx/path_win.cc
+++ b/app/gfx/path_win.cc
@@ -8,7 +8,7 @@
 
 namespace gfx {
 
-HRGN Path::CreateNativeRegion() const {
+HRGN Path::CreateHRGN() const {
   int point_count = getPoints(NULL, 0);
   scoped_array<SkPoint> points(new SkPoint[point_count]);
   getPoints(points.get(), point_count);
@@ -21,25 +21,4 @@ HRGN Path::CreateNativeRegion() const {
   return ::CreatePolygonRgn(windows_points.get(), point_count, ALTERNATE);
 }
 
-// static
-NativeRegion Path::IntersectRegions(NativeRegion r1, NativeRegion r2) {
-  HRGN dest = CreateRectRgn(0, 0, 1, 1);
-  CombineRgn(dest, r1, r2, RGN_AND);
-  return dest;
-}
-
-// static
-NativeRegion Path::CombineRegions(NativeRegion r1, NativeRegion r2) {
-  HRGN dest = CreateRectRgn(0, 0, 1, 1);
-  CombineRgn(dest, r1, r2, RGN_OR);
-  return dest;
-}
-
-// static
-NativeRegion Path::SubtractRegion(NativeRegion r1, NativeRegion r2) {
-  HRGN dest = CreateRectRgn(0, 0, 1, 1);
-  CombineRgn(dest, r1, r2, RGN_DIFF);
-  return dest;
-}
-
 }  // namespace gfx
diff --git a/app/win_util.h b/app/win_util.h
index 3140fbe3902360fcde22e99b211f96c093e831dd..c9340d1045799b8515cde77a884108bb17824e69 100644
--- a/app/win_util.h
+++ b/app/win_util.h
@@ -25,6 +25,7 @@ using ::ScopedHandle;
 using ::ScopedFindFileHandle;
 using ::ScopedHDC;
 using ::ScopedBitmap;
+using ::ScopedHRGN;
 
 // Simple scoped memory releaser class for COM allocated memory.
 // Example:
diff --git a/base/base.gyp b/base/base.gyp
index b79568df54967ec5de1dd8c30b6e09e2b5523a35..7ead978fdb9c9e6db2c2b06376f6194e893c1bf2 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -253,7 +253,6 @@
         'scoped_cftyperef.h',
         'scoped_comptr_win.h',
         'scoped_handle.h',
-        'scoped_handle_gtk.h',
         'scoped_handle_win.h',
         'scoped_nsautorelease_pool.h',
         'scoped_nsautorelease_pool.mm',
diff --git a/base/scoped_handle.h b/base/scoped_handle.h
index 913271d64b381f0cb9ea0597a0c0abe67d5915ea..e53b2dd1917cd652ea17743437f50748136699ae 100644
--- a/base/scoped_handle.h
+++ b/base/scoped_handle.h
@@ -11,8 +11,6 @@
 
 #if defined(OS_WIN)
 #include "base/scoped_handle_win.h"
-#elif defined(OS_LINUX)
-#include "base/scoped_handle_gtk.h"
 #endif
 
 class ScopedStdioHandle {
diff --git a/base/scoped_handle_gtk.h b/base/scoped_handle_gtk.h
deleted file mode 100644
index 06dd64db39e4f12cf2460f71ace13b5dc86e2a8b..0000000000000000000000000000000000000000
--- a/base/scoped_handle_gtk.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_SCOPED_HANDLE_GTK_H_
-#define BASE_SCOPED_HANDLE_GTK_H_
-
-#include <gdk/gdk.h>
-
-// Wraps a GdkRegion. This class provides the same methods as ScopedGDIObject in
-// scoped_handle_win.
-class ScopedRegion {
- public:
-  ScopedRegion() : region_(NULL) {}
-  explicit ScopedRegion(GdkRegion* region) : region_(region) {}
-
-  ~ScopedRegion() {
-    Close();
-  }
-
-  void Set(GdkRegion* region) {
-    Close();
-
-    region_ = region;
-  }
-
-  GdkRegion* Get() {
-    return region_;
-  }
-
-  GdkRegion* release() {
-    GdkRegion* region = region_;
-    region_ = NULL;
-    return region;
-  }
-
- private:
-  void Close() {
-    if (region_) {
-      gdk_region_destroy(region_);
-      region_ = NULL;
-    }
-  }
-
-  GdkRegion* region_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedRegion);
-};
-
-#endif  // BASE_SCOPED_HANDLE_GTK_H_
diff --git a/base/scoped_handle_win.h b/base/scoped_handle_win.h
index 6375ad95c84215fa4242f4e7dd649e6c19810f83..dbd0627d52f63a2e7881f96a8868da31bc5c6ae5 100644
--- a/base/scoped_handle_win.h
+++ b/base/scoped_handle_win.h
@@ -168,12 +168,6 @@ class ScopedGDIObject {
     return *this;
   }
 
-  T release() {
-    T object = object_;
-    object_ = NULL;
-    return object;
-  }
-
   operator T() { return object_; }
 
  private:
@@ -188,7 +182,7 @@ class ScopedGDIObject {
 
 // Typedefs for some common use cases.
 typedef ScopedGDIObject<HBITMAP> ScopedBitmap;
-typedef ScopedGDIObject<HRGN> ScopedRegion;
+typedef ScopedGDIObject<HRGN> ScopedHRGN;
 typedef ScopedGDIObject<HFONT> ScopedHFONT;
 
 
diff --git a/chrome/browser/dock_info_win.cc b/chrome/browser/dock_info_win.cc
index bdcbb5915c69c00a5777e2072f87a19564f1eef5..9ae56ad595f5a5e12cad09abaff4300875722f0a 100644
--- a/chrome/browser/dock_info_win.cc
+++ b/chrome/browser/dock_info_win.cc
@@ -115,7 +115,7 @@ class TopMostFinder : public BaseWindowFinder {
   // in ShouldStopIterating if target_ is passed in.
   bool is_top_most_;
 
-  ScopedRegion tmp_region_;
+  ScopedHRGN tmp_region_;
 
   DISALLOW_COPY_AND_ASSIGN(TopMostFinder);
 };
diff --git a/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.cc b/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.cc
index 419e0bb16d7c2ad7d58f47e02f37f5b886e205f0..5d78ec4ce23dcbf7023be8a866b40265eafb413f 100644
--- a/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.cc
+++ b/chrome/browser/views/autocomplete/autocomplete_popup_contents_view.cc
@@ -857,7 +857,7 @@ void AutocompletePopupContentsView::UpdateBlurRegion() {
   gfx::Path contents_path;
   MakeContentsPath(&contents_path, contents_rect);
   ScopedGDIObject<HRGN> popup_region;
-  popup_region.Set(contents_path.CreateNativeRegion());
+  popup_region.Set(contents_path.CreateHRGN());
   bb.hRgnBlur = popup_region.Get();
   DwmEnableBlurBehindWindow(GetWidget()->GetNativeView(), &bb);
 #endif
diff --git a/chrome/browser/views/blocked_popup_container_view_views.cc b/chrome/browser/views/blocked_popup_container_view_views.cc
index 4a47eb0ccc68c6fee49411c0d007cfed15aaf88b..832447e01cb987a5c22b522873646b46a97b7a5d 100644
--- a/chrome/browser/views/blocked_popup_container_view_views.cc
+++ b/chrome/browser/views/blocked_popup_container_view_views.cc
@@ -570,5 +570,5 @@ void BlockedPopupContainerViewViews::UpdateWidgetShape(
   rect.set(0, 0, SkIntToScalar(size.width()), SkIntToScalar(size.height()));
   gfx::Path path;
   path.addRoundRect(rect, kRoundedCornerRad, SkPath::kCW_Direction);
-  widget->SetShape(path.CreateNativeRegion());
+  widget->SetShape(path);
 }
diff --git a/chrome/browser/views/find_bar_host.cc b/chrome/browser/views/find_bar_host.cc
index fb1d344678ed96908b0010e28ef18026710f90fe..46888affe3bd661917d86e55c5137093feb62c4c 100644
--- a/chrome/browser/views/find_bar_host.cc
+++ b/chrome/browser/views/find_bar_host.cc
@@ -4,10 +4,8 @@
 
 #include "chrome/browser/views/find_bar_host.h"
 
-#include "app/gfx/path.h"
 #include "app/slide_animation.h"
 #include "base/keyboard_codes.h"
-#include "base/scoped_handle.h"
 #include "chrome/browser/browser.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/find_bar_controller.h"
@@ -25,8 +23,6 @@
 // static
 bool FindBarHost::disable_animations_during_testing_ = false;
 
-using gfx::Path;
-
 namespace browser {
 
 // Declared in browser_dialogs.h so others don't have to depend on our header.
@@ -65,9 +61,6 @@ FindBarHost::FindBarHost(BrowserView* browser_view)
 
   // Start the process of animating the opening of the window.
   animation_.reset(new SlideAnimation(this));
-
-
-animation_->SetSlideDuration(5000);
 }
 
 FindBarHost::~FindBarHost() {
@@ -259,116 +252,6 @@ void FindBarHost::GetDialogBounds(gfx::Rect* bounds) {
   *bounds = browser_view_->GetFindBarBoundingBox();
 }
 
-void FindBarHost::UpdateWindowEdges(const gfx::Rect& new_pos) {
-  // |w| is used to make it easier to create the part of the polygon that curves
-  // the right side of the Find window. It essentially keeps track of the
-  // x-pixel position of the right-most background image inside the view.
-  // TODO(finnur): Let the view tell us how to draw the curves or convert
-  // this to a CustomFrameWindow.
-  int w = new_pos.width() - 6;  // -6 positions us at the left edge of the
-                                // rightmost background image of the view.
-
-  // This polygon array represents the outline of the background image for the
-  // dialog. Basically, it encompasses only the visible pixels of the
-  // concatenated find_dlg_LMR_bg images (where LMR = [left | middle | right]).
-  static const Path::Point polygon[] = {
-      {0, 0}, {0, 1}, {2, 3}, {2, 29}, {4, 31},
-        {4, 32}, {w+0, 32},
-      {w+0, 31}, {w+1, 31}, {w+3, 29}, {w+3, 3}, {w+6, 0}
-  };
-
-  // Find the largest x and y value in the polygon.
-  int max_x = 0, max_y = 0;
-  for (size_t i = 0; i < arraysize(polygon); i++) {
-    max_x = std::max(max_x, static_cast<int>(polygon[i].x));
-    max_y = std::max(max_y, static_cast<int>(polygon[i].y));
-  }
-
-  // We then create the polygon and use SetWindowRgn to force the window to draw
-  // only within that area. This region may get reduced in size below.
-  Path path(polygon, arraysize(polygon));
-  ScopedRegion region(path.CreateNativeRegion());
-
-  // Are we animating?
-  if (find_dialog_animation_offset_ > 0) {
-    // The animation happens in two steps: First, we clip the window and then in
-    // GetDialogPosition we offset the window position so that it still looks
-    // attached to the toolbar as it grows. We clip the window by creating a
-    // rectangle region (that gradually increases as the animation progresses)
-    // and find the intersection between the two regions using CombineRgn.
-
-    // |y| shrinks as the animation progresses from the height of the view down
-    // to 0 (and reverses when closing).
-    int y = find_dialog_animation_offset_;
-    // |y| shrinking means the animation (visible) region gets larger. In other
-    // words: the rectangle grows upward (when the dialog is opening).
-    Path animation_path;
-    SkRect animation_rect = { SkIntToScalar(0), SkIntToScalar(y),
-                              SkIntToScalar(max_x), SkIntToScalar(max_y) };
-    animation_path.addRect(animation_rect);
-    ScopedRegion animation_region(animation_path.CreateNativeRegion());
-    region.Set(Path::IntersectRegions(animation_region.Get(), region.Get()));
-
-    // Next, we need to increase the region a little bit to account for the
-    // curved edges that the view will draw to make it look like grows out of
-    // the toolbar.
-    Path::Point left_curve[] = {
-      {0, y+0}, {0, y+1}, {2, y+3}, {2, y+0}, {0, y+0}
-    };
-    Path::Point right_curve[] = {
-      {w+3, y+3}, {w+6, y+0}, {w+3, y+0}, {w+3, y+3}
-    };
-
-    // Combine the region for the curve on the left with our main region.
-    Path left_path(left_curve, arraysize(left_curve));
-    ScopedRegion r(left_path.CreateNativeRegion());
-    region.Set(Path::CombineRegions(r.Get(), region.Get()));
-
-    // Combine the region for the curve on the right with our main region.
-    Path right_path(right_curve, arraysize(right_curve));
-    region.Set(Path::CombineRegions(r.Get(), region.Get()));
-  }
-
-  // Now see if we need to truncate the region because parts of it obscures
-  // the main window border.
-  gfx::Rect dialog_bounds;
-  GetDialogBounds(&dialog_bounds);
-
-  // Calculate how much our current position overlaps our boundaries. If we
-  // overlap, it means we have too little space to draw the whole dialog and
-  // we allow overwriting the scrollbar before we start truncating our dialog.
-  //
-  // TODO(brettw) this constant is evil. This is the amount of room we've added
-  // to the window size, when we set the region, it can change the size.
-  static const int kAddedWidth = 7;
-  int difference = (new_pos.right() - kAddedWidth) -
-                   dialog_bounds.width() -
-                   views::NativeScrollBar::GetVerticalScrollBarWidth() +
-                   1;
-  if (difference > 0) {
-    Path::Point exclude[4];
-    exclude[0].x = max_x - difference;  // Top left corner.
-    exclude[0].y = 0;
-
-    exclude[1].x = max_x;               // Top right corner.
-    exclude[1].y = 0;
-
-    exclude[2].x = max_x;               // Bottom right corner.
-    exclude[2].y = max_y;
-
-    exclude[3].x = max_x - difference;  // Bottom left corner.
-    exclude[3].y = max_y;
-
-    // Subtract this region from the original region.
-    gfx::Path exclude_path(exclude, arraysize(exclude));
-    ScopedRegion exclude_region(exclude_path.CreateNativeRegion());
-    region.Set(Path::SubtractRegion(region.Get(), exclude_region.Get()));
-  }
-
-  // Window takes ownership of the region.
-  host_->SetShape(region.release());
-}
-
 gfx::Rect FindBarHost::GetDialogPosition(gfx::Rect avoid_overlapping_rect) {
   // Find the area we have to work with (after accounting for scrollbars, etc).
   gfx::Rect dialog_bounds;
diff --git a/chrome/browser/views/find_bar_host.h b/chrome/browser/views/find_bar_host.h
index 4ccc57aabde7f89701f5346a9808f801ff14a6e1..a67b7148722b78046d1f4fa0460fed14024b57fe 100644
--- a/chrome/browser/views/find_bar_host.h
+++ b/chrome/browser/views/find_bar_host.h
@@ -132,6 +132,7 @@ class FindBarHost : public views::AcceleratorTarget,
   // to prevent from drawing onto Chrome's window border.
   void UpdateWindowEdges(const gfx::Rect& new_pos);
 
+
   // Registers this class as the handler for when Escape is pressed. We will
   // unregister once we loose focus. See also: SetFocusChangeListener().
   void RegisterEscAccelerator();
diff --git a/chrome/browser/views/find_bar_host_gtk.cc b/chrome/browser/views/find_bar_host_gtk.cc
index e4a46a2f1c4d6d822524c1b16a3025308d77221d..e517407671ee01a7b0620116966fe3e61f77f9b6 100644
--- a/chrome/browser/views/find_bar_host_gtk.cc
+++ b/chrome/browser/views/find_bar_host_gtk.cc
@@ -10,9 +10,14 @@
 #include "chrome/browser/renderer_host/render_view_host.h"
 #include "chrome/browser/tab_contents/tab_contents.h"
 #include "chrome/browser/views/frame/browser_view.h"
-#include "chrome/browser/views/tab_contents/tab_contents_view_gtk.h"
 #include "views/widget/widget_gtk.h"
 
+void FindBarHost::UpdateWindowEdges(const gfx::Rect& new_pos) {
+  // TODO(davemoore) move the windows implementation to CustomFrameWindow so we
+  // don't have to implement it for gtk
+  NOTIMPLEMENTED();
+}
+
 void FindBarHost::AudibleAlert() {
   // TODO(davemoore) implement
   NOTIMPLEMENTED();
@@ -32,12 +37,8 @@ void FindBarHost::SetDialogPositionNative(const gfx::Rect& new_pos,
 }
 
 void FindBarHost::GetDialogPositionNative(gfx::Rect* avoid_overlapping_rect) {
-  gfx::Rect frame_rect, webcontents_rect;
-  host_->GetRootWidget()->GetBounds(&frame_rect, true);
-  TabContentsView* tab_view = find_bar_controller_->tab_contents()->view();
-  static_cast<TabContentsViewGtk*>(tab_view)->GetBounds(&webcontents_rect,
-                                                        true);
-  avoid_overlapping_rect->Offset(0, webcontents_rect.y() - frame_rect.y());
+  // TODO(davemoore) implement
+  NOTIMPLEMENTED();
 }
 
 
diff --git a/chrome/browser/views/find_bar_host_win.cc b/chrome/browser/views/find_bar_host_win.cc
index 7d41f2ffac8da08bbefdf741d644ea774b6a9d44..8ba3c53206ad450678d733103e7f3ca35033f8c0 100644
--- a/chrome/browser/views/find_bar_host_win.cc
+++ b/chrome/browser/views/find_bar_host_win.cc
@@ -12,6 +12,117 @@
 #include "views/controls/scrollbar/native_scroll_bar.h"
 #include "views/widget/widget_win.h"
 
+// TODO(brettw) this should not be so complicated. The view should really be in
+// charge of these regions. CustomFrameWindow will do this for us. It will also
+// let us set a path for the window region which will avoid some logic here.
+void FindBarHost::UpdateWindowEdges(const gfx::Rect& new_pos) {
+  // |w| is used to make it easier to create the part of the polygon that curves
+  // the right side of the Find window. It essentially keeps track of the
+  // x-pixel position of the right-most background image inside the view.
+  // TODO(finnur): Let the view tell us how to draw the curves or convert
+  // this to a CustomFrameWindow.
+  int w = new_pos.width() - 6;  // -6 positions us at the left edge of the
+                                // rightmost background image of the view.
+
+  // This polygon array represents the outline of the background image for the
+  // dialog. Basically, it encompasses only the visible pixels of the
+  // concatenated find_dlg_LMR_bg images (where LMR = [left | middle | right]).
+  static const POINT polygon[] = {
+      {0, 0}, {0, 1}, {2, 3}, {2, 29}, {4, 31},
+        {4, 32}, {w+0, 32},
+      {w+0, 31}, {w+1, 31}, {w+3, 29}, {w+3, 3}, {w+6, 0}
+  };
+
+  // Find the largest x and y value in the polygon.
+  int max_x = 0, max_y = 0;
+  for (int i = 0; i < arraysize(polygon); i++) {
+    max_x = std::max(max_x, static_cast<int>(polygon[i].x));
+    max_y = std::max(max_y, static_cast<int>(polygon[i].y));
+  }
+
+  // We then create the polygon and use SetWindowRgn to force the window to draw
+  // only within that area. This region may get reduced in size below.
+  HRGN region = CreatePolygonRgn(polygon, arraysize(polygon), ALTERNATE);
+
+  // Are we animating?
+  if (find_dialog_animation_offset_ > 0) {
+    // The animation happens in two steps: First, we clip the window and then in
+    // GetDialogPosition we offset the window position so that it still looks
+    // attached to the toolbar as it grows. We clip the window by creating a
+    // rectangle region (that gradually increases as the animation progresses)
+    // and find the intersection between the two regions using CombineRgn.
+
+    // |y| shrinks as the animation progresses from the height of the view down
+    // to 0 (and reverses when closing).
+    int y = find_dialog_animation_offset_;
+    // |y| shrinking means the animation (visible) region gets larger. In other
+    // words: the rectangle grows upward (when the dialog is opening).
+    HRGN animation_region = CreateRectRgn(0, y, max_x, max_y);
+    // |region| will contain the intersected parts after calling this function:
+    CombineRgn(region, animation_region, region, RGN_AND);
+    DeleteObject(animation_region);
+
+    // Next, we need to increase the region a little bit to account for the
+    // curved edges that the view will draw to make it look like grows out of
+    // the toolbar.
+    POINT left_curve[] = {
+      {0, y+0}, {0, y+1}, {2, y+3}, {2, y+0}, {0, y+0}
+    };
+    POINT right_curve[] = {
+      {w+3, y+3}, {w+6, y+0}, {w+3, y+0}, {w+3, y+3}
+    };
+
+    // Combine the region for the curve on the left with our main region.
+    HRGN r = CreatePolygonRgn(left_curve, arraysize(left_curve), ALTERNATE);
+    CombineRgn(region, r, region, RGN_OR);
+    DeleteObject(r);
+
+    // Combine the region for the curve on the right with our main region.
+    r = CreatePolygonRgn(right_curve, arraysize(right_curve), ALTERNATE);
+    CombineRgn(region, r, region, RGN_OR);
+    DeleteObject(r);
+  }
+
+  // Now see if we need to truncate the region because parts of it obscures
+  // the main window border.
+  gfx::Rect dialog_bounds;
+  GetDialogBounds(&dialog_bounds);
+
+  // Calculate how much our current position overlaps our boundaries. If we
+  // overlap, it means we have too little space to draw the whole dialog and
+  // we allow overwriting the scrollbar before we start truncating our dialog.
+  //
+  // TODO(brettw) this constant is evil. This is the amount of room we've added
+  // to the window size, when we set the region, it can change the size.
+  static const int kAddedWidth = 7;
+  int difference = (new_pos.right() - kAddedWidth) -
+                   dialog_bounds.width() -
+                   views::NativeScrollBar::GetVerticalScrollBarWidth() +
+                   1;
+  if (difference > 0) {
+    POINT exclude[4] = {0};
+    exclude[0].x = max_x - difference;  // Top left corner.
+    exclude[0].y = 0;
+
+    exclude[1].x = max_x;               // Top right corner.
+    exclude[1].y = 0;
+
+    exclude[2].x = max_x;               // Bottom right corner.
+    exclude[2].y = max_y;
+
+    exclude[3].x = max_x - difference;  // Bottom left corner.
+    exclude[3].y = max_y;
+
+    // Subtract this region from the original region.
+    HRGN exclude_rgn = CreatePolygonRgn(exclude, arraysize(exclude), ALTERNATE);
+    int result = CombineRgn(region, region, exclude_rgn, RGN_DIFF);
+    DeleteObject(exclude_rgn);
+  }
+
+  // The system now owns the region, so we do not delete it.
+  ::SetWindowRgn(host_->GetNativeView(), region, TRUE);  // TRUE = Redraw.
+}
+
 NativeWebKeyboardEvent FindBarHost::GetKeyboardEvent(
      const TabContents* contents,
      const views::Textfield::Keystroke& key_stroke) {
diff --git a/chrome/browser/views/notifications/balloon_view.cc b/chrome/browser/views/notifications/balloon_view.cc
index cb0ef1e080f976e0251ede5a236615355438f113..a092ce41cf6281bbbbfe2b8426a7f16e72a8ba78 100644
--- a/chrome/browser/views/notifications/balloon_view.cc
+++ b/chrome/browser/views/notifications/balloon_view.cc
@@ -137,7 +137,7 @@ void BalloonViewImpl::SizeContentsWindow() {
 
   gfx::Path path;
   GetContentsMask(contents_rect, &path);
-  html_container_->SetShape(path.CreateNativeRegion());
+  html_container_->SetShape(path);
 }
 
 void BalloonViewImpl::RepositionToBalloon() {
diff --git a/views/view.cc b/views/view.cc
index 34ec1c32f5764e56f5d87f1b4d99f80e27d2464e..1e1cd206fc0151dcfc926b234c9355da8439ebdf 100644
--- a/views/view.cc
+++ b/views/view.cc
@@ -429,12 +429,14 @@ bool View::HitTest(const gfx::Point& l) const {
     if (HasHitTestMask()) {
       gfx::Path mask;
       GetHitTestMask(&mask);
-      ScopedRegion rgn(mask.CreateNativeRegion());
-      // TODO: can this use SkRegion's contains instead?
 #if defined(OS_WIN)
+      ScopedHRGN rgn(mask.CreateHRGN());
       return !!PtInRegion(rgn, l.x(), l.y());
 #elif defined(OS_LINUX)
-      return gdk_region_point_in(rgn.Get(), l.x(), l.y());
+      GdkRegion* region = mask.CreateGdkRegion();
+      bool result = gdk_region_point_in(region, l.x(), l.y());
+      gdk_region_destroy(region);
+      return result;
 #endif
     }
     // No mask, but inside our bounds.
diff --git a/views/widget/widget.h b/views/widget/widget.h
index 357f07a0e8ff5b8d0ec3a15fcb9d6a4e0793a433..7b0873742b9d9baed9c456a79abfe7c5b4b739de 100644
--- a/views/widget/widget.h
+++ b/views/widget/widget.h
@@ -96,8 +96,8 @@ class Widget {
   // Places the widget in front of the specified widget in z-order.
   virtual void MoveAbove(Widget* widget) = 0;
 
-  // Sets a shape on the widget. This takes ownership of shape.
-  virtual void SetShape(gfx::NativeRegion shape) = 0;
+  // Sets a shape on the widget.
+  virtual void SetShape(const gfx::Path& shape) = 0;
 
   // Hides the widget then closes it after a return to the message loop.
   virtual void Close() = 0;
diff --git a/views/widget/widget_gtk.cc b/views/widget/widget_gtk.cc
index 4edef7ceccc767060c47e3f2801527db9d592fe2..4557286f32a3448ef13041aac3f2163f4b2a9b7f 100644
--- a/views/widget/widget_gtk.cc
+++ b/views/widget/widget_gtk.cc
@@ -378,10 +378,12 @@ void WidgetGtk::MoveAbove(Widget* widget) {
   NOTIMPLEMENTED();
 }
 
-void WidgetGtk::SetShape(gfx::NativeRegion region) {
+void WidgetGtk::SetShape(const gfx::Path& shape) {
   DCHECK(widget_);
   DCHECK(widget_->window);
 
+  gdk_window_shape_combine_region(widget_->window, NULL, 0, 0);
+  GdkRegion* region = shape.CreateGdkRegion();
   gdk_window_shape_combine_region(widget_->window, region, 0, 0);
   gdk_region_destroy(region);
 }
diff --git a/views/widget/widget_gtk.h b/views/widget/widget_gtk.h
index 3799a4aa620be3ad92c5b1647a8f4c9ce997164a..e97f58ea2e03e5b6442512a3221d5d486c5a47b4 100644
--- a/views/widget/widget_gtk.h
+++ b/views/widget/widget_gtk.h
@@ -118,7 +118,7 @@ class WidgetGtk
   virtual void GetBounds(gfx::Rect* out, bool including_frame) const;
   virtual void SetBounds(const gfx::Rect& bounds);
   virtual void MoveAbove(Widget* other);
-  virtual void SetShape(gfx::NativeRegion region);
+  virtual void SetShape(const gfx::Path& shape);
   virtual void Close();
   virtual void CloseNow();
   virtual void Show();
diff --git a/views/widget/widget_win.cc b/views/widget/widget_win.cc
index a3dc3cea8e9f4cc9f4bf016cd7544482b18b7d67..e0edee8d3da312e7b3b960831ac3faf89ea33c60 100644
--- a/views/widget/widget_win.cc
+++ b/views/widget/widget_win.cc
@@ -144,8 +144,8 @@ void WidgetWin::MoveAbove(Widget* other) {
                bounds.width(), bounds.height(), SWP_NOACTIVATE);
 }
 
-void WidgetWin::SetShape(gfx::NativeRegion region) {
-  SetWindowRgn(region, TRUE);
+void WidgetWin::SetShape(const gfx::Path& shape) {
+  SetWindowRgn(shape.CreateHRGN(), TRUE);
 }
 
 void WidgetWin::Close() {
diff --git a/views/widget/widget_win.h b/views/widget/widget_win.h
index f22417c9b9c1ef577901c66e066df01f0d5b3656..b8e21ddcc640ba450d3b7fc0e982157778681e07 100644
--- a/views/widget/widget_win.h
+++ b/views/widget/widget_win.h
@@ -184,7 +184,7 @@ class WidgetWin : public app::WindowImpl,
   virtual void GetBounds(gfx::Rect* out, bool including_frame) const;
   virtual void SetBounds(const gfx::Rect& bounds);
   virtual void MoveAbove(Widget* other);
-  virtual void SetShape(gfx::NativeRegion region);
+  virtual void SetShape(const gfx::Path& shape);
   virtual void Close();
   virtual void CloseNow();
   virtual void Show();
diff --git a/views/window/window_gtk.cc b/views/window/window_gtk.cc
index fff4e74d36c3ad2652b198c5b8f146fd9dce90e9..9bf20712f75d02beb9d168c5e0b968aca0930261 100644
--- a/views/window/window_gtk.cc
+++ b/views/window/window_gtk.cc
@@ -326,7 +326,7 @@ void WindowGtk::OnSizeAllocate(GtkWidget* widget, GtkAllocation* allocation) {
   non_client_view_->GetWindowMask(gfx::Size(allocation->width,
                                             allocation->height),
                                   &window_mask);
-  GdkRegion* mask_region = window_mask.CreateNativeRegion();
+  GdkRegion* mask_region = window_mask.CreateGdkRegion();
   gdk_window_shape_combine_region(GetNativeView()->window, mask_region, 0, 0);
   if (mask_region)
     gdk_region_destroy(mask_region);
diff --git a/views/window/window_win.cc b/views/window/window_win.cc
index 66a1e85005356a4cb0febf891f4716f6576f4020..f77b80682e8a676a201940e5ce7ac3c29512a27e 100644
--- a/views/window/window_win.cc
+++ b/views/window/window_win.cc
@@ -1355,11 +1355,11 @@ void WindowWin::ResetWindowRegion(bool force) {
     gfx::Path window_mask;
     non_client_view_->GetWindowMask(
         gfx::Size(window_rect.Width(), window_rect.Height()), &window_mask);
-    new_region = window_mask.CreateNativeRegion();
+    new_region = window_mask.CreateHRGN();
   }
 
   if (current_rgn_result == ERROR || !EqualRgn(current_rgn, new_region)) {
-    // SetWindowRgn takes ownership of the HRGN created by CreateNativeRegion.
+    // SetWindowRgn takes ownership of the HRGN created by CreateHRGN.
     SetWindowRgn(new_region, TRUE);
   } else {
     DeleteObject(new_region);