summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xchrome/browser/extensions/extension_view.cc34
-rwxr-xr-xchrome/browser/extensions/extension_view.h3
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc6
-rw-r--r--chrome/browser/renderer_host/render_view_host.h1
-rw-r--r--chrome/browser/renderer_host/render_view_host_delegate.h3
-rw-r--r--chrome/common/render_messages_internal.h3
-rw-r--r--chrome/common/temp_scaffolding_stubs.h5
-rw-r--r--chrome/renderer/render_view.cc13
-rw-r--r--chrome/renderer/render_view.h3
-rw-r--r--webkit/glue/chrome_client_impl.cc9
-rw-r--r--webkit/glue/chrome_client_impl.h3
-rw-r--r--webkit/glue/webframe.h3
-rw-r--r--webkit/glue/webframe_impl.cc10
-rw-r--r--webkit/glue/webframe_impl.h1
-rw-r--r--webkit/glue/webview_delegate.h4
15 files changed, 98 insertions, 3 deletions
diff --git a/chrome/browser/extensions/extension_view.cc b/chrome/browser/extensions/extension_view.cc
index a9b3ed0..11c33cf 100755
--- a/chrome/browser/extensions/extension_view.cc
+++ b/chrome/browser/extensions/extension_view.cc
@@ -19,8 +19,38 @@ ExtensionView::ExtensionView(Extension* extension,
: HWNDHtmlView(url, this, false),
extension_(extension),
profile_(profile) {
- // TODO(mpcomplete): query this from the renderer somehow?
- set_preferred_size(gfx::Size(100, 100));
+ // Set the width initially to 0, so that the WebCore::Document can
+ // correctly compute the minPrefWidth which is returned in
+ // DidContentsChangeSize()
+ set_preferred_size(gfx::Size(0, 100));
+ SetVisible(false);
+}
+
+void ExtensionView::DidStopLoading(RenderViewHost* render_view_host,
+ int32 page_id) {
+ SetVisible(true);
+ render_view_host->WasResized();
+}
+
+void ExtensionView::DidContentsPreferredWidthChange(const int pref_width) {
+ if (pref_width > 0) {
+ // SchedulePaint first because new_width may be smaller and we want
+ // the Parent to paint the vacated space.
+ SchedulePaint();
+ set_preferred_size(gfx::Size(pref_width, 100));
+ SizeToPreferredSize();
+
+ // TODO(rafaelw): This assumes that the extension view is a child of an
+ // ExtensionToolstrip, which is a child of the BookmarkBarView. There should
+ // be a way to do this where the ExtensionView doesn't have to know it's
+ // containment hierarchy.
+ if (GetParent() != NULL && GetParent()->GetParent() != NULL) {
+ GetParent()->GetParent()->Layout();
+ }
+
+ SchedulePaint();
+ render_view_host()->WasResized();
+ }
}
void ExtensionView::CreatingRenderer() {
diff --git a/chrome/browser/extensions/extension_view.h b/chrome/browser/extensions/extension_view.h
index e82c918..960a294 100755
--- a/chrome/browser/extensions/extension_view.h
+++ b/chrome/browser/extensions/extension_view.h
@@ -33,6 +33,9 @@ class ExtensionView : public HWNDHtmlView,
// RenderViewHostDelegate
virtual Profile* GetProfile() const { return profile_; }
virtual void RenderViewCreated(RenderViewHost* render_view_host);
+ virtual void DidContentsPreferredWidthChange(const int pref_width);
+ virtual void DidStopLoading(RenderViewHost* render_view_host,
+ int32 page_id);
virtual WebPreferences GetWebkitPrefs();
virtual void RunJavaScriptMessage(
const std::wstring& message,
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc
index 76bc612..271df03 100644
--- a/chrome/browser/renderer_host/render_view_host.cc
+++ b/chrome/browser/renderer_host/render_view_host.cc
@@ -712,6 +712,8 @@ void RenderViewHost::OnMessageReceived(const IPC::Message& msg) {
IPC_MESSAGE_HANDLER(ViewHostMsg_DidDownloadImage, OnMsgDidDownloadImage)
IPC_MESSAGE_HANDLER(ViewHostMsg_ContextMenu, OnMsgContextMenu)
IPC_MESSAGE_HANDLER(ViewHostMsg_OpenURL, OnMsgOpenURL)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_DidContentsPreferredWidthChange,
+ OnMsgDidContentsPreferredWidthChange)
IPC_MESSAGE_HANDLER(ViewHostMsg_DomOperationResponse,
OnMsgDomOperationResponse)
IPC_MESSAGE_HANDLER(ViewHostMsg_DOMUISend,
@@ -1053,6 +1055,10 @@ void RenderViewHost::OnMsgOpenURL(const GURL& url,
delegate_->RequestOpenURL(validated_url, referrer, disposition);
}
+void RenderViewHost::OnMsgDidContentsPreferredWidthChange(const int pref_width) {
+ delegate_->DidContentsPreferredWidthChange(pref_width);
+}
+
void RenderViewHost::OnMsgDomOperationResponse(
const std::string& json_string, int automation_id) {
delegate_->DomOperationResponse(json_string, automation_id);
diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h
index f7a63a5..68fe3c2 100644
--- a/chrome/browser/renderer_host/render_view_host.h
+++ b/chrome/browser/renderer_host/render_view_host.h
@@ -493,6 +493,7 @@ class RenderViewHost : public RenderWidgetHost {
void OnMsgContextMenu(const ContextMenuParams& params);
void OnMsgOpenURL(const GURL& url, const GURL& referrer,
WindowOpenDisposition disposition);
+ void OnMsgDidContentsPreferredWidthChange(const int pref_width);
void OnMsgDomOperationResponse(const std::string& json_string,
int automation_id);
void OnMsgDOMUISend(const std::string& message,
diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h
index fc7c8c4..63c01e6 100644
--- a/chrome/browser/renderer_host/render_view_host_delegate.h
+++ b/chrome/browser/renderer_host/render_view_host_delegate.h
@@ -245,6 +245,9 @@ class RenderViewHostDelegate {
bool errored,
const SkBitmap& image) { }
+ // The content's intrinsic width (prefWidth) changed.
+ virtual void DidContentsPreferredWidthChange(const int pref_width) { }
+
// The page wants to open a URL with the specified disposition.
virtual void RequestOpenURL(const GURL& url,
const GURL& referrer,
diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h
index ece0cd1..576b659 100644
--- a/chrome/common/render_messages_internal.h
+++ b/chrome/common/render_messages_internal.h
@@ -832,6 +832,9 @@ IPC_BEGIN_MESSAGES(ViewHost)
GURL /* referrer */,
WindowOpenDisposition /* disposition */)
+ IPC_MESSAGE_ROUTED1(ViewHostMsg_DidContentsPreferredWidthChange,
+ int /* pref_width */)
+
// Following message is used to communicate the values received by the
// callback binding the JS to Cpp.
// An instance of browser that has an automation host listening to it can
diff --git a/chrome/common/temp_scaffolding_stubs.h b/chrome/common/temp_scaffolding_stubs.h
index 8085896..ede9a18 100644
--- a/chrome/common/temp_scaffolding_stubs.h
+++ b/chrome/common/temp_scaffolding_stubs.h
@@ -639,6 +639,11 @@ class HWNDHtmlView {
RenderViewHost* render_view_host() { NOTIMPLEMENTED(); return NULL; }
void InitHidden() { NOTIMPLEMENTED(); }
void set_preferred_size(const gfx::Size& size) { NOTIMPLEMENTED(); }
+ virtual void SetVisible(bool flag) { NOTIMPLEMENTED(); }
+ void SizeToPreferredSize() { NOTIMPLEMENTED(); }
+ HWNDHtmlView* GetParent() const { NOTIMPLEMENTED(); return NULL; }
+ void Layout() { NOTIMPLEMENTED(); }
+ void SchedulePaint() { NOTIMPLEMENTED(); }
};
#endif // CHROME_COMMON_TEMP_SCAFFOLDING_STUBS_H_
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 91d93119..ee218a3 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -1944,6 +1944,19 @@ void RenderView::OpenURL(WebView* webview, const GURL& url,
Send(new ViewHostMsg_OpenURL(routing_id_, url, referrer, disposition));
}
+void RenderView::DidContentsSizeChange(WebWidget* webwidget,
+ int new_width,
+ int new_height) {
+ // TODO(rafaelw): This is a temporary solution. Only the ExtensionView wants
+ // this notification at the moment. It isn't clean to test for ExtensionView
+ // by examining the enabled_bindings. This needs to be generalized as it
+ // becomes clear what extension toolbars need.
+ if (BindingsPolicy::is_extension_enabled(enabled_bindings_)) {
+ int width = webview()->GetMainFrame()->GetContentsPreferredWidth();
+ Send(new ViewHostMsg_DidContentsPreferredWidthChange(routing_id_, width));
+ }
+}
+
// We are supposed to get a single call to Show for a newly created RenderView
// that was created via RenderView::CreateWebView. So, we wait until this
// point to dispatch the ShowView message.
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index a272a3f..b0568b1 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -207,6 +207,9 @@ class RenderView : public RenderWidget,
WebFrame* frame,
bool is_new_navigation);
virtual void DidReceiveIconForFrame(WebView* webview, WebFrame* frame);
+ virtual void DidContentsSizeChange(WebWidget* webwidget,
+ int new_width,
+ int new_height);
virtual void WillPerformClientRedirect(WebView* webview,
WebFrame* frame,
diff --git a/webkit/glue/chrome_client_impl.cc b/webkit/glue/chrome_client_impl.cc
index 60cfe9b..f190551 100644
--- a/webkit/glue/chrome_client_impl.cc
+++ b/webkit/glue/chrome_client_impl.cc
@@ -448,6 +448,15 @@ PlatformWidget ChromeClientImpl::platformWindow() const {
return delegate ? delegate->GetContainingView(webview_) : NULL;
}
+void ChromeClientImpl::contentsSizeChanged(WebCore::Frame* frame, const
+ WebCore::IntSize& size) const {
+ WebViewDelegate* delegate = webview_->delegate();
+
+ if (delegate) {
+ delegate->DidContentsSizeChange(webview_, size.width(), size.height());
+ }
+}
+
void ChromeClientImpl::mouseDidMoveOverElement(
const WebCore::HitTestResult& result, unsigned modifierFlags) {
// Find out if the mouse is over a link, and if so, let our UI know... somehow
diff --git a/webkit/glue/chrome_client_impl.h b/webkit/glue/chrome_client_impl.h
index bf515d2..ad427f4 100644
--- a/webkit/glue/chrome_client_impl.h
+++ b/webkit/glue/chrome_client_impl.h
@@ -102,7 +102,8 @@ class ChromeClientImpl : public WebCore::ChromeClientChromium {
virtual WebCore::IntPoint screenToWindow(const WebCore::IntPoint&) const;
virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&) const;
virtual PlatformWidget platformWindow() const;
- virtual void contentsSizeChanged(WebCore::Frame*, const WebCore::IntSize&) const {}
+ virtual void contentsSizeChanged(WebCore::Frame*,
+ const WebCore::IntSize&) const;
virtual void mouseDidMoveOverElement(const WebCore::HitTestResult& result,
unsigned modifierFlags);
diff --git a/webkit/glue/webframe.h b/webkit/glue/webframe.h
index 7a2c376..93f5698d 100644
--- a/webkit/glue/webframe.h
+++ b/webkit/glue/webframe.h
@@ -140,6 +140,9 @@ class WebFrame {
// the page does not have a valid document, an empty GURL is returned.
virtual GURL GetOSDDURL() const = 0;
+ // Return the minPrefWidth of the content contained in the current Document
+ virtual int GetContentsPreferredWidth() const = 0;
+
// Return the list of feeds specified in the document for the frame. If
// the page does not have a valid document, an empty list is returned.
virtual scoped_refptr<class FeedList> GetFeedList() const = 0;
diff --git a/webkit/glue/webframe_impl.cc b/webkit/glue/webframe_impl.cc
index f647a72..11bdf5e 100644
--- a/webkit/glue/webframe_impl.cc
+++ b/webkit/glue/webframe_impl.cc
@@ -105,6 +105,7 @@ MSVC_PUSH_WARNING_LEVEL(0);
#if defined(OS_WIN)
#include "RenderThemeChromiumWin.h"
#endif
+#include "RenderView.h"
#include "RenderWidget.h"
#include "ReplaceSelectionCommand.h"
#include "ResourceHandle.h"
@@ -538,6 +539,15 @@ GURL WebFrameImpl::GetOSDDURL() const {
return GURL();
}
+int WebFrameImpl::GetContentsPreferredWidth() const {
+ if ((frame_->document() != NULL) &&
+ (frame_->document()->renderView() != NULL)) {
+ return frame_->document()->renderView()->minPrefWidth();
+ } else {
+ return 0;
+ }
+}
+
scoped_refptr<FeedList> WebFrameImpl::GetFeedList() const {
scoped_refptr<FeedList> feedlist = new FeedList();
diff --git a/webkit/glue/webframe_impl.h b/webkit/glue/webframe_impl.h
index 8bb334e..11d8731 100644
--- a/webkit/glue/webframe_impl.h
+++ b/webkit/glue/webframe_impl.h
@@ -101,6 +101,7 @@ class WebFrameImpl : public WebFrame, public base::RefCounted<WebFrameImpl> {
virtual GURL GetURL() const;
virtual GURL GetFavIconURL() const;
virtual GURL GetOSDDURL() const;
+ virtual int GetContentsPreferredWidth() const;
virtual scoped_refptr<class FeedList> GetFeedList() const;
virtual WebDataSource* GetDataSource() const;
virtual WebDataSource* GetProvisionalDataSource() const;
diff --git a/webkit/glue/webview_delegate.h b/webkit/glue/webview_delegate.h
index 482a24b..e58b518 100644
--- a/webkit/glue/webview_delegate.h
+++ b/webkit/glue/webview_delegate.h
@@ -485,6 +485,10 @@ class WebViewDelegate : virtual public WebWidgetDelegate {
const std::wstring& value) {
}
+ virtual void DidContentsSizeChange(WebWidget* webwidget, int new_width,
+ int new_height) {
+ }
+
// UIDelegate --------------------------------------------------------------
// Asks the browser to show a modal HTML dialog. The dialog is passed the