Index: user/src/com/google/gwt/user/client/ui/PopupPanel.java
===================================================================
--- user/src/com/google/gwt/user/client/ui/PopupPanel.java	(revision 5919)
+++ user/src/com/google/gwt/user/client/ui/PopupPanel.java	(working copy)
@@ -389,7 +389,7 @@
 
     int left = (Window.getClientWidth() - getOffsetWidth()) >> 1;
     int top = (Window.getClientHeight() - getOffsetHeight()) >> 1;
-    setPopupPosition(Window.getScrollLeft() + left, Window.getScrollTop() + top);
+    setPopupPosition(Math.max(Window.getScrollLeft() + left, 0), Math.max(Window.getScrollTop() + top, 0));
 
     if (!initiallyShowing) {
       setAnimationEnabled(initiallyAnimated);
Index: user/test/com/google/gwt/user/client/ui/PopupTest.java
===================================================================
--- user/test/com/google/gwt/user/client/ui/PopupTest.java	(revision 5919)
+++ user/test/com/google/gwt/user/client/ui/PopupTest.java	(working copy)
@@ -314,4 +314,18 @@
 
     delayTestFinish(5000);
   }
+
+  /**
+   * Tests that a large PopupPanel is not positioned off the top or left edges
+   * of the browser window, making part of the panel unreachable.
+   */
+  public void testCenterLargePopup() {
+    PopupPanel popup = new PopupPanel();
+    popup.setHeight("1000px");
+    popup.setWidth("1000px");
+    popup.setWidget(new Label("foo"));
+    popup.center();
+    assertEquals(0, popup.getAbsoluteTop());
+    assertEquals(0, popup.getAbsoluteLeft());
+  }
 }